Script 'mail_helper' called by obssrc
Hello community,
here is the log from the commit of package python-django-health-check for
openSUSE:Factory checked in at 2026-07-28 17:55:11
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/python-django-health-check (Old)
and /work/SRC/openSUSE:Factory/.python-django-health-check.new.2004 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "python-django-health-check"
Tue Jul 28 17:55:11 2026 rev:17 rq:1367889 version:4.4.3
Changes:
--------
---
/work/SRC/openSUSE:Factory/python-django-health-check/python-django-health-check.changes
2026-04-26 21:15:06.222709921 +0200
+++
/work/SRC/openSUSE:Factory/.python-django-health-check.new.2004/python-django-health-check.changes
2026-07-28 17:57:22.483351447 +0200
@@ -1,0 +2,17 @@
+Mon Jul 27 05:52:13 UTC 2026 - Steve Kowalik <[email protected]>
+
+- Update to 4.4.3:
+ * Remove blank lines in OpenMetrics output
+- Clean up {Build,}Requires.
+
+-------------------------------------------------------------------
+Sun Jun 14 09:55:30 UTC 2026 - Dirk Müller <[email protected]>
+
+- update to 4.4.2:
+ * Add sponsors to readme
+- update to 4.4.1:
+ * Update deprecated redis_url test case
+ * Add atlassian extra depnency test group
+ * Fix Atlassian incident checks
+
+-------------------------------------------------------------------
Old:
----
django-health-check-4.4.0.tar.gz
New:
----
django-health-check-4.4.3.tar.gz
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Other differences:
------------------
++++++ python-django-health-check.spec ++++++
--- /var/tmp/diff_new_pack.j297WU/_old 2026-07-28 17:57:23.999404544 +0200
+++ /var/tmp/diff_new_pack.j297WU/_new 2026-07-28 17:57:24.003404684 +0200
@@ -18,7 +18,7 @@
%{?sle15_python_module_pythons}
Name: python-django-health-check
-Version: 4.4.0
+Version: 4.4.3
Release: 0
Summary: Run checks on Django and is dependent services
License: MIT
@@ -29,7 +29,6 @@
BuildRequires: %{python_module celery >= 5.0.0}
BuildRequires: %{python_module django-storages}
BuildRequires: %{python_module dnspython >= 2.0.0}
-BuildRequires: %{python_module feedparser}
BuildRequires: %{python_module flit-core >= 3.2}
BuildRequires: %{python_module flit-scm}
BuildRequires: %{python_module pip}
@@ -37,14 +36,11 @@
BuildRequires: %{python_module pytest-django}
BuildRequires: %{python_module pytest}
BuildRequires: %{python_module redis >= 4.2.0}
-BuildRequires: %{python_module setuptools_scm}
-BuildRequires: %{python_module wheel}
#
BuildRequires: fdupes
BuildRequires: python-rpm-macros
Requires: python-Django >= 5.2
Requires: python-dnspython >= 2.0.0
-Requires: python-feedparser
BuildArch: noarch
%python_subpackages
@@ -72,7 +68,12 @@
cd /tmp/testenv
PYTHONPATH=${PWD}
export DJANGO_SETTINGS_MODULE=tests.testapp.settings
-%pytest -k "not (test_run_check__dns_working or TestDNSExceptionHandling or
test_feed_url)"
+donttest="test_run_check__dns_working or TestDNSExceptionHandling"
+donttest+=" or test_feed_url or test_check_status__live_summary_endpoint"
+if [ $(getconf LONG_BIT) -eq 32 ]; then
+ donttest+=" or test_redis__repr"
+fi
+%pytest -k "not ($donttest)"
%files %{python_files}
%doc README.md
++++++ django-health-check-4.4.0.tar.gz -> django-health-check-4.4.3.tar.gz
++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/django-health-check-4.4.0/.github/workflows/ci.yml
new/django-health-check-4.4.3/.github/workflows/ci.yml
--- old/django-health-check-4.4.0/.github/workflows/ci.yml 2026-04-19
19:44:38.000000000 +0200
+++ new/django-health-check-4.4.3/.github/workflows/ci.yml 2026-06-23
11:40:52.000000000 +0200
@@ -8,7 +8,7 @@
dist:
runs-on: ubuntu-latest
steps:
- - uses: actions/checkout@v6
+ - uses: actions/checkout@v7
- uses: astral-sh/setup-uv@v7
- run: uvx --from build pyproject-build --sdist --wheel
- run: uvx twine check dist/*
@@ -18,7 +18,7 @@
docs:
runs-on: ubuntu-latest
steps:
- - uses: actions/checkout@v6
+ - uses: actions/checkout@v7
- uses: astral-sh/setup-uv@v7
- run: uv run mkdocs build --strict
pytest:
@@ -41,12 +41,12 @@
- python-version: "3.11"
django-version: "6.0"
steps:
- - uses: actions/checkout@v6
+ - uses: actions/checkout@v7
- uses: astral-sh/setup-uv@v7
with:
python-version: ${{ matrix.python-version }}
- run: uv run --no-dev --group=test --with Django~=${{
matrix.django-version }}.0 pytest
- - uses: codecov/codecov-action@v6
+ - uses: codecov/codecov-action@v7
with:
token: ${{ secrets.CODECOV_TOKEN }}
flags: python-${{ matrix.python-version }}-django-${{
matrix.django-version }}
@@ -106,13 +106,14 @@
- "rabbitmq"
- "redis"
- "rss"
+ - "atlassian"
steps:
- - uses: actions/checkout@v6
+ - uses: actions/checkout@v7
- uses: astral-sh/setup-uv@v7
with:
python-version: ${{ matrix.python-version }}
- run: uv run --no-dev --group=test --extra=${{ matrix.extra }} --with
Django~=${{ matrix.django-version }}.0 pytest
- - uses: codecov/codecov-action@v6
+ - uses: codecov/codecov-action@v7
with:
token: ${{ secrets.CODECOV_TOKEN }}
flags: python-${{ matrix.python-version }}-django-${{
matrix.django-version }}-${{ matrix.extra }}
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/django-health-check-4.4.0/.github/workflows/pr.yml
new/django-health-check-4.4.3/.github/workflows/pr.yml
--- old/django-health-check-4.4.0/.github/workflows/pr.yml 2026-04-19
19:44:38.000000000 +0200
+++ new/django-health-check-4.4.3/.github/workflows/pr.yml 2026-06-23
11:40:52.000000000 +0200
@@ -32,7 +32,7 @@
timeout-minutes: 1
if: ${{ github.actor != 'dependabot[bot]' }}
steps:
- - uses: actions/checkout@v6
+ - uses: actions/checkout@v7
- name: REad docs to gh output
id: docs
run: echo "docs=$(find . -type f -name '*.md' -exec cat {} + | tr '\n'
' ')" >> $GITHUB_OUTPUT
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/django-health-check-4.4.0/.github/workflows/release.yml
new/django-health-check-4.4.3/.github/workflows/release.yml
--- old/django-health-check-4.4.0/.github/workflows/release.yml 2026-04-19
19:44:38.000000000 +0200
+++ new/django-health-check-4.4.3/.github/workflows/release.yml 2026-06-23
11:40:52.000000000 +0200
@@ -8,7 +8,7 @@
runs-on: ubuntu-latest
if: github.event_name != 'release' || github.event.release.prerelease ==
false
steps:
- - uses: actions/checkout@v6
+ - uses: actions/checkout@v7
- uses: astral-sh/setup-uv@v7
- run: uv run mkdocs build
- uses: actions/upload-pages-artifact@v5
@@ -29,7 +29,7 @@
pypi-build:
runs-on: ubuntu-latest
steps:
- - uses: actions/checkout@v6
+ - uses: actions/checkout@v7
- uses: astral-sh/setup-uv@v7
- run: uvx --from build pyproject-build --sdist --wheel
- uses: actions/upload-artifact@v7
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/django-health-check-4.4.0/.pre-commit-config.yaml
new/django-health-check-4.4.3/.pre-commit-config.yaml
--- old/django-health-check-4.4.0/.pre-commit-config.yaml 2026-04-19
19:44:38.000000000 +0200
+++ new/django-health-check-4.4.3/.pre-commit-config.yaml 2026-06-23
11:40:52.000000000 +0200
@@ -22,7 +22,7 @@
hooks:
- id: django-upgrade
- repo: https://github.com/djlint/djLint
- rev: v1.36.4
+ rev: v1.39.2
hooks:
- id: djlint-reformat-django
- repo: https://github.com/hukkin/mdformat
@@ -36,7 +36,7 @@
- mdformat-gfm-alerts
exclude: '.github/agents/'
- repo: https://github.com/astral-sh/ruff-pre-commit
- rev: v0.15.10
+ rev: v0.15.18
hooks:
- id: ruff-check
args: [--fix, --exit-non-zero-on-fix]
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/django-health-check-4.4.0/README.md
new/django-health-check-4.4.3/README.md
--- old/django-health-check-4.4.0/README.md 2026-04-19 19:44:38.000000000
+0200
+++ new/django-health-check-4.4.3/README.md 2026-06-23 11:40:52.000000000
+0200
@@ -15,6 +15,10 @@
_Pluggable health checks for Django applications_
+## 🥳 Sponsors 🎉
+
+
+
[](https://pypi.python.org/pypi/django-health-check/)
[](https://codecov.io/gh/codingjoe/django-health-check)
[](https://pypi.python.org/pypi/django-health-check/)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/django-health-check-4.4.0/health_check/contrib/atlassian.py
new/django-health-check-4.4.3/health_check/contrib/atlassian.py
--- old/django-health-check-4.4.0/health_check/contrib/atlassian.py
2026-04-19 19:44:38.000000000 +0200
+++ new/django-health-check-4.4.3/health_check/contrib/atlassian.py
2026-06-23 11:40:52.000000000 +0200
@@ -8,7 +8,11 @@
import httpx
from health_check import HealthCheck, __version__
-from health_check.exceptions import ServiceUnavailable, StatusPageWarning
+from health_check.exceptions import (
+ ServiceReturnedUnexpectedResult,
+ ServiceUnavailable,
+ StatusPageWarning,
+)
logger = logging.getLogger(__name__)
@@ -49,7 +53,7 @@
logger.debug("No incidents found")
async def _fetch_incidents(self):
- api_url = f"{self.base_url}/api/v2/components.json"
+ api_url = f"{self.base_url}/api/v2/summary.json"
logger.debug("Fetching incidents from %r", api_url)
async with httpx.AsyncClient() as client:
@@ -82,23 +86,25 @@
try:
_ = components_by_name[self.component]
except KeyError as e:
- raise ServiceUnavailable(
+ raise ServiceReturnedUnexpectedResult(
f"Component {self.component!r} not found"
) from e
-
- for incident in data.get("incidents", []):
- if (incident.get("status") not in ("resolved", "postmortem")) and (
- not self.component
- or any(
- c["name"] == self.component for c in
incident.get("components", [])
- )
- ):
- yield (
- f"{incident['name']}: {incident['shortlink']}",
- datetime.datetime.fromisoformat(
- incident["updated_at"].replace("Z", "+00:00")
- ),
- )
+ try:
+ for incident in data["incidents"]:
+ if (incident.get("status") not in ("resolved", "postmortem"))
and (
+ not self.component
+ or any(c["name"] == self.component for c in
incident["components"])
+ ):
+ yield (
+ f"{incident['name']}: {incident['shortlink']}",
+ datetime.datetime.fromisoformat(
+ incident["updated_at"].replace("Z", "+00:00")
+ ),
+ )
+ except KeyError as e:
+ raise ServiceReturnedUnexpectedResult(
+ "Unexpected API response structure"
+ ) from e
@dataclasses.dataclass
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/django-health-check-4.4.0/health_check/views.py
new/django-health-check-4.4.3/health_check/views.py
--- old/django-health-check-4.4.0/health_check/views.py 2026-04-19
19:44:38.000000000 +0200
+++ new/django-health-check-4.4.3/health_check/views.py 2026-06-23
11:40:52.000000000 +0200
@@ -242,7 +242,6 @@
# Add response time metrics
lines += [
- "",
"# HELP django_health_check_response_time_seconds Health check
response time in seconds",
"# TYPE django_health_check_response_time_seconds gauge",
]
@@ -254,7 +253,6 @@
# Add overall health status
lines += [
- "",
"# HELP django_health_check_overall_status Overall health check
status (1 = all healthy, 0 = at least one unhealthy)",
"# TYPE django_health_check_overall_status gauge",
f"django_health_check_overall_status {not has_errors:d}",
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/django-health-check-4.4.0/tests/contrib/test_atlassian.py
new/django-health-check-4.4.3/tests/contrib/test_atlassian.py
--- old/django-health-check-4.4.0/tests/contrib/test_atlassian.py
2026-04-19 19:44:38.000000000 +0200
+++ new/django-health-check-4.4.3/tests/contrib/test_atlassian.py
2026-06-23 11:40:52.000000000 +0200
@@ -16,6 +16,7 @@
Vercel,
)
from health_check.exceptions import (
+ ServiceReturnedUnexpectedResult,
ServiceUnavailable,
ServiceWarning,
StatusPageWarning,
@@ -23,7 +24,7 @@
def _make_response(components, incidents=None):
- """Build a minimal /api/v2/components.json payload."""
+ """Build a minimal /api/v2/summary.json payload."""
return {
"page": {"id": "test"},
"components": list(components),
@@ -77,6 +78,11 @@
check = FlyIo()
result = await check.get_result()
assert result.error is None
+ mock_context.__aenter__.return_value.get.assert_awaited_once()
+ assert (
+ mock_context.__aenter__.return_value.get.await_args.args[0]
+ == "https://status.flyio.net/api/v2/summary.json"
+ )
@pytest.mark.asyncio
async def test_check_status__raise_service_warning(self):
@@ -335,6 +341,13 @@
class TestGitHub:
"""Test GitHub platform status health check via Atlassian API."""
+ @pytest.mark.integration
+ @pytest.mark.asyncio
+ async def test_check_status__live_summary_endpoint(self):
+ """Verify the check can read a real Statuspage summary endpoint."""
+ result = await GitHub().get_result()
+ assert result.error is None or isinstance(result.error,
StatusPageWarning)
+
@pytest.mark.asyncio
async def test_check_status__ok(self):
"""Pass when there are no open incidents."""
@@ -359,6 +372,33 @@
result = await check.get_result()
assert result.error is None
+ @pytest.mark.asyncio
+ async def test_check_status__missing_expected_key(self):
+ """Raise ServiceUnavailable when the Statuspage payload is
malformed."""
+ api_response = {
+ "page": {"id": "test"},
+ "components": [_component("Actions")],
+ }
+
+ with mock.patch(
+ "health_check.contrib.atlassian.httpx.AsyncClient"
+ ) as mock_client:
+ mock_response = mock.MagicMock()
+ mock_response.json.return_value = api_response
+ mock_response.raise_for_status = mock.MagicMock()
+
+ mock_context = mock.AsyncMock()
+ mock_context.__aenter__.return_value.get = mock.AsyncMock(
+ return_value=mock_response
+ )
+ mock_client.return_value = mock_context
+
+ check = GitHub()
+ result = await check.get_result()
+ assert result.error is not None
+ assert isinstance(result.error, ServiceReturnedUnexpectedResult)
+ assert "Unexpected API response structure" in str(result.error)
+
def test_base_url_format(self):
"""Verify correct base URL for GitHub."""
assert GitHub().base_url == "https://www.githubstatus.com"
@@ -455,8 +495,8 @@
check = GitHub(component="Nonexistent")
result = await check.get_result()
assert result.error is not None
- assert isinstance(result.error, ServiceUnavailable)
- assert "Nonexistent" in str(result.error)
+ assert isinstance(result.error, ServiceReturnedUnexpectedResult)
+ assert "Component 'Nonexistent' not found" in str(result.error)
@pytest.mark.asyncio
async def test_check_status__no_component_filter(self):
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/django-health-check-4.4.0/tests/contrib/test_rss.py
new/django-health-check-4.4.3/tests/contrib/test_rss.py
--- old/django-health-check-4.4.0/tests/contrib/test_rss.py 2026-04-19
19:44:38.000000000 +0200
+++ new/django-health-check-4.4.3/tests/contrib/test_rss.py 2026-06-23
11:40:52.000000000 +0200
@@ -7,6 +7,7 @@
import pytest
httpx = pytest.importorskip("httpx")
+pytest.importorskip("feedparser")
from health_check.contrib.rss import ( # noqa: E402
AWS,
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/django-health-check-4.4.0/tests/test_views.py
new/django-health-check-4.4.3/tests/test_views.py
--- old/django-health-check-4.4.0/tests/test_views.py 2026-04-19
19:44:38.000000000 +0200
+++ new/django-health-check-4.4.3/tests/test_views.py 2026-06-23
11:40:52.000000000 +0200
@@ -812,6 +812,23 @@
assert "# EOF" in content
@pytest.mark.asyncio
+ async def test_get__openmetrics_format__no_empty_lines(self,
health_check_view):
+ """
+ Ensure OpenMetrics output does not contain empty lines.
+
+ Regression, see also:
+ https://github.com/codingjoe/django-health-check/issues/742
+ """
+
+ class SuccessBackend(HealthCheck):
+ async def run(self):
+ pass
+
+ response = await health_check_view([SuccessBackend],
format_param="openmetrics")
+ content = response.content.decode("utf-8")
+ assert not any(line == "" for line in content.splitlines())
+
+ @pytest.mark.asyncio
async def test_get__openmetrics_accept_header_openmetrics(self,
health_check_view):
"""Return OpenMetrics when Accept header is
application/openmetrics-text."""
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/django-health-check-4.4.0/tests/testapp/urls.py
new/django-health-check-4.4.3/tests/testapp/urls.py
--- old/django-health-check-4.4.0/tests/testapp/urls.py 2026-04-19
19:44:38.000000000 +0200
+++ new/django-health-check-4.4.3/tests/testapp/urls.py 2026-06-23
11:40:52.000000000 +0200
@@ -53,10 +53,14 @@
)
try:
- import redis # noqa: F401
+ from redis.asyncio import Redis as RedisClient
except ImportError:
pass
else:
+
+ def redis_client_factory():
+ return RedisClient.from_url(settings.REDIS_URL)
+
urlpatterns.append(
path(
"health/redis/",
@@ -64,7 +68,7 @@
checks=[
(
"health_check.contrib.redis.Redis",
- {"redis_url": settings.REDIS_URL},
+ {"client_factory": redis_client_factory},
)
]
),