diff --git a/picard/__init__.py b/picard/__init__.py index 93ce11c5a..38adc9ade 100644 --- a/picard/__init__.py +++ b/picard/__init__.py @@ -38,6 +38,7 @@ PICARD_BUILD_VERSION_STR = "" def version_to_string(version, short=False): + """Deprecated: Use picard.version.Version.to_string instead""" if len(version) != 5: raise VersionError("Length != 5") if not isinstance(version, Version): diff --git a/picard/plugin.py b/picard/plugin.py index f4724b79b..e06a7d80c 100644 --- a/picard/plugin.py +++ b/picard/plugin.py @@ -27,6 +27,10 @@ from picard import ( log, ) from picard.const import USER_PLUGIN_DIR +from picard.version import ( + Version, + VersionError, +) _PLUGIN_MODULE_PREFIX = "picard.plugins." @@ -129,9 +133,9 @@ class PluginWrapper(PluginShared): @property def version(self): try: - return self.data['PLUGIN_VERSION'] - except KeyError: - return "" + return Version.from_string(self.data['PLUGIN_VERSION']) + except (KeyError, VersionError): + return Version(0, 0, 0) @property def api_versions(self): @@ -186,6 +190,13 @@ class PluginData(PluginShared): log.debug('Attribute %r not found for plugin %r', name, self.module_name) return None + @property + def version(self): + try: + return Version.from_string(self.__dict__['version']) + except (KeyError, VersionError): + return Version(0, 0, 0) + @property def files_list(self): return ", ".join(self.files.keys()) diff --git a/picard/pluginmanager.py b/picard/pluginmanager.py index ff53bb1c3..800223dfc 100644 --- a/picard/pluginmanager.py +++ b/picard/pluginmanager.py @@ -31,11 +31,7 @@ import zipimport from PyQt5 import QtCore -from picard import ( - VersionError, - log, - version_to_string, -) +from picard import log from picard.const import ( PLUGINS_API, USER_PLUGIN_DIR, @@ -47,7 +43,10 @@ from picard.plugin import ( _unregister_module_extensions, ) import picard.plugins -from picard.version import Version +from picard.version import ( + Version, + VersionError, +) _SUFFIXES = tuple(importlib.machinery.all_suffixes()) @@ -272,7 +271,7 @@ class PluginManager(QtCore.QObject): log.debug("Loading plugin %r version %s, compatible with API: %s", plugin.name, plugin.version, - ", ".join([version_to_string(v, short=True) for v in + ", ".join([v.to_string(short=True) for v in sorted(compatible_versions)])) plugin.compatible = True setattr(picard.plugins, name, plugin_module) diff --git a/picard/ui/options/plugins.py b/picard/ui/options/plugins.py index b4fe07c41..ba648b1f2 100644 --- a/picard/ui/options/plugins.py +++ b/picard/ui/options/plugins.py @@ -130,7 +130,7 @@ class PluginTreeWidgetItem(HashableTreeWidgetItem): button.hide() else: button.show() - button.setToolTip(_("Download and upgrade plugin to version %s") % self.new_version) + button.setToolTip(_("Download and upgrade plugin to version %s") % self.new_version.to_string(short=True)) self.set_icon(button, 'SP_BrowserReload') def show_enable(self, button, mode): @@ -319,7 +319,7 @@ class PluginsOptionsPage(OptionsPage): new_version = None if plugin.module_name in available_plugins: latest = available_plugins[plugin.module_name] - if latest.split('.') > plugin.version.split('.'): + if latest > plugin.version: new_version = latest self.update_plugin_item(None, plugin, enabled=self.is_plugin_enabled(plugin), @@ -472,9 +472,10 @@ class PluginsOptionsPage(OptionsPage): def update_text(): if item.new_version is not None: - version = "%s → %s" % (plugin.version, item.new_version) + version = "%s → %s" % (plugin.version.to_string(short=True), + item.new_version.to_string(short=True)) else: - version = plugin.version + version = plugin.version.to_string(short=True) if item.installed_font is None: item.installed_font = item.font(COLUMN_NAME) @@ -561,7 +562,7 @@ class PluginsOptionsPage(OptionsPage): return int(elem) except ValueError: return 0 - item.setSortData(COLUMN_VERSION, tuple(v2int(e) for e in plugin.version.split('.'))) + item.setSortData(COLUMN_VERSION, plugin.version) return item diff --git a/test/test_versions.py b/test/test_versions.py index 5a043266c..c60cde7af 100644 --- a/test/test_versions.py +++ b/test/test_versions.py @@ -116,6 +116,10 @@ class VersionsTest(PicardTestCase): self.assertLess(v1, v2) self.assertFalse(v2 < v2) + v1 = Version(2, 3, 0, 'final', 1) + v2 = Version(2, 10, 0, 'final', 1) + self.assertLess(v1, v2) + def test_le(self): v1 = Version(2, 3, 0, 'dev', 1) v2 = Version(2, 3, 0, 'alpha', 1)