Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 10 additions & 0 deletions picard/tags/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,7 @@

import re

from picard.config import get_config
from picard.const.tags import ALL_TAGS


Expand Down Expand Up @@ -126,3 +127,12 @@ def display_tag_tooltip(name):

def display_tag_full_description(name):
return ALL_TAGS.display_full_description(name)


def remove_disabled_plugin_tags():
config = get_config()
plugins = config.setting['enabled_plugins']
tvs = [tv for tv in ALL_TAGS if (lambda x: x.plugin_id)(tv)]
for tv in tvs:
if tv.plugin_id not in plugins:
ALL_TAGS.remove(tv)
10 changes: 9 additions & 1 deletion picard/tags/tagvar.py
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,7 @@
except ImportError:
markdown = None

from picard.config import get_config
from picard.i18n import (
N_,
gettext as _,
Expand Down Expand Up @@ -83,7 +84,7 @@ def __init__(
self, name, shortdesc=None, longdesc=None, additionaldesc=None,
is_preserved=False, is_hidden=False, is_script_variable=True, is_tag=True, is_calculated=False,
is_file_info=False, is_from_mb=True, is_populated_by_picard=True, is_multi_value=False,
see_also=None, related_options=None, doc_links=None
see_also=None, related_options=None, doc_links=None, plugin_id=None
):
"""
shortdesc: Short description (typically one or two words) in title case that is suitable
Expand All @@ -106,6 +107,7 @@ def __init__(
see_also: an iterable containing ids of related tags
related_options: an iterable containing the related option settings (see picard/options.py)
doc_links: an iterable containing links to external documentation (DocumentLink tuples)
plugin_id: the ID of the plugin providing the tag/variable (string, default: None)
"""
self._name = name
self._shortdesc = shortdesc
Expand All @@ -123,6 +125,7 @@ def __init__(
self.see_also = see_also
self.related_options = related_options
self.doc_links = doc_links
self.plugin_id = plugin_id

@property
def shortdesc(self):
Expand Down Expand Up @@ -336,6 +339,11 @@ def display_full_description(self, tagname):
return self._format_display(name, content, tagdesc)

def names(self, selector=None):
config = get_config()
plugins = config.setting['enabled_plugins'] if 'enabled_plugins' in config.setting else []

for item in self._items:
if item.plugin_id and item.plugin_id not in plugins:
continue
if selector is None or selector(item):
yield str(item)
2 changes: 2 additions & 0 deletions picard/ui/options/plugins.py
Original file line number Diff line number Diff line change
Expand Up @@ -55,6 +55,7 @@
N_,
gettext as _,
)
from picard.tags import remove_disabled_plugin_tags
from picard.util import (
icontheme,
open_local_path,
Expand Down Expand Up @@ -603,6 +604,7 @@ def v2int(elem):
def save(self):
config = get_config()
config.setting['enabled_plugins'] = self.enabled_plugins()
remove_disabled_plugin_tags()
self.save_state()

def refresh_details(self, item):
Expand Down
29 changes: 29 additions & 0 deletions test/test_tags.py
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,7 @@
display_tag_tooltip,
parse_comment_tag,
parse_subtag,
remove_disabled_plugin_tags,
script_variable_tag_names,
)
from picard.tags.tagvar import (
Expand All @@ -59,6 +60,13 @@ def _translate_patch(s):
return f"_({s})"


class _config_patch():
setting = {'enabled_plugins': ['plugin_id']}

def __init__(self):
pass


class TagVarTest(PicardTestCase):
def test_basic_properties(self):
tv = TagVar('name')
Expand Down Expand Up @@ -132,6 +140,7 @@ def setUp(self):
is_file_info=True, is_hidden=True, is_script_variable=False)
self.tagvar_notes2 = TagVar('notes2', shortdesc='notes2_sd', longdesc='notes2_ld', is_file_info=True, is_from_mb=False)
self.tagvar_notes3 = TagVar('notes3', shortdesc='notes3_sd', longdesc='notes3_ld', is_from_mb=False)
self.tagvar_plugin = TagVar('plugin', shortdesc='plugin_sd', longdesc='plugin_ld', plugin_id='plugin_id')
self.tagvar_everything = TagVar('everything', shortdesc='everything sd', longdesc='everything ld.',
additionaldesc='Test additional description.', is_preserved=True,
is_script_variable=False, is_tag=False, is_calculated=True, is_file_info=True, is_from_mb=False,
Expand Down Expand Up @@ -531,3 +540,23 @@ def test_links_completeness(self):
link = doc_link.link.strip()
self.assertNotEqual(title, '', f"Invalid link (missing title) in '{str(tv)}' tag")
self.assertNotEqual(link, '', f"Invalid link (missing URL) in '{str(tv)}' tag")


class TagsPluginsTest(PicardTestCase):
def setUp(self):
self.tagvar_plugin_known = TagVar('known', shortdesc='known_sd', plugin_id='plugin_id')
self.tagvar_plugin_unknown = TagVar('unknown', shortdesc='unknown_sd', plugin_id='unknown_plugin_id')

def test_cleaning_plugin_var(self):
tagvars = TagVars(
self.tagvar_plugin_known,
self.tagvar_plugin_unknown,
)
self.assertEqual(len(tagvars), 2)

with mock.patch('picard.tags.get_config', return_value=_config_patch()):
with mock.patch('picard.tags.ALL_TAGS', tagvars):
remove_disabled_plugin_tags()
self.assertEqual(len(tagvars), 1)

self.assertEqual(tagvars[0], self.tagvar_plugin_known)
Loading