Add support for processing .pth files in project plugins#10661
Merged
radoering merged 13 commits intopython-poetry:mainfrom Dec 30, 2025
Merged
Add support for processing .pth files in project plugins#10661radoering merged 13 commits intopython-poetry:mainfrom
radoering merged 13 commits intopython-poetry:mainfrom
Conversation
Handle .pth files for plugins in editable mode.
Reviewer's GuideAdds support for processing .pth files when loading plugins so editable/develop-installed plugins have their dependencies available, with accompanying tests and documentation updates. Sequence diagram for loading a plugin with .pth processingsequenceDiagram
actor Developer
participant PoetryCLI
participant PluginManager
participant EntryPoint as metadata_EntryPoint
participant Dist as Distribution
participant Site as site_addpackage
participant PluginClass
Developer->>PoetryCLI: run poetry command
PoetryCLI->>PluginManager: load_plugins()
PluginManager->>EntryPoint: _load_plugin_entry_point(ep)
EntryPoint-->>PluginManager: ep with dist and files
PluginManager->>Dist: check ep.dist and ep.dist.files
Dist-->>PluginManager: list of files including pth_file
PluginManager->>PluginManager: locate pth_file
PluginManager->>PluginManager: pth_path = Path(ep.dist.locate_file(pth_file))
PluginManager->>Site: addpackage(str(pth_path.parent), pth_path.name, None)
PluginManager->>EntryPoint: ep.load()
EntryPoint-->>PluginManager: PluginClass
PluginManager->>PluginManager: issubclass(PluginClass, Plugin or ApplicationPlugin)
PluginManager-->>PoetryCLI: plugin loaded with dependencies available
PoetryCLI-->>Developer: command executes using plugin
File-Level Changes
Assessment against linked issues
Tips and commandsInteracting with Sourcery
Customizing Your ExperienceAccess your dashboard to:
Getting Help
|
There was a problem hiding this comment.
Hey there - I've reviewed your changes - here's some feedback:
- The inline
from site import addpackageinside_load_plugin_entry_pointwould be clearer and more conventional as a top-level import, avoiding repeated imports and making dependencies of the module more obvious. - The
if ep.dist and (pth_file := next((f for f in (ep.dist.files or []) if f.suffix == ".pth"), None)):line is quite dense; consider extracting the.pthdetection into a small helper method to improve readability and make the behaviour easier to test in isolation. - Currently only the first
.pthfile found is processed; if a distribution can reasonably have multiple.pthfiles, consider iterating over all matching files instead of short-circuiting on the first one.
Prompt for AI Agents
Please address the comments from this code review:
## Overall Comments
- The inline `from site import addpackage` inside `_load_plugin_entry_point` would be clearer and more conventional as a top-level import, avoiding repeated imports and making dependencies of the module more obvious.
- The `if ep.dist and (pth_file := next((f for f in (ep.dist.files or []) if f.suffix == ".pth"), None)):` line is quite dense; consider extracting the `.pth` detection into a small helper method to improve readability and make the behaviour easier to test in isolation.
- Currently only the first `.pth` file found is processed; if a distribution can reasonably have multiple `.pth` files, consider iterating over all matching files instead of short-circuiting on the first one.
## Individual Comments
### Comment 1
<location> `tests/plugins/test_plugin_manager.py:179-191` </location>
<code_context>
+ mock_ep.dist = mock_dist
+ mock_ep.load.return_value = MyPlugin
+
+ mock_addpackage = mocker.patch("site.addpackage")
+ mocker.patch.object(metadata, "entry_points", return_value=[mock_ep])
+
+ manager = manager_factory()
+ manager.load_plugins()
+
+ mock_addpackage.assert_called_once_with(
+ str(pth_file_path.parent), pth_file_path.name, None
+ )
+ assert len(manager._plugins) == 1
+
+
</code_context>
<issue_to_address>
**suggestion (testing):** Consider asserting that `.pth` processing happens before the plugin is loaded
The key behavior to verify is that the `.pth` side effects occur before the plugin is imported. Right now you only assert that `addpackage` is called, not that it happens before `ep.load`. Consider making `mock_ep.load` a `Mock`/spy as well and asserting call order (e.g. with `mocker.spy` + `assert_has_calls` or by comparing the recorded calls) so the test guards against regressions where these calls are reordered.
```suggestion
mock_ep.dist = mock_dist
mock_addpackage = mocker.patch("site.addpackage")
mocker.patch.object(metadata, "entry_points", return_value=[mock_ep])
def _load_side_effect(*args, **kwargs):
# Ensure .pth processing (via site.addpackage) happens before plugin load
assert mock_addpackage.called
return MyPlugin
mock_ep.load.side_effect = _load_side_effect
manager = manager_factory()
manager.load_plugins()
mock_addpackage.assert_called_once_with(
str(pth_file_path.parent), pth_file_path.name, None
)
assert len(manager._plugins) == 1
```
</issue_to_address>Help me be more useful! Please click 👍 or 👎 on each comment and I'll use the feedback to improve your reviews.
Contributor
Author
|
@radoering Hi! Can you make review of this PR? |
Contributor
Author
|
Any update on this? |
radoering
reviewed
Dec 29, 2025
Co-authored-by: Randy Döring <[email protected]>
This comment was marked as spam.
This comment was marked as spam.
|
Deploy preview for website ready! Built with commit fb4c2a9. |
radoering
approved these changes
Dec 30, 2025
Contributor
Author
|
@radoering Thank you! |
3 tasks
mwalbeck
pushed a commit
to mwalbeck/docker-python-poetry
that referenced
this pull request
Jan 19, 2026
This PR contains the following updates: | Package | Update | Change | |---|---|---| | [poetry](https://github.com/python-poetry/poetry) ([changelog](https://python-poetry.org/history/)) | minor | ` 2.2.1` -> `2.3.0` | --- ### Release Notes <details> <summary>python-poetry/poetry (poetry)</summary> ### [`v2.3.0`](https://github.com/python-poetry/poetry/blob/HEAD/CHANGELOG.md#230---2026-01-18) [Compare Source](python-poetry/poetry@2.2.1...2.3.0) ##### Added - **Add support for exporting `pylock.toml` files with `poetry-plugin-export`** ([#​10677](python-poetry/poetry#10677)). - Add support for specifying build constraints for dependencies ([#​10388](python-poetry/poetry#10388)). - Add support for publishing artifacts whose version is determined dynamically by the build-backend ([#​10644](python-poetry/poetry#10644)). - Add support for editable project plugins ([#​10661](python-poetry/poetry#10661)). - Check `requires-poetry` before any other validation ([#​10593](python-poetry/poetry#10593)). - Validate the content of `project.readme` when running `poetry check` ([#​10604](python-poetry/poetry#10604)). - Add the option to clear all caches by making the cache name in `poetry cache clear` optional ([#​10627](python-poetry/poetry#10627)). - Automatically update the cache for packages where the locked files differ from cached files ([#​10657](python-poetry/poetry#10657)). - Suggest to clear the cache if running a command with `--no-cache` solves an issue ([#​10585](python-poetry/poetry#10585)). - Propose `poetry init` when trying `poetry new` for an existing directory ([#​10563](python-poetry/poetry#10563)). - Add support for `poetry publish --skip-existing` for new Nexus OSS versions ([#​10603](python-poetry/poetry#10603)). - Show Poetry's own Python's path in `poetry debug info` ([#​10588](python-poetry/poetry#10588)). ##### Changed - **Drop support for Python 3.9** ([#​10634](python-poetry/poetry#10634)). - **Change the default of `installer.re-resolve` from `true` to `false`** ([#​10622](python-poetry/poetry#10622)). - **PEP 735 dependency groups are considered in the lock file hash** ([#​10621](python-poetry/poetry#10621)). - Deprecate `poetry.utils._compat.metadata`, which is sometimes used in plugins, in favor of `importlib.metadata` ([#​10634](python-poetry/poetry#10634)). - Improve managing free-threaded Python versions with `poetry python` ([#​10606](python-poetry/poetry#10606)). - Prefer JSON API to HTML API in legacy repositories ([#​10672](python-poetry/poetry#10672)). - When running `poetry init`, only add the readme field in the `pyproject.toml` if the readme file exists ([#​10679](python-poetry/poetry#10679)). - Raise an error if no hash can be determined for any distribution link of a package ([#​10673](python-poetry/poetry#10673)). - Require `dulwich>=0.25.0` ([#​10674](python-poetry/poetry#10674)). ##### Fixed - Fix an issue where `poetry remove` did not work for PEP 735 dependency groups with `include-group` items ([#​10587](python-poetry/poetry#10587)). - Fix an issue where `poetry remove` caused dangling `include-group` references in PEP 735 dependency groups ([#​10590](python-poetry/poetry#10590)). - Fix an issue where `poetry add` did not work for PEP 735 dependency groups with `include-group` items ([#​10636](python-poetry/poetry#10636)). - Fix an issue where PEP 735 dependency groups were not considered in the lock file hash ([#​10621](python-poetry/poetry#10621)). - Fix an issue where wrong markers were locked for a dependency that was required by several groups with different markers ([#​10613](python-poetry/poetry#10613)). - Fix an issue where non-deterministic markers were created in a method used by `poetry-plugin-export` ([#​10667](python-poetry/poetry#10667)). - Fix an issue where wrong wheels were chosen for installation in free-threaded Python environments if Poetry itself was not installed with free-threaded Python ([#​10614](python-poetry/poetry#10614)). - Fix an issue where `poetry publish` used the metadata of the project instead of the metadata of the build artifact ([#​10624](python-poetry/poetry#10624)). - Fix an issue where `poetry env use` just used another Python version instead of failing when the requested version was not supported by the project ([#​10685](python-poetry/poetry#10685)). - Fix an issue where `poetry env activate` returned the wrong command for `dash` ([#​10696](python-poetry/poetry#10696)). - Fix an issue where `data-dir` and `python.installation-dir` could not be set ([#​10595](python-poetry/poetry#10595)). - Fix an issue where Python and pip executables were not correctly detected on Windows ([#​10645](python-poetry/poetry#10645)). - Fix an issue where invalid template variables in `virtualenvs.prompt` caused an incomprehensible error message ([#​10648](python-poetry/poetry#10648)). ##### Docs - Add a warning about `~/.netrc` for Poetry credential configuration ([#​10630](python-poetry/poetry#10630)). - Clarify that the local configuration takes precedence over the global configuration ([#​10676](python-poetry/poetry#10676)). - Add an explanation in which cases `packages` are automatically detected ([#​10680](python-poetry/poetry#10680)). ##### poetry-core ([`2.3.0`](https://github.com/python-poetry/poetry-core/releases/tag/2.3.0)) - Normalize versions ([#​893](python-poetry/poetry-core#893)). - Fix an issue where unsatisfiable requirements did not raise an error ([#​891](python-poetry/poetry-core#891)). - Fix an issue where the implicit main group did not exist if it was explicitly declared as not having any dependencies ([#​892](python-poetry/poetry-core#892)). - Fix an issue where `python_full_version` markers with pre-release versions were parsed incorrectly ([#​893](python-poetry/poetry-core#893)). </details> --- ### Configuration 📅 **Schedule**: Branch creation - At any time (no schedule defined), Automerge - At any time (no schedule defined). 🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied. ♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox. 🔕 **Ignore**: Close this PR and you won't be reminded about this update again. --- - [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check this box --- This PR has been generated by [Renovate Bot](https://github.com/renovatebot/renovate). <!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0MS4xNDYuMCIsInVwZGF0ZWRJblZlciI6IjQxLjE0Ni4wIiwidGFyZ2V0QnJhbmNoIjoibWFpbiIsImxhYmVscyI6W119--> Reviewed-on: https://git.walbeck.it/walbeck-it/docker-python-poetry/pulls/1654 Co-authored-by: renovate-bot <[email protected]> Co-committed-by: renovate-bot <[email protected]>
|
This pull request has been automatically locked since there has not been any recent activity after it was closed. Please open a new issue for related bugs. |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to subscribe to this conversation on GitHub.
Already have an account?
Sign in.
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Handle .pth files for plugins in editable mode.
Pull Request Check List
Related to: #6742, #6529
Summary by Sourcery
Handle plugin .pth files when loading plugins so editable/develop-mode plugins have their dependencies available.
New Features:
Documentation:
Tests: