From e4661e837a6f12c2cd1004a179958266cbe8d2f3 Mon Sep 17 00:00:00 2001 From: Vinicius Moreira Date: Wed, 2 Sep 2020 10:18:59 -0300 Subject: [PATCH] [arch] fix -> AUR: not detecting some package updates --- bauh/gems/arch/mapper.py | 70 +--------- tests/gems/arch/test_arch_data_mapper.py | 167 +---------------------- 2 files changed, 7 insertions(+), 230 deletions(-) diff --git a/bauh/gems/arch/mapper.py b/bauh/gems/arch/mapper.py index e4311a2b..a4d01b91 100644 --- a/bauh/gems/arch/mapper.py +++ b/bauh/gems/arch/mapper.py @@ -1,25 +1,14 @@ import os -import re from datetime import datetime +from pkg_resources import parse_version + from bauh.api.abstract.model import PackageStatus from bauh.api.http import HttpClient from bauh.gems.arch.model import ArchPackage from bauh.view.util.translation import I18n URL_PKG_DOWNLOAD = 'https://aur.archlinux.org/{}' -RE_LETTERS = re.compile(r'\.([a-zA-Z]+)-\d+$') -RE_VERSION_SPLIT = re.compile(r'[a-zA-Z]+|\d+|[\.\-_@#]+') - -BAUH_PACKAGES = {'bauh', 'bauh-staging'} -RE_SFX = ('r', 're', 'release') -GA_SFX = ('ga', 'ge') -RC_SFX = ('rc',) -BETA_SFX = ('b', 'beta') -AL_SFX = ('alpha', 'alfa') -DEV_SFX = ('dev', 'devel', 'development') - -V_SUFFIX_MAP = {s: {'c': sfxs[0], 'p': idx} for idx, sfxs in enumerate([RE_SFX, GA_SFX, RC_SFX, BETA_SFX, AL_SFX, DEV_SFX]) for s in sfxs} class ArchDataMapper: @@ -52,62 +41,13 @@ class ArchDataMapper: pkg.url_download = URL_PKG_DOWNLOAD.format(package['URLPath']) if package.get('URLPath') else None pkg.first_submitted = datetime.fromtimestamp(package['FirstSubmitted']) if package.get('FirstSubmitted') else None pkg.last_modified = datetime.fromtimestamp(package['LastModified']) if package.get('LastModified') else None - pkg.update = self.check_update(pkg.version, pkg.latest_version, check_suffix=pkg.name in BAUH_PACKAGES) + pkg.update = self.check_update(pkg.version, pkg.latest_version) @staticmethod - def check_update(version: str, latest_version: str, check_suffix: bool = False) -> bool: + def check_update(version: str, latest_version: str) -> bool: if version and latest_version: + return parse_version(version) < parse_version(latest_version) - if check_suffix: - current_sfx = RE_LETTERS.findall(version) - latest_sf = RE_LETTERS.findall(latest_version) - - if latest_sf and current_sfx: - current_sfx = current_sfx[0] - latest_sf = latest_sf[0] - - current_sfx_data = V_SUFFIX_MAP.get(current_sfx.lower()) - latest_sfx_data = V_SUFFIX_MAP.get(latest_sf.lower()) - - if current_sfx_data and latest_sfx_data: - nversion = version.split(current_sfx)[0] - nlatest = latest_version.split(latest_sf)[0] - - if nversion == nlatest: - if current_sfx_data['c'] != latest_sfx_data['c']: - return latest_sfx_data['p'] < current_sfx_data['p'] - else: - return ''.join(latest_version.split(latest_sf)) > ''.join(version.split(current_sfx)) - - return nlatest > nversion - - latest_split = RE_VERSION_SPLIT.findall(latest_version) - current_split = RE_VERSION_SPLIT.findall(version) - - for idx in range(len(latest_split)): - if idx < len(current_split): - latest_part = latest_split[idx] - current_part = current_split[idx] - - if latest_part != current_part: - - try: - dif = int(latest_part) - int(current_part) - - if dif > 0: - return True - elif dif < 0: - return False - else: - continue - - except ValueError: - if latest_part.isdigit(): - return True - elif current_part.isdigit(): - return False - else: - return latest_part > current_part return False def fill_package_build(self, pkg: ArchPackage): diff --git a/tests/gems/arch/test_arch_data_mapper.py b/tests/gems/arch/test_arch_data_mapper.py index fdc17d5a..ad300458 100644 --- a/tests/gems/arch/test_arch_data_mapper.py +++ b/tests/gems/arch/test_arch_data_mapper.py @@ -5,7 +5,7 @@ from bauh.gems.arch.mapper import ArchDataMapper class ArchDataMapperTest(TestCase): - def test_check_update_no_suffix(self): + def test_check_update(self): self.assertTrue(ArchDataMapper.check_update('1.0.0-1', '1.0.0-2')) self.assertFalse(ArchDataMapper.check_update('1.0.0-2', '1.0.0-1')) self.assertTrue(ArchDataMapper.check_update('1.0.0-5', '1.0.1-1')) @@ -25,169 +25,6 @@ class ArchDataMapperTest(TestCase): self.assertTrue(ArchDataMapper.check_update('77.0.3865.a-1', '77.0.3865.b-1')) self.assertFalse(ArchDataMapper.check_update('77.0.b.0-1', '77.0.a.1-1')) self.assertFalse(ArchDataMapper.check_update('r25.e22697c-1', 'r8.19fe011-1')) + self.assertTrue(ArchDataMapper.check_update('0.9.7.RC-9', '0.9.7.RC-10')) self.assertFalse(ArchDataMapper.check_update('1.1.0.r11.caacf30-1', 'r65.4c7144a-1')) self.assertFalse(ArchDataMapper.check_update('1.2.16.r688.8b2c199-1', 'r2105.e91f0e9-3')) - - def test_check_update_no_suffix_3_x_2_digits(self): - self.assertTrue(ArchDataMapper.check_update('1.0.0-1', '1.1-1')) - self.assertFalse(ArchDataMapper.check_update('1.2.0-1', '1.1-1')) - - def test_check_update_no_suffix_3_x_1_digits(self): - self.assertTrue(ArchDataMapper.check_update('1.0.0-1', '2-1')) - self.assertFalse(ArchDataMapper.check_update('2-1', '1.1-1')) - - def test_check_update_release(self): - # RE - self.assertTrue(ArchDataMapper.check_update('1.0.0.R-1', '1.0.0.R-2', check_suffix=True)) - self.assertFalse(ArchDataMapper.check_update('1.0.0.R-2', '1.0.0.R-1', check_suffix=True)) - self.assertFalse(ArchDataMapper.check_update('1.0.1.R-1', '1.0.0.R-5', check_suffix=True)) - self.assertTrue(ArchDataMapper.check_update('1.0.1.R-1', '1.0.1.R-2', check_suffix=True)) - self.assertFalse(ArchDataMapper.check_update('1.0.2.R-1', '1.0.1.R-7', check_suffix=True)) - - self.assertTrue(ArchDataMapper.check_update('1.0.0.RE-1', '1.0.0.R-2', check_suffix=True)) - self.assertTrue(ArchDataMapper.check_update('1.0.0.RELEASE-2', '1.0.0.R-5', check_suffix=True)) - self.assertFalse(ArchDataMapper.check_update('1.0.1.R-1', '1.0.0.RELEASE-5', check_suffix=True)) - self.assertFalse(ArchDataMapper.check_update('1.0.1.R-1', '1.0.0.RE-1', check_suffix=True)) - - # GA - self.assertFalse(ArchDataMapper.check_update('1.0.0.R-1', '1.0.0.Ge-1', check_suffix=True)) - self.assertFalse(ArchDataMapper.check_update('1.0.0.RE-1', '1.0.0.GA-1', check_suffix=True)) - self.assertFalse(ArchDataMapper.check_update('1.0.0.RELEASE-1', '1.0.0.Ge-1', check_suffix=True)) - self.assertFalse(ArchDataMapper.check_update('1.0.0.R-1', '1.0.0.GE-1', check_suffix=True)) - self.assertFalse(ArchDataMapper.check_update('1.0.0.RE-1', '1.0.0.GE-1', check_suffix=True)) - self.assertFalse(ArchDataMapper.check_update('1.0.0.RELEASE-1', '1.0.0.GE-1', check_suffix=True)) - self.assertFalse(ArchDataMapper.check_update('1.0.0.R-1', '1.0.0.GA-1', check_suffix=True)) - self.assertFalse(ArchDataMapper.check_update('1.0.0.RE-1', '1.0.0.GA-1', check_suffix=True)) - self.assertFalse(ArchDataMapper.check_update('1.0.0.RELEASE-1', '1.0.0.GA-1', check_suffix=True)) - - self.assertTrue(ArchDataMapper.check_update('1.0.0.R-5', '1.0.1.GA-1', check_suffix=True)) - - # RCS - self.assertFalse(ArchDataMapper.check_update('1.0.0.R-1', '1.0.0.RC-1', check_suffix=True)) - self.assertFalse(ArchDataMapper.check_update('1.0.0.RE-1', '1.0.0.RC-1', check_suffix=True)) - self.assertFalse(ArchDataMapper.check_update('1.0.0.RELEASE-1', '1.0.0.RC-1', check_suffix=True)) - - self.assertTrue(ArchDataMapper.check_update('1.0.0.R-5', '1.0.1.RC-1', check_suffix=True)) - - # BETA - self.assertFalse(ArchDataMapper.check_update('1.0.0.R-1', '1.0.0.B-2', check_suffix=True)) - self.assertFalse(ArchDataMapper.check_update('1.0.0.RE-1', '1.0.0.B-2', check_suffix=True)) - self.assertFalse(ArchDataMapper.check_update('1.0.0.RELEASE-1', '1.0.0.B-2', check_suffix=True)) - self.assertFalse(ArchDataMapper.check_update('1.0.0.R-1', '1.0.0.BETA-2', check_suffix=True)) - self.assertFalse(ArchDataMapper.check_update('1.0.0.RE-1', '1.0.0.BETA-2', check_suffix=True)) - self.assertFalse(ArchDataMapper.check_update('1.0.0.RELEASE-1', '1.0.0.BETA-2', check_suffix=True)) - - self.assertTrue(ArchDataMapper.check_update('1.0.0.R-5', '1.0.1.BETA-1', check_suffix=True)) - - # ALPHA - self.assertFalse(ArchDataMapper.check_update('1.0.0.R-1', '1.0.0.Alpha-2', check_suffix=True)) - self.assertFalse(ArchDataMapper.check_update('1.0.0.RE-1', '1.0.0.ALPHA-2', check_suffix=True)) - self.assertFalse(ArchDataMapper.check_update('1.0.0.RELEASE-1', '1.0.0.ALPHA-2', check_suffix=True)) - self.assertFalse(ArchDataMapper.check_update('1.0.0.R-1', '1.0.0.ALPHA-2', check_suffix=True)) - self.assertFalse(ArchDataMapper.check_update('1.0.0.RE-1', '1.0.0.ALPHA-2', check_suffix=True)) - self.assertFalse(ArchDataMapper.check_update('1.0.0.RELEASE-1', '1.0.0.ALPHA-2', check_suffix=True)) - self.assertFalse(ArchDataMapper.check_update('1.0.0.R-1', '1.0.0.ALFA-2', check_suffix=True)) - self.assertFalse(ArchDataMapper.check_update('1.0.0.RE-1', '1.0.0.ALFA-2', check_suffix=True)) - self.assertFalse(ArchDataMapper.check_update('1.0.0.RELEASE-1', '1.0.0.ALFA-2', check_suffix=True)) - - self.assertTrue(ArchDataMapper.check_update('1.0.0.R-5', '1.0.1.Alfa-1', check_suffix=True)) - - # DEV - self.assertFalse(ArchDataMapper.check_update('1.0.0.R-1', '1.0.0.DeV-2', check_suffix=True)) - self.assertFalse(ArchDataMapper.check_update('1.0.0.RE-1', '1.0.0.DEV-2', check_suffix=True)) - self.assertFalse(ArchDataMapper.check_update('1.0.0.RELEASE-1', '1.0.0.DEVEL-2', check_suffix=True)) - self.assertFalse(ArchDataMapper.check_update('1.0.0.R-1', '1.0.0.DEV-2', check_suffix=True)) - self.assertFalse(ArchDataMapper.check_update('1.0.0.RE-1', '1.0.0.DEV-2', check_suffix=True)) - self.assertFalse(ArchDataMapper.check_update('1.0.0.RELEASE-1', '1.0.0.DEV-2', check_suffix=True)) - - self.assertTrue(ArchDataMapper.check_update('1.0.0.R-5', '1.0.1.DEV-1', check_suffix=True)) - - def test_check_update_ga(self): - # GA - self.assertFalse(ArchDataMapper.check_update('1.0.0.GA-1', '1.0.0.GE-1', check_suffix=True)) - self.assertTrue(ArchDataMapper.check_update('1.0.0.GE-1', '1.0.0.GA-2', check_suffix=True)) - self.assertTrue(ArchDataMapper.check_update('1.0.0.GA-2', '1.0.1.GA-1', check_suffix=True)) - self.assertFalse(ArchDataMapper.check_update('1.1.0.GE-3', '1.0.6.GE-10', check_suffix=True)) - - # RC - self.assertFalse(ArchDataMapper.check_update('1.0.0.GA-1', '1.0.0.RC-1', check_suffix=True)) - self.assertFalse(ArchDataMapper.check_update('1.0.0.GE-1', '1.0.0.RC-1', check_suffix=True)) - self.assertFalse(ArchDataMapper.check_update('1.0.0.GA-1', '1.0.0.RC-1', check_suffix=True)) - - self.assertTrue(ArchDataMapper.check_update('1.0.0.GE-1', '1.0.1.RC-1', check_suffix=True)) - self.assertTrue(ArchDataMapper.check_update('1.0.10.GA-10', '1.1.0.RC-1', check_suffix=True)) - self.assertFalse(ArchDataMapper.check_update('1.1.0.GE-1', '1.0.1.RC-1', check_suffix=True)) - - # BETA - self.assertFalse(ArchDataMapper.check_update('1.0.0.GA-1', '1.0.0.BETA-1', check_suffix=True)) - self.assertTrue(ArchDataMapper.check_update('1.0.0.GE-1', '1.0.1.BETA-1', check_suffix=True)) - - # ALPHA - self.assertFalse(ArchDataMapper.check_update('1.0.0.GE-1', '1.0.0.ALPHA-1', check_suffix=True)) - self.assertTrue(ArchDataMapper.check_update('1.0.0.GA-1', '1.0.1.ALPHA-1', check_suffix=True)) - - # DEV - self.assertFalse(ArchDataMapper.check_update('1.0.0.GA-1', '1.0.0.DEV-1', check_suffix=True)) - self.assertTrue(ArchDataMapper.check_update('1.0.0.GE-1', '1.0.1.DEV-1', check_suffix=True)) - - def test_check_update_rc(self): - # RC - self.assertFalse(ArchDataMapper.check_update('1.0.0.RC-1', '1.0.0.RC-1')) - self.assertTrue(ArchDataMapper.check_update('1.0.0.RC-1', '1.0.0.RC-2')) - self.assertTrue(ArchDataMapper.check_update('1.0.0.RC-2', '1.0.1.RC-1')) - self.assertFalse(ArchDataMapper.check_update('1.1.0.RC-3', '1.0.6.RC-10')) - - # BETA - self.assertFalse(ArchDataMapper.check_update('1.0.0.RC-1', '1.0.0.BETA-1')) - self.assertTrue(ArchDataMapper.check_update('1.0.0.RC-1', '1.0.1.BETA-1')) - - # ALPHA - self.assertFalse(ArchDataMapper.check_update('1.0.0.RC-1', '1.0.0.ALPHA-1')) - self.assertTrue(ArchDataMapper.check_update('1.0.0.RC-1', '1.0.1.ALPHA-1')) - - # DEV - self.assertFalse(ArchDataMapper.check_update('1.0.0.RC-1', '1.0.0.DEV-1')) - self.assertTrue(ArchDataMapper.check_update('1.0.0.RC-1', '1.0.1.DEV-1')) - - def test_check_update_beta(self): - # BETA - self.assertFalse(ArchDataMapper.check_update('1.0.0.BETA-1', '1.0.0.BETA-1', check_suffix=True)) - self.assertTrue(ArchDataMapper.check_update('1.0.0.BETA-1', '1.0.0.BETA-2', check_suffix=True)) - self.assertTrue(ArchDataMapper.check_update('1.0.0.BETA-2', '1.0.1.B-1', check_suffix=True)) - self.assertFalse(ArchDataMapper.check_update('1.1.0.B-3', '1.0.6.BETA-10', check_suffix=True)) - - # ALPHA - self.assertFalse(ArchDataMapper.check_update('1.0.0.BETA-1', '1.0.0.ALPHA-1', check_suffix=True)) - self.assertTrue(ArchDataMapper.check_update('1.0.0.B-1', '1.0.1.ALPHA-1', check_suffix=True)) - - # DEV - self.assertFalse(ArchDataMapper.check_update('1.0.0.BETA-1', '1.0.0.DEV-1', check_suffix=True)) - self.assertTrue(ArchDataMapper.check_update('1.0.0.B-1', '1.0.1.DEV-1', check_suffix=True)) - - def test_check_update_alpha(self): - # ALPHA - self.assertFalse(ArchDataMapper.check_update('1.0.0.ALPHA-1', '1.0.0.ALPHA-1', check_suffix=True)) - self.assertFalse(ArchDataMapper.check_update('1.0.0.ALPHA-1', '1.0.0.ALFA-1', check_suffix=True)) - self.assertTrue(ArchDataMapper.check_update('1.0.0.ALFA-1', '1.0.0.ALPHA-2', check_suffix=True)) - self.assertTrue(ArchDataMapper.check_update('1.0.0.ALPHA-2', '1.0.1.ALFA-1', check_suffix=True)) - self.assertFalse(ArchDataMapper.check_update('1.1.0.ALFA-3', '1.0.6.ALFA-10', check_suffix=True)) - - # DEV - self.assertFalse(ArchDataMapper.check_update('1.0.0.ALFA-1', '1.0.0.DEV-1', check_suffix=True)) - self.assertTrue(ArchDataMapper.check_update('1.0.0.ALPHA-1', '1.0.1.DEV-1', check_suffix=True)) - - def test_check_update_dev(self): - self.assertFalse(ArchDataMapper.check_update('1.0.0.DEV-1', '1.0.0.DEV-1', check_suffix=True)) - self.assertFalse(ArchDataMapper.check_update('1.0.0.DEV-1', '1.0.0.DEVEL-1', check_suffix=True)) - self.assertFalse(ArchDataMapper.check_update('1.0.0.DEVEL-1', '1.0.0.DEVELOPMENT-1', check_suffix=True)) - self.assertTrue(ArchDataMapper.check_update('1.0.0.DEV-1', '1.0.0.DEVEL-2', check_suffix=True)) - self.assertTrue(ArchDataMapper.check_update('1.0.0.DEVEL-2', '1.0.1.DEV-1', check_suffix=True)) - self.assertFalse(ArchDataMapper.check_update('1.1.0.DEV-3', '1.0.6.DEVELOPMENT-10', check_suffix=True)) - - def test_check_update_unknown_suffix(self): - self.assertTrue(ArchDataMapper.check_update('1.0.0.BALL-1', '1.0.0.TAR-1')) - self.assertFalse(ArchDataMapper.check_update('1.0.0.TAR-1', '1.0.0.BALL-1')) - - def test_check_update_known_and_unknown_suffix(self): - self.assertTrue(ArchDataMapper.check_update('1.0.0.RE-1', '1.0.0.TAR-1')) - self.assertFalse(ArchDataMapper.check_update('1.0.0.TAR-1', '1.0.0.RE-1'))