Releases: mborsetti/webchanges
Releases · mborsetti/webchanges
Release list
v3.36.1
Fixed
- Configuration loading no longer fails with
NameError: name '_ConfigDisplay' is not defined(or similar) when
an obsolete version oftypeguard(<4.5) is found installed. --edit-jobs,--edit-config,--edit-hooks, and--detailed-versionsnow run without loading the
configuration, jobs, and hooks files, so a malformed file no longer prevents launching the editor or the version
listing from being shown.- Improved output of
--detailed-versions, especially whenpackagingis available.
Internals
- RELEASE documentation is now in Markdown format.
- Updated vendored
packaging.version(used as a fallback when the optionalpackagingdependency is unavailable)
from v24.2 to v26.2.
v3.36.0
Added
* Job directives and configuration values are now type-checked when starting **webchanbges**. If a directive has the
wrong type (e.g. a string where a boolean is expected), this will be shown at launch with a clear error instead of
failing later during execution.
* New JSON Schemas for ``config.yaml`` and ``jobs.yaml`` are deployed next to those files, so editors that consume
schemas from the same directory can offer autocompletion and validation. ``config.schema.json`` is written next to
``--config``, and ``jobs.schema.json`` next to the first ``--jobs`` file.
- Note that while some editors automatically start using them, others (e.g. VS Code) require the line
``# yaml-language-server: $schema=config.schema.json`` to be inserted at the top of a config file, and the line
``# yaml-language-server: $schema=jobs.schema.json`` at the top of a jobs file and repeated after every ``---``
separator (i.e. each individual job entry starts with it).
* ``--test-reporter <name>`` combined with a positional joblist now overrides the configured reporters: the listed
jobs are fetched, filtered, and diffed against the snapshot database, and the resulting report is sent to the
named reporter only (other reporters do not fire). Snapshots are not saved (read-only). Without a joblist,
``--test-reporter`` continues to send a dummy report to the named reporter as before.
Changed
- The
additions_onlyjob directive now accepts a numeric ratio in[0, 1](interpreted as the minimum
fraction of the original content that must remain before the deletion-safeguard warning is triggered) in addition
to a boolean.trueremains equivalent to0.25(the historical default — warn when 25% or less of the
original content remains, i.e. 75% or more has been removed). The directive also accepts the string
"disable_safeguard"to keep additions-only filtering active while never showing deletions, even on a full
wipe.falsecontinues to disable additions-only filtering entirely. The diff safeguard message has been
rephrased and now reports the actual remaining percentage (e.g. "only 45% of the original content remains"). webchanges --list --verbosewill now also display the internalguidvalue.webchanges --errorsnow honors a "joblist" of positionalJOB(S)arguments (job index numbers and/or
URLs/commands), restricting the error check to those jobs only. Without a joblist, all enabled jobs are checked
as before.- New
-vvv(verbose level 3) command line argument to set the log level to Python'sNOTSETfor maximum
verbosity.
Internals
* Fixed packaging so that the ``webchanges(1)`` man page is actually generated and installed.
* Improved testing and code coverage (work in progress).
v3.35.0
Added
* New ``curl_cffi`` option for the ``http_client`` job directive, using the `curl_cffi
<https://github.com/lexiforest/curl_cffi>`__ library to wrap libcurl-impersonate. This replays real browser TLS
fingerprints (Chrome, Firefox, Safari, Edge) at the wire level, enabling retrieval of pages behind Cloudflare,
Akamai, and similar bot-walls that fingerprint the TLS handshake (JA3) or HTTP/2 ``SETTINGS`` frame, without
needing a full headless browser job.
* New ``impersonate`` job directive controlling the browser TLS fingerprint used by the ``curl_cffi`` HTTP client
(e.g. ``chrome``, ``chrome124``, ``safari17_0``, ``firefox133``). Defaults to ``chrome``. Ignored by the
``httpx`` and ``requests`` backends.
* New ``fingerprints`` job directive for advanced low-level TLS/HTTP fingerprint overrides with the ``curl_cffi``
HTTP client. Accepts a mapping with optional ``ja3``, ``akamai``, and ``extra_fp`` keys, forwarded verbatim to
``curl_cffi``. See the `curl_cffi customization documentation
<https://curl-cffi.readthedocs.io/en/latest/impersonate/customize.html>`__ for details. Ignored by the ``httpx``
and ``requests`` backends.
* New ``http_version`` job directive to pin the HTTP protocol version (``v1``, ``v2``, ``v2tls``,
``v2_prior_knowledge``, ``v3``, ``v3only``) when using the ``httpx`` or ``curl_cffi`` HTTP clients. ``httpx``
supports ``v1`` and ``v2`` (the latter requires the ``h2`` package); ``curl_cffi`` supports all values.
* New HTTP client selection logic. While **webchanges** installs ``httpx``, the program will work in in environments
where ``httpx`` has been uninstalled by falling back to ``requests`` or ``curl_cffi``, enabling custom lightweight
installs.
* The ``initialization_url`` job directive now works for all ``url`` jobs (not only those with
``use_browser: true``). A ``GET`` request is made to the initialization URL within the same session; cookies
received are automatically carried over to the main request.
* The ``use_browser`` job directive now accepts a browser name string in addition to a boolean. Supported values
any value starting with ``chrome`` or ``msedge`` (e.g. ``chrome``, ``chrome-beta``, ``msedge-dev``), ``firefox``, or
``webkit``, or. ``true`` continues to mean the ``chrome`` channel.
* A (fairly good) AI-generated high-level architectural overview of **webchanges** is available on `DeepWiki
<https://deepwiki.com/mborsetti/webchanges>`__.
Internals
- The
requestsandcurl_cffiHTTP client backends now use session objects (requests.Sessionand
curl_cffi.requests.Session) for connection reuse and automatic cookie persistence across initialization and
main requests.
Fixed
* A report will now be created for jobs initialized with ``--prepare-jobs`` when ``display`` > ``new`` configuration
has a ``true`` value.
v3.34.2
Fixed
* Files missing in PyPi installation.
v3.34.1
⚠ Breaking Changes
* Newly added ``utf-8`` sub-directive of ``smtp`` ``email`` reporter is now called ``utf_8`` (with an underscore) due to
Python TypedDict class limitation, but will have backward-compatibility for at least 12 months.
Changed
```````
* ``telegram`` reporter will now look for the environment variable ``TELEGRAM_BOT_TOKEN`` if no token is defined in the
configuration (i.e. ``bot_token`` is missing or has a ``null`` value).
Fixed
`````
* Regression: Rejecting ``ignore_cached`` job directive (reported by `Marcos Alano <https://github.com/mhalano>`__
in issue `#153 <https://github.com/mborsetti/webchanges/issues/153>`__).
* Rejecting ``http_credentials`` job directive in certain circumstances with URL jobs with ``browser: true``.
Internals impacting ``hooks.py``
- Broken up huge files into smaller, more manageable ones. If you are importing from webchanges, the location of
certain classes may have changed.
Internals
* Increased amount of free memory required before running URL jobs with ``use_browser: true`` (i.e. Playwright)
in parallel to 800 MiB.
v3.34.0
Added
* New reporter ``github_issue`` creates a GitHub issue for changes detected.
- Kindly contributed by `Dmitry Vasiliev <https://github.com/swimmwatch>`__ in `#105
<https://github.com/mborsetti/webchanges/issues/105>`__.
- Implemented as a GitHub Action ``webchanges-action`` available `here
<https://github.com/swimmwatch/webchanges-action>`__.
* The ``wdiff`` filter now handles ``html`` text.
* New ``suppress_error_ended`` and ``suppress_errors``` Job sub-directives to control error notifications job-by-job.
- Suggested by `Marcos Alano <https://github.com/mhalano>`__ in `#101
<https://github.com/mborsetti/webchanges/issues/101>`__.
* New ``ntfy`` reporter to support `ntfy <https://ntfy.sh>`__ (pronounced _notify_), an open-source fee simple
HTTP-based `pub-sub <https://en.wikipedia.org/wiki/Publish%E2%80%93subscribe_pattern>`__ notification service (also
for upstream compatibility).
* Filters ``execute`` and ``shellpipe`` now have an ``escape_characters`` sub-directive to automatically escape Windows
command caracters (e.g. ``%`` becomes ``%%``, ``!`` becomes ``^!``, etc.).
Fixed
`````
* All databases, keep-alive connections, and underlying SSL sockets are now closed correctly before exit. Fixes the
``ResourceWarning: unclosed database`` and ``ResourceWarning: <ssl.SSLSocket>`` messages when run with environment
variable ``PYTHONWARNINGS=all``.
v3.33.0
Added
* ``ai_google`` differ has new ``thinking_level`` and ``media_resolution`` sub-directives.
* ``command`` differ has a new ``context_lines`` sub-directive for commands starting with wdiff for backwards
compatibility (but use the built-in ``wdiff`` differ instead).
Changed
ai_googlediffer is no longer considered BETA.- Improved logging for the
evaluatedirective in URL Jobs withbrowser: true. --dump-history JOBcommand line argument will now match any job, even one that is not in the--jobsfile.
Fixed
* Regression: ``http_ignore_error_codes`` not being applied to ``TransientHTTPError`` Exceptions such as '429 Too Many
Requests' (issue #`119 <https://github.com/mborsetti/webchanges/issues/119>`__).
* ``http_credentials`` directive not being applied to URL jobs with ``browser: true`` and ``user_data_dir``.
* When running with command line argument ``-vv``, browser pages will open with DevTools open.
* Problem parsing Playwright exceptions in BrowserJob class retrieve method (issue #`141
<https://github.com/mborsetti/webchanges/issues/141>`__)..
Internals for ``hooks.py``
- The BrowserJob class'
retrievemethod has been modularized, and exposesresponse_handler(a callable which
replaces the built-in page.goto() directive),content_handler(a callable which replaces the built-in content
extractor from the Page), andreturn_data(a callable which replaces all of the built-in functionality after
the browser is launched).`
Internals
* Code type checking is now performed using ``ty`` instead of ``mypy``.
* Improved logging and the saving of snapshots when a browsing error is encountered for URL jobs with ``browser: true``.
* Use ``uv`` to build PyPi distributable.
v3.31.4
Reminder
Older Python versions are supported for 3 years after being obsoleted by a new major release. As Python 3.10 was
released on 24 October 2022, the codebase will be streamlined by removing support for Python 3.10 on or after 24
October 2025.
Added
`````
* Support for Python 3.14.
Fixed
`````
* Fixed ``deepdiff`` differ to handle text strings correctly (e.g. when an API typically returning JSON starts
returning an error in HTML).
Internals (impacting hooks.py)
- In the
DifferClass'processmethod, thereport_kind's valuetexthas been renamedplainfor
clarity and to align with IANA's media type nomenclature for different types of text.
Internals (other)
* Implemented testing for Python 3.14.
* Implemented OpenSSF Scorecard and improved code security.
* Enabled additional ``ruff check`` linters and improved code quality.
v3.31.3
Reminder
Older Python versions are supported for 3 years after being obsoleted by a new major release. As Python 3.10 was
released on 24 October 2022, the codebase will be streamlined by removing support for Python 3.10 on or after 24
October 2025.
Fixed
`````
* Certain job Exceptions would fail with a yaml Exception.
Internals
- Removed non-unique elements in pyproject.toml's classifiers,
- Updated run-gemini-cli to fix GitHub error.
- Fixed pre-commit.ci failing checks on new PRs
v3.31.2
Fixed
* Fixed UnboundLocalError when using new ``utf-8`` sub-directive within the ``smtp`` emailer (``email`` report).
Reported in #`104 <https://github.com/mborsetti/webchanges/issues/110>`__.
Internals
- Removed workaround for Python 3.9, which is no longer supported.