1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150
|
from __future__ import annotations
import importlib.machinery
import importlib.util
from contextlib import nullcontext
from textwrap import dedent
from typing import TYPE_CHECKING
import pytest
from streamlink.exceptions import StreamlinkDeprecationWarning
if TYPE_CHECKING:
from types import ModuleType
class TestDeprecated:
class _Loader(importlib.machinery.SourceFileLoader):
def __init__(self, filename: str, content: str):
super().__init__(filename, "/")
self._filename = filename
self._content = content
def get_filename(self, *_, **__):
return self._filename
def get_data(self, *_, **__):
return self._content
@pytest.fixture()
def module(self, request: pytest.FixtureRequest):
content = getattr(request, "param", "")
loader = self._Loader("mocked_module.py", content)
spec = importlib.util.spec_from_loader("mocked_module", loader)
assert spec
mod = importlib.util.module_from_spec(spec)
loader.exec_module(mod)
return mod
@pytest.mark.parametrize(
("module", "attr", "has_attr", "warnings", "raises_on_missing"),
[
pytest.param(
dedent("""
from streamlink.compat import deprecated
deprecated({
"Streamlink": ("streamlink.session.Streamlink", None, None),
})
""").strip(),
"Streamlink",
False,
[(__file__, StreamlinkDeprecationWarning, "'mocked_module.Streamlink' has been deprecated")],
pytest.raises(AttributeError),
id="import-path",
),
pytest.param(
dedent("""
from streamlink.compat import deprecated
deprecated({
"Streamlink": ("streamlink.session.Streamlink", None, "custom warning"),
})
""").strip(),
"Streamlink",
False,
[(__file__, StreamlinkDeprecationWarning, "custom warning")],
pytest.raises(AttributeError),
id="import-path-custom-msg",
),
pytest.param(
dedent("""
from streamlink.compat import deprecated
from streamlink.session import Streamlink
deprecated({
"Streamlink": (None, Streamlink, None),
})
""").strip(),
"Streamlink",
False,
[(__file__, StreamlinkDeprecationWarning, "'mocked_module.Streamlink' has been deprecated")],
pytest.raises(AttributeError),
id="import-obj",
),
pytest.param(
dedent("""
from streamlink.compat import deprecated
from streamlink.session import Streamlink
deprecated({
"Streamlink": (None, Streamlink, "custom warning"),
})
""").strip(),
"Streamlink",
False,
[(__file__, StreamlinkDeprecationWarning, "custom warning")],
pytest.raises(AttributeError),
id="import-obj-custom-msg",
),
pytest.param(
dedent("""
from streamlink.compat import deprecated
foo = 1
deprecated({
"Streamlink": ("streamlink.session.Streamlink", None, None),
})
""").strip(),
"foo",
True,
[],
pytest.raises(AttributeError),
id="no-warning-has-attr",
),
pytest.param(
dedent("""
from streamlink.compat import deprecated
def __getattr__(name):
return "foo"
deprecated({
"Streamlink": ("streamlink.session.Streamlink", None, None),
})
""").strip(),
"foo",
False,
[],
nullcontext(),
id="no-warning-has-getattr",
),
],
indirect=["module"],
)
def test_deprecated(
self,
recwarn: pytest.WarningsRecorder,
module: ModuleType,
attr: str,
has_attr: bool,
warnings: list,
raises_on_missing: nullcontext,
):
assert recwarn.list == []
assert (attr in dir(module)) is has_attr
assert "deprecated" not in dir(module)
assert getattr(module, attr)
assert [(record.filename, record.category, str(record.message)) for record in recwarn.list] == warnings
with raises_on_missing:
# noinspection PyStatementEffect
module.does_not_exist # noqa: B018
|