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): version = Version(*version) return version.to_string(short=short)
def test_ne(self): v1 = Version(2, 3, 0, 'alpha', 1) v2 = Version(2, 3, 0, 'a', 1) v3 = Version(2, 3, 0, 'final', 1) self.assertFalse(v1 != v1) self.assertFalse(v1 != v2) self.assertTrue(v1 != v3)
def test_eq(self): v1 = Version(2, 3, 0, 'alpha', 1) v2 = Version(2, 3, 0, 'a', 1) v3 = Version(2, 3, 0, 'final', 1) self.assertEqual(v1, v1) self.assertEqual(v1, v2) self.assertFalse(v1 == v3)
def test_lt(self): v1 = Version(2, 3, 0, 'dev', 1) v2 = Version(2, 3, 0, 'alpha', 1) 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_version_conversion(self): versions = ( (Version(1, 1, 0, 'final', 0), '1.1.0.final0'), (Version(0, 0, 1, 'dev', 1), '0.0.1.dev1'), (Version(1, 1, 0, 'dev', 0), '1.1.0.dev0'), (Version(999, 999, 999, 'dev', 999), '999.999.999.dev999'), (Version(1, 1, 2, 'alpha', 2), '1.1.2.alpha2'), (Version(1, 1, 2, 'a', 2), '1.1.2.alpha2'), (Version(1, 1, 2, 'beta', 2), '1.1.2.beta2'), (Version(1, 1, 2, 'b', 2), '1.1.2.beta2'), (Version(1, 1, 2, 'rc', 2), '1.1.2.rc2'), ) for v, s in versions: self.assertEqual(version_to_string(v), s) self.assertEqual(str(v), s) self.assertEqual(v, Version.from_string(s)) self.assertEqual(v, version_from_string(s))
def _backup_settings(self): if Version(0, 0, 0) < self._version < PICARD_VERSION: backup_path = self._versioned_config_filename() log.info('Backing up config file to %s', backup_path) try: shutil.copyfile(self.fileName(), backup_path) except OSError: log.error('Failed backing up config file to %s', backup_path)
def test_version_conversion_short(self): versions = ( (Version(1, 1, 0, 'final', 0), '1.1'), (Version(1, 1, 1, 'final', 0), '1.1.1'), (Version(0, 0, 1, 'dev', 1), '0.0.1.dev1'), (Version(1, 1, 0, 'dev', 0), '1.1.0.dev0'), (Version(1, 1, 2, 'alpha', 2), '1.1.2a2'), (Version(1, 1, 2, 'a', 2), '1.1.2a2'), (Version(1, 1, 2, 'beta', 2), '1.1.2b2'), (Version(1, 1, 2, 'b', 2), '1.1.2b2'), (Version(1, 1, 2, 'rc', 2), '1.1.2rc2'), ) for v, s in versions: self.assertEqual(version_to_string(v, short=True), s) self.assertEqual(v.to_string(short=True), s) self.assertEqual(v, Version.from_string(s)) self.assertEqual(v, version_from_string(s))
def register_upgrade_hook(self, func, *args): """Register a function to upgrade from one config version to another""" to_version = Version.from_string(func.__name__) assert to_version <= PICARD_VERSION, "%r > %r !!!" % (to_version, PICARD_VERSION) self._upgrade_hooks[to_version] = { 'func': func, 'args': args, 'done': False }
def __initialize(self): """Common initializer method for :meth:`from_app` and :meth:`from_file`.""" self.application = ConfigSection(self, "application") self.setting = ConfigSection(self, "setting") self.persist = ConfigSection(self, "persist") self.profile = ConfigSection(self, "profile/default") self.current_preset = "default" TextOption("application", "version", '0.0.0dev0') self._version = Version.from_string(self.application["version"]) self._upgrade_hooks = dict()
def __initialize(self): """Common initializer method for :meth:`from_app` and :meth:`from_file`.""" self.setAtomicSyncRequired(False) # See comment in event() self.application = ConfigSection(self, "application") self.profiles = ConfigSection(self, "profiles") self.setting = SettingConfigSection(self, "setting") self.persist = ConfigSection(self, "persist") TextOption("application", "version", '0.0.0dev0') self._version = Version.from_string(self.application["version"]) self._upgrade_hooks = dict()
def run_upgrade_hooks(self, outputfunc=None): """Executes registered functions to upgrade config version to the latest""" if self._version == Version(0, 0, 0, 'dev', 0): # This is a freshly created config self._version = PICARD_VERSION self._write_version() return if not self._upgrade_hooks: return if self._version >= PICARD_VERSION: if self._version > PICARD_VERSION: print("Warning: config file %s was created by a more recent " "version of Picard (current is %s)" % ( self._version.to_string(), PICARD_VERSION.to_string() )) return for version in sorted(self._upgrade_hooks): hook = self._upgrade_hooks[version] if self._version < version: try: if outputfunc and hook['func'].__doc__: outputfunc("Config upgrade %s -> %s: %s" % ( self._version.to_string(), version.to_string(), hook['func'].__doc__.strip())) hook['func'](self, *hook['args']) except BaseException: import traceback raise ConfigUpgradeError( "Error during config upgrade from version %s to %s " "using %s():\n%s" % ( self._version.to_string(), version.to_string(), hook['func'].__name__, traceback.format_exc() )) else: hook['done'] = True self._version = version self._write_version() else: # hook is not applicable, mark as done hook['done'] = True if all(map(itemgetter("done"), self._upgrade_hooks.values())): # all hooks were executed, ensure config is marked with latest version self._version = PICARD_VERSION self._write_version()
def _display_results(self): # Display results to user. key = '' high_version = PICARD_VERSION for test_key in PROGRAM_UPDATE_LEVELS: update_level = PROGRAM_UPDATE_LEVELS[test_key]['name'] version_tuple = self._available_versions.get(update_level, {}).get( 'version', (0, 0, 0, '')) try: test_version = Version(*version_tuple) except (TypeError, VersionError): log.error('Invalid version %r for update level %s.' % (version_tuple, update_level)) continue if self._update_level >= test_key and test_version > high_version: key = PROGRAM_UPDATE_LEVELS[test_key]['name'] high_version = test_version if key: if QMessageBox.information( self._parent, _("Picard Update"), _("A new version of Picard is available.\n\n" "This version: {picard_old_version}\n" "New version: {picard_new_version}\n\n" "Would you like to download the new version?").format( picard_old_version=PICARD_FANCY_VERSION_STR, picard_new_version=self._available_versions[key] ['tag']), QMessageBox.StandardButton.Ok | QMessageBox.StandardButton.Cancel, QMessageBox. StandardButton.Cancel) == QMessageBox.StandardButton.Ok: webbrowser2.open( self._available_versions[key]['urls']['download']) else: if self._show_always: if self._update_level in PROGRAM_UPDATE_LEVELS: update_level = PROGRAM_UPDATE_LEVELS[ self._update_level]['title'] else: update_level = N_('unknown') QMessageBox.information( self._parent, _("Picard Update"), _("There is no update currently available for your subscribed update level: {update_level}\n\n" "Your version: {picard_old_version}\n").format( update_level=_(update_level), picard_old_version=PICARD_FANCY_VERSION_STR, ), QMessageBox.StandardButton.Ok, QMessageBox.StandardButton.Ok)
def test_compatible_api_version(self): # use first element from picard.api_versions, it should be compatible api_versions = picard.api_versions[:1] expected = set([Version.from_string(v) for v in api_versions]) result = _compatible_api_versions(api_versions) self.assertEqual(result, expected) # pretty sure 0.0 isn't compatible api_versions = ["0.0"] expected = set() result = _compatible_api_versions(api_versions) self.assertEqual(result, expected) # buggy version api_versions = ["0.a"] with self.assertRaises(VersionError): result = _compatible_api_versions(api_versions)
def __initialize(self): """Common initializer method for :meth:`from_app` and :meth:`from_file`.""" self.application = ConfigSection(self, "application") self.setting = ConfigSection(self, "setting") self.persist = ConfigSection(self, "persist") self.profile = ConfigSection(self, "profile/default") self.current_preset = "default" TextOption("application", "version", '0.0.0dev0') self._version = Version.from_string(self.application["version"]) self._upgrade_hooks = dict() # Save known config names for faster access and to prevent # strange cases of Qt locking up when accessing QSettings.allKeys() # or QSettings.contains() shortly after having written settings # inside threads. # See https://tickets.metabrainz.org/browse/PICARD-1590 self.__known_keys = set(self.allKeys())
def version(self): try: return Version.from_string(self.__dict__['version']) except (KeyError, VersionError): return Version(0, 0, 0)
def version(self): try: return Version.from_string(self.data['PLUGIN_VERSION']) except (KeyError, VersionError): return Version(0, 0, 0)
def _compatible_api_versions(api_versions): versions = [Version.from_string(v) for v in list(api_versions)] return set(versions) & set(picard.api_versions_tuple)
def version_to_string(version, short=False): if len(version) != 5: raise VersionError("Length != 5") if not isinstance(version, Version): version = Version(*version) return version.to_string(short=short)
def test_sortkey(self): self.assertEqual((2, 1, 3, 4, 2), Version(2, 1, 3, 'final', 2).sortkey) self.assertEqual((2, 0, 0, 1, 0), Version(2, 0, 0, 'a', 0).sortkey) self.assertEqual((2, 0, 0, 1, 0), Version(2, 0, 0, 'alpha', 0).sortkey)
def test_le(self): v1 = Version(2, 3, 0, 'dev', 1) v2 = Version(2, 3, 0, 'alpha', 1) self.assertLessEqual(v1, v2) self.assertLessEqual(v2, v2)
def test_gt(self): v1 = Version(2, 3, 0, 'alpha', 1) v2 = Version(2, 3, 0, 'dev', 1) self.assertGreater(v1, v2) self.assertFalse(v2 > v2)
def test_ge(self): v1 = Version(2, 3, 0, 'alpha', 1) v2 = Version(2, 3, 0, 'dev', 1) self.assertGreaterEqual(v1, v2) self.assertGreaterEqual(v2, v2)
# # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. from picard.version import ( Version, VersionError, ) PICARD_ORG_NAME = "MusicBrainz" PICARD_APP_NAME = "Picard" PICARD_DISPLAY_NAME = "MusicBrainz Picard" PICARD_APP_ID = "org.musicbrainz.Picard" PICARD_DESKTOP_NAME = PICARD_APP_ID + ".desktop" PICARD_VERSION = Version(2, 7, 0, 'dev', 3) # optional build version # it should be in the form '<platform>_<YYMMDDHHMMSS>' # ie. win32_20140415091256 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): version = Version(*version) return version.to_string(short=short)
def test_version_single_digit(self): l, s = (2, 0, 0, 'final', 0), '2' self.assertEqual(l, version_from_string(s)) self.assertEqual(l, Version(2))
def version_from_string(version_str): """Deprecated: Use picard.version.Version.from_string instead""" return Version.from_string(version_str)
# # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. from picard.version import ( Version, VersionError, ) PICARD_ORG_NAME = "MusicBrainz" PICARD_APP_NAME = "Picard" PICARD_DISPLAY_NAME = "MusicBrainz Picard" PICARD_APP_ID = "org.musicbrainz.Picard" PICARD_DESKTOP_NAME = PICARD_APP_ID + ".desktop" PICARD_VERSION = Version(2, 3, 2, 'final', 0) # optional build version # it should be in the form '<platform>_<YYMMDDHHMMSS>' # ie. win32_20140415091256 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): version = Version(*version) return version.to_string(short=short)