From f3082d090adee6736d58cc999f5dc35d8e843299 Mon Sep 17 00:00:00 2001 From: Vojtech Polasek Date: Mon, 9 Jan 2023 13:55:51 +0100 Subject: [PATCH 1/5] change method to clear a list to be compatible with Python 2 there is no clear method of list object in Python 2 --- ssg/requirement_specs.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ssg/requirement_specs.py b/ssg/requirement_specs.py index e189022a34f..0679077dd30 100644 --- a/ssg/requirement_specs.py +++ b/ssg/requirement_specs.py @@ -17,7 +17,7 @@ def _add_version_element(elements, el): def _add_version_elements_to_evr_component(evr, elements, component): evr[component] = '.'.join(elements if elements else ['0']) - elements.clear() + elements = [] def _select_next_component(el): From faf0316f88003b15ad3d0f71985cb4303f45896d Mon Sep 17 00:00:00 2001 From: Vojtech Polasek Date: Mon, 9 Jan 2023 14:34:23 +0100 Subject: [PATCH 2/5] change method for parsing of version to evr previously we used methods of pkg_tools. But there were differences between various implementations and it posed too many problems. Therefore, I decided to use simple regex to parse simple version to evr. It has currently limitations to numbers only, but this can be easily expanded. --- ssg/requirement_specs.py | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/ssg/requirement_specs.py b/ssg/requirement_specs.py index 0679077dd30..3288f4b3b4c 100644 --- a/ssg/requirement_specs.py +++ b/ssg/requirement_specs.py @@ -94,8 +94,13 @@ def _get_evr(version_something): def _parse_version_into_evr(version): - ver = pkg_resources.parse_version(version) - return _get_evr(ver) + evr = {"epoch": None, "version": None, "release": None} + match_version = re.match(r'^(\d[\d\.]*)(?:-(\d*))?$', version) + if not match_version: + raise ValueError("Invalid version specifier {0}".format(version)) + evr["version"] = match_version.groups()[0] + evr["release"] = match_version.groups()[1] + return evr def _spec_to_version_specifier(spec): From 64f77e0002e490a67c9b15a5192bb267650b7f51 Mon Sep 17 00:00:00 2001 From: Vojtech Polasek Date: Tue, 10 Jan 2023 10:33:15 +0100 Subject: [PATCH 3/5] remove no longer used functions which were used for parsing of version to evr --- ssg/requirement_specs.py | 82 ---------------------------------------- 1 file changed, 82 deletions(-) diff --git a/ssg/requirement_specs.py b/ssg/requirement_specs.py index 3288f4b3b4c..b28601d8a23 100644 --- a/ssg/requirement_specs.py +++ b/ssg/requirement_specs.py @@ -11,88 +11,6 @@ pkg_resources.safe_extra = lambda extra: re.sub('[^A-Za-z0-9.-]+', '_', extra).lower() -def _add_version_element(elements, el): - elements.append(str(int(el))) - - -def _add_version_elements_to_evr_component(evr, elements, component): - evr[component] = '.'.join(elements if elements else ['0']) - elements = [] - - -def _select_next_component(el): - if el.endswith('final-'): - return 'release' - if el.endswith('final'): - return None - - -def _evr_from_tuple_for_sure(version_tuple): - # TODO: We do not support `epoch` at this moment, it is always None - evr = {'epoch': None, 'version': None, 'release': None} - component = 'version' - elements = [] - for el in version_tuple: - if el.startswith('*'): - _add_version_elements_to_evr_component(evr, elements, component) - component = _select_next_component(el) - if component is None: - break - continue - _add_version_element(elements, el) - return evr - - -def _evr_from_tuple(version_tuple): - # This is a version tuple from setuptools 0.9.8 - # 1.22.33-444 -> ('00000011', '00000022', '00000033', '*final-', '00000444', '*final') - if isinstance(version_tuple, tuple): - return _evr_from_tuple_for_sure(version_tuple) - raise ValueError('Invalid object: %s, ' - 'expected: tuple' % repr(version_tuple)) - - -def _evr_from_version_object_for_sure(version_object): - # TODO: We do not support `epoch` at this moment, it is always None - if hasattr(version_object, 'post'): - post = version_object.post - elif hasattr(version_object, '_version') and hasattr(version_object._version, 'post'): - # There was a range of versions around 40.8 of setuptools - # where `post` hasn't been a public property of the Version class. - # In _version it has structure of ('post', 12) for version 1.2.3-12. - post = version_object._version.post[1] if version_object._version.post else None - else: - raise ValueError('Invalid pkg_resources.packaging.version.Version object: ' - 'no Version.post or Version._version.post attributes.' - 'Current version of setuptools is not supported.') - return {'epoch': None, - 'version': version_object.base_version, - 'release': str(post) if post else None} - - -def _evr_from_version_object(version_object): - if isinstance(version_object, pkg_resources.packaging.version.Version): - return _evr_from_version_object_for_sure(version_object) - raise ValueError('Invalid version object: %s, ' - 'expected: pkg_resources.packaging.version.Version' % repr(version_object)) - - -def _get_evr(version_something): - # Function should be redefined in accordance with setuptools behaviour. See below. - raise Exception("No EVR parser defined!") - - -try: - from pkg_resources import packaging - # We are using modern setuptools, packaging.version.Version is available - # and is used as the result of parse_version() function. - _get_evr = _evr_from_version_object -except ImportError: - # We are using old setuptools (Python 2.7 / 0.9.8) the parse_version() function - # returns a tuple object. - _get_evr = _evr_from_tuple - - def _parse_version_into_evr(version): evr = {"epoch": None, "version": None, "release": None} match_version = re.match(r'^(\d[\d\.]*)(?:-(\d*))?$', version) From c35fad4286f50fe5d0b18e57dc0b89088279ee07 Mon Sep 17 00:00:00 2001 From: Vojtech Polasek Date: Tue, 10 Jan 2023 10:33:38 +0100 Subject: [PATCH 4/5] remove no longer valid tests --- tests/unit/ssg-module/test_requirement_specs.py | 14 -------------- 1 file changed, 14 deletions(-) diff --git a/tests/unit/ssg-module/test_requirement_specs.py b/tests/unit/ssg-module/test_requirement_specs.py index 670cec8264c..91a967c7f6c 100644 --- a/tests/unit/ssg-module/test_requirement_specs.py +++ b/tests/unit/ssg-module/test_requirement_specs.py @@ -3,20 +3,6 @@ from ssg import requirement_specs -def test_evr_from_tuple(): - v = requirement_specs._evr_from_tuple( - ('00000001', '00000022', '00000333', '*final-', '00004444', '*final')) - assert v == {'epoch': None, 'version': '1.22.333', 'release': '4444'} - - v = requirement_specs._evr_from_tuple( - ('*final',)) - assert v == {'epoch': None, 'version': '0', 'release': None} - - v = requirement_specs._evr_from_tuple( - ('*final-', '00000001', '*final')) - assert v == {'epoch': None, 'version': '0', 'release': '1'} - - def test_parse_version_into_evr(): v = requirement_specs._parse_version_into_evr('1.22.333-4444') assert v == {'epoch': None, 'version': '1.22.333', 'release': '4444'} From 38cd22abc0699fe32b36125420e0b2421bc0cf01 Mon Sep 17 00:00:00 2001 From: Vojtech Polasek Date: Tue, 10 Jan 2023 10:39:33 +0100 Subject: [PATCH 5/5] extend tests for version_to_evr --- tests/unit/ssg-module/test_requirement_specs.py | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/tests/unit/ssg-module/test_requirement_specs.py b/tests/unit/ssg-module/test_requirement_specs.py index 91a967c7f6c..d6a679bdd9f 100644 --- a/tests/unit/ssg-module/test_requirement_specs.py +++ b/tests/unit/ssg-module/test_requirement_specs.py @@ -20,3 +20,20 @@ def test_parse_version_into_evr(): # We do not support epoch at this moment, this version string is invalid. with pytest.raises(ValueError): v = requirement_specs._parse_version_into_evr('1:1.0.0') + + # we do not support letters anywhere for now + + with pytest.raises(ValueError): + v = requirement_specs._parse_version_into_evr('1.0.0-r2') + with pytest.raises(ValueError): + v = requirement_specs._parse_version_into_evr('b1') + + # some more tests to ensure that the regex is correct + with pytest.raises(ValueError): + v = requirement_specs._parse_version_into_evr('0:') + with pytest.raises(ValueError): + v = requirement_specs._parse_version_into_evr('-1') + with pytest.raises(ValueError): + v = requirement_specs._parse_version_into_evr(':') + with pytest.raises(ValueError): + v = requirement_specs._parse_version_into_evr('-')