From f185cc905601471b988522592846a26db7f3879c Mon Sep 17 00:00:00 2001 From: dgw Date: Sat, 16 Mar 2024 17:54:47 -0500 Subject: [PATCH] Last WIP changelog commit for 8.0! That's the whole list! --- NEWS | 180 +++++++++++++++++++++++++++++++++++++++++++++++++++-------- 1 file changed, 158 insertions(+), 22 deletions(-) diff --git a/NEWS b/NEWS index 76dd6d5c5..4b31d5829 100644 --- a/NEWS +++ b/NEWS @@ -20,6 +20,8 @@ Highlights * `.blocks` command accepts "nick" and "host" types now, and no longer lies about supporting "hostmasks" (further improvements to come) * Sopel no longer supports loading (very!) old Phenny/Jenni plugins +* Several built-in plugins have been converted to external packages, to simplify + maintenance and release-management going forward **For developers:** @@ -56,6 +58,11 @@ Plugin changes * adminchannel: * Refactored hostmask handling & added code comments/tests [[#2222][]] * Improved result of trying to kick the bot with `.kick` [[#2240][]] +* bugzilla: + * Extracted to [its own package][sopel-bugzilla] [[#2481][]] +* calc: + * Improved error handling [[#2507][]] + * Improved help output & test coverage [[#2530][]] * clock: * Added `unset` commands for user & channel time zone/format [[#2181][]] * coretasks: @@ -63,12 +70,17 @@ Plugin changes * Real "hostmask" support is planned; see [#1355][] * Improved help output for `.blocks` [[#2345][]] * currency: + * Added `.currencies` command to list known currency symbols [[#2439][]] * `fiat_provider` setting takes precedence over the existence of a `fixer_io_key` value [[#2330][]] + * Switched from `exchangerate.host` to `open.er-api.com` [[#2512][]] +* dice: + * Refactoring, bugfixes, and improved test coverage [[#2532][]] * emoticons: * Added `.tback` alias for `.unflip` command [[#2287][]] * Made `.unflip` table more closely match the `.tflip` one [[#2287][]] * find: + * Fixed use of flags when `|` is used as input separator [[#2447][]] * Code cleanup [[#2267][]] * help: * Now updatable independently from [its own package][sopel-help], but still @@ -76,10 +88,15 @@ Plugin changes * ip: * Miscellaneous code-style improvements [[#2393][]] * Extracted to [its own package][sopel-iplookup] [[#2523][]] +* meetbot: + * Extracted to [its own package][sopel-meetbot] [[#2477][]] * pronouns: * Accept abbreviated pronoun sets [[#2070][]] * Added `.clearpronouns` command [[#2154][]] * Fetch pronoun list dynamically at startup [[#2130][]] + * Support configurable pronoun backend [[#2437][], [#2438][]] + * The old backend at `pronoun.is` went down and never came back, so now you + can use [our replacement][pronoun-ours] or [host your own][pronoun-base] * py: * Extracted to [its own package][sopel-py] [[#2411][], [#2415][]] * reddit: @@ -94,11 +111,17 @@ Plugin changes * Extracted to [its own package][sopel-remind] [[#2478][]] * safety: * Comprehensive rework improving caching, output, etc. [[#2279][]] + * Ignore invalid hostnames [[#2472][]] * search: + * Fix `.suggest` when there is only one result [[#2513][]] * Code style and dependency updates [[#2260][], [#2334][], [#2420][]] * seen: * Adapted to aware `trigger.time` [[#2265][]] * Prevent error spam if database is temporarily inaccessible [[#2338][]] +* tell: + * Fixed edge cases in cleanup of tellee argument [[#2584][]] +* translate: + * Improved help output [[#2453][]] * unicode_info: * Uses `unicodedata2` if available [[#2349][], [#2361][]] * url: @@ -106,7 +129,9 @@ Plugin changes * Removed traceback from debug log when URL fetch fails [[#2280][]] * Made channel-privilege-based access to `.urlexclude` command and friends configurable [[#2352][]] - * Cleaned up code [[#2304][], [#2307][]] + * Cleaned up code [[#2304][], [#2307][], [#2433][]] + * Added better error handling for DNS lookups [[#2428][]] + * Ignore invalid hostnames [[#2472][]] * version: * Support retrieving plugin versions with `.version pluginname` [[#2133][]] * wikipedia: @@ -117,6 +142,7 @@ Plugin changes * Don't ping the user who posted a URL that fails to load [[#2315][]] * Output image description if URL has an image viewer fragment [[#2388][]] * Handle query strings in article links [[#2414][]] + * Fail gracefully on `Special:` namespace links [[#2575][]] * xkcd: * Switched keyword-search backend [[#2376][], [#2377][]] @@ -127,16 +153,20 @@ Core changes added testing on newer Python versions (up to 3.12), and modernized coding standards [[#2062][], [#2073][], [#2123][], [#2124][], [#2134][], [#2136][], [#2138][], [#2205][], [#2213][], [#2227][], [#2298][], [#2326][], [#2327][], - [#2342][], [#2384][], [#2516][]] + [#2342][], [#2384][], [#2464][], [#2500][], [#2516][]] +* Modified default settings: + * Removed default `B` mode from `core.modes` [[#2448][]] + * Added space before timezone in `default_time_format` [[#2531][]] * IRC backend refactored to use `asyncio` [[#2256][]] * Just in time, too: The `asynchat` module was removed in Python 3.12 +* Improved IRC connection error handling [[#2430][], [#2431][]] * `SopelDB` adapted to SQLAlchemy 2.x style [[#2243][]] * Database can be configured all at once with a new `db_url` setting [[#2087][]] * Replaced `pkg_resources` with `importlib.metadata` [[#2261][], [#2268][]] * Added support for several new IRC features and IRCv3 specifications: - * SASL EXTERNAL authentication using client certificates [[#2100][]] - * Sopel automatically marks itself as a bot if the IRC server supports - [the Bot Mode specification][bot-mode-spec] [[#2088][]] + * SASL EXTERNAL client certificate authentication [[#2100][], [#2561][]] + * Sopel uses [the Bot Mode specification][bot-mode-spec] to mark itself as a + bot and track other users that are flagged as bots [[#2088][], [#2448][]] * `userhost-in-names` capability and the legacy `UHNAMES` feature [[#2102][]] * `chghost` capability [[#2116][]] * Improved SASL handling when auth fails [[#2187][], [#2191][]] @@ -169,6 +199,7 @@ Core changes * See [ZNC issue #1224][znc/znc#1224] * Override `get_version()` method for `EntryPointPlugin` [[#2313][]] * Take advantage of `LINELEN` token if advertised in ISUPPORT [[#2346][]] +* Unescape ISUPPORT parameter values [[#2429][]] * Keep track of user realnames via WHO/WHOX [[#2383][], [#2396][]] * Raise error on receiving non-UTF-8 data if server advertises `UTF8ONLY` [[#2365][], [#2369][], [#2372][]] @@ -177,6 +208,9 @@ Core changes * Add guardrails to channel logging [[#2419][]] * Default is now always WARNING, regardless of file logging level * DEBUG level is no longer available for channel logs; it is far too noisy +* Handle `core.modes` setting being `None` [[#2510][]] +* Handle broken symlinks to plugin files [[#2545][]] +* Fixed auto-saving changes to Sopel's ignore list with `.blocks` [[#2550][]] API changes ----------- @@ -196,22 +230,33 @@ API changes * Moved `check_pid()` and `stderr()` functions to `cli.utils` [[#2385][]] * Deprecated `tools.OutputRedirect` class left over from the days before modern logging, to be removed in Sopel 8.1 [[#2385][]] -* Moved privilege constants into their own `sopel.privileges` submodule - [[#2179][], [#2352][]] - * The original constants in `sopel.plugin` are still available for now -* Sopel's API now uses `Enum` types where suitable: +* Moved channel privilege constants into their own `sopel.privileges` submodule + [[#2179][], [#2352][], [#2540][]] + * The new `sopel.privileges.AccessLevel` type encapsulates all levels in a + single object, which can support dynamic features in the future + * The original, individual constants in `sopel.plugin` are still available for + now, mapped to their corresponding `AccessLevel` values +* Sopel's API now uses enumerated types where suitable: * `formatting.colors` [[#2122][]] + * `privileges.AccessLevel` [[#2540][]] * `tools.events` [[#2127][]] * `bot`-tagged messages are ignored by default [[#2089][]] * `trigger.time` is offset-aware [[#2099][]] -* `tools.time.format_time()` accepts offset-aware `datetime` values [[#2132][]] +* `tools.time` improvements & changes: + * `format_time()` accepts offset-aware `datetime` values [[#2132][]] + * `seconds_to_split()` returns a `Duration` named tuple [[#2446][]] + * `validate_timezone()` now raises `ValueError` for `None` [[#2446][]] * Added `plugin.allow_bots` decorator [[#2244][]] -* Added more rate-limit controls [[#2290][]] +* Added more rate-limit controls [[#2290][], [#2434][]] * New `message` keyword-only argument to `plugin.rate` decorator, an optional string sent via NOTICE when a command is rate-limited * New `plugin.rate_user`, `plugin.rate_channel`, and `plugin.rate_global` decorators provide simpler control over a single rate-limit type, with the `rate` and `message` (optional) as positional parameters + * Messages support various placeholders that will be replaced with runtime + data about the triggering user, the rate limit in effect, and the + plugin/command that was limited; see [`plugin.rate`][rate-decorator] + decorator documentation for details * Added `bot.safe_text_length()` method [[#2136][]] * Added `RPL_WHOISBOT` to `tools.events` list [[#2145][]] * Added `bot.plugins` property [[#2199][]] @@ -224,6 +269,8 @@ API changes helper method to automatically use the bot's knowledge about the current server's configuration * Added CHANTYPES support to `Identifier` [[#2236][]] +* Added `bot.make_identifier_memory()` helper to easily take advantage of the + bot's CASEMAPPING and CHANTYPES knowledge [[#2552][]] * Changed reading `core.nick` from the bot's settings to return a `str` instead of `Identifier` [[#2231][]] * Depending on what your plugin does, you might need to use the result of @@ -237,6 +284,8 @@ API changes * Sopel 8.0 removes `intent` from `trigger.tags`; use `trigger.ctcp` instead * Updated invite-related event names in `tools.events` [[#2270][]] * Fixed checking if `None` exists in a `SopelIdentifierMemory` [[#2306][]] +* Fixed and tested `SopelIdentifierMemory` interactions with plainer-vanilla + dictionary types [[#2525][]] * Reworked capability negotiation [[#2341][]] * See [Managing Capability Negotiation][cap-mgmt-8] documentation chapter * This replaces the `irc.utils.CapReq` interface, which is now deprecated @@ -256,9 +305,18 @@ API changes intercept actions that don't work prior to connecting [[#2394][]] * Prohibited actions raise `RuntimeError` instead of falling through to a more esoteric error type or—worse—silently failing -* Added `realname` field to `User` objects [[#2383][]] +* Added `realname` & `is_bot` fields to `User` objects [[#2383][], [#2448][]] * Use of `plugin.require_privilege()` or `plugin.require_bot_privilege()` decorators now implies `require_chanmsg()` [[#2405][], [#2580][]] +* Fixed an inconsistency between behavior and documentation for + `tools.calculation.pow_complexity()` [[#2543][]] +* Soft-deprecated `SopelWrapper` type [[#2521]] + * Long-term, we will phase out this subclass in favor of using `contextvars`; + see [#2460][] for the full timeline +* Moved `sopel.plugins` to `sopel.builtins` [[#2504][]] + * **We don't technically consider these to be part of the API**, but if this + isn't mentioned we just *know* someone will complain that the move broke + some custom plugin code * Removed previously-deprecated API features [[#2128][], [#2129][], [#2141][], [#2144][], [#2146][], [#2147][], [#2148][], [#2150][], [#2329][]] @@ -267,29 +325,41 @@ Housekeeping changes * Many, many improvements to documentation [[#1990][], [#2169][], [#2178][], [#2182][], [#2226][], [#2238][], [#2239][], [#2257][], [#2275][], [#2276][], - [#2323][], [#2379][], [#2386][], [#2409][], [#2424][]] -* Switched from Travis CI to GitHub Actions and revamped testing infrastructure - [[#2075][], [#2078][], [#2123][], [#2188][], [#2335][], [#2342][], [#2381][]] + [#2323][], [#2379][], [#2386][], [#2409][], [#2424][], [#2426][], [#2442][], + [#2489][], [#2494][], [#2495][], [#2496][], [#2533][], [#2539][], [#2543][], + [#2550][], [#2558][], [#2574][]] +* Switched from Travis CI to GitHub Actions and incrementally improved tests + [[#2075][], [#2078][], [#2123][], [#2188][], [#2262][], [#2335][], [#2342][], + [#2381][], [#2452][], [#2453][], [#2458][], [#2505][], [#2519][], [#2543][]] +* Improved tooling for contributors, e.g. `Makefile` targets [[#2502][]] * Modernized packaging [[#2328][]] -* Cleanup on aisle `contrib/` [[#2085][]] -* Cleanup of deprecated feature usage in core & built-in plugins [[#2117][]] +* Cleanup on aisle `contrib/` [[#2085][], [#2520][]] +* Cleanup of deprecated feature usage in core & built-in plugins [[#2117][], + [#2464][], [#2468][], [#2470][]] * Import reorganization [[#2179][]] -* Miscellaneous code smell/style issues fixed [[#2186][], [#2220][], [#2231][], - [#2382][], [#2393][]] -* Miscellaneous logging improvements [[#2309][], [#2354][]] -* Miscellaneous test suite improvements [[#2262][]] +* Various code smell/style issues fixed [[#2186][], [#2220][], [#2231][], + [#2382][], [#2393][], [#2514][]] +* Various logging improvements [[#2309][], [#2354][], [#2473][], [#2569][]] +* Deprecation warnings for the corresponding stable release now begin to emit + logs in prerelease versions [[#2522][]] * Removed legacy CLI run mode [[#2118][]] * Removed obsolete, nonfunctional CLI argument `--quiet` [[#2404][]] * Removed old `sopel.test_tools` [[#2139][], [#2177][]] * Raw logs improved both output and decode failure handling [[#2095][]] -* Started our journey into the wonderful world of type checking [[#2185][]] +* Started our journey into the wonderful world of type checking [[#2185][], + [#2462][], [#2471][], [#2480][], [#2491][], [#2535][], [#2555][]] * Many *many* PRs added or updated type hints in the course of adding/fixing something else, so we won't *also* list all of them here [bot-mode-spec]: https://ircv3.net/specs/extensions/bot-mode [cap-mgmt-8]: https://sopel.chat/docs/plugin/advanced#managing-capability-negotiation +[pronoun-base]: https://github.com/lucasew/svelte-pronounisland +[pronoun-ours]: https://github.com/sopel-irc/pronoun-service +[rate-decorator]: https://sopel.chat/docs/plugin/decorators#sopel.plugin.rate +[sopel-bugzilla]: https://pypi.org/project/sopel-bugzilla/ [sopel-help]: https://pypi.org/project/sopel-help/ [sopel-iplookup]: https://pypi.org/project/sopel-iplookup/ +[sopel-meetbot]: https://pypi.org/project/sopel-meetbot/ [sopel-py]: https://pypi.org/project/sopel-py/ [sopel-reddit]: https://pypi.org/project/sopel-reddit/ [sopel-remind]: https://pypi.org/project/sopel-remind/ @@ -470,14 +540,80 @@ Housekeeping changes [#2419]: https://github.com/sopel-irc/sopel/pull/2419 [#2420]: https://github.com/sopel-irc/sopel/pull/2420 [#2424]: https://github.com/sopel-irc/sopel/pull/2424 +[#2426]: https://github.com/sopel-irc/sopel/pull/2426 +[#2428]: https://github.com/sopel-irc/sopel/pull/2428 +[#2429]: https://github.com/sopel-irc/sopel/pull/2429 +[#2430]: https://github.com/sopel-irc/sopel/pull/2430 +[#2431]: https://github.com/sopel-irc/sopel/pull/2431 +[#2433]: https://github.com/sopel-irc/sopel/pull/2433 +[#2434]: https://github.com/sopel-irc/sopel/pull/2434 +[#2437]: https://github.com/sopel-irc/sopel/pull/2437 +[#2438]: https://github.com/sopel-irc/sopel/pull/2438 +[#2439]: https://github.com/sopel-irc/sopel/pull/2439 [#2441]: https://github.com/sopel-irc/sopel/pull/2441 +[#2442]: https://github.com/sopel-irc/sopel/pull/2442 [#2444]: https://github.com/sopel-irc/sopel/pull/2444 +[#2446]: https://github.com/sopel-irc/sopel/pull/2446 +[#2447]: https://github.com/sopel-irc/sopel/pull/2447 +[#2448]: https://github.com/sopel-irc/sopel/pull/2448 [#2450]: https://github.com/sopel-irc/sopel/pull/2450 +[#2452]: https://github.com/sopel-irc/sopel/pull/2452 +[#2453]: https://github.com/sopel-irc/sopel/pull/2453 +[#2455]: https://github.com/sopel-irc/sopel/pull/2455 +[#2458]: https://github.com/sopel-irc/sopel/pull/2458 +[#2460]: https://github.com/sopel-irc/sopel/issues/2460 +[#2462]: https://github.com/sopel-irc/sopel/pull/2462 +[#2464]: https://github.com/sopel-irc/sopel/pull/2464 +[#2468]: https://github.com/sopel-irc/sopel/pull/2468 +[#2470]: https://github.com/sopel-irc/sopel/pull/2470 +[#2471]: https://github.com/sopel-irc/sopel/pull/2471 +[#2472]: https://github.com/sopel-irc/sopel/pull/2472 +[#2473]: https://github.com/sopel-irc/sopel/pull/2473 +[#2477]: https://github.com/sopel-irc/sopel/pull/2477 [#2478]: https://github.com/sopel-irc/sopel/pull/2478 +[#2480]: https://github.com/sopel-irc/sopel/pull/2480 +[#2481]: https://github.com/sopel-irc/sopel/pull/2481 +[#2489]: https://github.com/sopel-irc/sopel/pull/2489 +[#2491]: https://github.com/sopel-irc/sopel/pull/2491 +[#2494]: https://github.com/sopel-irc/sopel/pull/2494 +[#2495]: https://github.com/sopel-irc/sopel/pull/2495 +[#2496]: https://github.com/sopel-irc/sopel/pull/2496 +[#2500]: https://github.com/sopel-irc/sopel/pull/2500 +[#2502]: https://github.com/sopel-irc/sopel/pull/2502 +[#2504]: https://github.com/sopel-irc/sopel/pull/2504 +[#2505]: https://github.com/sopel-irc/sopel/pull/2505 +[#2507]: https://github.com/sopel-irc/sopel/pull/2507 +[#2510]: https://github.com/sopel-irc/sopel/pull/2510 +[#2512]: https://github.com/sopel-irc/sopel/pull/2512 +[#2513]: https://github.com/sopel-irc/sopel/pull/2513 +[#2514]: https://github.com/sopel-irc/sopel/pull/2514 [#2516]: https://github.com/sopel-irc/sopel/pull/2516 +[#2519]: https://github.com/sopel-irc/sopel/pull/2519 +[#2520]: https://github.com/sopel-irc/sopel/pull/2520 +[#2521]: https://github.com/sopel-irc/sopel/pull/2521 +[#2522]: https://github.com/sopel-irc/sopel/pull/2522 [#2523]: https://github.com/sopel-irc/sopel/pull/2523 +[#2525]: https://github.com/sopel-irc/sopel/pull/2525 +[#2530]: https://github.com/sopel-irc/sopel/pull/2530 +[#2531]: https://github.com/sopel-irc/sopel/pull/2531 +[#2532]: https://github.com/sopel-irc/sopel/pull/2532 +[#2533]: https://github.com/sopel-irc/sopel/pull/2533 +[#2535]: https://github.com/sopel-irc/sopel/pull/2535 +[#2539]: https://github.com/sopel-irc/sopel/pull/2539 +[#2540]: https://github.com/sopel-irc/sopel/pull/2540 +[#2543]: https://github.com/sopel-irc/sopel/pull/2543 +[#2545]: https://github.com/sopel-irc/sopel/pull/2545 +[#2550]: https://github.com/sopel-irc/sopel/pull/2550 +[#2552]: https://github.com/sopel-irc/sopel/pull/2552 +[#2555]: https://github.com/sopel-irc/sopel/pull/2555 +[#2558]: https://github.com/sopel-irc/sopel/pull/2558 +[#2561]: https://github.com/sopel-irc/sopel/pull/2561 +[#2569]: https://github.com/sopel-irc/sopel/pull/2569 +[#2574]: https://github.com/sopel-irc/sopel/pull/2574 +[#2575]: https://github.com/sopel-irc/sopel/pull/2575 [#2580]: https://github.com/sopel-irc/sopel/pull/2580 [#2581]: https://github.com/sopel-irc/sopel/pull/2581 +[#2584]: https://github.com/sopel-irc/sopel/pull/2584 Changes between 7.1.8 and 7.1.9