1
mirror of https://github.com/streamlink/streamlink synced 2024-09-28 13:05:55 +02:00

options: remove deprecated global plugin arguments

This commit is contained in:
bastimeyer 2022-12-16 08:34:57 +01:00 committed by Sebastian Meyer
parent a50fb70e2b
commit 5c8c0b213c
5 changed files with 22 additions and 69 deletions

View File

@ -1,8 +1,5 @@
import warnings
from typing import Any, Callable, ClassVar, Dict, Iterator, Mapping, Optional, Sequence, Union
from streamlink.exceptions import StreamlinkDeprecationWarning
class Options:
"""
@ -106,7 +103,6 @@ class Argument:
sensitive: bool = False,
argument_name: Optional[str] = None,
dest: Optional[str] = None,
is_global: bool = False,
**options,
):
"""
@ -117,7 +113,6 @@ class Argument:
:param sensitive: Whether the argument is sensitive (passwords, etc.) and should be masked
:param argument_name: Custom CLI argument name without plugin name prefix
:param dest: Custom plugin option name
:param is_global: Whether this plugin argument refers to a global CLI argument (deprecated)
:param options: Arguments passed to :meth:`ArgumentParser.add_argument()`, excluding ``requires`` and ``dest``
"""
@ -131,15 +126,6 @@ class Argument:
self.prompt = prompt
self.sensitive = sensitive
self._default = options.get("default")
self.is_global = is_global
if is_global:
warnings.warn(
"Defining global plugin arguments is deprecated. Use the session options instead.",
StreamlinkDeprecationWarning,
# set stacklevel to 3 because of the @pluginargument decorator
# which is the public interface for defining plugin arguments
stacklevel=3,
)
@staticmethod
def _normalize_name(name: str) -> str:
@ -153,7 +139,7 @@ class Argument:
return self._argument_name or self._normalize_name(f"{plugin}-{self.name}")
def argument_name(self, plugin):
return f"--{self.name if self.is_global else self._name(plugin)}"
return f"--{self._name(plugin)}"
def namespace_dest(self, plugin):
return self._normalize_dest(self._name(plugin))

View File

@ -708,7 +708,6 @@ def pluginargument(
sensitive: bool = False,
argument_name: Optional[str] = None,
dest: Optional[str] = None,
is_global: bool = False,
**options,
) -> Callable[[Type[Plugin]], Type[Plugin]]:
"""
@ -746,7 +745,6 @@ def pluginargument(
sensitive=sensitive,
argument_name=argument_name,
dest=dest,
is_global=is_global,
**options,
)

View File

@ -711,7 +711,7 @@ def setup_streamlink():
def setup_plugin_args(session: Streamlink, parser: ArgumentParser):
"""Sets Streamlink plugin options."""
"""Adds plugin argument data to the argument parser and sets default plugin options."""
plugin_args = parser.add_argument_group("Plugin options")
for pname, plugin in session.plugins.items():
@ -719,16 +719,8 @@ def setup_plugin_args(session: Streamlink, parser: ArgumentParser):
group = parser.add_argument_group(pname.capitalize(), parent=plugin_args)
for parg in plugin.arguments or []:
if not parg.is_global:
group.add_argument(parg.argument_name(pname), **parg.options)
defaults[parg.dest] = parg.default
else:
pargdest = parg.dest
for action in parser._actions:
# find matching global argument
if pargdest != action.dest:
continue
defaults[pargdest] = action.default
group.add_argument(parg.argument_name(pname), **parg.options)
defaults[parg.dest] = parg.default
plugin.options = PluginOptions(defaults)
@ -744,20 +736,19 @@ def setup_plugin_options(session: Streamlink, pluginname: str, pluginclass: Type
if parg.options.get("help") == argparse.SUPPRESS:
continue
value = getattr(args, parg.dest if parg.is_global else parg.namespace_dest(pluginname))
value = getattr(args, parg.namespace_dest(pluginname))
session.set_plugin_option(pluginname, parg.dest, value)
if not parg.is_global:
if parg.required:
required[parg.name] = parg
# if the value is set, check to see if any of the required arguments are not set
if parg.required or value:
try:
for rparg in pluginclass.arguments.requires(parg.name):
required[rparg.name] = rparg
except RuntimeError:
log.error(f"{pluginname} plugin has a configuration error and the arguments cannot be parsed")
break
if parg.required:
required[parg.name] = parg
# if the value is set, check to see if any of the required arguments are not set
if parg.required or value:
try:
for rparg in pluginclass.arguments.requires(parg.name):
required[rparg.name] = rparg
except RuntimeError:
log.error(f"{pluginname} plugin has a configuration error and the arguments cannot be parsed")
break
if required:
for req in required.values():

View File

@ -4,7 +4,6 @@ from unittest.mock import Mock, patch
import pytest
from streamlink.exceptions import StreamlinkDeprecationWarning
from streamlink.options import Argument, Arguments, Options
from streamlink.plugin import Plugin, pluginargument
from streamlink_cli.argparser import ArgumentParser
@ -194,25 +193,18 @@ class TestArguments(unittest.TestCase):
class TestSetupOptions:
def test_setup_plugin_args(self, recwarn: pytest.WarningsRecorder):
def test_setup_plugin_args(self):
session = Mock()
plugin = Mock()
parser = ArgumentParser(add_help=False)
parser.add_argument("--global-arg1", default=123)
parser.add_argument("--global-arg2", default=456)
session.plugins = {"mock": plugin}
plugin.arguments = Arguments(
Argument("global-arg1", is_global=True),
Argument("test1", default="default1"),
Argument("test2", default="default2"),
Argument("test3"),
)
assert [(record.category, str(record.message)) for record in recwarn.list] == [
(StreamlinkDeprecationWarning, "Defining global plugin arguments is deprecated. Use the session options instead."),
]
setup_plugin_args(session, parser)
group_plugins = next((grp for grp in parser._action_groups if grp.title == "Plugin options"), None) # pragma: no branch
@ -225,49 +217,38 @@ class TestSetupOptions:
== ["--mock-test1", "--mock-test2", "--mock-test3"], \
"Only adds plugin arguments and ignores global argument references"
assert [item for action in parser._actions for item in action.option_strings] \
== ["--global-arg1", "--global-arg2", "--mock-test1", "--mock-test2", "--mock-test3"], \
== ["--mock-test1", "--mock-test2", "--mock-test3"], \
"Parser has all arguments registered"
assert plugin.options.get("global-arg1") == 123
assert plugin.options.get("global-arg2") is None
assert plugin.options.get("test1") == "default1"
assert plugin.options.get("test2") == "default2"
assert plugin.options.get("test3") is None
def test_setup_plugin_options(self, recwarn: pytest.WarningsRecorder):
@pluginargument("foo-foo", is_global=True)
def test_setup_plugin_options(self):
@pluginargument("foo-foo")
@pluginargument("bar-bar", default=456)
@pluginargument("baz-baz", default=789, help=argparse.SUPPRESS)
class FakePlugin(Plugin):
def _get_streams(self): # pragma: no cover
pass
assert [(record.category, str(record.message), record.filename) for record in recwarn.list] == [
(
StreamlinkDeprecationWarning,
"Defining global plugin arguments is deprecated. Use the session options instead.",
__file__,
),
]
session = Mock()
parser = ArgumentParser()
parser.add_argument("--foo-foo", default=123)
session.plugins = {"plugin": FakePlugin}
session.set_plugin_option = lambda name, key, value: session.plugins[name].options.update({key: value})
with patch("streamlink_cli.main.args") as args:
args.foo_foo = 321
args.plugin_foo_foo = 123
args.plugin_bar_bar = 654
args.plugin_baz_baz = 987 # this wouldn't be set by the parser if the argument is suppressed
setup_plugin_args(session, parser)
assert FakePlugin.options.get("foo_foo") == 123, "Sets the global-argument's default value"
assert FakePlugin.options.get("foo_foo") is None, "No default value"
assert FakePlugin.options.get("bar_bar") == 456, "Sets the plugin-argument's default value"
assert FakePlugin.options.get("baz_baz") == 789, "Sets the suppressed plugin-argument's default value"
setup_plugin_options(session, "plugin", FakePlugin)
assert FakePlugin.options.get("foo_foo") == 321, "Sets the provided global-argument value"
assert FakePlugin.options.get("foo_foo") == 123, "Overrides the default plugin-argument value"
assert FakePlugin.options.get("bar_bar") == 654, "Sets the provided plugin-argument value"
assert FakePlugin.options.get("baz_baz") == 789, "Doesn't set values of suppressed plugin-arguments"

View File

@ -84,9 +84,6 @@ class TestPlugins:
assert not hasattr(pluginclass, "priority"), "Does not implement deprecated priority(url)"
assert callable(pluginclass._get_streams), "Implements _get_streams()"
def test_no_global_args(self, plugin):
assert not [parg for parg in plugin.__plugin__.arguments or [] if parg.is_global], "Doesn't define global arguments"
class TestPluginTests:
@pytest.mark.parametrize("plugin", plugins)