Skip to content

Changelog

All notable changes to BetterPy are documented here. This project uses CalVer (Calendar Versioning) with the format YYYY.MM.PATCH[-channel.build].

For the full changelog, see CHANGELOG.md on GitHub.


2026.09.4 - 2026-09-18

BetterPy adds pytest fixture pull-up and push-down refactorings to widen or narrow fixture availability, and improves test-file renaming, fixture deletion, and Protocol implementation discovery.

🚀 Features

  • Pull Up pytest fixture moves a class fixture to module level, a test-module fixture to its local conftest.py, or a conftest fixture to the parent directory. Required imports and referenced helpers accompany the fixture, with preview and conflict checks before changes are applied.
  • Push Down pytest fixture moves or copies fixtures into test classes, sibling test modules, or child conftests. Consumer-aware destination selection supports multiple child directories and retains the source fixture when consumers still need it outside the selected destinations.
  • Pytest file renaming now preselects only the editable test-file stem rather than the pytest prefix or extension. For example, renaming test_login.py selects login; custom python_files patterns such as check_*.py are respected too.

🐛 Bug Fixes

  • Safe delete unused fixture now removes imports left unused by the deleted fixture while preserving imports needed by remaining code, quoted annotations, exports, and fixture injection. Undo restores the fixture and removed imports together.
  • Class implementations Code Vision finds more valid Protocol implementations, including nested classes, instance attributes, inherited members, and generic or callable matches, while excluding unrelated Protocol descendants and respecting the search scope.

2026.09.3 - 2026-09-12

BetterPy adds redundant inspection-suppression detection and improves mock and pytest typing across supported PyCharm versions.

Features

  • Unnecessary inspection suppressions (PY-45308) highlights redundant IDs in Python # noinspection comments and removes only the selected ID, preserving the comment prefix and trailing explanation. Detection supports PyCharm's comment formats and kebab-case inspection IDs. On PyCharm build 263.3889.77 and later, the IDE provides equivalent behavior and BetterPy steps aside.

Bug Fixes

  • Jump to pytest node in test tree no longer resolves test locations on the event-dispatch thread while refreshing test results.

  • Mock typing preserves spec method return types, including async and chained calls, across PyCharm 2026.1, 2026.2, and 2026.3 EAP. Parameters injected by patch decorators are correctly typed as mocks rather than patchers.

  • Mock assertion methods no longer produce incorrect implicit-self argument warnings on PyCharm 2026.3 EAP.
  • Pytest fixture typing restores inference fallbacks when the IDE returns an explicit unknown type and recognizes additional NoneType representations when handling optional fixture values.
  • Constant Final inspection generates valid Any annotations when a constant's inferred type is unknown.
  • UV script runner no longer fails while checking a run context whose source element has no containing file.
  • MCP integration keeps tools available if feature-state lookup fails during a plugin reload.

2026.09.2 - 2026-09-08

This patch release adds direct bare tuple-return inlining while preserving Python expression grouping, fixes dynamic pytest action registration, and offers preliminary compatibility with PyCharm 263 EAP builds.

🚀 Features

🐛 Bug Fixes

  • Pytest collection-pattern IDE integration no longer reports an action-registration error when the plugin is loaded dynamically; run-context filtering now overrides the stable parent group while preserving platform additions.

[2026.09.1] - 2026-09-06

This patch release improves pytest fixture navigation and parametrized test execution while extending compatibility to PyCharm 2026.3 EAP.

🐛 Bug Fixes

  • Fixture Go to Type Declaration now offers every inferred class target when a fixture can return or yield multiple types, including navigation from fixture parameters and references in test bodies. This integration is active on PyCharm 2026.1; PyCharm 2026.2 and later bundle equivalent navigation natively.
  • Pytest parametrized case runs now use the exact pytest node ID when launched from a case gutter or the Test Runner, including decimal and source-derived IDs, while the function gutter continues to run the whole test.
  • Unknown dynamic pytest fixture inspection no longer reports dependencies of fixtures that have no discovered consumer scope and therefore do not execute.
  • BetterPy settings now place feature prerequisites before dependent features and groups.
  • IDE compatibility now covers PyCharm 2026.3 EAP in addition to PyCharm 2026.1 and 2026.2.

2026.09.0 - 2026-09-01

BetterPy aligns pytest run actions with configured collection patterns and expands headless MCP automation across feature-owned navigation, analysis, intentions, and refactorings.

🚀 Features

  • Pytest collection-pattern IDE integration keeps editor run gutters and Run/Debug context actions aligned with configured python_files, python_classes, python_functions, and testpaths, including custom-named and inherited tests.
  • BetterPy MCP now exposes 59 additional feature-owned operations for navigation, analysis, intentions, and refactorings. Each tool follows its existing feature flag and uses headless PSI/index logic instead of IDE dialogs.
  • UV script runner adds Generate → uv: script entry point for creating the first [project.scripts] mapping and a live template for its target.

🐛 Bug Fixes

  • Pytest fixture engine now discovers built-in fixtures declared on pytest's default-plugin classes, infers concrete request subtypes, and returns complete fixture usages without an artificial result cap.
  • Pytest fixture editor integration now resolves builtin fixtures from the active interpreter's pytest source, so Cmd+B navigation and fixture availability follow the installed pytest version.
  • Pytest fixture editor integration still types monkeypatch from _pytest.monkeypatch.monkeypatch when the fixture file index lists no files for that name.
  • Pytest fixture editor integration recognizes version-gated entries in pytest's default_plugins manifest, so standard fixtures such as tmp_path are not reported as unknown.
  • Pytest fixture documentation now shows request documentation from FixtureRequest, including the class docstring when no enriched return type is available.
  • Pytest fixture to usefixtures inspection now offers conversion only for unused setup-only fixtures, not for fixtures that return or yield a value.
  • Test/production editor tabs now preserve automatic pin state when files move across newly created splits and avoid reopening editor composites while restoring focus.
  • Create pytest fixtures from parameters now keeps intention previews side-effect-free, including feature-tip scheduling.
  • Contextual feature tips no longer schedule stale editor updates when focus leaves the editor or when source belongs to library code.

2026.08.5 - 2026-08-17

BetterPy adds first-class uv script run configurations and a quick fix for missing pytest test directories, while tightening pytest generation, collection, navigation, and result handling across existing workflows.

🚀 Features

  • UV script runner creates and maintains workspace-local run configurations for detected [project.scripts] and [project.gui-scripts] entry points, reusing existing configs and leaving user-specific settings untouched. Plugin-owned configs are removed when a script is commented out or deleted.
  • Missing pytest test directory highlights configured testpaths that do not exist and offers to create them.
  • New pytest members now insert assert False, "Not implemented" in generated tests so they fail until a real assertion is written.
  • Generate class actions now uses the same unimplemented assertion in generated test-class methods.
  • New pytest members recognize custom python_classes and python_functions collection patterns when generating tests and fixtures.
  • Test/production editor tabs now honor configured pytest python_files patterns when identifying test files.

🐛 Bug Fixes

  • Generate class actions avoids duplicate pytest class names and keeps the class action after the test action in the Generate menu.
  • Jump to pytest node in test tree no longer shows a second gutter icon next to the run icon. The jump is now offered as an item inside the existing run gutter menu.
  • Jump to pytest node in test tree now finds test nodes that the test tree has not expanded or is currently hiding, so the gutter menu item and the action are available right after a test run.
  • Jump to pytest node in test tree remains available when the caret is inside a pytest function or class body.
  • Parametrized case run gutter keeps the default Run Test tooltip when the test-tree jump is not on the menu.
  • Parametrized case run gutter now derives accurate node IDs for custom IDs, complex values, Unicode data, and configured pytest collection patterns.
  • Pytest fixture editor integration renames aliased fixtures from the name argument and updates their dynamic consumers.
  • Pytest failed-line inspection resolves failures to the correct file and class in projects with multiple pytest configuration roots.
  • Use actual test outcome resolves stack traces correctly across multiple pytest configuration roots and custom collection patterns.
  • Constant should be Final inspection restores collection and tuple type compatibility across PyCharm 2026.1, 2026.2, and 2026.3.

2026.08.4 - 2026-08-11

BetterPy makes generated Python and pytest declarations immediately editable and brings frequently used feature switches directly into the welcome experience.

🚀 Features

  • Generate class actions now start live templates for generated class names, method names, and bodies, including dataclasses, frozen dataclasses, protocols, and Pydantic models.
  • New pytest members now use live templates so generated tests and fixtures can be named and completed in place.
  • Generate pytest hook now opens generated hook implementations as live templates for immediate editing.
  • Quick Settings on the Welcome and What's New dialogs lets users enable or disable certain features without browsing through the settings panel.

🐛 Bug Fixes

  • Pytest mark completion now combines multiple marker declarations on the same editor line into one gutter icon with a target chooser, while keeping known markers navigable alongside unknown markers.

2026.08.3 - 2026-08-10

BetterPy adds a focused set of pytest inspections, marker and plugin-reference tooling, and configurable Python Structure View enhancements.

🚀 Features

  • In tester mode, What's new now opens the unreleased notes and provides a release selector for browsing every published changelog section.
  • Enhanced Python Structure View adds BetterPy's filters and pytest-specific presentation to PyCharm's Python Structure View while preserving the platform's native navigation, expansion, and filtering behavior.
  • Hide overloads adds a Structure View filter that hides @overload signatures while keeping their implementation visible.
  • Filter private members adds a Structure View toggle for hiding single- and double-underscore members while keeping Python protocol methods such as __init__ visible.
  • Icons for pytest tests and fixtures distinguishes tests, fixtures, and regular functions in Structure View and adds filters for showing or hiding tests and fixtures in pytest files.
  • Pytest fixture redundant parameter inspection reports unreferenced fixture parameters that are already provided by autouse, class-level usefixtures, or module-level pytestmark.
  • Pytest fixture to usefixtures inspection converts unused fixture parameters to explicit @pytest.mark.usefixtures(...) dependencies.
  • Pytest mark completion completes built-in, configured, and plugin-provided markers and adds navigation, rename, quick documentation, and strict-marker diagnostics for marker declarations.
  • Pytest missing assert inspection reports tests that have no effective assertion or explicitly return a value, while recognizing pytest checks, unittest assertions, fluent assertion libraries, mocks, and project helpers.
  • Pytest parametrize count mismatch inspection reports parameter rows whose value count does not match the declared argument names.
  • Pytest parametrize ids count inspection reports when the number of explicit IDs does not match the number of parameter sets.
  • Pytest parametrize unexpected keyword inspection reports unsupported keyword arguments passed to pytest.mark.parametrize.
  • Pytest parametrize unused argname inspection reports parameter names that are never used and offers coordinated fixes for the decorator values and test signature.
  • Pytest plugin references adds navigation, rename, usage search, and unresolved-reference diagnostics for module names in pytest_plugins.

🐛 Bug Fixes

  • What's new links feature entries to their documentation and uses more readable line spacing.
  • Pytest context-manager APIs such as pytest.raises(...) and pytest.warns(...) now count as checks only when they are actually entered, and assert_that helpers are recognized only when imported from AssertPy or PyHamcrest.
  • Parametrize inspections no longer mistake unrelated local aliases ending in mark.parametrize for pytest decorators.

2026.08.2 - 2026-08-08

BetterPy now brings fixture creation, navigation, completion, and diagnostics closer to pytest's actual scope and availability rules.

🚀 Features

  • Create pytest fixtures from parameters is now available and creates unknown fixtures in the nearest applicable scope, so local test and fixture parameters no longer default to unnecessarily broad fixture placement.
  • Parametrize pytest test completes fixture-backed parameter names inside @pytest.mark.parametrize, restricted to fixtures that are useful and available at the test's location.

🐛 Bug Fixes

  • Pytest fixture engine now shows fixture return types in completion, navigates to the closest available fixture, distinguishes unavailable and recursively defined fixtures, recognizes more built-in fixtures, and avoids duplicate unresolved-fixture diagnostics and indirect-navigation targets.
  • Pytest fixture engine now preserves the IDE's bundled fixture resolution and navigation when BetterPy is disabled, while clearing BetterPy-provided fixture types, documentation, and dynamic-fixture diagnostics when their corresponding features are muted.
  • Fixture Editor Integration groups overridden fixtures by module, opens the implementation chooser on typed parameters in ordinary functions and on injected fixtures with declared return types and identifies the inferred type in the chooser title.
  • Pytest hook generation preserves required imports in generated hooks and adds quick search to the hook chooser.
  • Pytest fixture documentation no longer appears after the feature is disabled.
  • Pytest fixture scope inspection validates dynamically requested fixtures against the requesting fixture's scope.

2026.08.1 - 2026-08-04

🐛 Bug Fixes

  • Pytest fixture engine follows local decorator aliases so fixtures registered through conditional pytest.fixture/pytest.yield_fixture assignments, such as requests-mock's pytest11 entry point, are recognized correctly.
  • Private module import inspection no longer suggests exporting symbols from third-party dependencies, only flagging private-module imports that belong to your own project's code.
  • Pytest parametrized case run gutter icon anchors per-case run configurations to the test file's own content root and module, so attached projects keep their own working directory and interpreter instead of inheriting one from an unrelated module.

2026.08.0 - 2026-08-02

This release ships BetterPy's mock-patching and mock-typing tooling in stable builds, previously available only in dev builds: mock type inference for Mock/MagicMock/AsyncMock with spec/spec_set support, mock.patch target navigation and mock.patch.object attribute completion/navigation, and an inspection for unresolved attributes on specced mocks. The pytest fixture engine also got a significant navigation/inspection performance pass for large repositories.

🚀 Features

  • Mock assertion methods are now available, resolving unittest.mock assertion methods (assert_called_once_with, assert_any_call, and similar) without enabling the broader dev-only mock type provider, and correctly resolve pytest-mock's Mock, MagicMock, and AsyncMock aliases to their unittest.mock classes for consistent spec/spec_set typing.
  • Mock type inference infers the type of Mock, MagicMock, and AsyncMock construction and of patch/patch.object return values, propagating spec/spec_set classes (including lists of protocols) through mock attribute and method access, return_value, and helper functions that return a mock, so calls on properly specced mocks resolve like calls on the real target.
  • Mock patch reference resolves and navigates the dotted target string passed to mock.patch(...), including static segments of f-string targets, and lets Go to Declaration jump from a mock.patch.object(target, "attribute") attribute string to the real attribute on the target class.
  • Mock patch object attribute completion completes the attribute name in mock.patch.object(target, "attribute") calls based on the target's inferred type.
  • Mock unresolved reference inspection flags attribute reads and writes on specced Mock/MagicMock/AsyncMock instances that don't resolve against the spec/spec_set class, catching typos that would otherwise be silently accepted by Mock's auto-attribute behavior.
  • Pytest hook generation reads annotations and availability notes from the installed hookspec.py, exposes hooks in registered plugin and test modules where pytest supports them, renders hook documentation and Code Vision hook implementations through F1, and extends hook navigation and override discovery to every registry-valid pytest location, including test and plugin modules.

🐛 Bug Fixes

  • Pytest fixture engine speeds up fixture navigation and inspections in large repositories by caching inspection-facing resolve methods, routing reference resolution through the platform resolve cache, resolving re-exported fixtures from conftest.py correctly, and capping oversized fixture-not-found diagnostics behind an on-demand chooser instead of one long error description.
  • Pytest test-tree navigation keeps editor actions and gutter markers synchronized with runner tree updates while avoiding background access to live test proxies and repeated full-tree scans.
  • Toggle pytest skip from test tree resolves function, class, and module targets through a shared, deduplicated dispatch path so repeated selections toggle each target exactly once instead of drifting out of sync.
  • Copy method annotations from parent safely transfers imports for quoted (string) type annotations into TYPE_CHECKING blocks, excluding value and metadata strings, aliasing conflicting bindings, and avoiding duplicate imports.

2026.07.1 - 2026-07-17

🐛 Bug Fixes

  • Pytest fixture documentation falls back to rendering the fixture's own docstring when its return type can't be enriched with field/value info, instead of showing no documentation at all.
  • Pytest fixture engine resolves fixture overrides shadowed by installed pytest plugins, discovers pytest plugins declared in nested source roots so pytest_plugins references resolve correctly across overlapping source roots, and avoids scanning uncommitted fixture PSI to prevent stale stub mismatches during editor searches.
  • Pytest fixture editor integration resolves fixture override imports for types imported under TYPE_CHECKING or other conditional blocks and for classes declared locally in a pytest plugin module, generates fixture overrides as pass-throughs that preserve the parent fixture's behavior and avoid recursion, and avoids nested blocking reads when resolving fixture override hierarchies during indexing.
  • Class implementations code vision avoids duplicate and stale results when resolving import aliases.
  • Docstring Example Rendering renders the underlying class docstring for class aliases assigned from a class reference or class instantiation.

2026.07.0 - 2026-07-15

🚀 Features

  • Pytest fixture intelligence now extends PyCharm's built-in pytest support with BetterPy's own fixture index and resolver. This improves fixture understanding across conftest.py, plugin modules, autouse fixtures, fixture overrides, string-based fixture references, and dynamic fixture providers such as register_fixture.
  • Pytest fixture inspections and navigation are now powered by that resolver. BetterPy can highlight unused fixtures, direct fixture imports, fixture-scope narrowing, uninjected fixture references, no-op @pytest.mark.usefixtures decorators, redundant fixture imports, and pytest_plugins declarations in non-root conftest.py files, while also making pytest identifiers available in Search Everywhere and fixture Find Usages.
  • Pytest fixture hierarchy support makes fixtures behave more like ordinary overridden Python members. You can jump from an overriding fixture to the broader-scope fixture it shadows, and gutter markers show which narrower-scope fixtures override the current fixture.
  • Pytest fixture editor integration makes fixture names act more like normal Python symbols: fixture parameters can resolve to the fixture definition pytest would choose, fixture-name completion uses the visible fixture set for the current file, and Go to Implementation can list narrower-scope fixture overrides.
  • Pytest fixture Quick Documentation and type inference build on the same fixture model to cover cases tracked by the linked PyCharm issues, including richer fixture value types, unresolved or uninjected fixture references, and basic checks that a test or fixture parameter annotation matches the resolved fixture return type.
  • Pytest parametrization helpers add intentions for creating and maintaining @pytest.mark.parametrize decorators, converting values to and from pytest.param(...), and running individual parametrized cases from the editor gutter.
  • Pytest test-tree actions add copyable node IDs, editor-to-test-tree navigation, skip toggling from the test tree, and a debug-logging run variant for the selected pytest node.
  • Pytest test-writing helpers add Generate-menu actions for new tests, fixtures, and pytest hooks, plus editor intentions for toggling @pytest.mark.skip and wrapping statements with pytest.raises(...).
  • Inherited attribute documentation shows an ancestor attribute's docstring when an overriding class attribute has no local documentation, preserving useful Quick Documentation across class hierarchies.

🐛 Bug Fixes

  • Pytest fixture documentation, already available in stable, shows consumer-scoped fixture variants and follows static fixture pass-throughs in Quick Documentation, renders correctly for class-based fixture containers, and stays compatible with newer PyCharm platform versions.
  • Pytest fixture editor integration suppresses feature nudges while focus is outside the editor.
  • Class implementations code vision includes specced mocks in class inlays, ignores inferred protocol method return types, mirrors native protocol library implementation behavior, and keeps code-vision navigation constrained to the intended editor split.
  • Go to target presentation mirrors native protocol library implementation behavior for library protocols.
  • Test/Production editor tabs preserves the active split and placement when moving files right, avoids duplicate splits, keeps navigation history intact, guards editor tab pin checks, creates a split when needed for navigation routing, guards action event file lookups with read access, honors pytest's configured collection naming, and applies workspace-aware source roots consistently.
  • Property usages code vision stabilizes usage-count recording and keeps code-vision navigation constrained to the intended editor split.
  • Module assignment usages code vision keeps code-vision navigation constrained to the intended editor split.
  • Constant should be Final inspection avoids unsafe Final annotations for literal regular-expression values, reuses existing and re-exported imports instead of adding duplicates, preserves literal builtin types and quote qualifiers, collapses homogeneous tuple types, normalizes generated import order, and supports newer PyCharm collection type APIs.
  • Shadowing stdlib module inspection no longer rewrites existing references when renaming through the dialog, and avoids subclassing a final platform file-action class.
  • Missing None annotation inspection avoids emitting a duplicate quick-fix action.
  • Docstring Example Rendering renders reStructuredText docstring examples and preserves field lists when rendering fenced code.
  • Copy method annotations from parent avoids duplicate actions, prefers existing qualified imports, normalizes import insertion order, guards against stale PSI when reading the copy plan, and recognizes stub and implementation modules as the same module identity.
  • Copy with imports avoids resolving shadowed names when copying imports.
  • Generate class actions keeps generated names selected and normalizes generated import order.
  • Export symbol to target avoids PSI reads outside read access, applies workspace-aware source roots, and uses pytest's configured naming when checking feature guards.
  • Introduce Parameter Object (refactoring and MCP tool) respects disabled feature gates and reuses existing Python imports when generating parameter objects.
  • Make parameter mandatory preserves override propagation.
  • Make parameter optional preserves type-only optional declarations.
  • Change visibility avoids running usage previews on the EDT and uses pytest's configured naming when checking feature guards.
  • Attribute docstring renders module-assignment docstring examples correctly.
  • Dict access avoids stale PSI after intention edits.
  • Top-level extract function prevents refactoring-action crashes and tolerates a missing Python extract handler.
  • Message console filter links constructor-style class representations in the console.
  • Python navigation bar renders dunder methods correctly in navbar breadcrumbs.
  • Use actual test outcome uses pytest's configured naming when checking feature guards.
  • Analytics follows the IDE usage-statistics setting by default and no longer sends an opt-out event.

⚡ Performance

  • Class implementations code vision reduces the work done by import-alias search.

2026.06.1 - 2026-06-05

🚀 Features

  • Return path highlighting highlights every explicit return statement in a Python function when the caret is on that function's return annotation.

🐛 Bug Fixes

  • Pytest parametrized case run gutter icon only registers pytest-specific run targets and fully opts out when the feature is disabled, preserving PyCharm's built-in pytest gutter actions when other Python test configurations exist.

2026.06.0 - 2026-06-05

🚀 Features

🐛 Bug Fixes

  • Toggle enum member value can toggle enum members back to literal values.
  • Test/Production editor tabs adds tab sorting support and keeps the toolbar/menu state consistent with the active split mode.
  • Class implementations code vision uses structural protocol search and keeps protocol implementation labels more precise.
  • Constant should be Final inspection preserves declared constant types and keeps generated imports separated cleanly.
  • BetterPy settings hides empty groups while searching, expands correctly from the status bar, and restores feature state after muting.

2026.05.2 - 2026-05-31

🚀 Features

  • Pytest fixture documentation (PY-66245) with Quick Documentation and fixture-parameter type inference for primitive, generator-style, async, dataclass, Pydantic, TypedDict, and conftest.py fixture cases.
  • Introduce Parameter Object (PY-59270) now supports async functions, nested functions, and safe decorated targets, with warnings for local decorators that may depend on the original signature.
  • Toggle enum member value
  • Class implementations code vision (PY-56627) shows an inline code vision hint above each Python class displaying the number of implementations (subclasses) with uv-workspace-aware counting.
  • Module assignment usages code vision shows an inline code vision hint above each module-level assignment with the number of project-scope usages, allowing navigation via a non-blocking read action for single usages or delegating to the platform's Show Usages flow for multiple usages.
  • Test/Production editor tabs supports routing same-kind test/production navigation targets to the opposite editor split when enabled, complete with toolbar options and a toggle action.
  • Add contextual feature nudges for intentions.

🐛 Bug Fixes

  • Pytest fixture documentation (PY-66245) renders set literal values and unwraps async fixture return types as the injected fixture value type.
  • Missing |None annotation inspection (PY-88504) is re-enabled and contributes a BetterPy quick-fix intention while leaving PyCharm's built-in diagnostic responsible on current IDE builds.
  • NewType/TypeVar/ParamSpec references (PY-82966, PY-53658) adds a BetterPy quick-fix for NewType declarations whose string name no longer matches the assigned symbol.
  • Constant should be Final inspection keeps class-object constants as Final[type[Cls]] instead of treating them as instances.
  • Shadowing stdlib module inspection (PY-23615, PY-43957) warns before creating stdlib-shadowing Python files and preserves existing imports when renaming files that already shadow standard-library modules.
  • Generate class actions places generated classes above the caret and supports inserting them from inside function scopes.

2026.05.1 - 2026-05-21

🚀 Features

  • Shadowing stdlib module inspection — report project files such as random.py, logging.py, or json.py that shadow Python standard-library modules, offer a rename quick-fix, and warn before renaming a Python file to a stdlib-shadowing name (PY-23615, PY-43957).
  • Change visibility intention — when toggling method visibility in an inheritance hierarchy, ask whether to rename the whole hierarchy or only the selected method.

🐛 Bug Fixes

  • Copy method annotations from parent — preserve module-alias qualifiers and relative module imports, and copy nested class annotations through the importable outer class so generated annotations remain valid.
  • Shadowing stdlib module inspection — register the feature logging category and keep the inspection and rename confirmation processor under the stable feature package.

2026.05.0 - 2026-05-19

🚀 Features

  • Attribute Docstring in Quick Documentation — show the string literal that follows a class attribute as its documentation in Quick Documentation popups (PY-63878).
  • Constant should be Final inspection — report module-level constants that should be annotated with Final, with safe quick-fixes that handle aliased module types, from __future__ imports, function-local assignments, wildcard imports, and unknown types.
  • Test/Production editor tabs — keep test and production files in separate editor splits, with a toolbar toggle, configurable split alignment, pytest-config-aware test-file detection, file-color-based tab tinting, and respect for manual tab moves and pinning within a session.
  • Show test usages — new Find Usages toggle to hide references from test sources, shipped alongside the existing Show type annotations toggle under a shared Usage filtering settings UI.

🐛 Bug Fixes

  • Structural search: register the Python structural-search profile correctly, and recognize parenthesized expressions, assignments, calls, tuples, and other Python syntax equivalences during matching.
  • Message console filter: restore navigation from console output to Python classes and pytest identifiers, and stop turning Pydantic error detail words into false console links.
  • Missing None annotation inspection: detect top-level None defaults and Annotated[...] annotations correctly, including typing wildcard imports and literal None cases.
  • Python navigation bar: restore member filtering in the enhanced navigation bar, including overload-aware behavior.
  • Go to Implementation presentation: preserve module and class context so same-named targets stay distinguishable in the chooser.
  • dict[key] access intention: avoid unsafe rewrites for assignment targets and unsafe receiver/key expressions, and preserve the behavior of default expressions when converting between bracket access, .get(), and try/except KeyError.
  • Generate dataclass / frozen dataclass / Pydantic model actions: handle insertion edge cases so generated classes land in the expected location with consistent formatting.
  • Make Parameter Mandatory / Optional intentions: harden availability and rewriting around inherited parameters and parameters that already carry defaults.
  • Parameter Object refactoring: tighten introduce/inline validation, including safer handling of Pydantic models and unsupported inline targets.
  • Copy method annotations from parent: preserve copied annotation imports when the parent method uses import aliases.

2026.04.14 - 2026-04-27

🚀 Features

  • Add test/production editor tab mode
  • Show BetterPy plugin version in the status bar widget tooltip
  • Ship message-console-filter in stable
  • Link settings features to versioned docs

📚 Documentation

  • Add persistent Marketplace and GitHub links to the docs site
  • Point changelog links to the public GitHub repo
  • Remove redundant README text

2026.04.13 - 2026-04-27

🚀 Features

  • (diagnostics) Copy Diagnostic Data now includes operating system, Python interpreter version, and the list of disabled features
  • Ship dict-access in stable with dedicated docs
  • Ship generate-class-actions in stable
  • Ship change-visibility feature in stable

🐛 Bug Fixes

  • Use implementation for navigation and usage extensions in plugin.xml

🚜 Refactor

  • (core) Move always-on actions out of feature packages
  • Move feature schema to META-INF

2026.04.12 - 2026-04-25

🚀 Features

  • Structural search
  • Move py-goto-target-presentation to stable

🧪 Testing

  • Migrate from JUnit3 to JUnit 4

⚙️ Miscellaneous Tasks

  • Bump intelliJPlatform to 2.15.0
  • Bump zensical to 0.0.36

2026.04.11 - 2026-04-24

🚀 Features

  • Extend navigation bar to show file members

🧪 Testing

  • Migrate test suite from JUnit 3 to JUnit 4

2026.04.10 - 2026-04-21

🚀 Features

  • Move copy-method-annotations-from-parent to TYPING_TYPE_HINTS
  • Mark more features as incubating
  • Auto-stamp since field in feature metadata at build time
  • Add metadata row to docs rendering
  • Require 'since' for features in non-wildcard feature-sets
  • Set since=2026.04.05 for stable features; move maturity tooltip to badge only

🐛 Bug Fixes

  • (intentions) Redirect MakeParameterMandatory to root base class in multi-level hierarchies
  • (docs) Collapse consecutive horizontal rules left by stripped sections
  • (docs) Load feature metadata from META-INF XML blocks
  • (docs) Pre-expand feature blocks via docs_ext before handing off to zensical
  • (docs) Drop empty group rows from Features Overview table
  • (docs) Escape | in feature displayName for reference tables
  • (docs) Remove "Default" column from reference tables

💼 Other

  • Recover lost docs/plugin.xml/feature-metadata chain (43b9f7d8..4f39217a)

🚜 Refactor

  • (docs) Unify on RELEASE_CHANNEL env and --channel CLI flag
  • Build plugin.xml dynamically
  • Include plugin registrations on build time
  • Include *.actions.xml files
  • Move feature file content to XML fragments
  • Use test annotations to skip tests for features that are not configured
  • (plugin-xml) Inline *.actions.xml fragments into canonical feature files
  • Split _bootstrap.xml registrations into owning feature XMLs
  • Retire TypeEvalContexts.java

🧪 Testing

  • Validate metadata block
  • Validate feature id matches filename
  • Skip tests for excluded features in stable channel

⚙️ Miscellaneous Tasks

  • Add purge release script
  • (docs) Drop internal Pages deploy (plan does not support Pages on private repos)
  • Upgrade to intellij-platform-plugin-template v2.5.0
  • Disable jobs targeting dev branch
  • Bump version to 2026.04.10