diff --git a/src/pytest_html/basereport.py b/src/pytest_html/basereport.py
index cfcc74b2..eea6284d 100644
--- a/src/pytest_html/basereport.py
+++ b/src/pytest_html/basereport.py
@@ -81,6 +81,7 @@ def _generate_environment(self):
warnings.warn(
"'pytest-metadata < 3.0.0' is deprecated and support will be dropped in next major version",
DeprecationWarning,
+ stacklevel=2,
)
for key in metadata.keys():
@@ -214,6 +215,7 @@ def pytest_runtest_logreport(self, report):
"'duration_formatter' has been removed and no longer has any effect!"
"Please use the 'pytest_html_duration_format' hook instead.",
DeprecationWarning,
+ stacklevel=2,
)
# "reruns" makes this code a mess.
@@ -370,6 +372,7 @@ def _fix_py(cells):
"The 'py' module is deprecated and support "
"will be removed in a future release.",
DeprecationWarning,
+ stacklevel=2,
)
html = str(html)
html = html.replace("col=", "data-column-type=")
diff --git a/src/pytest_html/fixtures.py b/src/pytest_html/fixtures.py
index 88ce828d..2e97f0b8 100644
--- a/src/pytest_html/fixtures.py
+++ b/src/pytest_html/fixtures.py
@@ -24,6 +24,7 @@ def test_foo(extra):
"The 'extra' fixture is deprecated and will be removed in a future release"
", use 'extras' instead.",
DeprecationWarning,
+ stacklevel=2,
)
pytestconfig.stash[extras_stash_key] = []
yield pytestconfig.stash[extras_stash_key]
diff --git a/src/pytest_html/plugin.py b/src/pytest_html/plugin.py
index 949a6ffa..7d224b20 100644
--- a/src/pytest_html/plugin.py
+++ b/src/pytest_html/plugin.py
@@ -134,6 +134,7 @@ def pytest_runtest_makereport(item, call):
"The 'report.extra' attribute is deprecated and will be removed in a future release"
", use 'report.extras' instead.",
DeprecationWarning,
+ stacklevel=2,
)
fixture_extras = item.config.stash.get(extras_stash_key, [])
plugin_extras = getattr(report, "extras", [])
diff --git a/src/pytest_html/report.py b/src/pytest_html/report.py
index 22ef7e14..dfe211d2 100644
--- a/src/pytest_html/report.py
+++ b/src/pytest_html/report.py
@@ -32,8 +32,13 @@ def _media_content(self, content, asset_name, *args, **kwargs):
media_data = base64.b64decode(content.encode("utf-8"), validate=True)
return self._write_content(media_data, asset_name)
except binascii.Error:
- # if not base64 content, just return as it's a file or link
- return content
+ # if not base64 content, try to make it relative to the report
+ try:
+ abs_path = Path(content).resolve()
+ return str(abs_path.relative_to(self._report_path.parent.resolve()))
+ except (ValueError, OSError):
+ # On different drives (Windows) or unresolvable, return as-is
+ return content
def _write_content(self, content, asset_name):
content_relative_path = Path(self._assets_path, asset_name)
diff --git a/src/pytest_html/report_data.py b/src/pytest_html/report_data.py
index 3dc0ea21..88ef07af 100644
--- a/src/pytest_html/report_data.py
+++ b/src/pytest_html/report_data.py
@@ -53,6 +53,7 @@ def __init__(self, config):
"will be removed in the next major release. "
"Please use 'render_collapsed = all' instead.",
DeprecationWarning,
+ stacklevel=2,
)
collapsed = "all"
diff --git a/src/pytest_html/selfcontained_report.py b/src/pytest_html/selfcontained_report.py
index ecc44600..8c5931bb 100644
--- a/src/pytest_html/selfcontained_report.py
+++ b/src/pytest_html/selfcontained_report.py
@@ -31,7 +31,8 @@ def _media_content(self, content, mime_type, *args, **kwargs):
warnings.warn(
"Self-contained HTML report "
"includes link to external "
- f"resource: {content}"
+ f"resource: {content}",
+ stacklevel=2,
)
return content