diff --git a/src/python/jw/pkg/App.py b/src/python/jw/pkg/App.py index 32a4db97..af9b9311 100644 --- a/src/python/jw/pkg/App.py +++ b/src/python/jw/pkg/App.py @@ -209,9 +209,8 @@ class App(Base): scope: Scope, names_only: bool, ) -> None: - dep = Dependency(spec) - name = dep.base_name - mod = dep.full_name + name = self.strip_module_from_spec(spec) + mod = re.split('([=><]+)', spec)[0].strip() if names_only: spec = name if spec in buf: diff --git a/src/python/jw/pkg/lib/version/Dependency.py b/src/python/jw/pkg/lib/version/Dependency.py index 01c710c8..8ed8ee3b 100644 --- a/src/python/jw/pkg/lib/version/Dependency.py +++ b/src/python/jw/pkg/lib/version/Dependency.py @@ -22,7 +22,7 @@ class Dependency: # export class Error(ValueError): pass - __SPLIT_RE: ClassVar[re.Pattern[str]] = re.compile('([~=><]+)') @property def __target_prefix(self) -> str: @@ -45,12 +45,6 @@ class Dependency: # export case 3: if not parts[0] or not parts[2]: self.__raise(f'Invalid dependency spec "{self.__spec}"') - if parts[1] not in ('=', '<', '<=', '>', '>='): - self.__raise( - f'Spec "{self.__spec}": unsupported operator ' - f'"{parts[1]}", supported operators are =, <, ' - '<=, > and >=' - ) if parts[2] == 'REVISION': self.__raise( f'Spec "{self.__spec}": a bare REVISION renders as a ' diff --git a/test/unit/python/jw/pkg/lib/version/test.py b/test/unit/python/jw/pkg/lib/version/test.py index 07817f87..91783ae3 100644 --- a/test/unit/python/jw/pkg/lib/version/test.py +++ b/test/unit/python/jw/pkg/lib/version/test.py @@ -40,7 +40,7 @@ assert d.base_name == 'dev' assert d.full_name == 'dev' # Operators with and without whitespace -for op in ['=', '<', '<=', '>', '>=']: +for op in ['=', '==', '<', '<=', '>', '>=']: d = Dependency(f'foo {op} 1.0') assert d.base_name == 'foo' assert d.full_name == 'foo' @@ -135,6 +135,14 @@ d = Dependency('foo = 1.2.3', app.get_version) assert d.constraint_str(as_range = True) == 'foo = 1.2.3' d = Dependency('foo = 1.0-rc1', app.get_version) assert d.constraint_str(as_range = True) == 'foo = 1.0-rc1' +# unimplemented operators raise +d = Dependency('foo == 1.2.3-45', app.get_version) +try: + d.constraint_str(as_range = True) + assert False, 'Should have raised' +except NotImplementedError: + pass + # Default syntax is SEM_VER d = Dependency('foo < 2.0') assert d.constraint_str(untemplated = False) == 'foo < 2.0' @@ -230,26 +238,6 @@ for bad in ['', 'foo =', ' = 1.0']: except Dependency.Error: pass -# Operators outside the supported set are rejected when parsed, -# not folded into the package name or deferred to expansion -for bad in [ - 'foo ~= 1.0', - 'foo~=1.0', - 'foo ~ 1.0', - 'foo != 1.0', - 'foo!=1.0', - 'foo == 1.0', - 'foo==1.0', - 'foo === 1.0', - 'foo << 1.0', - 'foo >> 1.0', -]: - try: - Dependency(bad).full_name - assert False, f'Should have raised for {bad!r}' - except Dependency.Error as e: - assert 'unsupported operator' in str(e) - # str assert str(Dependency('foo-devel >= 1.0')) == 'foo-devel >= 1.0' assert str(Dependency('foo')) == 'foo'