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.
Unreleased¶
🚀 Features¶
- 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, and renders hook documentation through F1.
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 editor integration resolves fixture override imports for types imported under
TYPE_CHECKINGor 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 asregister_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.usefixturesdecorators, redundant fixture imports, andpytest_pluginsdeclarations in non-rootconftest.pyfiles, 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.parametrizedecorators, converting values to and frompytest.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.skipand wrapping statements withpytest.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
Finalannotations 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
returnstatement 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¶
- Top-level extract function (PY-40840, PY-44636, PY-73852) extracts selected module-level Python statements into a new function with explicit parameters and return values instead of relying on globals.
- Copy with imports (PY-62801) copies selected Python code together with the import statements referenced inside that selection.
- Docstring Example Rendering (PY-47744) renders doctests and fenced Python examples in Quick Documentation, including copy links for runnable doctest input.
- Use actual test outcome replaces expected assertion values with the actual value from the last failed pytest run.
- Pytest failed line inspection (PY-32337, PY-61067) highlights the line reported by the most recent pytest failure directly in the editor.
- Pytest parametrized case run gutter icon (PY-88558) adds gutter run targets for individual
pytest.mark.parametrizecases when BetterPy can infer the exact pytest node id. - Property usages code vision shows inline usage counts above Python properties and opens the matching project usages.
- Suppress missing docstrings on overloads (PY-56267) suppresses PyCharm's
missing-docstring inspection for
@overloadsignatures while keeping the implementation subject to the normal rule. - BetterPy settings adds an all-features view and recent-feature controls so users can find, mute, and restore feature settings more directly.
🐛 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.pyfixture 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
NewTypedeclarations 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, orjson.pythat 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
Noneannotation inspection: detect top-levelNonedefaults andAnnotated[...]annotations correctly, including typing wildcard imports and literalNonecases. - 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(), andtry/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-filterin 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-accessin stable with dedicated docs - Ship
generate-class-actionsin stable - Ship
change-visibilityfeature in stable
🐛 Bug Fixes¶
- Use
implementationfor 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