diff --git a/picard/config_upgrade.py b/picard/config_upgrade.py index 8e212e90a..ddada669a 100644 --- a/picard/config_upgrade.py +++ b/picard/config_upgrade.py @@ -430,14 +430,14 @@ def upgrade_to_v2_7_0dev3(config): from picard.script import get_file_naming_script_presets from picard.script.serializer import ( PicardFileNamingScript, - PicardScriptFromFileError, + ScriptSerializerFromFileError, ) scripts = {} for item in config.setting.raw_value('file_naming_scripts') or []: try: script_item = PicardFileNamingScript().create_from_yaml(item, create_new_id=False) scripts[script_item['id']] = script_item.to_dict() - except PicardScriptFromFileError: + except ScriptSerializerFromFileError: log.error("Error converting file naming script") script_list = set(scripts.keys()) | set(map(lambda item: item['id'], get_file_naming_script_presets())) if config.setting['selected_file_naming_script_id'] not in script_list: diff --git a/picard/script/serializer.py b/picard/script/serializer.py index 817a28558..f7b9391d4 100644 --- a/picard/script/serializer.py +++ b/picard/script/serializer.py @@ -49,7 +49,7 @@ from picard.util import make_filename_from_title @unique -class PicardScriptType(IntEnum): +class ScriptSerializerType(IntEnum): """Picard Script object types """ BASE = 0 @@ -57,11 +57,11 @@ class PicardScriptType(IntEnum): FILENAMING = 2 -class PicardScriptError(Exception): - """Base exception class for PicardScript errors""" +class ScriptSerializerError(Exception): + """Base exception class for ScriptSerializer errors""" -class PicardScriptImportExportError(PicardScriptError): +class ScriptSerializerImportExportError(ScriptSerializerError): def __init__(self, *args, format=None, filename=None, error_msg=None): super().__init__(*args) self.format = format @@ -69,16 +69,16 @@ class PicardScriptImportExportError(PicardScriptError): self.error_msg = error_msg -class PicardScriptImportError(PicardScriptImportExportError): +class ScriptSerializerImportError(ScriptSerializerImportExportError): """Exception raised during script import""" -class PicardScriptExportError(PicardScriptImportExportError): +class ScriptSerializerExportError(ScriptSerializerImportExportError): """Exception raised during script export""" -class PicardScriptFromFileError(PicardScriptError): - """Exception raised when converting a file to a PicardScript""" +class ScriptSerializerFromFileError(ScriptSerializerError): + """Exception raised when converting a file to a ScriptSerializer""" class MultilineLiteral(str): @@ -92,12 +92,12 @@ class MultilineLiteral(str): yaml.add_representer(MultilineLiteral, MultilineLiteral.yaml_presenter) -class PicardScript(): +class ScriptSerializer(): """Base class for Picard script objects. """ # Base class developed to support future tagging script class as possible replacement for currently used tuples in config.setting["list_of_scripts"]. - TYPE = PicardScriptType.BASE + TYPE = ScriptSerializerType.BASE OUTPUT_FIELDS = ('title', 'script_language_version', 'script', 'id') # Don't automatically trigger changing the `script_last_updated` property when updating these properties. @@ -238,7 +238,7 @@ class PicardScript(): with open(filename, 'w', encoding='utf-8') as o_file: o_file.write(script_text) except OSError as error: - raise PicardScriptExportError(format=FILE_ERROR_EXPORT, filename=filename, error_msg=error.strerror) + raise ScriptSerializerExportError(format=FILE_ERROR_EXPORT, filename=filename, error_msg=error.strerror) dialog = QtWidgets.QMessageBox( QtWidgets.QMessageBox.Icon.Information, _("Export Script"), @@ -267,14 +267,14 @@ class PicardScript(): with open(filename, 'r', encoding='utf-8') as i_file: file_content = i_file.read() except OSError as error: - raise PicardScriptImportError(format=FILE_ERROR_IMPORT, filename=filename, error_msg=error.strerror) + raise ScriptSerializerImportError(format=FILE_ERROR_IMPORT, filename=filename, error_msg=error.strerror) if not file_content.strip(): - raise PicardScriptImportError(format=FILE_ERROR_IMPORT, filename=filename, error_msg=N_("The file was empty")) + raise ScriptSerializerImportError(format=FILE_ERROR_IMPORT, filename=filename, error_msg=N_("The file was empty")) if file_type == cls._file_types()['package']: try: return cls().create_from_yaml(file_content) - except PicardScriptFromFileError as error: - raise PicardScriptImportError(format=FILE_ERROR_DECODE, filename=filename, error_msg=error) + except ScriptSerializerFromFileError as error: + raise ScriptSerializerImportError(format=FILE_ERROR_DECODE, filename=filename, error_msg=error) else: return cls( title=_("Imported from %s") % filename, @@ -295,9 +295,9 @@ class PicardScript(): """ new_object = cls() if not isinstance(script_dict, Mapping): - raise PicardScriptFromFileError(N_("Argument is not a dictionary")) + raise ScriptSerializerFromFileError(N_("Argument is not a dictionary")) if 'title' not in script_dict or 'script' not in script_dict: - raise PicardScriptFromFileError(N_("Invalid script package")) + raise ScriptSerializerFromFileError(N_("Invalid script package")) new_object.update_from_dict(script_dict) if create_new_id or not new_object['id']: new_object._set_new_id() @@ -339,9 +339,9 @@ class PicardScript(): new_object = cls() yaml_dict = yaml.safe_load(yaml_string) if not isinstance(yaml_dict, dict): - raise PicardScriptFromFileError(N_("File content not a dictionary")) + raise ScriptSerializerFromFileError(N_("File content not a dictionary")) if 'title' not in yaml_dict or 'script' not in yaml_dict: - raise PicardScriptFromFileError(N_("Invalid script package")) + raise ScriptSerializerFromFileError(N_("Invalid script package")) new_object.update_from_dict(yaml_dict) if create_new_id or not new_object['id']: new_object._set_new_id() @@ -379,10 +379,10 @@ class PicardScript(): )) -class PicardTaggingScript(PicardScript): +class PicardTaggingScript(ScriptSerializer): """Picard tagging script class """ - TYPE = PicardScriptType.TAGGER + TYPE = ScriptSerializerType.TAGGER OUTPUT_FIELDS = ('title', 'script_language_version', 'script', 'id') def __init__(self, script='', title='', id=None, last_updated=None, script_language_version=None): @@ -397,10 +397,10 @@ class PicardTaggingScript(PicardScript): super().__init__(script=script, title=title, id=id, last_updated=last_updated, script_language_version=script_language_version) -class PicardFileNamingScript(PicardScript): +class PicardFileNamingScript(ScriptSerializer): """Picard file naming script class """ - TYPE = PicardScriptType.FILENAMING + TYPE = ScriptSerializerType.FILENAMING OUTPUT_FIELDS = ('title', 'description', 'author', 'license', 'version', 'last_updated', 'script_language_version', 'script', 'id') def __init__( diff --git a/picard/ui/options/scripting.py b/picard/ui/options/scripting.py index 714f74bfb..497cdd001 100644 --- a/picard/ui/options/scripting.py +++ b/picard/ui/options/scripting.py @@ -47,8 +47,8 @@ from picard.script import ( save_tagging_scripts_to_config, ) from picard.script.serializer import ( - PicardScriptImportExportError, PicardTaggingScript, + ScriptSerializerImportExportError, ) from picard.ui import ( @@ -151,12 +151,12 @@ class ScriptingOptionsPage(OptionsPage): error_message = _(fmt) % params self.display_error(ScriptFileError(_(title), error_message)) - def output_file_error(self, error: PicardScriptImportExportError): + def output_file_error(self, error: ScriptSerializerImportExportError): """Log file error and display error message dialog. Args: fmt (str): Format for the error type being displayed - error (PicardScriptImportExportError): The error as a PicardScriptImportExportError instance + error (ScriptSerializerImportExportError): The error as a ScriptSerializerImportExportError instance """ params = { 'filename': error.filename, @@ -170,7 +170,7 @@ class ScriptingOptionsPage(OptionsPage): """ try: tagging_script = PicardTaggingScript().import_script(self) - except PicardScriptImportExportError as error: + except ScriptSerializerImportExportError as error: self.output_file_error(error) return if tagging_script: @@ -196,7 +196,7 @@ class ScriptingOptionsPage(OptionsPage): tagging_script = PicardTaggingScript(title=title, script=content) try: tagging_script.export_script(parent=self) - except PicardScriptImportExportError as error: + except ScriptSerializerImportExportError as error: self.output_file_error(error) def enable_tagger_scripts_toggled(self, on): diff --git a/picard/ui/scripteditor.py b/picard/ui/scripteditor.py index 671d27b3c..5aa89c2df 100644 --- a/picard/ui/scripteditor.py +++ b/picard/ui/scripteditor.py @@ -61,7 +61,7 @@ from picard.script import ( ) from picard.script.serializer import ( PicardFileNamingScript, - PicardScriptImportExportError, + ScriptSerializerImportExportError, ) from picard.util import ( get_base_title, @@ -1234,7 +1234,7 @@ class ScriptEditorDialog(PicardDialog, SingletonDialog): """ try: script_item = PicardFileNamingScript().import_script(self) - except PicardScriptImportExportError as error: + except ScriptSerializerImportExportError as error: self.output_file_error(error.format, error.filename, error.error_msg) return if script_item: @@ -1281,7 +1281,7 @@ class ScriptEditorDialog(PicardDialog, SingletonDialog): script_item.title = get_base_title(script_item.title) try: script_item.export_script(parent=self) - except PicardScriptImportExportError as error: + except ScriptSerializerImportExportError as error: self.output_file_error(error.format, error.filename, error.error_msg) def check_formats(self): diff --git a/test/test_script_serializer.py b/test/test_script_serializer.py index 9f4366110..f23f59aa1 100644 --- a/test/test_script_serializer.py +++ b/test/test_script_serializer.py @@ -29,8 +29,8 @@ from test.picardtestcase import PicardTestCase from picard.script.serializer import ( PicardFileNamingScript, - PicardScript, - PicardScriptFromFileError, + ScriptSerializer, + ScriptSerializerFromFileError, ) @@ -43,14 +43,14 @@ class MockDateTime(datetime.datetime): raise Exception("Unexpected parameter tz=%r" % tz) -class PicardScriptTest(PicardTestCase): +class ScriptSerializerTest(PicardTestCase): def assertYamlEquals(self, yaml_str, obj, msg=None): self.assertEqual(obj, yaml.safe_load(yaml_str), msg) def test_script_object_1(self): # Check initial loaded values. - test_script = PicardScript(title='Script 1', script='Script text', id='12345', last_updated='2021-04-26', script_language_version='1.0') + test_script = ScriptSerializer(title='Script 1', script='Script text', id='12345', last_updated='2021-04-26', script_language_version='1.0') self.assertEqual(test_script.id, '12345') self.assertEqual(test_script['id'], '12345') self.assertEqual(test_script.last_updated, '2021-04-26') @@ -59,7 +59,7 @@ class PicardScriptTest(PicardTestCase): def test_script_object_2(self): # Check updating values directly so as not to modify `last_updated`. - test_script = PicardScript(title='Script 1', script='Script text', id='12345', last_updated='2021-04-26') + test_script = ScriptSerializer(title='Script 1', script='Script text', id='12345', last_updated='2021-04-26') test_script.id = '54321' self.assertEqual(test_script.id, '54321') self.assertEqual(test_script['id'], '54321') @@ -73,7 +73,7 @@ class PicardScriptTest(PicardTestCase): def test_script_object_3(self): # Check updating values that are ignored from modifying `last_updated`. - test_script = PicardScript(title='Script 1', script='Script text', id='12345', last_updated='2021-04-26') + test_script = ScriptSerializer(title='Script 1', script='Script text', id='12345', last_updated='2021-04-26') test_script.update_script_setting(id='54321') self.assertEqual(test_script.id, '54321') self.assertEqual(test_script['id'], '54321') @@ -83,7 +83,7 @@ class PicardScriptTest(PicardTestCase): @patch('datetime.datetime', MockDateTime) def test_script_object_4(self): # Check updating values that modify `last_updated`. - test_script = PicardScript(title='Script 1', script='Script text', id='12345', last_updated='2021-04-26') + test_script = ScriptSerializer(title='Script 1', script='Script text', id='12345', last_updated='2021-04-26') test_script.update_script_setting(title='Updated Script 1') self.assertEqual(test_script.title, 'Updated Script 1') self.assertEqual(test_script['title'], 'Updated Script 1') @@ -93,7 +93,7 @@ class PicardScriptTest(PicardTestCase): @patch('datetime.datetime', MockDateTime) def test_script_object_5(self): # Check updating values from dict that modify `last_updated`. - test_script = PicardScript(title='Script 1', script='Script text', id='12345', last_updated='2021-04-26') + test_script = ScriptSerializer(title='Script 1', script='Script text', id='12345', last_updated='2021-04-26') test_script.update_from_dict({"script": "Updated script"}) self.assertEqual(test_script.script, 'Updated script') self.assertEqual(test_script['script'], 'Updated script') @@ -102,7 +102,7 @@ class PicardScriptTest(PicardTestCase): def test_script_object_6(self): # Test that extra (unknown) settings are ignored during updating - test_script = PicardScript(title='Script 1', script='Script text', id='12345', last_updated='2021-04-26', script_language_version='1.0') + test_script = ScriptSerializer(title='Script 1', script='Script text', id='12345', last_updated='2021-04-26', script_language_version='1.0') test_script.update_script_setting(description='Updated description') self.assertEqual(test_script['last_updated'], '2021-04-26') self.assertYamlEquals(test_script.to_yaml(), {"id": "12345", "script": "Script text\n", "script_language_version": "1.0", "title": "Script 1"}) @@ -111,7 +111,7 @@ class PicardScriptTest(PicardTestCase): def test_script_object_7(self): # Test that extra (unknown) settings are ignored during updating from dict - test_script = PicardScript(title='Script 1', script='Script text', id='12345', last_updated='2021-04-26', script_language_version='1.0') + test_script = ScriptSerializer(title='Script 1', script='Script text', id='12345', last_updated='2021-04-26', script_language_version='1.0') test_script.update_from_dict({"description": "Updated description"}) self.assertEqual(test_script['last_updated'], '2021-04-26') self.assertYamlEquals(test_script.to_yaml(), {"id": "12345", "script": "Script text\n", "script_language_version": "1.0", "title": "Script 1"}) @@ -120,14 +120,14 @@ class PicardScriptTest(PicardTestCase): def test_script_object_8(self): # Test that requested unknown settings return None - test_script = PicardScript(title='Script 1', script='Script text', id='12345', last_updated='2021-04-26') + test_script = ScriptSerializer(title='Script 1', script='Script text', id='12345', last_updated='2021-04-26') self.assertEqual(test_script['unknown_setting'], None) def test_script_object_9(self): # Test that an exception is raised when creating or updating using an invalid YAML string - with self.assertRaises(PicardScriptFromFileError): - PicardScript().create_from_yaml('Not a YAML string') - PicardScript(title='Script 1', script='Script text', id='12345', last_updated='2021-04-26', script_language_version='1.0') + with self.assertRaises(ScriptSerializerFromFileError): + ScriptSerializer().create_from_yaml('Not a YAML string') + ScriptSerializer(title='Script 1', script='Script text', id='12345', last_updated='2021-04-26', script_language_version='1.0') def test_naming_script_object_1(self): # Check initial loaded values.