webchanges 3.37.0__tar.gz → 3.39.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (65) hide show
  1. {webchanges-3.37.0/webchanges.egg-info → webchanges-3.39.0}/PKG-INFO +36 -28
  2. {webchanges-3.37.0 → webchanges-3.39.0}/README.rst +26 -21
  3. {webchanges-3.37.0 → webchanges-3.39.0}/pyproject.toml +13 -6
  4. {webchanges-3.37.0 → webchanges-3.39.0}/requirements.txt +0 -1
  5. {webchanges-3.37.0 → webchanges-3.39.0}/webchanges/__init__.py +2 -2
  6. {webchanges-3.37.0 → webchanges-3.39.0}/webchanges/_resources/config.schema.json +238 -54
  7. {webchanges-3.37.0 → webchanges-3.39.0}/webchanges/_resources/jobs.schema.json +337 -73
  8. {webchanges-3.37.0 → webchanges-3.39.0}/webchanges/_vendored/headers.py +3 -3
  9. {webchanges-3.37.0 → webchanges-3.39.0}/webchanges/_vendored/packaging_version.py +39 -18
  10. {webchanges-3.37.0 → webchanges-3.39.0}/webchanges/cli.py +162 -84
  11. {webchanges-3.37.0 → webchanges-3.39.0}/webchanges/command.py +227 -42
  12. {webchanges-3.37.0 → webchanges-3.39.0}/webchanges/config.py +32 -9
  13. {webchanges-3.37.0 → webchanges-3.39.0}/webchanges/differs.py +147 -126
  14. {webchanges-3.37.0 → webchanges-3.39.0}/webchanges/filters/_base.py +27 -10
  15. {webchanges-3.37.0 → webchanges-3.39.0}/webchanges/filters/_document.py +121 -51
  16. {webchanges-3.37.0 → webchanges-3.39.0}/webchanges/filters/_encoding.py +2 -0
  17. {webchanges-3.37.0 → webchanges-3.39.0}/webchanges/filters/_html.py +97 -35
  18. {webchanges-3.37.0 → webchanges-3.39.0}/webchanges/filters/_shell.py +2 -0
  19. {webchanges-3.37.0 → webchanges-3.39.0}/webchanges/filters/_text.py +20 -17
  20. {webchanges-3.37.0 → webchanges-3.39.0}/webchanges/handler.py +58 -28
  21. {webchanges-3.37.0 → webchanges-3.39.0}/webchanges/jobs/__init__.py +2 -0
  22. {webchanges-3.37.0 → webchanges-3.39.0}/webchanges/jobs/_base.py +225 -60
  23. {webchanges-3.37.0 → webchanges-3.39.0}/webchanges/jobs/_browser.py +74 -30
  24. {webchanges-3.37.0 → webchanges-3.39.0}/webchanges/jobs/_exceptions.py +14 -1
  25. {webchanges-3.37.0 → webchanges-3.39.0}/webchanges/jobs/_shell.py +46 -6
  26. {webchanges-3.37.0 → webchanges-3.39.0}/webchanges/jobs/_url.py +276 -102
  27. {webchanges-3.37.0 → webchanges-3.39.0}/webchanges/mailer.py +79 -14
  28. {webchanges-3.37.0 → webchanges-3.39.0}/webchanges/main.py +8 -0
  29. {webchanges-3.37.0 → webchanges-3.39.0}/webchanges/reporters/__init__.py +13 -3
  30. {webchanges-3.37.0 → webchanges-3.39.0}/webchanges/reporters/_base.py +192 -60
  31. {webchanges-3.37.0 → webchanges-3.39.0}/webchanges/reporters/_browser.py +2 -0
  32. {webchanges-3.37.0 → webchanges-3.39.0}/webchanges/reporters/_chat.py +97 -72
  33. {webchanges-3.37.0 → webchanges-3.39.0}/webchanges/reporters/_email.py +5 -2
  34. {webchanges-3.37.0 → webchanges-3.39.0}/webchanges/reporters/_stdout.py +41 -17
  35. webchanges-3.39.0/webchanges/reporters/_system.py +132 -0
  36. {webchanges-3.37.0 → webchanges-3.39.0}/webchanges/reporters/_web.py +91 -56
  37. {webchanges-3.37.0 → webchanges-3.39.0}/webchanges/storage/__init__.py +2 -0
  38. {webchanges-3.37.0 → webchanges-3.39.0}/webchanges/storage/_base.py +62 -14
  39. {webchanges-3.37.0 → webchanges-3.39.0}/webchanges/storage/_config.py +78 -44
  40. {webchanges-3.37.0 → webchanges-3.39.0}/webchanges/storage/_minidb.py +3 -1
  41. {webchanges-3.37.0 → webchanges-3.39.0}/webchanges/storage/_redis.py +10 -7
  42. {webchanges-3.37.0 → webchanges-3.39.0}/webchanges/storage/_sqlite3.py +10 -5
  43. {webchanges-3.37.0 → webchanges-3.39.0}/webchanges/storage/_ssdb.py +12 -5
  44. {webchanges-3.37.0 → webchanges-3.39.0}/webchanges/storage/_yaml.py +191 -49
  45. {webchanges-3.37.0 → webchanges-3.39.0}/webchanges/util.py +75 -50
  46. {webchanges-3.37.0 → webchanges-3.39.0}/webchanges/worker.py +28 -31
  47. {webchanges-3.37.0 → webchanges-3.39.0/webchanges.egg-info}/PKG-INFO +36 -28
  48. {webchanges-3.37.0 → webchanges-3.39.0}/webchanges.egg-info/requires.txt +15 -5
  49. webchanges-3.37.0/webchanges/reporters/_system.py +0 -69
  50. {webchanges-3.37.0 → webchanges-3.39.0}/LICENSE.md +0 -0
  51. {webchanges-3.37.0 → webchanges-3.39.0}/MANIFEST.in +0 -0
  52. {webchanges-3.37.0 → webchanges-3.39.0}/setup.cfg +0 -0
  53. {webchanges-3.37.0 → webchanges-3.39.0}/setup.py +0 -0
  54. {webchanges-3.37.0 → webchanges-3.39.0}/tools/get_manpages_parser.py +0 -0
  55. {webchanges-3.37.0 → webchanges-3.39.0}/webchanges/__main__.py +0 -0
  56. {webchanges-3.37.0 → webchanges-3.39.0}/webchanges/_resources/__init__.py +0 -0
  57. {webchanges-3.37.0 → webchanges-3.39.0}/webchanges/_vendored/__init__.py +0 -0
  58. {webchanges-3.37.0 → webchanges-3.39.0}/webchanges/_vendored/typeguard.py +0 -0
  59. {webchanges-3.37.0 → webchanges-3.39.0}/webchanges/filters/__init__.py +0 -0
  60. {webchanges-3.37.0 → webchanges-3.39.0}/webchanges/py.typed +0 -0
  61. {webchanges-3.37.0 → webchanges-3.39.0}/webchanges/storage_minidb.py +0 -0
  62. {webchanges-3.37.0 → webchanges-3.39.0}/webchanges.egg-info/SOURCES.txt +0 -0
  63. {webchanges-3.37.0 → webchanges-3.39.0}/webchanges.egg-info/dependency_links.txt +0 -0
  64. {webchanges-3.37.0 → webchanges-3.39.0}/webchanges.egg-info/entry_points.txt +0 -0
  65. {webchanges-3.37.0 → webchanges-3.39.0}/webchanges.egg-info/top_level.txt +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: webchanges
3
- Version: 3.37.0
3
+ Version: 3.39.0
4
4
  Summary: Web Changes Delivered. AI-Summarized. Totally Anonymous.
5
5
  Author-email: Mike Borsetti <mike+webchanges@borsetti.com>
6
6
  Maintainer-email: Mike Borsetti <mike+webchanges@borsetti.com>
@@ -21,10 +21,10 @@ Classifier: Operating System :: OS Independent
21
21
  Classifier: Programming Language :: Python
22
22
  Classifier: Programming Language :: Python :: 3
23
23
  Classifier: Programming Language :: Python :: 3 :: Only
24
- Classifier: Programming Language :: Python :: 3.11
25
24
  Classifier: Programming Language :: Python :: 3.12
26
25
  Classifier: Programming Language :: Python :: 3.13
27
26
  Classifier: Programming Language :: Python :: 3.14
27
+ Classifier: Programming Language :: Python :: 3.15
28
28
  Classifier: Programming Language :: Python :: Free Threading
29
29
  Classifier: Programming Language :: Python :: Free Threading :: 4 - Resilient
30
30
  Classifier: Programming Language :: Python :: Implementation :: CPython
@@ -34,10 +34,9 @@ Classifier: Topic :: Internet :: WWW/HTTP :: Indexing/Search
34
34
  Classifier: Topic :: System :: Monitoring
35
35
  Classifier: Topic :: Utilities
36
36
  Classifier: Typing :: Typed
37
- Requires-Python: >=3.11
37
+ Requires-Python: >=3.12
38
38
  Description-Content-Type: text/x-rst
39
39
  License-File: LICENSE.md
40
- Requires-Dist: colorama; sys_platform == "win32"
41
40
  Requires-Dist: cssselect
42
41
  Requires-Dist: h2
43
42
  Requires-Dist: html2text
@@ -64,7 +63,7 @@ Requires-Dist: html5lib; extra == "html5lib"
64
63
  Provides-Extra: ical2text
65
64
  Requires-Dist: vobject; extra == "ical2text"
66
65
  Provides-Extra: jq
67
- Requires-Dist: jq; os_name != "nt" and extra == "jq"
66
+ Requires-Dist: jq; extra == "jq"
68
67
  Provides-Extra: ocr
69
68
  Requires-Dist: pytesseract; extra == "ocr"
70
69
  Requires-Dist: Pillow; extra == "ocr"
@@ -75,10 +74,14 @@ Requires-Dist: pypdf; extra == "pypdf"
75
74
  Provides-Extra: pypdf-crypto
76
75
  Requires-Dist: pypdf; extra == "pypdf-crypto"
77
76
  Requires-Dist: cryptography; extra == "pypdf-crypto"
77
+ Provides-Extra: xmltodict
78
+ Requires-Dist: xmltodict; extra == "xmltodict"
78
79
  Provides-Extra: deepdiff
79
- Requires-Dist: deepdiff>=8.0; extra == "deepdiff"
80
+ Requires-Dist: deepdiff>=8.0; python_version < "3.15" and extra == "deepdiff"
81
+ Requires-Dist: deepdiff<9,>=8.0; python_version >= "3.15" and extra == "deepdiff"
80
82
  Provides-Extra: deepdiff-xml
81
- Requires-Dist: deepdiff>=8.0; extra == "deepdiff-xml"
83
+ Requires-Dist: deepdiff>=8.0; python_version < "3.15" and extra == "deepdiff-xml"
84
+ Requires-Dist: deepdiff<9,>=8.0; python_version >= "3.15" and extra == "deepdiff-xml"
82
85
  Requires-Dist: xmltodict; extra == "deepdiff-xml"
83
86
  Provides-Extra: imagediff
84
87
  Requires-Dist: Pillow; extra == "imagediff"
@@ -99,7 +102,7 @@ Requires-Dist: requests; extra == "requests"
99
102
  Provides-Extra: safe-password
100
103
  Requires-Dist: keyring; extra == "safe-password"
101
104
  Provides-Extra: all
102
- Requires-Dist: webchanges[beautify,bs4,curl_cffi,deepdiff_xml,html5lib,ical2text,imagediff,jq,matrix,ocr,pdf2text,pushbullet,pushover,pypdf_crypto,redis,requests,safe_password,use_browser,xmpp]; extra == "all"
105
+ Requires-Dist: webchanges[beautify,bs4,curl_cffi,deepdiff_xml,html5lib,ical2text,imagediff,jq,matrix,ocr,pdf2text,pushbullet,pushover,pypdf_crypto,redis,requests,safe_password,use_browser,xmltodict,xmpp]; extra == "all"
103
106
  Dynamic: license-file
104
107
 
105
108
  .. role:: underline
@@ -120,22 +123,25 @@ notifications and AI-powered summaries to your favorite `platform
120
123
 
121
124
  Highlights
122
125
  ==========
123
- - **AI-powered change summaries** via Gemini (`ai_google differ
124
- <https://webchanges.readthedocs.io/en/stable/differs.html#ai-google-diff>`__, BETA).
125
- - **Structural diffs for JSON and XML** via the `deepdiff differ
126
- <https://webchanges.readthedocs.io/en/stable/differs.html#deepdiff-diff>`__.
127
- - **Visual diffs for images** via the `image differ
128
- <https://webchanges.readthedocs.io/en/stable/differs.html#image-diff>`__ (BETA).
129
- - **Bypass TLS/JA3 fingerprinting** with the optional `curl_cffi
130
- <https://webchanges.readthedocs.io/en/stable/jobs.html#http-client>`__ HTTP client.
131
- - **JSON-Schema-validated** ``jobs.yaml`` and ``config.yaml`` for editor autocompletion and inline validation.
126
+ - **Watch anything**: web pages (in a `real browser
127
+ <https://webchanges.readthedocs.io/en/stable/jobs.html#use-browser>`__ if needed), APIs, local files and command
128
+ output.
129
+ - **Track only what matters** with over 30 `filters <https://webchanges.readthedocs.io/en/stable/filters.html>`__.
130
+ - **Read changes at a glance** in formatted HTML, side by side, word by word, as `AI summaries
131
+ <https://webchanges.readthedocs.io/en/stable/differs.html#ai-google-diff>`__ and more.
132
+ - **Get notified anywhere**: email, Telegram, Discord, ntfy, webhooks and `more
133
+ <https://webchanges.readthedocs.io/en/stable/reporters.html>`__.
134
+ - **Few false alarms**: transient errors can be held back and repeated ones reported `once
135
+ <https://webchanges.readthedocs.io/en/stable/jobs.html#suppress-repeated-errors>`__.
136
+ - **Runs on your machine**, total privacy, no account needed, and extends with Python `hooks
137
+ <https://webchanges.readthedocs.io/en/stable/hooks.html>`__.
132
138
 
133
139
 
134
140
  Requirements
135
141
  ============
136
142
  **webchanges** requires |support|. For the best experience, use the current version of `Python
137
- <https://www.python.org/downloads/>`__; older Python versions are supported for 3 years after they're replaced. Free-threaded Python is supported, though some
138
- optional dependencies may not be.
143
+ <https://www.python.org/downloads/>`__; older Python versions are supported for 3 years after they're replaced.
144
+ Free-threaded Python is supported.
139
145
 
140
146
  For Generative AI summaries (BETA), you need a free `API Key from Google Cloud AI Studio
141
147
  <https://aistudio.google.com/app/apikey>`__ (see `here
@@ -158,6 +164,10 @@ or with ``pip``:
158
164
 
159
165
  pip install webchanges
160
166
 
167
+ On Windows with Python 3.15, first run ``set PYYAML_FORCE_LIBYAML=0`` (in PowerShell:
168
+ ``$env:PYYAML_FORCE_LIBYAML = "0"``), as explained `here
169
+ <https://webchanges.readthedocs.io/en/stable/introduction.html#install-windows>`__.
170
+
161
171
  Other ways to run
162
172
  -----------------
163
173
  - In a `Docker <https://www.docker.com/>`__ container: a minimal implementation (no browser) is `here
@@ -217,7 +227,7 @@ Schedule
217
227
 
218
228
  Code
219
229
  ====
220
- |coveralls| |issues| |code_style| |OpenSSF_Scorecard|
230
+ |coveralls| |issues| |code_style|
221
231
 
222
232
  The code, issues tracker, and discussions are hosted on `GitHub <https://github.com/mborsetti/webchanges>`__.
223
233
 
@@ -236,10 +246,11 @@ License
236
246
  =======
237
247
  |license|
238
248
 
239
- See the `complete licenses <https://raw.githubusercontent.com/mborsetti/webchanges/refs/heads/main/LICENSE.md>`__ (released
240
- under the `MIT License <https://opensource.org/licenses/MIT>`__ but redistributing modified source code, dated 30
241
- July 2020, from `urlwatch 2.21 <https://github.com/thp/urlwatch/tree/346b25914b0418342ffe2fb0529bed702fddc01f>`__
242
- licensed under a `BSD 3-Clause License
249
+ See the `complete licenses
250
+ <https://raw.githubusercontent.com/mborsetti/webchanges/refs/heads/main/LICENSE.md>`__ (released under the `MIT
251
+ License <https://opensource.org/licenses/MIT>`__ but redistributing modified source code, dated 30 July 2020, from
252
+ `urlwatch 2.21 <https://github.com/thp/urlwatch/tree/346b25914b0418342ffe2fb0529bed702fddc01f>`__ licensed under a
253
+ `BSD 3-Clause License
243
254
  <https://raw.githubusercontent.com/thp/urlwatch/346b25914b0418342ffe2fb0529bed702fddc01f/COPYING>`__).
244
255
 
245
256
 
@@ -247,7 +258,7 @@ Relationship with **urlwatch**
247
258
  ==============================
248
259
  This project is a fork of `urlwatch 2.21
249
260
  <https://github.com/thp/urlwatch/tree/346b25914b0418342ffe2fb0529bed702fddc01f>`__ and has since added many features;
250
- see the `comparison <https://webchanges.readthedocs.io/en/stable/_static/webchanges-vs-urlwatch.html>`__.
261
+ see the `comparison <https://webchanges.readthedocs.io/en/stable/upgrading.html>`__.
251
262
 
252
263
 
253
264
  .. |support| image:: https://img.shields.io/pypi/pyversions/webchanges.svg
@@ -295,6 +306,3 @@ see the `comparison <https://webchanges.readthedocs.io/en/stable/_static/webchan
295
306
  .. .. |snyk| image:: https://snyk.io/advisor/python/webchanges/badge.svg
296
307
  .. :target: https://security.snyk.io/package/pip/webchanges
297
308
  .. :alt: Snyk Package Health Score
298
- .. |OpenSSF_Scorecard| image:: https://api.scorecard.dev/projects/github.com/mborsetti/webchanges/badge
299
- :target: https://scorecard.dev/viewer/?uri=github.com/mborsetti/webchanges
300
- :alt: OpenSSF Scoreard
@@ -16,22 +16,25 @@ notifications and AI-powered summaries to your favorite `platform
16
16
 
17
17
  Highlights
18
18
  ==========
19
- - **AI-powered change summaries** via Gemini (`ai_google differ
20
- <https://webchanges.readthedocs.io/en/stable/differs.html#ai-google-diff>`__, BETA).
21
- - **Structural diffs for JSON and XML** via the `deepdiff differ
22
- <https://webchanges.readthedocs.io/en/stable/differs.html#deepdiff-diff>`__.
23
- - **Visual diffs for images** via the `image differ
24
- <https://webchanges.readthedocs.io/en/stable/differs.html#image-diff>`__ (BETA).
25
- - **Bypass TLS/JA3 fingerprinting** with the optional `curl_cffi
26
- <https://webchanges.readthedocs.io/en/stable/jobs.html#http-client>`__ HTTP client.
27
- - **JSON-Schema-validated** ``jobs.yaml`` and ``config.yaml`` for editor autocompletion and inline validation.
19
+ - **Watch anything**: web pages (in a `real browser
20
+ <https://webchanges.readthedocs.io/en/stable/jobs.html#use-browser>`__ if needed), APIs, local files and command
21
+ output.
22
+ - **Track only what matters** with over 30 `filters <https://webchanges.readthedocs.io/en/stable/filters.html>`__.
23
+ - **Read changes at a glance** in formatted HTML, side by side, word by word, as `AI summaries
24
+ <https://webchanges.readthedocs.io/en/stable/differs.html#ai-google-diff>`__ and more.
25
+ - **Get notified anywhere**: email, Telegram, Discord, ntfy, webhooks and `more
26
+ <https://webchanges.readthedocs.io/en/stable/reporters.html>`__.
27
+ - **Few false alarms**: transient errors can be held back and repeated ones reported `once
28
+ <https://webchanges.readthedocs.io/en/stable/jobs.html#suppress-repeated-errors>`__.
29
+ - **Runs on your machine**, total privacy, no account needed, and extends with Python `hooks
30
+ <https://webchanges.readthedocs.io/en/stable/hooks.html>`__.
28
31
 
29
32
 
30
33
  Requirements
31
34
  ============
32
35
  **webchanges** requires |support|. For the best experience, use the current version of `Python
33
- <https://www.python.org/downloads/>`__; older Python versions are supported for 3 years after they're replaced. Free-threaded Python is supported, though some
34
- optional dependencies may not be.
36
+ <https://www.python.org/downloads/>`__; older Python versions are supported for 3 years after they're replaced.
37
+ Free-threaded Python is supported.
35
38
 
36
39
  For Generative AI summaries (BETA), you need a free `API Key from Google Cloud AI Studio
37
40
  <https://aistudio.google.com/app/apikey>`__ (see `here
@@ -54,6 +57,10 @@ or with ``pip``:
54
57
 
55
58
  pip install webchanges
56
59
 
60
+ On Windows with Python 3.15, first run ``set PYYAML_FORCE_LIBYAML=0`` (in PowerShell:
61
+ ``$env:PYYAML_FORCE_LIBYAML = "0"``), as explained `here
62
+ <https://webchanges.readthedocs.io/en/stable/introduction.html#install-windows>`__.
63
+
57
64
  Other ways to run
58
65
  -----------------
59
66
  - In a `Docker <https://www.docker.com/>`__ container: a minimal implementation (no browser) is `here
@@ -113,7 +120,7 @@ Schedule
113
120
 
114
121
  Code
115
122
  ====
116
- |coveralls| |issues| |code_style| |OpenSSF_Scorecard|
123
+ |coveralls| |issues| |code_style|
117
124
 
118
125
  The code, issues tracker, and discussions are hosted on `GitHub <https://github.com/mborsetti/webchanges>`__.
119
126
 
@@ -132,10 +139,11 @@ License
132
139
  =======
133
140
  |license|
134
141
 
135
- See the `complete licenses <https://raw.githubusercontent.com/mborsetti/webchanges/refs/heads/main/LICENSE.md>`__ (released
136
- under the `MIT License <https://opensource.org/licenses/MIT>`__ but redistributing modified source code, dated 30
137
- July 2020, from `urlwatch 2.21 <https://github.com/thp/urlwatch/tree/346b25914b0418342ffe2fb0529bed702fddc01f>`__
138
- licensed under a `BSD 3-Clause License
142
+ See the `complete licenses
143
+ <https://raw.githubusercontent.com/mborsetti/webchanges/refs/heads/main/LICENSE.md>`__ (released under the `MIT
144
+ License <https://opensource.org/licenses/MIT>`__ but redistributing modified source code, dated 30 July 2020, from
145
+ `urlwatch 2.21 <https://github.com/thp/urlwatch/tree/346b25914b0418342ffe2fb0529bed702fddc01f>`__ licensed under a
146
+ `BSD 3-Clause License
139
147
  <https://raw.githubusercontent.com/thp/urlwatch/346b25914b0418342ffe2fb0529bed702fddc01f/COPYING>`__).
140
148
 
141
149
 
@@ -143,7 +151,7 @@ Relationship with **urlwatch**
143
151
  ==============================
144
152
  This project is a fork of `urlwatch 2.21
145
153
  <https://github.com/thp/urlwatch/tree/346b25914b0418342ffe2fb0529bed702fddc01f>`__ and has since added many features;
146
- see the `comparison <https://webchanges.readthedocs.io/en/stable/_static/webchanges-vs-urlwatch.html>`__.
154
+ see the `comparison <https://webchanges.readthedocs.io/en/stable/upgrading.html>`__.
147
155
 
148
156
 
149
157
  .. |support| image:: https://img.shields.io/pypi/pyversions/webchanges.svg
@@ -190,7 +198,4 @@ see the `comparison <https://webchanges.readthedocs.io/en/stable/_static/webchan
190
198
  .. :alt: Security Status
191
199
  .. .. |snyk| image:: https://snyk.io/advisor/python/webchanges/badge.svg
192
200
  .. :target: https://security.snyk.io/package/pip/webchanges
193
- .. :alt: Snyk Package Health Score
194
- .. |OpenSSF_Scorecard| image:: https://api.scorecard.dev/projects/github.com/mborsetti/webchanges/badge
195
- :target: https://scorecard.dev/viewer/?uri=github.com/mborsetti/webchanges
196
- :alt: OpenSSF Scoreard
201
+ .. :alt: Snyk Package Health Score
@@ -16,7 +16,7 @@ dynamic = ['version', 'dependencies']
16
16
  name = 'webchanges'
17
17
  description = 'Web Changes Delivered. AI-Summarized. Totally Anonymous.'
18
18
  readme = { file = 'README.rst', content-type = 'text/x-rst' }
19
- requires-python = '>=3.11'
19
+ requires-python = '>=3.12'
20
20
  license = "MIT AND BSD-3-Clause"
21
21
  license-files = ['LICENSE.md']
22
22
  authors = [{ name = 'Mike Borsetti', email = 'mike+webchanges@borsetti.com' }]
@@ -35,10 +35,10 @@ classifiers = [
35
35
  'Programming Language :: Python',
36
36
  'Programming Language :: Python :: 3',
37
37
  'Programming Language :: Python :: 3 :: Only',
38
- 'Programming Language :: Python :: 3.11',
39
38
  'Programming Language :: Python :: 3.12',
40
39
  'Programming Language :: Python :: 3.13',
41
40
  'Programming Language :: Python :: 3.14',
41
+ 'Programming Language :: Python :: 3.15',
42
42
  'Programming Language :: Python :: Free Threading',
43
43
  'Programming Language :: Python :: Free Threading :: 4 - Resilient',
44
44
  'Programming Language :: Python :: Implementation :: CPython',
@@ -70,15 +70,22 @@ beautify = ['beautifulsoup4', 'jsbeautifier', 'cssbeautifier']
70
70
  bs4 = ['beautifulsoup4']
71
71
  html5lib = ['html5lib']
72
72
  ical2text = ['vobject']
73
- jq = ['jq; os_name != "nt"']
73
+ jq = ['jq']
74
74
  ocr = ['pytesseract', 'Pillow']
75
75
  pdf2text = ['pdftotext']
76
76
  pypdf = ['pypdf']
77
77
  pypdf_crypto = ['pypdf', 'cryptography']
78
+ xmltodict = ['xmltodict'] # xmltojson and xmltoyaml filters
78
79
  # differs
79
80
  # deepdiff >= 8.0 is required for threshold_to_diff_deeper
80
- deepdiff = ['deepdiff >= 8.0']
81
- deepdiff_xml = ['deepdiff >= 8.0', 'xmltodict']
81
+ # deepdiff < 9 on Python >= 3.15: deepdiff 9 requires cachebox < 6, and cachebox 5.x has no 3.15 wheels and cannot be
82
+ # built for 3.15 (it uses PyO3 0.27, which supports Python only up to 3.14). Keep in sync with tests/requirements_*.txt
83
+ deepdiff = ['deepdiff >= 8.0; python_version < "3.15"', 'deepdiff >= 8.0, < 9; python_version >= "3.15"']
84
+ deepdiff_xml = [
85
+ 'deepdiff >= 8.0; python_version < "3.15"',
86
+ 'deepdiff >= 8.0, < 9; python_version >= "3.15"',
87
+ 'xmltodict',
88
+ ]
82
89
  imagediff = ['Pillow']
83
90
  # reporters
84
91
  matrix = ['matrix_client']
@@ -92,7 +99,7 @@ requests = ['requests']
92
99
  safe_password = ['keyring']
93
100
  # all
94
101
  all = [
95
- 'webchanges[use_browser,beautify,bs4,html5lib,ical2text,jq,ocr,pdf2text,pypdf_crypto,deepdiff_xml,imagediff,matrix,pushbullet,pushover,xmpp,curl_cffi,redis,requests,safe_password]',
102
+ 'webchanges[use_browser,beautify,bs4,html5lib,ical2text,jq,ocr,pdf2text,pypdf_crypto,xmltodict,deepdiff_xml,imagediff,matrix,pushbullet,pushover,xmpp,curl_cffi,redis,requests,safe_password]',
96
103
  ]
97
104
 
98
105
 
@@ -1,4 +1,3 @@
1
- colorama; sys_platform == 'win32'
2
1
  cssselect
3
2
  h2
4
3
  html2text
@@ -12,7 +12,7 @@ supported services. Can check the output of local commands as well.
12
12
 
13
13
  from __future__ import annotations
14
14
 
15
- __min_python_version__ = (3, 11) # minimum version of Python required to run; 3.11 supported until fall 2026
15
+ __min_python_version__ = (3, 12) # minimum version of Python required to run; 3.12 supported until 7 October 2027
16
16
 
17
17
 
18
18
  __project_name__ = str(__package__)
@@ -22,7 +22,7 @@ __project_name__ = str(__package__)
22
22
  # * MINOR version when you add functionality in a backwards compatible manner, and
23
23
  # * MICRO or PATCH version when you make backwards compatible bug fixes. We no longer use '0'
24
24
  # If unsure on increments, use pkg_resources.parse_version to parse
25
- __version__ = '3.37.0'
25
+ __version__ = '3.39.0'
26
26
  __description__ = (
27
27
  'Check web (or command output) for changes since last run and notify.\n\nAnonymously alerts you of web changes.'
28
28
  )