From 18e959339064840e529262176d4e895c790be7d2 Mon Sep 17 00:00:00 2001 From: Philipp Eder Date: Wed, 9 Sep 2020 09:39:33 +0200 Subject: [PATCH 1/6] add looking for and changing PROJECT_DEV_VERSION within CMakeLists.txt --- pontos/version/cmake_version.py | 61 ++++++++++++++++++++++++----- pontos/version/version.py | 18 ++++----- tests/version/test_cmake_version.py | 57 +++++++++++++++++++++++---- 3 files changed, 110 insertions(+), 26 deletions(-) diff --git a/pontos/version/cmake_version.py b/pontos/version/cmake_version.py index 174c4fc0..c1e71dc3 100644 --- a/pontos/version/cmake_version.py +++ b/pontos/version/cmake_version.py @@ -56,6 +56,7 @@ def run(self, args=None) -> Union[int, str]: if commandline_arguments.command == 'update': self.update_version( commandline_arguments.version, + develop=commandline_arguments.develop, ) elif commandline_arguments.command == 'show': self.print_current_version() @@ -70,11 +71,11 @@ def __print(self, *args): if not self.__quiet: print(*args) - def update_version(self, version: str): + def update_version(self, version: str, *, develop: bool = False): content = self.__cmake_filepath.read_text() cmvp = CMakeVersionParser(content) previous_version = cmvp.get_current_version() - new_content = cmvp.update_version(version) + new_content = cmvp.update_version(version, develop=develop) self.__cmake_filepath.write_text(new_content) self.__print( 'Updated version from {} to {}'.format(previous_version, version) @@ -96,17 +97,20 @@ def verify_version(self, version: str): class CMakeVersionParser: def __init__(self, cmake_content_lines: str): - line_no, current_version = self._find_version_in_cmake( + line_no, current_version, pd_line_no, pd = self._find_version_in_cmake( cmake_content_lines ) self._cmake_content_lines = cmake_content_lines.split('\n') self._version_line_number = line_no self._current_version = current_version + self._project_dev_version_line_numeber = pd_line_no + self._project_dev_version = pd __cmake_scanner = re.Scanner( [ (r'#.*', lambda _, token: ("comment", token)), (r'"[^"]*"', lambda _, token: ("string", token)), + (r'"[0-9]+"', lambda _, token: ("int", token)), (r"\(", lambda _, token: ("open_bracket", token)), (r"\)", lambda _, token: ("close_bracket", token)), (r'[^ \t\r\n()#"]+', lambda _, token: ("word", token)), @@ -119,7 +123,7 @@ def __init__(self, cmake_content_lines: str): def get_current_version(self) -> str: return self._current_version - def update_version(self, new_version: str) -> str: + def update_version(self, new_version: str, *, develop: bool = False) -> str: if not is_version_pep440_compliant(new_version): raise VersionError( "version {} is not pep 440 compliant.".format(new_version) @@ -130,6 +134,15 @@ def update_version(self, new_version: str) -> str: self._cmake_content_lines[self._version_line_number] = updated self._current_version = new_version + if self._project_dev_version_line_numeber: + self._cmake_content_lines[ + self._project_dev_version_line_numeber + ] = self._cmake_content_lines[ + self._project_dev_version_line_numeber + ].replace( + str(int(not develop)), str(int(develop)) + ) + self._project_dev_version = str(int(develop)) return '\n'.join(self._cmake_content_lines) @@ -137,6 +150,15 @@ def _find_version_in_cmake(self, content: str) -> Tuple[int, str]: in_project = False in_version = False + version_line_no: int = None + version: str = None + + in_set = False + in_project_dev_version = False + + project_dev_version_line_no: int = None + project_dev_version: int = None + for lineno, token_type, value in self._tokenize(content): if token_type == 'word' and value == 'project': in_project = True @@ -145,18 +167,39 @@ def _find_version_in_cmake(self, content: str) -> Tuple[int, str]: elif in_version and ( token_type == 'word' or token_type == 'string' ): - return lineno, value + version_line_no = lineno + version = value + in_project = False + in_version = False + elif token_type == 'word' and value == 'set': + in_set = True + elif ( + in_set + and token_type == 'word' + and value == 'PROJECT_DEV_VERSION' + ): + in_project_dev_version = True + elif in_project_dev_version and ( + token_type == 'word' or token_type == 'int' + ): + project_dev_version_line_no = lineno + project_dev_version = value elif in_project and token_type == 'close_bracket': raise ValueError('unable to find cmake version in project.') - raise ValueError('unable to find cmake project.') + if not version or version_line_no is None: + raise ValueError('unable to find cmake version.') + return ( + version_line_no, + version, + project_dev_version_line_no, + project_dev_version, + ) def _tokenize( self, content: str ) -> Generator[ - Tuple[int, str, str], - Tuple[int, str, str], - Tuple[int, str, str], + Tuple[int, str, str], Tuple[int, str, str], Tuple[int, str, str], ]: toks, remainder = self.__cmake_scanner.scan(content) if remainder != '': diff --git a/pontos/version/version.py b/pontos/version/version.py index 12fa89fe..571a19a2 100644 --- a/pontos/version/version.py +++ b/pontos/version/version.py @@ -111,8 +111,7 @@ def initialize_default_parser() -> argparse.ArgumentParser: - update """ parser = argparse.ArgumentParser( - description='Version handling utilities.', - prog='version', + description='Version handling utilities.', prog='version', ) parser.add_argument( '--quiet', help='don\'t print messages', action="store_true" @@ -136,6 +135,11 @@ def initialize_default_parser() -> argparse.ArgumentParser: help="don't check if version is already set", action="store_true", ) + update_parser.add_argument( + '--develop', + help="indicates if it is a develop version", + action="store_true", + ) return parser @@ -192,10 +196,7 @@ def update_version_file(self, new_version: str) -> None: self.version_file_path.write_text(self.TEMPLATE.format(version)) - def update_pyproject_version( - self, - new_version: str, - ) -> None: + def update_pyproject_version(self, new_version: str,) -> None: """ Update the version in the pyproject.toml file """ @@ -291,10 +292,7 @@ def run(self, args=None) -> Union[int, str]: try: if args.command == 'update': - self.update_version( - args.version, - force=args.force, - ) + self.update_version(args.version, force=args.force) elif args.command == 'show': self.print_current_version() elif args.command == 'verify': diff --git a/tests/version/test_cmake_version.py b/tests/version/test_cmake_version.py index fbbaa82c..b8031f88 100644 --- a/tests/version/test_cmake_version.py +++ b/tests/version/test_cmake_version.py @@ -3,6 +3,8 @@ from unittest.mock import MagicMock from pontos.version import CMakeVersionParser, VersionError, CMakeVersionCommand +# pylint: disable=W0212 + class CMakeVersionCommandTestCase(unittest.TestCase): def test_raise_exception_file_not_exists(self): @@ -61,12 +63,16 @@ def test_raise_update_version(self): fake_path = fake_path_class.return_value fake_path.__str__.return_value = 'CMakeLists.txt' fake_path.exists.return_value = True - fake_path.read_text.return_value = "project(VERSION 21)" + fake_path.read_text.return_value = ( + "project(VERSION 21)\nset(PROJECT_DEV_VERSION 0)" + ) CMakeVersionCommand(cmake_lists_path=fake_path).run( - args=['update', '22'] + args=['update', '22', '--develop'] ) fake_path.read_text.assert_called_with() - fake_path.write_text.assert_called_with('project(VERSION 22)') + fake_path.write_text.assert_called_with( + 'project(VERSION 22)\nset(PROJECT_DEV_VERSION 1)' + ) class CMakeVersionParserTestCase(unittest.TestCase): @@ -95,6 +101,45 @@ def test_get_current_version_multiline_project(self): under_test = CMakeVersionParser("project\n(\nVERSION\n\t 2.3.4)") self.assertEqual(under_test.get_current_version(), '2.3.4') + def test_find_project_dev_version(self): + test_cmake_lists = """ + project( + DESCRIPTION something + VERSION 41.41.41 + LANGUAGES c + ) + set( + PROJECT_DEV_VERSION 1 + ) + """ + under_test = CMakeVersionParser(test_cmake_lists) + self.assertEqual(under_test._project_dev_version_line_numeber, 7) + self.assertEqual(under_test._project_dev_version, '1') + + def test_update_project_dev_version(self): + test_cmake_lists = """ + project( + DESCRIPTION something + VERSION 41.41.41 + LANGUAGES c + ) + set( + PROJECT_DEV_VERSION 1 + ) + """ + under_test = CMakeVersionParser(test_cmake_lists) + + self.assertEqual(under_test._project_dev_version_line_numeber, 7) + self.assertEqual(under_test._project_dev_version, '1') + result = under_test.update_version('41.41.41', develop=False) + self.assertEqual(under_test._project_dev_version, '0') + self.assertEqual( + result, + test_cmake_lists.replace( + 'PROJECT_DEV_VERSION 1', 'PROJECT_DEV_VERSION 0' + ), + ) + def test_get_current_version_multiline_project_combined_token(self): under_test = CMakeVersionParser( "project\n(\nDESCRIPTION something VERSION 2.3.4 LANGUAGES c\n)" @@ -110,10 +155,8 @@ def test_raise_exception_project_no_version(self): def test_raise_exception_no_project(self): with self.assertRaises(ValueError) as context: - CMakeVersionParser( - "non_project(VERSION 2.3.5)", - ) + CMakeVersionParser("non_project(VERSION 2.3.5)",) self.assertEqual( - str(context.exception), 'unable to find cmake project.' + str(context.exception), 'unable to find cmake version.' ) From 122f1fc6a9a9221a7374eb8b7186ad8686d7d0d8 Mon Sep 17 00:00:00 2001 From: Philipp Eder Date: Wed, 9 Sep 2020 09:46:05 +0200 Subject: [PATCH 2/6] add PROJECT_DEV_VERSION handling into release --- pontos/release/release.py | 26 ++++++++++++++------------ 1 file changed, 14 insertions(+), 12 deletions(-) diff --git a/pontos/release/release.py b/pontos/release/release.py index fd367926..da07b295 100644 --- a/pontos/release/release.py +++ b/pontos/release/release.py @@ -63,8 +63,7 @@ def build_release_dict( def initialize_default_parser() -> argparse.ArgumentParser: parser = argparse.ArgumentParser( - description='Release handling utility.', - prog='pontos-release', + description='Release handling utility.', prog='pontos-release', ) parser.add_argument( '--release-version', @@ -77,14 +76,10 @@ def initialize_default_parser() -> argparse.ArgumentParser: required=True, ) parser.add_argument( - '--project', - help='The github project', - required=True, + '--project', help='The github project', required=True, ) parser.add_argument( - '--space', - default='greenbone', - help='user/team name in github', + '--space', default='greenbone', help='user/team name in github', ) parser.add_argument( '--signing-key', @@ -139,8 +134,13 @@ def parse(args=None): ) -def update_version(to: str, _version: version) -> Tuple[bool, str]: - executed, filename = _version.main(False, args=["--quiet", "update", to]) +def update_version( + to: str, _version: version, *, develop: bool +) -> Tuple[bool, str]: + develop_arg = '--develop' if develop else '' + executed, filename = _version.main( + False, args=["--quiet", develop_arg, "update", to] + ) if not executed: if filename == "": @@ -186,7 +186,9 @@ def prepare( if git_version.encode() in git_tags.stdout.splitlines(): raise ValueError('git tag {} is already taken.'.format(git_version)) - executed, filename = update_version(release_version, _version) + executed, filename = update_version( + release_version, _version, develop=False + ) if not executed: return False @@ -226,7 +228,7 @@ def prepare( release_text.write_text(changelog_text) # set to new version add skeleton - executed, filename = update_version(nextversion, _version) + executed, filename = update_version(nextversion, _version, develop=True) if not executed: return False From bc651c8add6ce372dfb6a0655c812f8c489be97e Mon Sep 17 00:00:00 2001 From: Philipp Eder Date: Wed, 9 Sep 2020 09:56:36 +0200 Subject: [PATCH 3/6] add changelog entry --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index ca4aac15..ef399acc 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased] ### Added +- add handling of PROJECT_DEV_VERSION in CMakeLists.txt if set [#32](https://github.com/greenbone/pontos/pull/32) ### Changed - set releasename to projectname version [#25](https://github.com/greenbone/pontos/pull/25) ### Deprecated From 13c1b77e00a149b56284d8a919e74d3036f75b97 Mon Sep 17 00:00:00 2001 From: Philipp Eder Date: Wed, 9 Sep 2020 11:14:51 +0200 Subject: [PATCH 4/6] reformat with new black version --- poetry.lock | 8 ++++---- pontos/release/release.py | 11 ++++++++--- pontos/version/cmake_version.py | 4 +++- pontos/version/version.py | 8 ++++++-- tests/version/test_cmake_version.py | 4 +++- 5 files changed, 24 insertions(+), 11 deletions(-) diff --git a/poetry.lock b/poetry.lock index cfca50be..50f6761f 100644 --- a/poetry.lock +++ b/poetry.lock @@ -144,11 +144,11 @@ description = "A Python utility / library to sort Python imports." name = "isort" optional = false python-versions = ">=3.6,<4.0" -version = "5.4.2" +version = "5.5.1" [package.extras] colors = ["colorama (>=0.4.3,<0.5.0)"] -pipfile_deprecated_finder = ["pipreqs", "requirementslib", "tomlkit (>=0.5.3)"] +pipfile_deprecated_finder = ["pipreqs", "requirementslib"] requirements_deprecated_finder = ["pipreqs", "pip-api"] [[package]] @@ -376,8 +376,8 @@ idna = [ {file = "idna-2.10.tar.gz", hash = "sha256:b307872f855b18632ce0c21c5e45be78c0ea7ae4c15c828c20788b26921eb3f6"}, ] isort = [ - {file = "isort-5.4.2-py3-none-any.whl", hash = "sha256:60a1b97e33f61243d12647aaaa3e6cc6778f5eb9f42997650f1cc975b6008750"}, - {file = "isort-5.4.2.tar.gz", hash = "sha256:d488ba1c5a2db721669cc180180d5acf84ebdc5af7827f7aaeaa75f73cf0e2b8"}, + {file = "isort-5.5.1-py3-none-any.whl", hash = "sha256:a200d47b7ee8b7f7d0a9646650160c4a51b6a91a9413fd31b1da2c4de789f5d3"}, + {file = "isort-5.5.1.tar.gz", hash = "sha256:92533892058de0306e51c88f22ece002a209dc8e80288aa3cec6d443060d584f"}, ] lazy-object-proxy = [ {file = "lazy-object-proxy-1.4.3.tar.gz", hash = "sha256:f3900e8a5de27447acbf900b4750b0ddfd7ec1ea7fbaf11dfa911141bc522af0"}, diff --git a/pontos/release/release.py b/pontos/release/release.py index da07b295..10aab708 100644 --- a/pontos/release/release.py +++ b/pontos/release/release.py @@ -63,7 +63,8 @@ def build_release_dict( def initialize_default_parser() -> argparse.ArgumentParser: parser = argparse.ArgumentParser( - description='Release handling utility.', prog='pontos-release', + description='Release handling utility.', + prog='pontos-release', ) parser.add_argument( '--release-version', @@ -76,10 +77,14 @@ def initialize_default_parser() -> argparse.ArgumentParser: required=True, ) parser.add_argument( - '--project', help='The github project', required=True, + '--project', + help='The github project', + required=True, ) parser.add_argument( - '--space', default='greenbone', help='user/team name in github', + '--space', + default='greenbone', + help='user/team name in github', ) parser.add_argument( '--signing-key', diff --git a/pontos/version/cmake_version.py b/pontos/version/cmake_version.py index c1e71dc3..ef439c0c 100644 --- a/pontos/version/cmake_version.py +++ b/pontos/version/cmake_version.py @@ -199,7 +199,9 @@ def _find_version_in_cmake(self, content: str) -> Tuple[int, str]: def _tokenize( self, content: str ) -> Generator[ - Tuple[int, str, str], Tuple[int, str, str], Tuple[int, str, str], + Tuple[int, str, str], + Tuple[int, str, str], + Tuple[int, str, str], ]: toks, remainder = self.__cmake_scanner.scan(content) if remainder != '': diff --git a/pontos/version/version.py b/pontos/version/version.py index 571a19a2..56e8ce1e 100644 --- a/pontos/version/version.py +++ b/pontos/version/version.py @@ -111,7 +111,8 @@ def initialize_default_parser() -> argparse.ArgumentParser: - update """ parser = argparse.ArgumentParser( - description='Version handling utilities.', prog='version', + description='Version handling utilities.', + prog='version', ) parser.add_argument( '--quiet', help='don\'t print messages', action="store_true" @@ -196,7 +197,10 @@ def update_version_file(self, new_version: str) -> None: self.version_file_path.write_text(self.TEMPLATE.format(version)) - def update_pyproject_version(self, new_version: str,) -> None: + def update_pyproject_version( + self, + new_version: str, + ) -> None: """ Update the version in the pyproject.toml file """ diff --git a/tests/version/test_cmake_version.py b/tests/version/test_cmake_version.py index b8031f88..c9650102 100644 --- a/tests/version/test_cmake_version.py +++ b/tests/version/test_cmake_version.py @@ -155,7 +155,9 @@ def test_raise_exception_project_no_version(self): def test_raise_exception_no_project(self): with self.assertRaises(ValueError) as context: - CMakeVersionParser("non_project(VERSION 2.3.5)",) + CMakeVersionParser( + "non_project(VERSION 2.3.5)", + ) self.assertEqual( str(context.exception), 'unable to find cmake version.' From cc662369d0140ad75a3a0a513d998f4cfaccfd3c Mon Sep 17 00:00:00 2001 From: Philipp Eder Date: Fri, 11 Sep 2020 10:13:47 +0200 Subject: [PATCH 5/6] Update pontos/version/cmake_version.py Co-authored-by: Jaspar L. --- pontos/version/cmake_version.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pontos/version/cmake_version.py b/pontos/version/cmake_version.py index ef439c0c..376f90fe 100644 --- a/pontos/version/cmake_version.py +++ b/pontos/version/cmake_version.py @@ -103,7 +103,7 @@ def __init__(self, cmake_content_lines: str): self._cmake_content_lines = cmake_content_lines.split('\n') self._version_line_number = line_no self._current_version = current_version - self._project_dev_version_line_numeber = pd_line_no + self._project_dev_version_line_number = pd_line_no self._project_dev_version = pd __cmake_scanner = re.Scanner( From b01bfb26d32c11a937771e312a30ea7dd1738e79 Mon Sep 17 00:00:00 2001 From: Philipp Eder Date: Fri, 11 Sep 2020 10:22:09 +0200 Subject: [PATCH 6/6] fix review finding --- pontos/version/cmake_version.py | 10 +++++----- tests/version/test_cmake_version.py | 4 ++-- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/pontos/version/cmake_version.py b/pontos/version/cmake_version.py index 376f90fe..e3d1e7ce 100644 --- a/pontos/version/cmake_version.py +++ b/pontos/version/cmake_version.py @@ -110,7 +110,7 @@ def __init__(self, cmake_content_lines: str): [ (r'#.*', lambda _, token: ("comment", token)), (r'"[^"]*"', lambda _, token: ("string", token)), - (r'"[0-9]+"', lambda _, token: ("int", token)), + (r'"[0-9]+"', lambda _, token: ("number", token)), (r"\(", lambda _, token: ("open_bracket", token)), (r"\)", lambda _, token: ("close_bracket", token)), (r'[^ \t\r\n()#"]+', lambda _, token: ("word", token)), @@ -134,11 +134,11 @@ def update_version(self, new_version: str, *, develop: bool = False) -> str: self._cmake_content_lines[self._version_line_number] = updated self._current_version = new_version - if self._project_dev_version_line_numeber: + if self._project_dev_version_line_number: self._cmake_content_lines[ - self._project_dev_version_line_numeber + self._project_dev_version_line_number ] = self._cmake_content_lines[ - self._project_dev_version_line_numeber + self._project_dev_version_line_number ].replace( str(int(not develop)), str(int(develop)) ) @@ -180,7 +180,7 @@ def _find_version_in_cmake(self, content: str) -> Tuple[int, str]: ): in_project_dev_version = True elif in_project_dev_version and ( - token_type == 'word' or token_type == 'int' + token_type == 'word' or token_type == 'number' ): project_dev_version_line_no = lineno project_dev_version = value diff --git a/tests/version/test_cmake_version.py b/tests/version/test_cmake_version.py index c9650102..d3f0d123 100644 --- a/tests/version/test_cmake_version.py +++ b/tests/version/test_cmake_version.py @@ -113,7 +113,7 @@ def test_find_project_dev_version(self): ) """ under_test = CMakeVersionParser(test_cmake_lists) - self.assertEqual(under_test._project_dev_version_line_numeber, 7) + self.assertEqual(under_test._project_dev_version_line_number, 7) self.assertEqual(under_test._project_dev_version, '1') def test_update_project_dev_version(self): @@ -129,7 +129,7 @@ def test_update_project_dev_version(self): """ under_test = CMakeVersionParser(test_cmake_lists) - self.assertEqual(under_test._project_dev_version_line_numeber, 7) + self.assertEqual(under_test._project_dev_version_line_number, 7) self.assertEqual(under_test._project_dev_version, '1') result = under_test.update_version('41.41.41', develop=False) self.assertEqual(under_test._project_dev_version, '0')