diff --git a/INSTALL.md b/INSTALL.md index eb4d56e78..58ebbc977 100644 --- a/INSTALL.md +++ b/INSTALL.md @@ -11,6 +11,7 @@ Required: * [Python 3.6 or newer](http://python.org/download) * [PyQt 5.10 or newer](http://www.riverbankcomputing.co.uk/software/pyqt/download) * [Mutagen 1.37 or newer](https://mutagen.readthedocs.io/) +* [PyYAML 5.1 or newer](https://pyyaml.org/) * [python-dateutil](https://dateutil.readthedocs.io/en/stable/) * gettext: * [Windows](https://mlocati.github.io/articles/gettext-iconv-windows.html) diff --git a/picard/script/__init__.py b/picard/script/__init__.py index c4bc21000..9dbbbaa76 100644 --- a/picard/script/__init__.py +++ b/picard/script/__init__.py @@ -44,6 +44,8 @@ from enum import ( import json import uuid +import yaml + from picard.config import get_config from picard.const import ( DEFAULT_FILE_NAMING_FORMAT, @@ -71,14 +73,6 @@ from picard.script.parser import ( # noqa: F401 # pylint: disable=unused-import ) -try: - import yaml - supports_script_package = True -except ImportError: - yaml = None - supports_script_package = False - - class ScriptFunctionDocError(Exception): pass @@ -139,7 +133,7 @@ class ScriptImportError(Exception): super().__init__(*args) -class ScriptLiteral(str): +class MultilineLiteral(str): @staticmethod def yaml_presenter(dumper, data): if data: @@ -147,8 +141,7 @@ class ScriptLiteral(str): return dumper.represent_scalar("tag:yaml.org,2002:str", data, style="|") -if yaml: - yaml.add_representer(ScriptLiteral, ScriptLiteral.yaml_presenter) +yaml.add_representer(MultilineLiteral, MultilineLiteral.yaml_presenter) class PicardScript(): @@ -214,7 +207,7 @@ class PicardScript(): @script.setter def script(self, value): - self._script = ScriptLiteral(value) + self._script = MultilineLiteral(value) @staticmethod def make_last_updated(): @@ -393,6 +386,14 @@ class FileNamingScript(PicardScript): self.license = license self.version = version + @property + def description(self): + return self._description + + @description.setter + def description(self, value): + self._description = MultilineLiteral(value) + def get_file_naming_script_presets(): """Generator of preset example file naming script objects. diff --git a/picard/ui/scripteditor.py b/picard/ui/scripteditor.py index a9631f6a0..8709c1eb2 100644 --- a/picard/ui/scripteditor.py +++ b/picard/ui/scripteditor.py @@ -46,7 +46,6 @@ from picard.script import ( ScriptImportError, ScriptParser, get_file_naming_script_presets, - supports_script_package, ) from picard.util import ( icontheme, @@ -872,7 +871,7 @@ class ScriptEditorDialog(PicardDialog): if not file_content.strip(): self.output_file_error(FILE_ERROR_IMPORT, filename, _('The file was empty')) return - if supports_script_package and file_type == self.FILE_TYPE_PACKAGE: + if file_type == self.FILE_TYPE_PACKAGE: try: script_item = FileNamingScript().create_from_yaml(file_content) except ScriptImportError as error: @@ -907,7 +906,7 @@ class ScriptEditorDialog(PicardDialog): if ext and str(name).endswith('.' + ext): filename = name log.debug('Exporting naming script file: %s' % filename) - if supports_script_package and file_type == self.FILE_TYPE_PACKAGE: + if file_type == self.FILE_TYPE_PACKAGE: script_text = script_item.to_yaml() try: with open(filename, 'w', encoding='utf8') as o_file: @@ -925,12 +924,11 @@ class ScriptEditorDialog(PicardDialog): dialog.exec_() def _get_dialog_filetypes(self): - file_types = [] - if supports_script_package: - file_types.append(self.FILE_TYPE_PACKAGE) - file_types.append(self.FILE_TYPE_SCRIPT) - file_types.append(self.FILE_TYPE_ALL) - return ";;".join(file_types) + return ";;".join(( + self.FILE_TYPE_PACKAGE, + self.FILE_TYPE_SCRIPT, + self.FILE_TYPE_ALL, + )) def reset_script(self): """Reset the script to the last saved value. diff --git a/requirements.txt b/requirements.txt index 54b3a3854..80598872b 100644 --- a/requirements.txt +++ b/requirements.txt @@ -7,4 +7,4 @@ pyobjc-core~=6.2; sys_platform == 'darwin' pyobjc-framework-Cocoa~=6.2; sys_platform == 'darwin' PyQt5~=5.10 pywin32; sys_platform == 'win32' -pyyaml>=5.1 +pyyaml~=5.1