Skip to content

Conversation

@radoering
Copy link
Member

@radoering radoering commented Aug 3, 2025

Resolves: python-poetry/poetry#10439

  • Added tests for changed code.
  • Updated documentation for changed code.

Summary by Sourcery

Fix union logic for multi constraints and atomic multi markers to properly return AnyConstraint/AnyMarker when there are no common elements and return a single constraint/marker when there is exactly one common element, accompanied by new tests to verify these behaviors.

Bug Fixes:

  • Ensure MultiConstraint.union returns AnyConstraint when there are no shared constraints
  • Ensure MultiConstraint.union returns a single Constraint when there is exactly one shared constraint
  • Fix atomic marker union to return AnyMarker for disjoint sets and a SingleMarker for a single common element

Tests:

  • Add tests for atomic marker union to verify is_any and single marker results
  • Update generic constraint tests to expect AnyConstraint for unions with no common constraints

@sourcery-ai
Copy link

sourcery-ai bot commented Aug 3, 2025

Reviewer's Guide

Union behavior for multi-constraints has been enhanced to return an AnyConstraint when there are no common elements and a single Constraint when there is exactly one common element, and corresponding tests for both constraint intersection and atomic marker union have been updated or added to reflect the new behavior.

Class diagram for updated MultiConstraint.union behavior

classDiagram
    class BaseConstraint
    class Constraint
    class AnyConstraint
    class MultiConstraint {
        +constraints: List[Constraint]
        +union(other: BaseConstraint) BaseConstraint
    }
    BaseConstraint <|-- Constraint
    BaseConstraint <|-- AnyConstraint
    BaseConstraint <|-- MultiConstraint

    MultiConstraint --> Constraint : contains

    %% Updated union method logic:
    %% - If other is MultiConstraint, find common constraints
    %%   - If no common: return AnyConstraint
    %%   - If one common: return that Constraint
    %%   - Else: return MultiConstraint of common constraints
    %% - If other is not Constraint: (not shown in this diff)
Loading

File-Level Changes

Change Details Files
Enhanced MultiConstraint.union to handle no or single common constraint
  • return AnyConstraint() when no common constraints
  • return single Constraint instance when exactly one common
  • preserve MultiConstraint for multiple common
src/poetry/core/constraints/generic/multi_constraint.py
Added tests for atomic marker union behavior
  • test_atomic_marker_union_is_any verifies disjoint multi markers yield Any
  • test_atomic_marker_union_is_single verifies overlapping markers yield a SingleMarker
tests/version/test_markers.py
Adjusted generic constraint intersection tests for single and no-common cases
  • updated expected result to a simple Constraint when one common in intersection
  • added case expecting AnyConstraint for no common in intersection
tests/constraints/generic/test_constraint.py

Tips and commands

Interacting with Sourcery

  • Trigger a new review: Comment @sourcery-ai review on the pull request.
  • Continue discussions: Reply directly to Sourcery's review comments.
  • Generate a GitHub issue from a review comment: Ask Sourcery to create an
    issue from a review comment by replying to it. You can also reply to a
    review comment with @sourcery-ai issue to create an issue from it.
  • Generate a pull request title: Write @sourcery-ai anywhere in the pull
    request title to generate a title at any time. You can also comment
    @sourcery-ai title on the pull request to (re-)generate the title at any time.
  • Generate a pull request summary: Write @sourcery-ai summary anywhere in
    the pull request body to generate a PR summary at any time exactly where you
    want it. You can also comment @sourcery-ai summary on the pull request to
    (re-)generate the summary at any time.
  • Generate reviewer's guide: Comment @sourcery-ai guide on the pull
    request to (re-)generate the reviewer's guide at any time.
  • Resolve all Sourcery comments: Comment @sourcery-ai resolve on the
    pull request to resolve all Sourcery comments. Useful if you've already
    addressed all the comments and don't want to see them anymore.
  • Dismiss all Sourcery reviews: Comment @sourcery-ai dismiss on the pull
    request to dismiss all existing Sourcery reviews. Especially useful if you
    want to start fresh with a new review - don't forget to comment
    @sourcery-ai review to trigger a new review!

Customizing Your Experience

Access your dashboard to:

  • Enable or disable review features such as the Sourcery-generated pull request
    summary, the reviewer's guide, and others.
  • Change the review language.
  • Add, remove or edit custom review instructions.
  • Adjust other review settings.

Getting Help

Copy link

@sourcery-ai sourcery-ai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Hey @radoering - I've reviewed your changes - here's some feedback:

  • Please update the docstring of MultiConstraint.union to document that it can now return an AnyConstraint or a single Constraint when common constraints count is 0 or 1.
  • Consider refactoring the common-length checks in union into early return guard clauses to simplify the control flow.
Prompt for AI Agents
Please address the comments from this code review:
## Overall Comments
- Please update the docstring of MultiConstraint.union to document that it can now return an AnyConstraint or a single Constraint when common constraints count is 0 or 1.
- Consider refactoring the common-length checks in union into early return guard clauses to simplify the control flow.

Sourcery is free for open source - if you like our reviews please consider sharing them ✨
Help me be more useful! Please click 👍 or 👎 on each comment and I'll use the feedback to improve your reviews.

@radoering radoering requested a review from a team August 3, 2025 12:17
… of atomic multi markers resulting in invalid marker strings
@radoering radoering force-pushed the fix-multi-constraint-union branch from f4539e6 to 043460d Compare August 16, 2025 14:34
@radoering radoering merged commit 37b16d1 into python-poetry:main Aug 16, 2025
18 checks passed
mwalbeck pushed a commit to mwalbeck/docker-python-poetry that referenced this pull request Sep 26, 2025
This PR contains the following updates:

| Package | Update | Change |
|---|---|---|
| [poetry](https://github.com/python-poetry/poetry) ([changelog](https://python-poetry.org/history/)) | minor | `2.1.4` -> `2.2.1` |

---

### Release Notes

<details>
<summary>python-poetry/poetry (poetry)</summary>

### [`v2.2.1`](https://github.com/python-poetry/poetry/blob/HEAD/CHANGELOG.md#221---2025-09-21)

[Compare Source](python-poetry/poetry@2.2.0...2.2.1)

##### Fixed

- Fix an issue where `poetry self show` failed with a message about an invalid output format ([#&#8203;10560](python-poetry/poetry#10560)).

##### Docs

- Remove outdated statements about dependency groups ([#&#8203;10561](python-poetry/poetry#10561)).

##### poetry-core ([`2.2.1`](https://github.com/python-poetry/poetry-core/releases/tag/2.2.1))

- Fix an issue where it was not possible to declare a PEP 735 dependency group as optional ([#&#8203;888](python-poetry/poetry-core#888)).

### [`v2.2.0`](https://github.com/python-poetry/poetry/blob/HEAD/CHANGELOG.md#220---2025-09-14)

[Compare Source](python-poetry/poetry@2.1.4...2.2.0)

##### Added

- **Add support for nesting dependency groups** ([#&#8203;10166](python-poetry/poetry#10166)).
- **Add support for PEP 735 dependency groups** ([#&#8203;10130](python-poetry/poetry#10130)).
- **Add support for PEP 639 license clarity** ([#&#8203;10413](python-poetry/poetry#10413)).
- Add a `--format` option to `poetry show` to alternatively output json format ([#&#8203;10487](python-poetry/poetry#10487)).
- Add official support for Python 3.14 ([#&#8203;10514](python-poetry/poetry#10514)).

##### Changed

- **Normalize dependency group names** ([#&#8203;10387](python-poetry/poetry#10387)).
- Change `installer.no-binary` and `installer.only-binary` so that explicit package names will take precedence over `:all:` ([#&#8203;10278](python-poetry/poetry#10278)).
- Improve log output during `poetry install` when a wheel is built from source ([#&#8203;10404](python-poetry/poetry#10404)).
- Improve error message in case a file lock could not be acquired while cloning a git repository ([#&#8203;10535](python-poetry/poetry#10535)).
- Require `dulwich>=0.24.0` ([#&#8203;10492](python-poetry/poetry#10492)).
- Allow `virtualenv>=20.33` again ([#&#8203;10506](python-poetry/poetry#10506)).
- Allow `findpython>=0.7` ([#&#8203;10510](python-poetry/poetry#10510)).
- Allow `importlib-metadata>=8.7` ([#&#8203;10511](python-poetry/poetry#10511)).

##### Fixed

- Fix an issue where `poetry new` did not create the project structure in an existing empty directory ([#&#8203;10431](python-poetry/poetry#10431)).
- Fix an issue where a dependency that was required for a specific Python version was not installed into an environment of a pre-release Python version ([#&#8203;10516](python-poetry/poetry#10516)).

##### poetry-core ([`2.2.0`](https://github.com/python-poetry/poetry-core/releases/tag/2.2.0))

- Deprecate table values and values that are not valid SPDX expressions for `[project.license]` ([#&#8203;870](python-poetry/poetry-core#870)).
- Fix an issue where explicitly included files that are in `.gitignore` were not included in the distribution ([#&#8203;874](python-poetry/poetry-core#874)).
- Fix an issue where marker operations could result in invalid markers ([#&#8203;875](python-poetry/poetry-core#875)).

</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:eyJjcmVhdGVkSW5WZXIiOiI0MS42MC40IiwidXBkYXRlZEluVmVyIjoiNDEuNjAuNCIsInRhcmdldEJyYW5jaCI6Im1haW4iLCJsYWJlbHMiOltdfQ==-->

Reviewed-on: https://git.walbeck.it/walbeck-it/docker-python-poetry/pulls/1588
Co-authored-by: renovate-bot <[email protected]>
Co-committed-by: renovate-bot <[email protected]>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Invalid platform marker boolean operator usage in generated poetry.lock

1 participant