From b0b51ee0a36fe350bf412dc0d78ce492c440ccd4 Mon Sep 17 00:00:00 2001 From: Francesco Faraone Date: Thu, 25 Nov 2021 12:51:06 +0100 Subject: [PATCH] select the newest boilerplate tag whose major version is the same as that of the CLI. Add author to report project wizard --- connect/cli/plugins/project/git.py | 13 +++- connect/cli/plugins/project/report/wizard.py | 8 ++ resources/ccli.spec | 2 +- .../plugins/project/test_extension_helpers.py | 1 + tests/plugins/project/test_git.py | 73 +++++++++++-------- tests/plugins/project/test_report_helpers.py | 2 +- 6 files changed, 64 insertions(+), 35 deletions(-) diff --git a/connect/cli/plugins/project/git.py b/connect/cli/plugins/project/git.py index de8ea28b..1aa0a2ed 100644 --- a/connect/cli/plugins/project/git.py +++ b/connect/cli/plugins/project/git.py @@ -3,6 +3,8 @@ from distutils.version import StrictVersion from collections import OrderedDict +from connect.cli import get_version + class GitException(Exception): pass @@ -46,9 +48,15 @@ def _cmp(self, other): return super()._cmp(other) -def _sort_tags(tags): +def _sort_and_filter_tags(tags, desired_major): sorted_tags = OrderedDict() for tag in sorted(tags.keys(), key=ConnectVersionTag): + match = ConnectVersionTag.version_re.match(tag) + if not match: + continue + major = match.group(1) + if major != desired_major: + continue sorted_tags[tag] = tags[tag] return sorted_tags @@ -77,5 +85,6 @@ def _list_tags(repo_url): def get_highest_version(repo_url): tags = _list_tags(repo_url) - tags = _sort_tags(tags) + desired_major, _ = get_version().split('.', 1) + tags = _sort_and_filter_tags(tags, desired_major) return tags.popitem() if tags else (None, None) diff --git a/connect/cli/plugins/project/report/wizard.py b/connect/cli/plugins/project/report/wizard.py index 7034de56..79b613a8 100644 --- a/connect/cli/plugins/project/report/wizard.py +++ b/connect/cli/plugins/project/report/wizard.py @@ -45,6 +45,14 @@ PythonIdentifierValidator(), ), }, + { + 'name': 'author', + 'label': 'Project: author', + 'type': 'input', + 'description': 'Please enter the author for this project:', + 'default': 'Globex Corporation', + 'validators': (RequiredValidator(message='Please, provide an author name.'),), + }, { 'name': 'description', 'label': 'Project: description', diff --git a/resources/ccli.spec b/resources/ccli.spec index dea67147..094b8859 100644 --- a/resources/ccli.spec +++ b/resources/ccli.spec @@ -14,7 +14,7 @@ datas += collect_data_files('cairosvg') datas += collect_data_files('connect.reports') datas += collect_data_files('interrogatio') datas += collect_data_files('pyphen') -datas += copy_metadata('connect-cli') +datas += copy_metadata('connect-cli', recursive=True) a = Analysis( ['../connect/cli/ccli.py'], diff --git a/tests/plugins/project/test_extension_helpers.py b/tests/plugins/project/test_extension_helpers.py index f667626f..bb1eb16b 100644 --- a/tests/plugins/project/test_extension_helpers.py +++ b/tests/plugins/project/test_extension_helpers.py @@ -101,6 +101,7 @@ def test_bootstrap_extension_project_vendor( commit3 refs/tags/21.11 commit4 refs/tags/21.9""" mock_subprocess_run.return_value = mock_called_process + mocker.patch('connect.cli.plugins.project.git.get_version', return_value='21.2') cookie_dir = f'{fs.root_path}/.cookiecutters' if exists_cookiecutter_dir: os.mkdir(cookie_dir) diff --git a/tests/plugins/project/test_git.py b/tests/plugins/project/test_git.py index 76a5bca1..4d72f8b8 100644 --- a/tests/plugins/project/test_git.py +++ b/tests/plugins/project/test_git.py @@ -1,11 +1,10 @@ -from typing import OrderedDict -from connect.cli.plugins.project import git - +import subprocess from collections import OrderedDict import pytest -import subprocess +from connect.cli.plugins.project import git + @pytest.mark.parametrize( ('str', 'result'), @@ -65,7 +64,7 @@ def test_list_tags(mocker): mock_subprocess_run.return_value = mock_subprocess_called_process_error tags = git._list_tags('dummy.repo') - assert tags == {'21.1': 'commit1', '21.10': 'commit2', '21.11': 'commit3', '21.9': 'commit4'} + assert tags == {'21.1': 'commit1', '21.10': 'commit2', '21.11': 'commit3', '21.9': 'commit4'} def test_list_tags_error(mocker): @@ -79,36 +78,39 @@ def test_list_tags_error(mocker): with pytest.raises(git.GitException): git._list_tags('dummy.repo') + @pytest.mark.parametrize( ('tags', 'expected'), ( ( {'v21.1': 'cmt1', 'v21.10': 'cmt2', 'v21.11': 'cmt3', 'v21.9': 'cmt4'}, - OrderedDict({'v21.1': 'cmt1', 'v21.9': 'cmt4','v21.10': 'cmt2', 'v21.11': 'cmt3'}) + OrderedDict({'v21.1': 'cmt1', 'v21.9': 'cmt4', 'v21.10': 'cmt2', 'v21.11': 'cmt3'}), ), ( {'21.1': 'cmt1', '21.10': 'cmt2', '21.11': 'cmt3', '21.9': 'cmt4'}, - OrderedDict({'21.1': 'cmt1', '21.9': 'cmt4', '21.10': 'cmt2', '21.11': 'cmt3', }) + OrderedDict({'21.1': 'cmt1', '21.9': 'cmt4', '21.10': 'cmt2', '21.11': 'cmt3'}), ), ( {'21.1': 'cmt1', '21.10': 'cmt2', '21.9': 'cmt4', '23.0.1a2': 'cmt3'}, - OrderedDict({ '21.1': 'cmt1', '21.9': 'cmt4', '21.10': 'cmt2', '23.0.1a2': 'cmt3'}) + OrderedDict({'21.1': 'cmt1', '21.9': 'cmt4', '21.10': 'cmt2'}), + ), + ( + {'21.1': 'cmt1', '21.10': 'cmt2', '21.9': 'cmt4', '21.0.1a2': 'cmt3'}, + OrderedDict({'21.0.1a2': 'cmt3', '21.1': 'cmt1', '21.9': 'cmt4', '21.10': 'cmt2'}), ), ( {'01.1': 'cmt1', '21.10': 'cmt2', '21.11': 'cmt3', '21.9': 'cmt4'}, - OrderedDict({'01.1': 'cmt1', '21.9': 'cmt4', '21.10': 'cmt2', '21.11': 'cmt3'}) + OrderedDict({'21.9': 'cmt4', '21.10': 'cmt2', '21.11': 'cmt3'}), ), ( {'v21.10not-a-tag': 'cmt5', '01.1': 'cmt1', '21.11': 'cmt3', '21.10': 'cmt2', 'v21.11': 'cmt4'}, OrderedDict( { - 'v21.10not-a-tag': 'cmt5', - '01.1': 'cmt1', '21.10': 'cmt2', '21.11': 'cmt3', 'v21.11': 'cmt4', - } - ) + }, + ), ), ( { @@ -124,69 +126,78 @@ def test_list_tags_error(mocker): }, OrderedDict( { - '22a2': 'cmt4', - 'not-a-version-tag': 'cmt1', - 'not-a-version-tag2': 'cmt2', - 'not-a-version-tag3': 'cmt3', '21.1': 'cmt5', '21.9': 'cmt6', '21.10a1': 'cmt7alpha', '21.10': 'cmt7', - '23.0.1a2': 'cmt8', - } - ) + }, + ), ), - ({},OrderedDict()), + ({}, OrderedDict()), ), ) -def test_sort_tags(tags, expected): - sorted_tags = git._sort_tags(tags) +def test_sort_and_filter_tags(tags, expected): + sorted_tags = git._sort_and_filter_tags(tags, '21') assert sorted_tags == expected @pytest.mark.parametrize( - ('tags', 'expected'), + ('tags', 'cli_version', 'expected'), ( ( b"""commit1 refs/tags/v21.1 commit2 refs/tags/v21.10 commit3 refs/tags/v21.11 commit4 refs/tags/v21.9""", - ('v21.11', 'commit3') + '21.4', + ('v21.11', 'commit3'), ), ( b"""commit1 refs/tags/21.1 commit2 refs/tags/21.10 commit3 refs/tags/21.11 commit4 refs/tags/21.9""", - ('21.11', 'commit3') + '21.7', + ('21.11', 'commit3'), + ), + ( + b"""commit4 refs/tags/22.0 + commit1 refs/tags/21.3 + commit2 refs/tags/21.2 + commit3 refs/tags/21.1""", + '22.1', + ('22.0', 'commit4'), ), ( b"""commit4 refs/tags/22.0 commit1 refs/tags/21.3 commit2 refs/tags/21.2 commit3 refs/tags/21.1""", - ('22.0', 'commit4') + '21.1', + ('21.3', 'commit1'), ), ( b"""commit4 refs/tags/22.0 commit1 refs/tags/21.3 commit2 refs/tags/21.2""", - ('22.0', 'commit4') + '22.4', + ('22.0', 'commit4'), ), ( b"""commit4 refs/tags/01.0 commit1 refs/tags/0.0""", - ('01.0', 'commit4') + '22.1', + (None, None), ), - (b"", (None, None)), + (b"", '21.1', (None, None)), ), ) -def test_get_highest_version(mocker, tags, expected): +def test_get_highest_version(mocker, tags, cli_version, expected): mock_subprocess_run = mocker.patch('connect.cli.plugins.project.git.subprocess.run') mock_subprocess_called_process_error = mocker.patch( 'connect.cli.plugins.project.git.subprocess.CalledProcessError', ) mock_subprocess_called_process_error.stdout = tags mock_subprocess_run.return_value = mock_subprocess_called_process_error + mocker.patch('connect.cli.plugins.project.git.get_version', return_value=cli_version) assert expected == git.get_highest_version('dummy.repo') diff --git a/tests/plugins/project/test_report_helpers.py b/tests/plugins/project/test_report_helpers.py index 1c985f23..4a3ef099 100644 --- a/tests/plugins/project/test_report_helpers.py +++ b/tests/plugins/project/test_report_helpers.py @@ -86,7 +86,7 @@ def test_bootstrap_report_project(fs, mocker, capsys, exists_cookiecutter_dir, i commit3 refs/tags/21.11 commit4 refs/tags/21.9""" mock_subprocess_run.return_value = mock_called_process - + mocker.patch('connect.cli.plugins.project.git.get_version', return_value='21.2') cookie_dir = f'{fs.root_path}/.cookiecutters' if exists_cookiecutter_dir: os.mkdir(cookie_dir)