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:
parent
a50fb70e2b
commit
5c8c0b213c
@ -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))
|
||||
|
@ -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,
|
||||
)
|
||||
|
||||
|
@ -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():
|
||||
|
@ -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"
|
||||
|
@ -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)
|
||||
|
Loading…
Reference in New Issue
Block a user