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 🎉
+
+![Sponsors](https://sponsor.pics/codingjoe/django-health-check.svg?)
+
 
[![version](https://img.shields.io/pypi/v/django-health-check.svg)](https://pypi.python.org/pypi/django-health-check/)
 
[![coverage](https://codecov.io/gh/codingjoe/django-health-check/branch/main/graph/badge.svg)](https://codecov.io/gh/codingjoe/django-health-check)
 
[![pyversion](https://img.shields.io/pypi/pyversions/django-health-check.svg)](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},
                     )
                 ]
             ),

Reply via email to