def test_notImplementedComparisons(self): """ Comparing a L{Version} to some other object type results in C{NotImplemented}. """ va = Version("dummy", 1, 0, 0) vb = ("dummy", 1, 0, 0) # a tuple is not a Version object self.assertEqual(va.__cmp__(vb), NotImplemented) # type: ignore[operator]
def test_notImplementedComparisons(self): """ Comparing a L{Version} to some other object type results in C{NotImplemented}. """ va = Version("dummy", 1, 0, 0) vb = ("dummy", 1, 0, 0) # a tuple is not a Version object self.assertEqual(va.__cmp__(vb), NotImplemented)
class AppVersion(Entity): """Track application versions""" implements(IDroneModelAppVersion) description = property( lambda self: "%s %s" % \ (self.app.name, self.version_string) ) serializable = True def __getattribute__(self, name): """Overrode to fulfill Interface Obligations""" if name in ('package','major','minor','micro','prerelease','base',\ 'short'): return self.version.__getattribute__(name) return object.__getattribute__(self, name) def __init__(self, *args, **kwargs): self.version = Version(*args, **kwargs) self.app = IDroneModelApp(self.version) @property def version_string(self): """makes a nice version string that we can use for reconstruction""" result = '.'.join([ str(self.major), str(self.minor), str(self.micro), ]) if self.prerelease: result += '.%s' % str(self.prerelease) return result def __getstate__(self): return { 'app' : self.package, 'version' : self.version_string, #for proper serialization } def __cmp__(self, other): """overrode for easy comparison of AppVersion to AppVersion and Version to AppVersion. @raise IncomparableVersions: when the package names of the versions differ. @param other L{twisted.python.versions.Version}, L{IDroneModelAppVersion}, or object @return C{int} of value -1, 0, or 1 """ try: if IDroneModelAppVersion.providedBy(other): return self.version.__cmp__(other.version) except IncomparableVersions: raise except: pass if isinstance(other, Version): return self.version.__cmp__(other) return object.__cmp__(self, other) @staticmethod def makeAppVersion(name, version): """Similar to ``makeArgs`` @return L{IDroneModelAppVersion} provider """ args, kwargs = AppVersion.makeArgs(name, version) return AppVersion(*args, **kwargs) @staticmethod def makeVersion(name, version): """Similar to ``makeArgs`` @return L{twisted.python.versions.Version} """ args, kwargs = AppVersion.makeArgs(name, version) return Version(*args, **kwargs) @staticmethod def versionExists(name, version): """check if this L{IDroneModelAppVersion} provider exists""" args, kwargs = AppVersion.makeArgs(name, version) return AppVersion.exists(*args, **kwargs) @staticmethod def makeArgs(name, version): """goes through great lengths to make args for use by a constructor for class types - L{IDroneModelAppVersion} providers or L{twisted.python.versions.Version}. @raises TypeError - if version is not convertable @param name C{str} @param version C{str}, C{list}, C{tuple}, or L{twisted.python.versions.Version} @return ((name, major, minor, micro), {'prerelease': prerelease}) """ default = [0,0,0,0] #last number denotes pre-release if isinstance(version, Version): if version.package == name: return ( (name, version.major, version.minor, version.micro), {'prerelease': version.prerelease} ) else: version = [] if isinstance(version, str): version = version.split('.') elif isinstance(version, tuple): version = list(version) elif isinstance(version, type(None)): version = [] else: raise TypeError('Unacceptable version input %s' % type(version)) version = version + default #pad the length for comparisons v = [ i[0] for i in zip(version, default) ] kwargs = {'prerelease': None} try: #don't try too hard to get this right if len(v) == 4 and v[3]: kwargs['prerelease'] = int(v[3]) except: pass return (tuple((name,) + tuple([int(i) for i in v[0:3]])), kwargs) @staticmethod def construct(state): name = state['app'] appversion = AppVersion.makeAppVersion(name, state['version']) return appversion
class AppVersion(Entity): """Track application versions""" implements(IDroneModelAppVersion) description = property( lambda self: "%s %s" % \ (self.app.name, self.version_string) ) serializable = True def __getattribute__(self, name): """Overrode to fulfill Interface Obligations""" if name in ('package','major','minor','micro','prerelease','base',\ 'short'): return self.version.__getattribute__(name) return object.__getattribute__(self, name) def __init__(self, *args, **kwargs): self.version = Version(*args, **kwargs) self.app = IDroneModelApp(self.version) @property def version_string(self): """makes a nice version string that we can use for reconstruction""" result = '.'.join([ str(self.major), str(self.minor), str(self.micro), ]) if self.prerelease: result += '.%s' % str(self.prerelease) return result def __getstate__(self): return { 'app': self.package, 'version': self.version_string, #for proper serialization } def __cmp__(self, other): """overrode for easy comparison of AppVersion to AppVersion and Version to AppVersion. @raise IncomparableVersions: when the package names of the versions differ. @param other L{twisted.python.versions.Version}, L{IDroneModelAppVersion}, or object @return C{int} of value -1, 0, or 1 """ try: if IDroneModelAppVersion.providedBy(other): return self.version.__cmp__(other.version) except IncomparableVersions: raise except: pass if isinstance(other, Version): return self.version.__cmp__(other) return object.__cmp__(self, other) @staticmethod def makeAppVersion(name, version): """Similar to ``makeArgs`` @return L{IDroneModelAppVersion} provider """ args, kwargs = AppVersion.makeArgs(name, version) return AppVersion(*args, **kwargs) @staticmethod def makeVersion(name, version): """Similar to ``makeArgs`` @return L{twisted.python.versions.Version} """ args, kwargs = AppVersion.makeArgs(name, version) return Version(*args, **kwargs) @staticmethod def versionExists(name, version): """check if this L{IDroneModelAppVersion} provider exists""" args, kwargs = AppVersion.makeArgs(name, version) return AppVersion.exists(*args, **kwargs) @staticmethod def makeArgs(name, version): """goes through great lengths to make args for use by a constructor for class types - L{IDroneModelAppVersion} providers or L{twisted.python.versions.Version}. @raises TypeError - if version is not convertable @param name C{str} @param version C{str}, C{list}, C{tuple}, or L{twisted.python.versions.Version} @return ((name, major, minor, micro), {'prerelease': prerelease}) """ default = [0, 0, 0, 0] #last number denotes pre-release if isinstance(version, Version): if version.package == name: return ((name, version.major, version.minor, version.micro), { 'prerelease': version.prerelease }) else: version = [] if isinstance(version, str): version = version.split('.') elif isinstance(version, tuple): version = list(version) elif isinstance(version, type(None)): version = [] else: raise TypeError('Unacceptable version input %s' % type(version)) version = version + default #pad the length for comparisons v = [i[0] for i in zip(version, default)] kwargs = {'prerelease': None} try: #don't try too hard to get this right if len(v) == 4 and v[3]: kwargs['prerelease'] = int(v[3]) except: pass return (tuple((name, ) + tuple([int(i) for i in v[0:3]])), kwargs) @staticmethod def construct(state): name = state['app'] appversion = AppVersion.makeAppVersion(name, state['version']) return appversion