Script 'mail_helper' called by obssrc
Hello community,

here is the log from the commit of package python-django-silk for 
openSUSE:Factory checked in at 2026-11-09 16:05:00
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/python-django-silk (Old)
 and      /work/SRC/openSUSE:Factory/.python-django-silk.new.3759290 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Package is "python-django-silk"

Mon Nov  9 16:05:00 2026 rev:20 rq:1396200 version:5.6.0

Changes:
--------
--- /work/SRC/openSUSE:Factory/python-django-silk/python-django-silk.changes    
2026-08-22 21:36:58.140983097 +0200
+++ 
/work/SRC/openSUSE:Factory/.python-django-silk.new.3759290/python-django-silk.changes
       2026-11-09 16:05:42.048471726 +0100
@@ -1,0 +2,21 @@
+Sun Nov  8 21:45:19 UTC 2026 - Dirk Müller <[email protected]>
+
+- update to 5.6.0:
+  * **Backwards incompatible:** `SILKY_IGNORE_PATHS` entries are
+    now matched against `request.path_info` instead of `request.path`.
+    For most deployments these are identical and nothing changes.
+    If silk runs behind a front-end web server that
+    sets a `SCRIPT_NAME` prefix, and you worked around #349 by
+    writing that prefix into your `SILKY_IGNORE_PATHS` entries
+  * Fix SILKY_IGNORE_PATHS matching when used with a SCRIPT_NAME
+    prefix
+  * Fix false-positive migration for Request.prof_file
+  * Fix PackageNotFoundError when determining __version__
+  * Add support for Django 6.1
+  * Drop support for EOL Django 4.2 and 5.1
+  * Fix grammar and typos in middleware comments
+  * Remove outdated compatibility logic for old versions of
+    python/django
+  * Remove outdated settings.DEFAULT_FILE_STORAGE
+
+-------------------------------------------------------------------

Old:
----
  django_silk-5.5.2.tar.gz

New:
----
  django_silk-5.6.0.tar.gz

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Other differences:
------------------
++++++ python-django-silk.spec ++++++
--- /var/tmp/diff_new_pack.HSCKEF/_old  2026-11-09 16:05:42.749501115 +0100
+++ /var/tmp/diff_new_pack.HSCKEF/_new  2026-11-09 16:05:42.750501157 +0100
@@ -17,26 +17,26 @@
 
 
 Name:           python-django-silk
-Version:        5.5.2
+Version:        5.6.0
 Release:        0
 Summary:        Profiling for the Django Framework
 License:        MIT
 URL:            https://github.com/jazzband/django-silk
 Source:         
https://files.pythonhosted.org/packages/source/d/django-silk/django_silk-%{version}.tar.gz
-BuildRequires:  %{python_module base >= 3.8}
+BuildRequires:  %{python_module base >= 3.10}
 BuildRequires:  %{python_module pip}
-BuildRequires:  %{python_module setuptools_scm}
-BuildRequires:  %{python_module setuptools}
+BuildRequires:  %{python_module setuptools >= 64}
+BuildRequires:  %{python_module setuptools_scm >= 8}
 BuildRequires:  %{python_module wheel}
 BuildRequires:  fdupes
 BuildRequires:  python-rpm-macros
-Requires:       python-Django >= 4.2
+Requires:       python-Django >= 5.2
 Requires:       python-autopep8 >= 1.2.1
 Requires:       python-gprof2dot >= 2017.09.19
 Requires:       python-sqlparse >= 0.1.19
 BuildArch:      noarch
 # SECTION test requirements
-BuildRequires:  %{python_module Django >= 4.2}
+BuildRequires:  %{python_module Django >= 5.2}
 BuildRequires:  %{python_module autopep8 >= 1.2.1}
 BuildRequires:  %{python_module factory_boy >= 3.3}
 BuildRequires:  %{python_module freezegun}

++++++ django_silk-5.5.2.tar.gz -> django_silk-5.6.0.tar.gz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/django_silk-5.5.2/.github/workflows/test.yml 
new/django_silk-5.6.0/.github/workflows/test.yml
--- old/django_silk-5.5.2/.github/workflows/test.yml    2026-08-13 
06:11:58.660578300 +0200
+++ new/django_silk-5.6.0/.github/workflows/test.yml    2026-09-12 
07:34:51.918403400 +0200
@@ -10,34 +10,36 @@
       fail-fast: false
       matrix:
         python-version: ['3.10', '3.11', '3.12', '3.13', '3.14', '3.15']
-        django-version: ['4.2', '5.1', '5.2', '6.0', 'main']
+        django-version: ['5.2', '6.0', '6.1', 'main']
         postgres-version: ['14', '18']
         mariadb-version: ['10.6', '10.11', '11.4', '11.8']
         exclude:
-          # Django 4.2 doesn't support Python >= 3.13
-          - django-version: '4.2'
-            python-version: '3.13'
-          - django-version: '4.2'
-            python-version: '3.14'
-          - django-version: '4.2'
-            python-version: '3.15'
-
-          # Django 5.1 doesn't support Python >= 3.14
-          - django-version: '5.1'
-            python-version: '3.14'
-          - django-version: '5.1'
-            python-version: '3.15'
-
-          # Django 6.0 doesn't support Python <3.12 
(https://docs.djangoproject.com/en/dev/releases/6.0/#python-compatibility)
+          # Django >=6.0 doesn't support Python <3.12 
(https://docs.djangoproject.com/en/dev/releases/6.0/#python-compatibility)
           - django-version: '6.0'
             python-version: '3.10'
           - django-version: '6.0'
             python-version: '3.11'
+          - django-version: '6.1'
+            python-version: '3.10'
+          - django-version: '6.1'
+            python-version: '3.11'
           - django-version: 'main'
             python-version: '3.10'
           - django-version: 'main'
             python-version: '3.11'
 
+          # Django 6.1 doesn't support Postgres <15
+          - django-version: '6.1'
+            postgres-version: '14'
+          - django-version: 'main'
+            postgres-version: '14'
+
+          # Django 6.1 doesn't support mariadb <10.11
+          - django-version: '6.1'
+            mariadb-version: '10.6'
+          - django-version: 'main'
+            mariadb-version: '10.6'
+
     services:
       postgres:
         image: postgres:${{ matrix.postgres-version }}
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/django_silk-5.5.2/.pre-commit-config.yaml 
new/django_silk-5.6.0/.pre-commit-config.yaml
--- old/django_silk-5.5.2/.pre-commit-config.yaml       2026-08-13 
06:11:58.660578300 +0200
+++ new/django_silk-5.6.0/.pre-commit-config.yaml       2026-09-12 
07:34:51.918403400 +0200
@@ -13,7 +13,7 @@
   hooks:
   - id: yesqa
 - repo: https://github.com/pycqa/isort
-  rev: '9.0.0b2'
+  rev: '9.0.1'
   hooks:
   - id: isort
     args: ['--profile', 'black']
@@ -52,10 +52,10 @@
   - id: pyupgrade
     args: ['--keep-mock']
 - repo: https://github.com/adamchainz/django-upgrade
-  rev: '1.31.1'
+  rev: '1.32.0'
   hooks:
   - id: django-upgrade
-    args: [--target-version, '4.2']
+    args: [--target-version, '5.2']
 - repo: https://github.com/hhatto/autopep8
   rev: 'v2.3.2'
   hooks:
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/django_silk-5.5.2/CHANGELOG.md 
new/django_silk-5.6.0/CHANGELOG.md
--- old/django_silk-5.5.2/CHANGELOG.md  2026-08-13 06:11:58.660648300 +0200
+++ new/django_silk-5.6.0/CHANGELOG.md  2026-09-12 07:34:51.918403400 +0200
@@ -1,6 +1,36 @@
 # Change Log
 ## Unreleased
 
+
+## [5.6.0](https://github.com/jazzband/django-silk/tree/5.6.0) (2026-09-11)
+:release-by: Albert Wang (@albertyw)
+[Full Changelog](https://github.com/jazzband/django-silk/compare/5.5.2..5.6.0)
+
+**Backwards incompatible:** `SILKY_IGNORE_PATHS` entries are now matched 
against
+`request.path_info` instead of `request.path`.  For most deployments these are
+identical and nothing changes.  If silk runs behind a front-end web server that
+sets a `SCRIPT_NAME` prefix, and you worked around #349 by writing that prefix
+into your `SILKY_IGNORE_PATHS` entries (e.g. `/some-prefix/healthz`), remove 
the
+prefix (`/healthz`) or those paths will no longer be ignored.
+
+**Fixes:**
+
+ - Fix SILKY_IGNORE_PATHS matching when used with a SCRIPT_NAME prefix (#888) 
@agu2347
+ - Fix false-positive migration for Request.prof_file (#906) @richardmilles
+ - Fix PackageNotFoundError when determining __version__ (#911) @aoright
+
+**Features/Enhancements:**
+
+ - Add support for Django 6.1 (#893) @albertyw
+
+**Maintenance and Cleanup:**
+
+ - Drop support for EOL Django 4.2 and 5.1 (#891) @albertyw
+ - Fix grammar and typos in middleware comments (#904) @aoright
+ - Remove outdated compatibility logic for old versions of python/django 
(#902) @albertyw
+ - Remove outdated settings.DEFAULT_FILE_STORAGE (#901) @albertyw
+
+
 ## [5.5.2](https://github.com/jazzband/django-silk/tree/5.5.2) (2026-08-11)
 :release-by: Albert Wang (@albertyw)
 [Full Changelog](https://github.com/jazzband/django-silk/compare/5.5.0..5.5.2)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/django_silk-5.5.2/PKG-INFO 
new/django_silk-5.6.0/PKG-INFO
--- old/django_silk-5.5.2/PKG-INFO      2026-08-13 06:12:08.207594900 +0200
+++ new/django_silk-5.6.0/PKG-INFO      2026-09-12 07:35:00.539775100 +0200
@@ -1,6 +1,6 @@
 Metadata-Version: 2.4
 Name: django-silk
-Version: 5.5.2
+Version: 5.6.0
 Summary: Silky smooth profiling for the Django Framework
 Home-page: https://github.com/jazzband/django-silk
 Author: Michael Ford
@@ -9,10 +9,9 @@
 Classifier: Development Status :: 5 - Production/Stable
 Classifier: Environment :: Web Environment
 Classifier: Framework :: Django
-Classifier: Framework :: Django :: 4.2
-Classifier: Framework :: Django :: 5.1
 Classifier: Framework :: Django :: 5.2
 Classifier: Framework :: Django :: 6.0
+Classifier: Framework :: Django :: 6.1
 Classifier: Intended Audience :: Developers
 Classifier: Operating System :: OS Independent
 Classifier: Programming Language :: Python
@@ -27,7 +26,7 @@
 Requires-Python: >=3.10
 Description-Content-Type: text/markdown
 License-File: LICENSE
-Requires-Dist: Django>=4.2
+Requires-Dist: Django>=5.2
 Requires-Dist: sqlparse
 Requires-Dist: gprof2dot>=2017.09.19
 Provides-Extra: formatting
@@ -68,6 +67,7 @@
   * [Request/Response bodies](#requestresponse-bodies)
   * [Meta-Profiling](#meta-profiling)
   * [Recording a fraction of requests](#recording-a-fraction-of-requests)
+  * [Ignoring specific paths](#ignoring-specific-paths)
   * [Limiting request/response data](#limiting-requestresponse-data)
   * [Clearing logged data](#clearing-logged-data)
 * [Contributing](#contributing)
@@ -77,7 +77,7 @@
 
 Silk has been tested with:
 
-* Django: 4.2, 5.1, 5.2, 6.0
+* Django: 5.2, 6.0, 6.1
 * Python: 3.10, 3.11, 3.12, 3.13, 3.14, 3.15
 
 ## Installation
@@ -234,8 +234,7 @@
 A custom storage class can be used for the saved generated binary `.prof` 
files:
 
 ```python
-# For Django >= 4.2 and Django-Silk >= 5.1.0:
-# See https://docs.djangoproject.com/en/5.0/ref/settings/#std-setting-STORAGES
+# See 
https://docs.djangoproject.com/en/stable/ref/settings/#std-setting-STORAGES
 STORAGES = {
     'SILKY_STORAGE': {
         'BACKEND': 'path.to.StorageClass',
@@ -243,7 +242,7 @@
     # ...
 }
 
-# For Django < 4.2 or Django-Silk < 5.1.0
+# Alternatively, if STORAGES has no 'SILKY_STORAGE' entry:
 SILKY_STORAGE_CLASS = 'path.to.StorageClass'
 ```
 
@@ -543,6 +542,20 @@
 SILKY_INTERCEPT_FUNC = lambda request: 'record_requests' in request.session
 ```
 
+### Ignoring specific paths
+
+To stop silk recording particular paths entirely, list them in 
`SILKY_IGNORE_PATHS`:
+
+```python
+SILKY_IGNORE_PATHS = ['/healthz', '/readyz']
+```
+
+Entries are matched exactly against `request.path_info`, which is the request 
path
+*without* any `SCRIPT_NAME` prefix your front-end web server may add.  So if 
silk is
+mounted under `/some-prefix/`, write `/healthz` rather than 
`/some-prefix/healthz`.
+
+Silk's own views are always ignored and do not need to be listed here.
+
 ### Limiting request/response data
 
 To make sure silky garbage collects old request/response data, a config var 
can be set to limit the number of request/response rows it stores.
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/django_silk-5.5.2/README.md 
new/django_silk-5.6.0/README.md
--- old/django_silk-5.5.2/README.md     2026-08-13 06:11:58.660648300 +0200
+++ new/django_silk-5.6.0/README.md     2026-09-12 07:34:51.918473500 +0200
@@ -21,6 +21,7 @@
   * [Request/Response bodies](#requestresponse-bodies)
   * [Meta-Profiling](#meta-profiling)
   * [Recording a fraction of requests](#recording-a-fraction-of-requests)
+  * [Ignoring specific paths](#ignoring-specific-paths)
   * [Limiting request/response data](#limiting-requestresponse-data)
   * [Clearing logged data](#clearing-logged-data)
 * [Contributing](#contributing)
@@ -30,7 +31,7 @@
 
 Silk has been tested with:
 
-* Django: 4.2, 5.1, 5.2, 6.0
+* Django: 5.2, 6.0, 6.1
 * Python: 3.10, 3.11, 3.12, 3.13, 3.14, 3.15
 
 ## Installation
@@ -187,8 +188,7 @@
 A custom storage class can be used for the saved generated binary `.prof` 
files:
 
 ```python
-# For Django >= 4.2 and Django-Silk >= 5.1.0:
-# See https://docs.djangoproject.com/en/5.0/ref/settings/#std-setting-STORAGES
+# See 
https://docs.djangoproject.com/en/stable/ref/settings/#std-setting-STORAGES
 STORAGES = {
     'SILKY_STORAGE': {
         'BACKEND': 'path.to.StorageClass',
@@ -196,7 +196,7 @@
     # ...
 }
 
-# For Django < 4.2 or Django-Silk < 5.1.0
+# Alternatively, if STORAGES has no 'SILKY_STORAGE' entry:
 SILKY_STORAGE_CLASS = 'path.to.StorageClass'
 ```
 
@@ -496,6 +496,20 @@
 SILKY_INTERCEPT_FUNC = lambda request: 'record_requests' in request.session
 ```
 
+### Ignoring specific paths
+
+To stop silk recording particular paths entirely, list them in 
`SILKY_IGNORE_PATHS`:
+
+```python
+SILKY_IGNORE_PATHS = ['/healthz', '/readyz']
+```
+
+Entries are matched exactly against `request.path_info`, which is the request 
path
+*without* any `SCRIPT_NAME` prefix your front-end web server may add.  So if 
silk is
+mounted under `/some-prefix/`, write `/healthz` rather than 
`/some-prefix/healthz`.
+
+Silk's own views are always ignored and do not need to be listed here.
+
 ### Limiting request/response data
 
 To make sure silky garbage collects old request/response data, a config var 
can be set to limit the number of request/response rows it stores.
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/django_silk-5.5.2/django_silk.egg-info/PKG-INFO 
new/django_silk-5.6.0/django_silk.egg-info/PKG-INFO
--- old/django_silk-5.5.2/django_silk.egg-info/PKG-INFO 2026-08-13 
06:12:08.145595600 +0200
+++ new/django_silk-5.6.0/django_silk.egg-info/PKG-INFO 2026-09-12 
07:35:00.467501900 +0200
@@ -1,6 +1,6 @@
 Metadata-Version: 2.4
 Name: django-silk
-Version: 5.5.2
+Version: 5.6.0
 Summary: Silky smooth profiling for the Django Framework
 Home-page: https://github.com/jazzband/django-silk
 Author: Michael Ford
@@ -9,10 +9,9 @@
 Classifier: Development Status :: 5 - Production/Stable
 Classifier: Environment :: Web Environment
 Classifier: Framework :: Django
-Classifier: Framework :: Django :: 4.2
-Classifier: Framework :: Django :: 5.1
 Classifier: Framework :: Django :: 5.2
 Classifier: Framework :: Django :: 6.0
+Classifier: Framework :: Django :: 6.1
 Classifier: Intended Audience :: Developers
 Classifier: Operating System :: OS Independent
 Classifier: Programming Language :: Python
@@ -27,7 +26,7 @@
 Requires-Python: >=3.10
 Description-Content-Type: text/markdown
 License-File: LICENSE
-Requires-Dist: Django>=4.2
+Requires-Dist: Django>=5.2
 Requires-Dist: sqlparse
 Requires-Dist: gprof2dot>=2017.09.19
 Provides-Extra: formatting
@@ -68,6 +67,7 @@
   * [Request/Response bodies](#requestresponse-bodies)
   * [Meta-Profiling](#meta-profiling)
   * [Recording a fraction of requests](#recording-a-fraction-of-requests)
+  * [Ignoring specific paths](#ignoring-specific-paths)
   * [Limiting request/response data](#limiting-requestresponse-data)
   * [Clearing logged data](#clearing-logged-data)
 * [Contributing](#contributing)
@@ -77,7 +77,7 @@
 
 Silk has been tested with:
 
-* Django: 4.2, 5.1, 5.2, 6.0
+* Django: 5.2, 6.0, 6.1
 * Python: 3.10, 3.11, 3.12, 3.13, 3.14, 3.15
 
 ## Installation
@@ -234,8 +234,7 @@
 A custom storage class can be used for the saved generated binary `.prof` 
files:
 
 ```python
-# For Django >= 4.2 and Django-Silk >= 5.1.0:
-# See https://docs.djangoproject.com/en/5.0/ref/settings/#std-setting-STORAGES
+# See 
https://docs.djangoproject.com/en/stable/ref/settings/#std-setting-STORAGES
 STORAGES = {
     'SILKY_STORAGE': {
         'BACKEND': 'path.to.StorageClass',
@@ -243,7 +242,7 @@
     # ...
 }
 
-# For Django < 4.2 or Django-Silk < 5.1.0
+# Alternatively, if STORAGES has no 'SILKY_STORAGE' entry:
 SILKY_STORAGE_CLASS = 'path.to.StorageClass'
 ```
 
@@ -543,6 +542,20 @@
 SILKY_INTERCEPT_FUNC = lambda request: 'record_requests' in request.session
 ```
 
+### Ignoring specific paths
+
+To stop silk recording particular paths entirely, list them in 
`SILKY_IGNORE_PATHS`:
+
+```python
+SILKY_IGNORE_PATHS = ['/healthz', '/readyz']
+```
+
+Entries are matched exactly against `request.path_info`, which is the request 
path
+*without* any `SCRIPT_NAME` prefix your front-end web server may add.  So if 
silk is
+mounted under `/some-prefix/`, write `/healthz` rather than 
`/some-prefix/healthz`.
+
+Silk's own views are always ignored and do not need to be listed here.
+
 ### Limiting request/response data
 
 To make sure silky garbage collects old request/response data, a config var 
can be set to limit the number of request/response rows it stores.
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/django_silk-5.5.2/django_silk.egg-info/SOURCES.txt 
new/django_silk-5.6.0/django_silk.egg-info/SOURCES.txt
--- old/django_silk-5.5.2/django_silk.egg-info/SOURCES.txt      2026-08-13 
06:12:08.168366200 +0200
+++ new/django_silk-5.6.0/django_silk.egg-info/SOURCES.txt      2026-09-12 
07:35:00.495925400 +0200
@@ -159,6 +159,7 @@
 silk/migrations/0006_fix_request_prof_file_blank.py
 silk/migrations/0007_sqlquery_identifier.py
 silk/migrations/0008_sqlquery_analysis.py
+silk/migrations/0009_alter_request_prof_file.py
 silk/migrations/__init__.py
 silk/profiling/__init__.py
 silk/profiling/dynamic.py
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/django_silk-5.5.2/django_silk.egg-info/requires.txt 
new/django_silk-5.6.0/django_silk.egg-info/requires.txt
--- old/django_silk-5.5.2/django_silk.egg-info/requires.txt     2026-08-13 
06:12:08.146669400 +0200
+++ new/django_silk-5.6.0/django_silk.egg-info/requires.txt     2026-09-12 
07:35:00.468668000 +0200
@@ -1,4 +1,4 @@
-Django>=4.2
+Django>=5.2
 sqlparse
 gprof2dot>=2017.09.19
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/django_silk-5.5.2/django_silk.egg-info/scm_file_list.json 
new/django_silk-5.6.0/django_silk.egg-info/scm_file_list.json
--- old/django_silk-5.5.2/django_silk.egg-info/scm_file_list.json       
2026-08-13 06:12:08.144238200 +0200
+++ new/django_silk-5.6.0/django_silk.egg-info/scm_file_list.json       
2026-09-12 07:35:00.465991300 +0200
@@ -145,6 +145,7 @@
     "silk/migrations/0006_fix_request_prof_file_blank.py",
     "silk/migrations/0007_sqlquery_identifier.py",
     "silk/migrations/0008_sqlquery_analysis.py",
+    "silk/migrations/0009_alter_request_prof_file.py",
     "silk/migrations/__init__.py",
     "silk/model_factory.py",
     "silk/models.py",
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/django_silk-5.5.2/django_silk.egg-info/scm_version.json 
new/django_silk-5.6.0/django_silk.egg-info/scm_version.json
--- old/django_silk-5.5.2/django_silk.egg-info/scm_version.json 2026-08-13 
06:12:08.132381700 +0200
+++ new/django_silk-5.6.0/django_silk.egg-info/scm_version.json 2026-09-12 
07:35:00.448947200 +0200
@@ -1,8 +1,8 @@
 {
-  "tag": "5.5.2",
+  "tag": "5.6.0",
   "distance": 0,
-  "node": "ge04dc567b0a17bbd8630f3e0dbffaabf2bfb97c0",
+  "node": "g5e88c839b65a73d1fbc4d41f9886c81c45c94eec",
   "dirty": false,
   "branch": "HEAD",
-  "node_date": "2026-08-13"
+  "node_date": "2026-09-12"
 }
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/django_silk-5.5.2/docs/conf.py 
new/django_silk-5.6.0/docs/conf.py
--- old/django_silk-5.5.2/docs/conf.py  2026-08-13 06:11:58.661215300 +0200
+++ new/django_silk-5.6.0/docs/conf.py  2026-09-12 07:34:51.919092000 +0200
@@ -11,7 +11,7 @@
 # All configuration values have a default; values that are commented out
 # serve to show the default.
 
-import pkg_resources
+import importlib.metadata
 
 # If extensions (or modules to document with autodoc) are in another directory,
 # add these directories to sys.path here. If the directory is relative to the
@@ -46,7 +46,7 @@
 # built documents.
 #
 # The full version, including alpha/beta/rc tags.
-release = pkg_resources.get_distribution("django-silk").version
+release = importlib.metadata.version("django-silk")
 # The short X.Y version.
 version = '.'.join(release.split('.')[:2])
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/django_silk-5.5.2/docs/index.rst 
new/django_silk-5.6.0/docs/index.rst
--- old/django_silk-5.5.2/docs/index.rst        2026-08-13 06:11:58.664648500 
+0200
+++ new/django_silk-5.6.0/docs/index.rst        2026-09-12 07:34:51.921473500 
+0200
@@ -57,5 +57,5 @@
 Requirements
 ------------
 
-* Django: 4.2, 5.1, 5.2, 6.0
+* Django: 5.2, 6.0, 6.1
 * Python: 3.10, 3.11, 3.12, 3.13, 3.14, 3.15
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/django_silk-5.5.2/package.json 
new/django_silk-5.6.0/package.json
--- old/django_silk-5.5.2/package.json  2026-08-13 06:11:58.664648500 +0200
+++ new/django_silk-5.6.0/package.json  2026-09-12 07:34:51.921473500 +0200
@@ -1,6 +1,6 @@
 {
   "name": "silk",
-  "version": "5.5.2",
+  "version": "5.6.0",
   "description": "https://github.com/jazzband/django-silk";,
   "main": "index.js",
   "directories": {
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/django_silk-5.5.2/project/tests/test_compat.py 
new/django_silk-5.6.0/project/tests/test_compat.py
--- old/django_silk-5.5.2/project/tests/test_compat.py  2026-08-13 
06:11:58.666165800 +0200
+++ new/django_silk-5.6.0/project/tests/test_compat.py  2026-09-12 
07:34:51.923331000 +0200
@@ -23,3 +23,21 @@
         factory = ResponseModelFactory(mock)
         body, content = factory.body()
         self.assertDictEqual(json.loads(body), d)
+
+
+class TestPackageVersion(TestCase):
+    def test_version_falls_back_when_metadata_is_missing(self):
+        import importlib
+        import importlib.metadata
+        from unittest.mock import patch
+
+        import silk
+
+        self.addCleanup(importlib.reload, silk)
+        with patch(
+            "importlib.metadata.version",
+            side_effect=importlib.metadata.PackageNotFoundError,
+        ):
+            importlib.reload(silk)
+
+        self.assertEqual(silk.__version__, "unknown")
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/django_silk-5.5.2/project/tests/test_models.py 
new/django_silk-5.6.0/project/tests/test_models.py
--- old/django_silk-5.5.2/project/tests/test_models.py  2026-08-13 
06:11:58.666710600 +0200
+++ new/django_silk-5.6.0/project/tests/test_models.py  2026-09-12 
07:34:51.923878200 +0200
@@ -1,4 +1,7 @@
+import base64
 import datetime
+import gzip
+import json
 import uuid
 
 from django.core.management import call_command
@@ -236,6 +239,20 @@
         self.obj.encoded_headers = '{"content-type": "some_data"}'
         self.assertEqual(self.obj.content_type, "some_data")
 
+    def test_raw_body_decoded_decompresses_gzip_response(self):
+        content = b'hello from gzip'
+        self.obj.raw_body = 
base64.b64encode(gzip.compress(content)).decode('ascii')
+        self.obj.encoded_headers = json.dumps({'content-encoding': 'gzip'})
+
+        self.assertEqual(self.obj.raw_body_decoded, content)
+
+    def test_raw_body_decoded_falls_back_on_malformed_gzip_response(self):
+        raw = b'not actually gzip data'
+        self.obj.raw_body = base64.b64encode(raw).decode('ascii')
+        self.obj.encoded_headers = json.dumps({'content-encoding': 'gzip'})
+
+        self.assertEqual(self.obj.raw_body_decoded, raw)
+
 
 class SQLQueryManagerTest(TestCase):
 
@@ -286,9 +303,9 @@
         self.obj.traceback = """Traceback (most recent call last):
           File "/home/user/some_script.py", line 10, in some_func
             pass
-          File "/usr/lib/python2.7/bdb.py", line 20, in trace_dispatch
+          File "/usr/lib/python3.13/bdb.py", line 20, in trace_dispatch
             return self.dispatch_return(frame, arg)
-          File "/usr/lib/python2.7/bdb.py", line 30, in dispatch_return
+          File "/usr/lib/python3.13/bdb.py", line 30, in dispatch_return
             if self.quitting: raise BdbQuit
         BdbQuit"""
 
@@ -523,8 +540,8 @@
     @override_settings(DEFAULT_AUTO_FIELD='django.db.models.BigAutoField')
     def test_check_with_overridden_default_auto_field(self):
         """
-        Test with `BigAutoField` set as `DEFAULT_AUTO_FIELD` - which is
-        default when generating proj with Django 3.2.
+        Test with `BigAutoField` set as `DEFAULT_AUTO_FIELD` - the default
+        for newly generated projects.
         """
         self.test_no_pending_migrations()
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/django_silk-5.5.2/project/tests/test_response_assumptions.py 
new/django_silk-5.6.0/project/tests/test_response_assumptions.py
--- old/django_silk-5.5.2/project/tests/test_response_assumptions.py    
2026-08-13 06:11:58.666710600 +0200
+++ new/django_silk-5.6.0/project/tests/test_response_assumptions.py    
2026-09-12 07:34:51.923878200 +0200
@@ -5,6 +5,6 @@
 class TestResponseAssumptions(TestCase):
 
     def test_headers_present_in_http_response(self):
-        """Verify that HttpResponse has a headers or _headers attribute, which 
we use and Mock in our tests."""
+        """Verify that HttpResponse has a headers attribute, which 
ResponseModelFactory relies on."""
         django_response = HttpResponse()
-        self.assertTrue(hasattr(django_response, '_headers') or 
hasattr(django_response, 'headers'))
+        self.assertTrue(hasattr(django_response, 'headers'))
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/django_silk-5.5.2/project/tests/test_silky_middleware.py 
new/django_silk-5.6.0/project/tests/test_silky_middleware.py
--- old/django_silk-5.5.2/project/tests/test_silky_middleware.py        
2026-08-13 06:11:58.666710600 +0200
+++ new/django_silk-5.6.0/project/tests/test_silky_middleware.py        
2026-09-12 07:34:51.923878200 +0200
@@ -1,7 +1,7 @@
 from unittest.mock import patch
 
 from django.test import TestCase, override_settings
-from django.urls import reverse
+from django.urls import reverse, set_script_prefix
 
 from silk.config import SilkyConfig
 from silk.errors import SilkNotConfigured
@@ -121,6 +121,7 @@
     def test_should_intercept_non_silk_request(self):
         request = Request()
         request.path = '/myapp/foo'
+        request.path_info = '/myapp/foo'
         should_intercept = _should_intercept(request)
 
         self.assertTrue(should_intercept)
@@ -128,6 +129,7 @@
     def test_should_intercept_silk_request(self):
         request = Request()
         request.path = reverse('silk:summary')
+        request.path_info = reverse('silk:summary')
         should_intercept = _should_intercept(request)
 
         self.assertFalse(should_intercept)
@@ -136,6 +138,7 @@
     def test_should_intercept_without_silk_urls(self):
         request = Request()
         request.path = '/login'
+        request.path_info = '/login'
         _should_intercept(request)  # Just checking no crash
 
     def test_should_intercept_ignore_paths(self):
@@ -144,6 +147,57 @@
         ]
         request = Request()
         request.path = '/ignorethis'
+        request.path_info = '/ignorethis'
         should_intercept = _should_intercept(request)
 
         self.assertFalse(should_intercept)
+
+    def test_should_intercept_ignore_paths_behind_script_name_prefix(self):
+        """
+        Regression test for
+        https://github.com/jazzband/django-silk/issues/349
+
+        A SILKY_IGNORE_PATHS entry is a plain string the user writes
+        in settings.py -- never passed through reverse() -- so it's
+        naturally written without any deployment-specific SCRIPT_NAME
+        prefix. Matching it must therefore use path_info (which has
+        that prefix stripped), not path (which still has it), or a
+        front-end web server prefix causes the entry to go
+        unrecognized.
+        """
+        SilkyConfig().SILKY_IGNORE_PATHS = [
+            '/ignorethis'
+        ]
+
+        # A path with a SCRIPT_NAME-style prefix that only path_info
+        # (not path) has stripped off.
+        request = Request()
+        request.path = '/some-prefix/ignorethis'
+        request.path_info = '/ignorethis'
+        should_intercept = _should_intercept(request)
+
+        self.assertFalse(should_intercept)
+
+    def test_should_intercept_silk_request_behind_script_name_prefix(self):
+        """
+        Companion regression test for
+        https://github.com/jazzband/django-silk/issues/349.
+
+        Unlike SILKY_IGNORE_PATHS entries, get_fpath() is built from
+        reverse(), which picks up Django's script prefix (set from
+        SCRIPT_NAME by the WSGI handler on every real request) just
+        like request.path does. So when deployed behind a front-end
+        prefix, both request.path and reverse() include it together
+        and self-detection must keep comparing against request.path,
+        not the prefix-stripped request.path_info.
+        """
+        set_script_prefix('/some-prefix/')
+        try:
+            request = Request()
+            request.path = reverse('silk:summary')
+            request.path_info = reverse('silk:summary')[len('/some-prefix'):]
+            should_intercept = _should_intercept(request)
+
+            self.assertFalse(should_intercept)
+        finally:
+            set_script_prefix('/')
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/django_silk-5.5.2/setup.py 
new/django_silk-5.6.0/setup.py
--- old/django_silk-5.5.2/setup.py      2026-08-13 06:11:58.672315800 +0200
+++ new/django_silk-5.6.0/setup.py      2026-09-12 07:34:51.928452000 +0200
@@ -21,10 +21,9 @@
         'Development Status :: 5 - Production/Stable',
         'Environment :: Web Environment',
         'Framework :: Django',
-        'Framework :: Django :: 4.2',
-        'Framework :: Django :: 5.1',
         'Framework :: Django :: 5.2',
         'Framework :: Django :: 6.0',
+        'Framework :: Django :: 6.1',
         'Intended Audience :: Developers',
         'Operating System :: OS Independent',
         'Programming Language :: Python',
@@ -38,7 +37,7 @@
         'Topic :: Internet :: WWW/HTTP :: Dynamic Content',
     ],
     install_requires=[
-        'Django>=4.2',
+        'Django>=5.2',
         'sqlparse',
         'gprof2dot>=2017.09.19',
     ],
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/django_silk-5.5.2/silk/__init__.py 
new/django_silk-5.6.0/silk/__init__.py
--- old/django_silk-5.5.2/silk/__init__.py      2026-08-13 06:11:58.672315800 
+0200
+++ new/django_silk-5.6.0/silk/__init__.py      2026-09-12 07:34:51.928452000 
+0200
@@ -1,3 +1,6 @@
-from importlib.metadata import version
+from importlib.metadata import PackageNotFoundError, version
 
-__version__ = version("django-silk")
+try:
+    __version__ = version("django-silk")
+except PackageNotFoundError:
+    __version__ = "unknown"
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/django_silk-5.5.2/silk/middleware.py 
new/django_silk-5.6.0/silk/middleware.py
--- old/django_silk-5.5.2/silk/middleware.py    2026-08-13 06:11:58.672876600 
+0200
+++ new/django_silk-5.6.0/silk/middleware.py    2026-09-12 07:34:51.929073600 
+0200
@@ -24,9 +24,9 @@
     try:
         r = reverse('silk:%s' % name, *args, **kwargs)
     except NoReverseMatch:
-        # In case user forgets to set namespace, but also fixes Django 1.5 
tests on Travis
+        # In case user forgets to set namespace
         # Hopefully if user has forgotten to add namespace there are no 
clashes with their own
-        # view names but I don't think there is really anything can do about 
this.
+        # view names but I don't think there is really anything we can do 
about this.
         r = reverse(name, *args, **kwargs)
     return r
 
@@ -44,7 +44,7 @@
 
 
 def _should_intercept(request):
-    """we want to avoid recording any requests/sql queries etc that belong to 
Silky"""
+    """We want to avoid recording any requests/SQL queries, etc., that belong 
to Silky."""
     # Check custom intercept logic.
     if config.SILKY_INTERCEPT_FUNC:
         if not config.SILKY_INTERCEPT_FUNC(request):
@@ -55,11 +55,22 @@
             return False
 
     try:
+        # get_fpath() (via reverse()) picks up Django's script prefix
+        # (set from SCRIPT_NAME by the WSGI handler on every real
+        # request), so it already includes any front-end web server
+        # prefix -- exactly like request.path does. Keep comparing
+        # against request.path here; request.path_info has that
+        # prefix stripped and would no longer match.
         silky = request.path.startswith(get_fpath())
     except NoReverseMatch:
         silky = False
 
-    ignored = request.path in config.SILKY_IGNORE_PATHS
+    # SILKY_IGNORE_PATHS entries are plain strings the user writes in
+    # settings.py -- never passed through reverse() -- so they're
+    # naturally written without any deployment-specific SCRIPT_NAME
+    # prefix. Use path_info (prefix-stripped) here so such an entry
+    # still matches when silk is deployed behind a prefix. See GH #349.
+    ignored = request.path_info in config.SILKY_IGNORE_PATHS
     return not (silky or ignored)
 
 
@@ -89,7 +100,7 @@
         # To be able to persist filters when Session and Authentication
         # middlewares are not present.
         # Unlike session (which stores in DB) it won't persist filters
-        # after refresh the page.
+        # after refreshing the page.
         request.silk_filters = {}
 
         response = self.get_response(request)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/django_silk-5.5.2/silk/migrations/0009_alter_request_prof_file.py 
new/django_silk-5.6.0/silk/migrations/0009_alter_request_prof_file.py
--- old/django_silk-5.5.2/silk/migrations/0009_alter_request_prof_file.py       
1970-01-01 01:00:00.000000000 +0100
+++ new/django_silk-5.6.0/silk/migrations/0009_alter_request_prof_file.py       
2026-09-12 07:34:51.929236400 +0200
@@ -0,0 +1,25 @@
+# Generated by Django 5.2.17 on 2026-08-21 12:49
+
+from django.db import migrations, models
+
+import silk.models
+
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        ("silk", "0008_sqlquery_analysis"),
+    ]
+
+    operations = [
+        migrations.AlterField(
+            model_name="request",
+            name="prof_file",
+            field=models.FileField(
+                blank=True,
+                max_length=300,
+                storage=silk.models.get_silk_storage,
+                upload_to="",
+            ),
+        ),
+    ]
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/django_silk-5.5.2/silk/models.py 
new/django_silk-5.6.0/silk/models.py
--- old/django_silk-5.5.2/silk/models.py        2026-08-13 06:11:58.673049400 
+0200
+++ new/django_silk-5.6.0/silk/models.py        2026-09-12 07:34:51.929236400 
+0200
@@ -1,11 +1,11 @@
 import base64
+import gzip
 import json
 import random
 import re
 from uuid import uuid4
 
 import sqlparse
-from django.conf import settings
 from django.core.files.storage import storages
 from django.core.files.storage.handler import InvalidStorageError
 from django.db import models, router, transaction
@@ -28,12 +28,18 @@
 from silk.config import SilkyConfig
 from silk.utils.profile_parser import parse_profile
 
-try:
-    silk_storage = storages['SILKY_STORAGE']
-except InvalidStorageError:
-    from django.utils.module_loading import import_string
-    storage_class = SilkyConfig().SILKY_STORAGE_CLASS or 
settings.DEFAULT_FILE_STORAGE
-    silk_storage = import_string(storage_class)()
+
+def get_silk_storage():
+    """Resolve profiler file storage at use-time (migration-safe callable)."""
+    try:
+        return storages['SILKY_STORAGE']
+    except InvalidStorageError:
+        from django.utils.module_loading import import_string
+        return import_string(SilkyConfig().SILKY_STORAGE_CLASS)()
+
+
+# Kept for historical migrations that reference silk.models.silk_storage.
+silk_storage = get_silk_storage()
 
 
 # Seperated out so can use in tests w/o models
@@ -84,7 +90,8 @@
     meta_num_queries = IntegerField(null=True, blank=True)
     meta_time_spent_queries = FloatField(null=True, blank=True)
     pyprofile = TextField(blank=True, default='')
-    prof_file = FileField(max_length=300, blank=True, storage=silk_storage)
+    # Callable storage keeps migrations stable across project STORAGES 
settings.
+    prof_file = FileField(max_length=300, blank=True, storage=get_silk_storage)
 
     # Useful method to create shortened copies of strings without losing start 
and end context
     # Used to ensure path and view_name don't exceed 190 characters
@@ -221,7 +228,15 @@
 
     @property
     def raw_body_decoded(self):
-        return base64.b64decode(self.raw_body)
+        raw_body = base64.b64decode(self.raw_body)
+        if self.headers.get('content-encoding') == 'gzip':
+            try:
+                return gzip.decompress(raw_body)
+            except (OSError, EOFError):
+                # Malformed gzip payloads must not crash the raw view;
+                # fall back to the still-compressed body.
+                return raw_body
+        return raw_body
 
 
 # TODO rewrite docstring
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/django_silk-5.5.2/tox.ini 
new/django_silk-5.6.0/tox.ini
--- old/django_silk-5.5.2/tox.ini       2026-08-13 06:11:58.692936200 +0200
+++ new/django_silk-5.6.0/tox.ini       2026-09-12 07:34:51.947491000 +0200
@@ -9,16 +9,15 @@
 
 [gh-actions:env]
 DJANGO =
-    4.2: dj42
-    5.1: dj51
     5.2: dj52
     6.0: dj60
+    6.1: dj61
     main: djmain
 
 [tox]
 envlist =
-    py{310-315}-dj{42,50,51,52}-{sqlite3,mysql,postgresql}
-    py{312-315}-dj{60,main}-{sqlite3,mysql,postgresql}
+    py{310-315}-dj52-{sqlite3,mysql,postgresql}
+    py{312-315}-dj{60,61,main}-{sqlite3,mysql,postgresql}
 
 [testenv]
 usedevelop = True
@@ -29,10 +28,9 @@
     -rrequirements.txt
     mysql: mysqlclient
     postgresql: psycopg2-binary
-    dj42: django>=4.2,<4.3
-    dj51: django>=5.1,<5.2
     dj52: django>=5.2,<5.3
     dj60: django>=6.0,<6.1
+    dj61: django>=6.1,<6.2
     djmain: https://github.com/django/django/archive/main.tar.gz
 extras = formatting
 setenv =

Reply via email to