Skip to content

feat: populate component.authors from pyproject.toml, Poetry manifests and packaging metadata - #1096

Draft
SemyonAndreyev wants to merge 2 commits into
CycloneDX:mainfrom
q2quantum:feat/component-authors
Draft

feat: populate component.authors from pyproject.toml, Poetry manifests and packaging metadata#1096
SemyonAndreyev wants to merge 2 commits into
CycloneDX:mainfrom
q2quantum:feat/component-authors

Conversation

@SemyonAndreyev

Copy link
Copy Markdown

Description

Populates component.authors (CycloneDX 1.6+, structured, repeatable) and derives the legacy singular component.author for the single-author case, from three independent sources: PEP 621 project.authors, Poetry's tool.poetry.authors, and packaging core-metadata Author/Author-email (wired into the environment scan).

New shared helper module cyclonedx_py/_internal/utils/contact.py:

  • person_string2contact() parses the "Name <email>" convention used by both Poetry and packaging metadata.
  • contacts2author() derives the legacy author string only when there is exactly one author — CycloneDX has no agreed-upon way to fold multiple authors into one string (see CycloneDX/specification#335), so this deliberately does not guess a join convention and leaves it unset otherwise.

Along the way, found and handled two real edge cases:

  • email.utils.getaddresses() silently mis-splits a bare name with no @ on whitespace, keeping only the last word (getaddresses(['Jane Doe']) == [('', 'Jane')]). metadata2authors() filters out any parsed address that doesn't actually contain @ before trusting it.
  • PEP 621 requires authors to be tables, but tests/_data/infiles/pipenv/no-deps/pyproject.toml already exercises the non-compliant authors = ["Name <email>", ...] string form some real-world files use anyway — project2authors() now falls back to the same string parser instead of raising.

56 new test cases across a new test_utils_contact.py, new test_utils_poetry.py, new test_utils_packaging.py, and an extended test_utils_pep621.py. Full existing suite passes with only the expected snapshot updates (root components in fixtures that declare authors now show them). flake8/isort/mypy clean.

Resolves or fixes issue: #648

AI Tool Disclosure

  • My contribution includes AI-generated content, as disclosed below:
    • AI Tools: Claude Code
    • LLMs and versions: Claude Sonnet 5
    • Prompts: Implement the three data sources for issue feat: populate component.authors #648 as specified by the maintainer's own comments on the issue; add thorough test coverage; verify against the full existing test suite with no regressions.

Affirmation

🤖 Generated with Claude Code

…s and packaging metadata

Fixes CycloneDX#648.

Adds the structured, repeatable `components[].authors` (CycloneDX 1.6+)
and derives the legacy singular `components[].author` string for the
single-author case, from three independent sources:

- PEP 621 `project.authors` (pep621.py) -- tables of name/email, with
  lenient handling of the non-compliant-but-real-world "Name <email>"
  string form some pyproject.toml files use here instead.
- Poetry's `tool.poetry.authors` (utils/poetry.py) -- "Name <email>"
  strings.
- Packaging core-metadata's `Author`/`Author-email` (utils/packaging.py,
  wired into the environment scan) -- the two are independent free-text
  fields with no guaranteed correlation when either holds more than one
  person; see the docstring of `metadata2authors()` for the rules used
  to combine or keep them separate.

New shared helper module `utils/contact.py`:
- `person_string2contact()` parses the "Name <email>" convention used
  by both Poetry and packaging metadata.
- `contacts2author()` derives the legacy `author` string only when
  there is exactly one author -- CycloneDX has no agreed-upon way to
  fold multiple authors into one string (see
  CycloneDX/specification#335), so this deliberately does not guess a
  join convention.

Found and worked around a real footgun in `email.utils.getaddresses()`:
fed a bare name with no `@`, it silently mis-splits on whitespace and
keeps only the last word (`getaddresses(['Jane Doe']) == [('', 'Jane')]`).
`metadata2authors()` filters out any parsed address that doesn't
actually contain `@` before trusting it.

Tests: 56 new cases across a new `test_utils_contact.py`, new
`test_utils_poetry.py`, new `test_utils_packaging.py`, and an extended
`test_utils_pep621.py` -- covering both happy paths and the edge cases
above. Full existing suite passes unchanged aside from the expected
snapshot updates (root components in fixtures that declare authors now
show them).

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_015xJ8pA9rPpAjVATkZCzCS2
Signed-off-by: Semyon Andreev <q2quantum.app@gmail.com>
@SemyonAndreyev
SemyonAndreyev requested a review from a team as a code owner September 3, 2026 19:03
@codacy-production

codacy-production Bot commented Sep 3, 2026

Copy link
Copy Markdown

Not up to standards ⛔

🟢 Issues 0 issues

Results:
0 new issues

View in Codacy

🔴 Metrics 38 complexity · 0 duplication

Metric Results
Complexity ⚠️ 38 (≤ 20 complexity)
Duplication 0

View in Codacy

NEW Get contextual insights on your PRs based on Codacy's metrics, along with PR and Jira context, without leaving GitHub. Enable AI reviewer
TIP This summary will be updated as you push new changes.

…ting

Additional test coverage for the component.authors feature (CycloneDX#1096/CycloneDX#648),
found by systematically probing edge cases of the three author sources:

- contact.py: `_PERSON_STRING_MATCHER.match()` returning None was marked
  `# pragma: nocover -- the pattern matches any string, including the
  empty one`, but that comment is incorrect -- multiple `<...>` fragments,
  an unbalanced bracket, or trailing text after a closing `>` all make the
  whole match fail (verified live). Removed the stale pragma, documented
  why the branch is reachable, and added 5 new test cases exercising it
  (test_none_for_unparseable_shape).

- pep621.py: `project2authors()` already tolerates a not-per-spec *string*
  entry in `authors` (see test_project2authors_string_entry_not_per_spec_
  but_tolerated), but a non-dict, non-string entry -- e.g. `authors = [123]`,
  valid TOML, invalid PEP 621 -- crashed with AttributeError on
  `author.get(...)`. Verified live before fixing. Now skipped, consistent
  with the function's own existing "be lenient, don't crash" intent for the
  string case; 3 new test cases.

- poetry.py: same class of bug in `poetry2authors()` -- a non-string entry
  crashed with TypeError from `re.match()` inside `person_string2contact()`.
  Same fix, same reasoning; 3 new test cases.

metadata2authors() in packaging.py was also checked for a similar gap but
already has thorough dedicated coverage matching its own documented rules
(9 existing tests); no gap found there.

68/68 tests pass across the 4 affected test modules (11 new cases added).
flake8 and mypy clean on all changed files.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_015xJ8pA9rPpAjVATkZCzCS2
Signed-off-by: Semyon Andreev <q2quantum.app@gmail.com>
@SemyonAndreyev

Copy link
Copy Markdown
Author

Pushed a follow-up commit while stress-testing this feature's edge cases further: found and fixed two real crashes on not-per-spec (but valid TOML) authors entries —

  • project2authors() (PEP 621): a non-dict, non-string entry (e.g. authors = [123]) crashed with AttributeError on author.get(...).
  • poetry2authors() (Poetry): a non-string entry crashed with TypeError from re.match().

Both are now skipped, consistent with this same code's existing "be lenient, don't crash" handling of a not-per-spec string entry in the PEP 621 case. Also removed a stale # pragma: nocover comment on person_string2contact()'s None-return branch — it claimed the regex "matches any string," which isn't actually true for several realistic messy shapes (multiple <...> fragments, unbalanced brackets, trailing text after a closing >); added 5 test cases exercising it.

11 new test cases, 68/68 passing across the 4 affected test modules. flake8/mypy clean.

Copilot AI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

🟡 Changes recommended

One or more issues must be addressed before approval.

Once you've addressed the issues Copilot identified, you can request another Copilot review.

Pull request overview

Adds structured and legacy component author metadata from PEP 621, Poetry, and package metadata.

Changes:

  • Adds shared contact parsing and legacy-author derivation.
  • Wires authors into manifest and environment components.
  • Adds tests and updates generated SBOM snapshots.
File summaries
File Description
tests/_data/snapshots/poetry/some-groups_group-deps_lock21_1.5.json.bin Updated as part of this pull request.
tests/_data/snapshots/poetry/some-groups_group-deps_lock21_1.4.json.bin Updated as part of this pull request.
tests/_data/snapshots/poetry/some-groups_group-deps_lock21_1.3.json.bin Updated as part of this pull request.
tests/_data/snapshots/poetry/some-groups_group-deps_lock21_1.2.json.bin Updated as part of this pull request.
tests/_data/snapshots/poetry/some-groups_group-deps_lock20_1.5.json.bin Updated as part of this pull request.
tests/_data/snapshots/poetry/some-groups_group-deps_lock20_1.4.json.bin Updated as part of this pull request.
tests/_data/snapshots/poetry/some-groups_group-deps_lock20_1.3.json.bin Updated as part of this pull request.
tests/_data/snapshots/poetry/some-groups_group-deps_lock20_1.2.json.bin Updated as part of this pull request.
tests/_data/snapshots/poetry/some-groups_group-deps_lock11_1.5.json.bin Updated as part of this pull request.
tests/_data/snapshots/poetry/some-groups_group-deps_lock11_1.4.json.bin Updated as part of this pull request.
tests/_data/snapshots/poetry/some-groups_group-deps_lock11_1.3.json.bin Updated as part of this pull request.
tests/_data/snapshots/poetry/some-groups_group-deps_lock11_1.2.json.bin Updated as part of this pull request.
tests/_data/snapshots/poetry/some-extras_with-extras_lock21_1.5.json.bin Updated as part of this pull request.
tests/_data/snapshots/poetry/some-extras_with-extras_lock21_1.4.json.bin Updated as part of this pull request.
tests/_data/snapshots/poetry/some-extras_with-extras_lock21_1.3.json.bin Updated as part of this pull request.
tests/_data/snapshots/poetry/some-extras_with-extras_lock21_1.2.json.bin Updated as part of this pull request.
tests/_data/snapshots/poetry/some-extras_with-extras_lock20_1.5.json.bin Updated as part of this pull request.
tests/_data/snapshots/poetry/some-extras_with-extras_lock20_1.4.json.bin Updated as part of this pull request.
tests/_data/snapshots/poetry/some-extras_with-extras_lock20_1.3.json.bin Updated as part of this pull request.
tests/_data/snapshots/poetry/some-extras_with-extras_lock20_1.2.json.bin Updated as part of this pull request.
tests/_data/snapshots/poetry/some-extras_with-extras_lock11_1.5.json.bin Updated as part of this pull request.
tests/_data/snapshots/poetry/some-extras_with-extras_lock11_1.4.json.bin Updated as part of this pull request.
tests/_data/snapshots/poetry/some-extras_with-extras_lock11_1.3.json.bin Updated as part of this pull request.
tests/_data/snapshots/poetry/some-extras_with-extras_lock11_1.2.json.bin Updated as part of this pull request.
tests/_data/snapshots/poetry/some-extras_with-extras_lock10_1.5.json.bin Updated as part of this pull request.
tests/_data/snapshots/poetry/some-extras_with-extras_lock10_1.4.json.bin Updated as part of this pull request.
tests/_data/snapshots/poetry/some-extras_with-extras_lock10_1.3.json.bin Updated as part of this pull request.
tests/_data/snapshots/poetry/some-extras_with-extras_lock10_1.2.json.bin Updated as part of this pull request.
tests/_data/snapshots/poetry/plain_with-urls_lock21_1.5.xml.bin Updated as part of this pull request.
tests/_data/snapshots/poetry/plain_with-urls_lock21_1.5.json.bin Updated as part of this pull request.
tests/_data/snapshots/poetry/plain_with-urls_lock21_1.4.xml.bin Updated as part of this pull request.
tests/_data/snapshots/poetry/plain_with-urls_lock21_1.4.json.bin Updated as part of this pull request.
tests/_data/snapshots/poetry/plain_with-urls_lock21_1.3.xml.bin Updated as part of this pull request.
tests/_data/snapshots/poetry/plain_with-urls_lock21_1.3.json.bin Updated as part of this pull request.
tests/_data/snapshots/poetry/plain_with-urls_lock21_1.2.xml.bin Updated as part of this pull request.
tests/_data/snapshots/poetry/plain_with-urls_lock21_1.2.json.bin Updated as part of this pull request.
tests/_data/snapshots/poetry/plain_with-urls_lock20_1.5.xml.bin Updated as part of this pull request.
tests/_data/snapshots/poetry/plain_with-urls_lock20_1.5.json.bin Updated as part of this pull request.
tests/_data/snapshots/poetry/plain_with-urls_lock20_1.4.xml.bin Updated as part of this pull request.
tests/_data/snapshots/poetry/plain_with-urls_lock20_1.4.json.bin Updated as part of this pull request.
tests/_data/snapshots/poetry/plain_with-urls_lock20_1.3.xml.bin Updated as part of this pull request.
tests/_data/snapshots/poetry/plain_with-urls_lock20_1.3.json.bin Updated as part of this pull request.
tests/_data/snapshots/poetry/plain_with-urls_lock20_1.2.xml.bin Updated as part of this pull request.
tests/_data/snapshots/poetry/plain_with-urls_lock20_1.2.json.bin Updated as part of this pull request.
tests/_data/snapshots/poetry/plain_with-urls_lock11_1.5.xml.bin Updated as part of this pull request.
tests/_data/snapshots/poetry/plain_with-urls_lock11_1.5.json.bin Updated as part of this pull request.
tests/_data/snapshots/poetry/plain_with-urls_lock11_1.4.xml.bin Updated as part of this pull request.
tests/_data/snapshots/poetry/plain_with-urls_lock11_1.4.json.bin Updated as part of this pull request.
tests/_data/snapshots/poetry/plain_with-urls_lock11_1.3.xml.bin Updated as part of this pull request.
tests/_data/snapshots/poetry/plain_with-urls_lock11_1.3.json.bin Updated as part of this pull request.
tests/_data/snapshots/poetry/plain_with-urls_lock11_1.2.xml.bin Updated as part of this pull request.
tests/_data/snapshots/poetry/plain_with-urls_lock11_1.2.json.bin Updated as part of this pull request.
tests/_data/snapshots/poetry/plain_with-urls_lock10_1.5.xml.bin Updated as part of this pull request.
tests/_data/snapshots/poetry/plain_with-urls_lock10_1.5.json.bin Updated as part of this pull request.
tests/_data/snapshots/poetry/plain_with-urls_lock10_1.4.xml.bin Updated as part of this pull request.
tests/_data/snapshots/poetry/plain_with-urls_lock10_1.4.json.bin Updated as part of this pull request.
tests/_data/snapshots/poetry/plain_with-urls_lock10_1.3.xml.bin Updated as part of this pull request.
tests/_data/snapshots/poetry/plain_with-urls_lock10_1.3.json.bin Updated as part of this pull request.
tests/_data/snapshots/poetry/plain_with-urls_lock10_1.2.xml.bin Updated as part of this pull request.
tests/_data/snapshots/poetry/plain_with-urls_lock10_1.2.json.bin Updated as part of this pull request.
tests/_data/snapshots/poetry/plain_with-optionals-no-extra_lock21_1.5.json.bin Updated as part of this pull request.
tests/_data/snapshots/poetry/plain_with-optionals-no-extra_lock21_1.4.json.bin Updated as part of this pull request.
tests/_data/snapshots/poetry/plain_with-optionals-no-extra_lock21_1.3.json.bin Updated as part of this pull request.
tests/_data/snapshots/poetry/plain_with-optionals-no-extra_lock21_1.2.json.bin Updated as part of this pull request.
tests/_data/snapshots/poetry/plain_with-optionals-no-extra_lock20_1.5.json.bin Updated as part of this pull request.
tests/_data/snapshots/poetry/plain_with-optionals-no-extra_lock20_1.4.json.bin Updated as part of this pull request.
tests/_data/snapshots/poetry/plain_with-optionals-no-extra_lock20_1.3.json.bin Updated as part of this pull request.
tests/_data/snapshots/poetry/plain_with-optionals-no-extra_lock20_1.2.json.bin Updated as part of this pull request.
tests/_data/snapshots/poetry/plain_with-optionals-no-extra_lock11_1.5.json.bin Updated as part of this pull request.
tests/_data/snapshots/poetry/plain_with-optionals-no-extra_lock11_1.4.json.bin Updated as part of this pull request.
tests/_data/snapshots/poetry/plain_with-optionals-no-extra_lock11_1.3.json.bin Updated as part of this pull request.
tests/_data/snapshots/poetry/plain_with-optionals-no-extra_lock11_1.2.json.bin Updated as part of this pull request.
tests/_data/snapshots/poetry/plain_with-optionals-no-extra_lock10_1.5.json.bin Updated as part of this pull request.
tests/_data/snapshots/poetry/plain_with-optionals-no-extra_lock10_1.4.json.bin Updated as part of this pull request.
tests/_data/snapshots/poetry/plain_with-optionals-no-extra_lock10_1.3.json.bin Updated as part of this pull request.
tests/_data/snapshots/poetry/plain_with-optionals-no-extra_lock10_1.2.json.bin Updated as part of this pull request.
tests/_data/snapshots/poetry/plain_with-extras_lock21_1.5.xml.bin Updated as part of this pull request.
tests/_data/snapshots/poetry/plain_with-extras_lock21_1.5.json.bin Updated as part of this pull request.
tests/_data/snapshots/poetry/plain_with-extras_lock21_1.4.xml.bin Updated as part of this pull request.
tests/_data/snapshots/poetry/plain_with-extras_lock21_1.4.json.bin Updated as part of this pull request.
tests/_data/snapshots/poetry/plain_with-extras_lock21_1.3.xml.bin Updated as part of this pull request.
tests/_data/snapshots/poetry/plain_with-extras_lock21_1.3.json.bin Updated as part of this pull request.
tests/_data/snapshots/poetry/plain_with-extras_lock21_1.2.xml.bin Updated as part of this pull request.
tests/_data/snapshots/poetry/plain_with-extras_lock21_1.2.json.bin Updated as part of this pull request.
tests/_data/snapshots/poetry/plain_with-extras_lock20_1.5.xml.bin Updated as part of this pull request.
tests/_data/snapshots/poetry/plain_with-extras_lock20_1.5.json.bin Updated as part of this pull request.
tests/_data/snapshots/poetry/plain_with-extras_lock20_1.4.xml.bin Updated as part of this pull request.
tests/_data/snapshots/poetry/plain_with-extras_lock20_1.4.json.bin Updated as part of this pull request.
tests/_data/snapshots/poetry/plain_with-extras_lock20_1.3.xml.bin Updated as part of this pull request.
tests/_data/snapshots/poetry/plain_with-extras_lock20_1.3.json.bin Updated as part of this pull request.
tests/_data/snapshots/poetry/plain_with-extras_lock20_1.2.xml.bin Updated as part of this pull request.
tests/_data/snapshots/poetry/plain_with-extras_lock20_1.2.json.bin Updated as part of this pull request.
tests/_data/snapshots/poetry/plain_with-extras_lock11_1.5.xml.bin Updated as part of this pull request.
tests/_data/snapshots/poetry/plain_with-extras_lock11_1.5.json.bin Updated as part of this pull request.
tests/_data/snapshots/poetry/plain_with-extras_lock11_1.4.xml.bin Updated as part of this pull request.
tests/_data/snapshots/poetry/plain_with-extras_lock11_1.4.json.bin Updated as part of this pull request.
tests/_data/snapshots/poetry/plain_with-extras_lock11_1.3.xml.bin Updated as part of this pull request.
tests/_data/snapshots/poetry/plain_with-extras_lock11_1.3.json.bin Updated as part of this pull request.
tests/_data/snapshots/poetry/plain_with-extras_lock11_1.2.xml.bin Updated as part of this pull request.
tests/_data/snapshots/poetry/plain_with-extras_lock11_1.2.json.bin Updated as part of this pull request.
tests/_data/snapshots/poetry/plain_with-extras_lock10_1.5.xml.bin Updated as part of this pull request.
tests/_data/snapshots/poetry/plain_with-extras_lock10_1.5.json.bin Updated as part of this pull request.
tests/_data/snapshots/poetry/plain_with-extras_lock10_1.4.xml.bin Updated as part of this pull request.
tests/_data/snapshots/poetry/plain_with-extras_lock10_1.4.json.bin Updated as part of this pull request.
tests/_data/snapshots/poetry/plain_with-extras_lock10_1.3.xml.bin Updated as part of this pull request.
tests/_data/snapshots/poetry/plain_with-extras_lock10_1.3.json.bin Updated as part of this pull request.
tests/_data/snapshots/poetry/plain_with-extras_lock10_1.2.xml.bin Updated as part of this pull request.
tests/_data/snapshots/poetry/plain_with-extras_lock10_1.2.json.bin Updated as part of this pull request.
tests/_data/snapshots/poetry/plain_regression-issue727_lock21_1.5.json.bin Updated as part of this pull request.
tests/_data/snapshots/poetry/plain_regression-issue727_lock21_1.4.json.bin Updated as part of this pull request.
tests/_data/snapshots/poetry/plain_regression-issue727_lock21_1.3.json.bin Updated as part of this pull request.
tests/_data/snapshots/poetry/plain_regression-issue727_lock21_1.2.json.bin Updated as part of this pull request.
tests/_data/snapshots/poetry/plain_regression-issue727_lock20_1.5.json.bin Updated as part of this pull request.
tests/_data/snapshots/poetry/plain_regression-issue727_lock20_1.4.json.bin Updated as part of this pull request.
tests/_data/snapshots/poetry/plain_regression-issue727_lock20_1.3.json.bin Updated as part of this pull request.
tests/_data/snapshots/poetry/plain_regression-issue727_lock20_1.2.json.bin Updated as part of this pull request.
tests/_data/snapshots/poetry/plain_regression-issue702_lock21_1.5.json.bin Updated as part of this pull request.
tests/_data/snapshots/poetry/plain_regression-issue702_lock21_1.4.json.bin Updated as part of this pull request.
tests/_data/snapshots/poetry/plain_regression-issue702_lock21_1.3.json.bin Updated as part of this pull request.
tests/_data/snapshots/poetry/plain_regression-issue702_lock21_1.2.json.bin Updated as part of this pull request.
tests/_data/snapshots/poetry/plain_regression-issue702_lock20_1.5.json.bin Updated as part of this pull request.
tests/_data/snapshots/poetry/plain_regression-issue702_lock20_1.4.json.bin Updated as part of this pull request.
tests/_data/snapshots/poetry/plain_regression-issue702_lock20_1.3.json.bin Updated as part of this pull request.
tests/_data/snapshots/poetry/plain_regression-issue702_lock20_1.2.json.bin Updated as part of this pull request.
tests/_data/snapshots/poetry/plain_regression-issue702_lock11_1.5.json.bin Updated as part of this pull request.
tests/_data/snapshots/poetry/plain_regression-issue702_lock11_1.4.json.bin Updated as part of this pull request.
tests/_data/snapshots/poetry/plain_regression-issue702_lock11_1.3.json.bin Updated as part of this pull request.
tests/_data/snapshots/poetry/plain_regression-issue702_lock11_1.2.json.bin Updated as part of this pull request.
tests/_data/snapshots/poetry/plain_regression-issue702_lock10_1.5.json.bin Updated as part of this pull request.
tests/_data/snapshots/poetry/plain_regression-issue702_lock10_1.4.json.bin Updated as part of this pull request.
tests/_data/snapshots/poetry/plain_regression-issue702_lock10_1.3.json.bin Updated as part of this pull request.
tests/_data/snapshots/poetry/plain_regression-issue702_lock10_1.2.json.bin Updated as part of this pull request.
tests/_data/snapshots/poetry/plain_regression-issue611_lock21_1.5.json.bin Updated as part of this pull request.
tests/_data/snapshots/poetry/plain_regression-issue611_lock21_1.4.json.bin Updated as part of this pull request.
tests/_data/snapshots/poetry/plain_regression-issue611_lock21_1.3.json.bin Updated as part of this pull request.
tests/_data/snapshots/poetry/plain_regression-issue611_lock21_1.2.json.bin Updated as part of this pull request.
tests/_data/snapshots/poetry/plain_regression-issue611_lock20_1.5.json.bin Updated as part of this pull request.
tests/_data/snapshots/poetry/plain_regression-issue611_lock20_1.4.json.bin Updated as part of this pull request.
tests/_data/snapshots/poetry/plain_regression-issue611_lock20_1.3.json.bin Updated as part of this pull request.
tests/_data/snapshots/poetry/plain_regression-issue611_lock20_1.2.json.bin Updated as part of this pull request.
tests/_data/snapshots/poetry/plain_private-packges_v2_lock21_1.5.json.bin Updated as part of this pull request.
tests/_data/snapshots/poetry/plain_private-packges_v2_lock21_1.4.json.bin Updated as part of this pull request.
tests/_data/snapshots/poetry/plain_private-packges_v2_lock21_1.3.json.bin Updated as part of this pull request.
tests/_data/snapshots/poetry/plain_private-packges_v2_lock21_1.2.json.bin Updated as part of this pull request.
tests/_data/snapshots/poetry/plain_private-packges_lock20_1.5.xml.bin Updated as part of this pull request.
tests/_data/snapshots/poetry/plain_private-packges_lock20_1.5.json.bin Updated as part of this pull request.
tests/_data/snapshots/poetry/plain_private-packges_lock20_1.4.xml.bin Updated as part of this pull request.
tests/_data/snapshots/poetry/plain_private-packges_lock20_1.4.json.bin Updated as part of this pull request.
tests/_data/snapshots/poetry/plain_private-packges_lock20_1.3.xml.bin Updated as part of this pull request.
tests/_data/snapshots/poetry/plain_private-packges_lock20_1.3.json.bin Updated as part of this pull request.
tests/_data/snapshots/poetry/plain_private-packges_lock20_1.2.xml.bin Updated as part of this pull request.
tests/_data/snapshots/poetry/plain_private-packges_lock20_1.2.json.bin Updated as part of this pull request.
tests/_data/snapshots/poetry/plain_private-packges_lock11_1.5.xml.bin Updated as part of this pull request.
tests/_data/snapshots/poetry/plain_private-packges_lock11_1.5.json.bin Updated as part of this pull request.
tests/_data/snapshots/poetry/plain_private-packges_lock11_1.4.xml.bin Updated as part of this pull request.
tests/_data/snapshots/poetry/plain_private-packges_lock11_1.4.json.bin Updated as part of this pull request.
tests/_data/snapshots/poetry/plain_private-packges_lock11_1.3.xml.bin Updated as part of this pull request.
tests/_data/snapshots/poetry/plain_private-packges_lock11_1.3.json.bin Updated as part of this pull request.
tests/_data/snapshots/poetry/plain_private-packges_lock11_1.2.xml.bin Updated as part of this pull request.
tests/_data/snapshots/poetry/plain_private-packges_lock11_1.2.json.bin Updated as part of this pull request.
tests/_data/snapshots/poetry/plain_private-packges_lock10_1.5.xml.bin Updated as part of this pull request.
tests/_data/snapshots/poetry/plain_private-packges_lock10_1.5.json.bin Updated as part of this pull request.
tests/_data/snapshots/poetry/plain_private-packges_lock10_1.4.xml.bin Updated as part of this pull request.
tests/_data/snapshots/poetry/plain_private-packges_lock10_1.4.json.bin Updated as part of this pull request.
tests/_data/snapshots/poetry/plain_private-packges_lock10_1.3.xml.bin Updated as part of this pull request.
tests/_data/snapshots/poetry/plain_private-packges_lock10_1.3.json.bin Updated as part of this pull request.
tests/_data/snapshots/poetry/plain_private-packges_lock10_1.2.xml.bin Updated as part of this pull request.
tests/_data/snapshots/poetry/plain_private-packges_lock10_1.2.json.bin Updated as part of this pull request.
tests/_data/snapshots/poetry/plain_normalize-packagename_lock21_1.5.xml.bin Updated as part of this pull request.
tests/_data/snapshots/poetry/plain_normalize-packagename_lock21_1.5.json.bin Updated as part of this pull request.
tests/_data/snapshots/poetry/plain_normalize-packagename_lock21_1.4.xml.bin Updated as part of this pull request.
tests/_data/snapshots/poetry/plain_normalize-packagename_lock21_1.4.json.bin Updated as part of this pull request.
tests/_data/snapshots/poetry/plain_normalize-packagename_lock21_1.3.xml.bin Updated as part of this pull request.
tests/_data/snapshots/poetry/plain_normalize-packagename_lock21_1.3.json.bin Updated as part of this pull request.
tests/_data/snapshots/poetry/plain_normalize-packagename_lock21_1.2.xml.bin Updated as part of this pull request.
tests/_data/snapshots/poetry/plain_normalize-packagename_lock21_1.2.json.bin Updated as part of this pull request.
tests/_data/snapshots/poetry/plain_normalize-packagename_lock20_1.5.xml.bin Updated as part of this pull request.
tests/_data/snapshots/poetry/plain_normalize-packagename_lock20_1.5.json.bin Updated as part of this pull request.
tests/_data/snapshots/poetry/plain_normalize-packagename_lock20_1.4.json.bin Updated as part of this pull request.
tests/_data/snapshots/poetry/plain_normalize-packagename_lock20_1.3.json.bin Updated as part of this pull request.
tests/_data/snapshots/poetry/plain_normalize-packagename_lock20_1.2.json.bin Updated as part of this pull request.
tests/_data/snapshots/poetry/plain_normalize-packagename_lock10_1.5.json.bin Updated as part of this pull request.
tests/_data/snapshots/poetry/plain_normalize-packagename_lock10_1.4.json.bin Updated as part of this pull request.
tests/_data/snapshots/poetry/plain_normalize-packagename_lock10_1.3.json.bin Updated as part of this pull request.
tests/_data/snapshots/poetry/plain_normalize-packagename_lock10_1.2.json.bin Updated as part of this pull request.
tests/_data/snapshots/poetry/plain_multi-constraint-deps_lock21_1.5.json.bin Updated as part of this pull request.
tests/_data/snapshots/poetry/plain_multi-constraint-deps_lock21_1.4.json.bin Updated as part of this pull request.
tests/_data/snapshots/poetry/plain_multi-constraint-deps_lock21_1.3.json.bin Updated as part of this pull request.
tests/_data/snapshots/poetry/plain_multi-constraint-deps_lock21_1.2.json.bin Updated as part of this pull request.
tests/_data/snapshots/poetry/plain_multi-constraint-deps_lock20_1.5.json.bin Updated as part of this pull request.
tests/_data/snapshots/poetry/plain_multi-constraint-deps_lock20_1.4.json.bin Updated as part of this pull request.
tests/_data/snapshots/poetry/plain_multi-constraint-deps_lock20_1.3.json.bin Updated as part of this pull request.
tests/_data/snapshots/poetry/plain_multi-constraint-deps_lock20_1.2.json.bin Updated as part of this pull request.
tests/_data/snapshots/poetry/plain_multi-constraint-deps_lock11_1.5.json.bin Updated as part of this pull request.
tests/_data/snapshots/poetry/plain_multi-constraint-deps_lock11_1.4.json.bin Updated as part of this pull request.
tests/_data/snapshots/poetry/plain_multi-constraint-deps_lock11_1.3.json.bin Updated as part of this pull request.
tests/_data/snapshots/poetry/plain_multi-constraint-deps_lock11_1.2.json.bin Updated as part of this pull request.
tests/_data/snapshots/poetry/plain_main-and-dev_lock21_1.5.xml.bin Updated as part of this pull request.
tests/_data/snapshots/poetry/plain_main-and-dev_lock21_1.5.json.bin Updated as part of this pull request.
tests/_data/snapshots/poetry/plain_main-and-dev_lock21_1.4.xml.bin Updated as part of this pull request.
tests/_data/snapshots/poetry/plain_main-and-dev_lock21_1.4.json.bin Updated as part of this pull request.
tests/_data/snapshots/poetry/plain_main-and-dev_lock21_1.3.xml.bin Updated as part of this pull request.
tests/_data/snapshots/poetry/plain_main-and-dev_lock21_1.3.json.bin Updated as part of this pull request.
tests/_data/snapshots/poetry/plain_main-and-dev_lock21_1.2.xml.bin Updated as part of this pull request.
tests/_data/snapshots/poetry/plain_main-and-dev_lock21_1.2.json.bin Updated as part of this pull request.
tests/_data/snapshots/poetry/plain_main-and-dev_lock20_1.5.xml.bin Updated as part of this pull request.
tests/_data/snapshots/poetry/plain_main-and-dev_lock20_1.5.json.bin Updated as part of this pull request.
tests/_data/snapshots/poetry/plain_main-and-dev_lock20_1.4.xml.bin Updated as part of this pull request.
tests/_data/snapshots/poetry/plain_main-and-dev_lock20_1.4.json.bin Updated as part of this pull request.
tests/_data/snapshots/poetry/plain_main-and-dev_lock20_1.3.xml.bin Updated as part of this pull request.
tests/_data/snapshots/poetry/plain_main-and-dev_lock20_1.3.json.bin Updated as part of this pull request.
tests/_data/snapshots/poetry/plain_main-and-dev_lock20_1.2.xml.bin Updated as part of this pull request.
tests/_data/snapshots/poetry/plain_main-and-dev_lock20_1.2.json.bin Updated as part of this pull request.
tests/_data/snapshots/poetry/plain_main-and-dev_lock11_1.5.xml.bin Updated as part of this pull request.
tests/_data/snapshots/poetry/plain_main-and-dev_lock11_1.5.json.bin Updated as part of this pull request.
tests/_data/snapshots/poetry/plain_main-and-dev_lock11_1.4.xml.bin Updated as part of this pull request.
tests/_data/snapshots/poetry/plain_main-and-dev_lock11_1.4.json.bin Updated as part of this pull request.
tests/_data/snapshots/poetry/plain_main-and-dev_lock11_1.3.xml.bin Updated as part of this pull request.
tests/_data/snapshots/poetry/plain_main-and-dev_lock11_1.3.json.bin Updated as part of this pull request.
tests/_data/snapshots/poetry/plain_main-and-dev_lock11_1.2.xml.bin Updated as part of this pull request.
tests/_data/snapshots/poetry/plain_main-and-dev_lock11_1.2.json.bin Updated as part of this pull request.
tests/_data/snapshots/poetry/plain_main-and-dev_lock10_1.5.xml.bin Updated as part of this pull request.
tests/_data/snapshots/poetry/plain_main-and-dev_lock10_1.5.json.bin Updated as part of this pull request.
tests/_data/snapshots/poetry/plain_main-and-dev_lock10_1.4.xml.bin Updated as part of this pull request.
tests/_data/snapshots/poetry/plain_main-and-dev_lock10_1.4.json.bin Updated as part of this pull request.
tests/_data/snapshots/poetry/plain_main-and-dev_lock10_1.3.xml.bin Updated as part of this pull request.
tests/_data/snapshots/poetry/plain_main-and-dev_lock10_1.3.json.bin Updated as part of this pull request.
tests/_data/snapshots/poetry/plain_main-and-dev_lock10_1.2.xml.bin Updated as part of this pull request.
tests/_data/snapshots/poetry/plain_main-and-dev_lock10_1.2.json.bin Updated as part of this pull request.
tests/_data/snapshots/poetry/plain_local_lock21_1.5.xml.bin Updated as part of this pull request.
tests/_data/snapshots/poetry/plain_local_lock21_1.5.json.bin Updated as part of this pull request.
tests/_data/snapshots/poetry/plain_local_lock21_1.4.xml.bin Updated as part of this pull request.
tests/_data/snapshots/poetry/plain_local_lock21_1.4.json.bin Updated as part of this pull request.
tests/_data/snapshots/poetry/plain_local_lock21_1.3.xml.bin Updated as part of this pull request.
tests/_data/snapshots/poetry/plain_local_lock21_1.3.json.bin Updated as part of this pull request.
tests/_data/snapshots/poetry/plain_local_lock21_1.2.xml.bin Updated as part of this pull request.
tests/_data/snapshots/poetry/plain_local_lock21_1.2.json.bin Updated as part of this pull request.
tests/_data/snapshots/poetry/plain_local_lock20_1.5.xml.bin Updated as part of this pull request.
tests/_data/snapshots/poetry/plain_local_lock20_1.5.json.bin Updated as part of this pull request.
tests/_data/snapshots/poetry/plain_local_lock20_1.4.xml.bin Updated as part of this pull request.
tests/_data/snapshots/poetry/plain_local_lock20_1.4.json.bin Updated as part of this pull request.
tests/_data/snapshots/poetry/plain_local_lock20_1.3.xml.bin Updated as part of this pull request.
tests/_data/snapshots/poetry/plain_local_lock20_1.3.json.bin Updated as part of this pull request.
tests/_data/snapshots/poetry/plain_local_lock20_1.2.xml.bin Updated as part of this pull request.
tests/_data/snapshots/poetry/plain_local_lock20_1.2.json.bin Updated as part of this pull request.
tests/_data/snapshots/poetry/plain_local_lock11_1.5.xml.bin Updated as part of this pull request.
tests/_data/snapshots/poetry/plain_local_lock11_1.5.json.bin Updated as part of this pull request.
tests/_data/snapshots/poetry/plain_local_lock11_1.4.xml.bin Updated as part of this pull request.
tests/_data/snapshots/poetry/plain_local_lock11_1.4.json.bin Updated as part of this pull request.
tests/_data/snapshots/poetry/plain_local_lock11_1.3.xml.bin Updated as part of this pull request.
tests/_data/snapshots/poetry/plain_local_lock11_1.3.json.bin Updated as part of this pull request.
tests/_data/snapshots/poetry/plain_local_lock11_1.2.xml.bin Updated as part of this pull request.
tests/_data/snapshots/poetry/plain_local_lock11_1.2.json.bin Updated as part of this pull request.
tests/_data/snapshots/poetry/plain_local_lock10_1.5.xml.bin Updated as part of this pull request.
tests/_data/snapshots/poetry/plain_local_lock10_1.5.json.bin Updated as part of this pull request.
tests/_data/snapshots/poetry/plain_local_lock10_1.4.xml.bin Updated as part of this pull request.
tests/_data/snapshots/poetry/plain_local_lock10_1.4.json.bin Updated as part of this pull request.
tests/_data/snapshots/poetry/plain_local_lock10_1.3.xml.bin Updated as part of this pull request.
tests/_data/snapshots/poetry/plain_local_lock10_1.3.json.bin Updated as part of this pull request.
tests/_data/snapshots/poetry/plain_local_lock10_1.2.xml.bin Updated as part of this pull request.
tests/_data/snapshots/poetry/plain_local_lock10_1.2.json.bin Updated as part of this pull request.
tests/_data/snapshots/poetry/plain_group-deps_lock21_1.5.xml.bin Updated as part of this pull request.
tests/_data/snapshots/poetry/plain_group-deps_lock21_1.5.json.bin Updated as part of this pull request.
tests/_data/snapshots/poetry/plain_group-deps_lock21_1.4.xml.bin Updated as part of this pull request.
tests/_data/snapshots/poetry/plain_group-deps_lock21_1.4.json.bin Updated as part of this pull request.
tests/_data/snapshots/poetry/plain_group-deps_lock21_1.3.xml.bin Updated as part of this pull request.
tests/_data/snapshots/poetry/plain_group-deps_lock21_1.3.json.bin Updated as part of this pull request.
tests/_data/snapshots/poetry/plain_group-deps_lock21_1.2.xml.bin Updated as part of this pull request.
tests/_data/snapshots/poetry/plain_group-deps_lock21_1.2.json.bin Updated as part of this pull request.
tests/_data/snapshots/poetry/plain_group-deps_lock20_1.5.xml.bin Updated as part of this pull request.
tests/_data/snapshots/poetry/plain_group-deps_lock20_1.5.json.bin Updated as part of this pull request.
tests/_data/snapshots/poetry/plain_group-deps_lock20_1.4.xml.bin Updated as part of this pull request.
tests/_data/snapshots/poetry/plain_group-deps_lock20_1.4.json.bin Updated as part of this pull request.
tests/_data/snapshots/poetry/plain_group-deps_lock20_1.3.xml.bin Updated as part of this pull request.
tests/_data/snapshots/poetry/plain_group-deps_lock20_1.3.json.bin Updated as part of this pull request.
tests/_data/snapshots/poetry/plain_group-deps_lock20_1.2.xml.bin Updated as part of this pull request.
tests/_data/snapshots/poetry/plain_group-deps_lock20_1.2.json.bin Updated as part of this pull request.
tests/_data/snapshots/poetry/plain_group-deps_lock11_1.5.xml.bin Updated as part of this pull request.
tests/_data/snapshots/poetry/plain_group-deps_lock11_1.5.json.bin Updated as part of this pull request.
tests/_data/snapshots/poetry/plain_group-deps_lock11_1.4.xml.bin Updated as part of this pull request.
tests/_data/snapshots/poetry/plain_group-deps_lock11_1.4.json.bin Updated as part of this pull request.
tests/_data/snapshots/poetry/plain_group-deps_lock11_1.3.xml.bin Updated as part of this pull request.
tests/_data/snapshots/poetry/plain_group-deps_lock11_1.3.json.bin Updated as part of this pull request.
tests/_data/snapshots/poetry/plain_group-deps_lock11_1.2.xml.bin Updated as part of this pull request.
tests/_data/snapshots/poetry/plain_group-deps_lock11_1.2.json.bin Updated as part of this pull request.
tests/_data/snapshots/poetry/only-groups_group-deps_lock21_1.5.json.bin Updated as part of this pull request.
tests/_data/snapshots/poetry/only-groups_group-deps_lock21_1.4.json.bin Updated as part of this pull request.
tests/_data/snapshots/poetry/only-groups_group-deps_lock21_1.3.json.bin Updated as part of this pull request.
tests/_data/snapshots/poetry/only-groups_group-deps_lock21_1.2.json.bin Updated as part of this pull request.
tests/_data/snapshots/poetry/only-groups_group-deps_lock20_1.5.json.bin Updated as part of this pull request.
tests/_data/snapshots/poetry/only-groups_group-deps_lock20_1.4.json.bin Updated as part of this pull request.
tests/_data/snapshots/poetry/only-groups_group-deps_lock20_1.3.json.bin Updated as part of this pull request.
tests/_data/snapshots/poetry/only-groups_group-deps_lock20_1.2.json.bin Updated as part of this pull request.
tests/_data/snapshots/poetry/only-groups_group-deps_lock11_1.5.json.bin Updated as part of this pull request.
tests/_data/snapshots/poetry/only-groups_group-deps_lock11_1.4.json.bin Updated as part of this pull request.
tests/_data/snapshots/poetry/only-groups_group-deps_lock11_1.3.json.bin Updated as part of this pull request.
tests/_data/snapshots/poetry/only-groups_group-deps_lock11_1.2.json.bin Updated as part of this pull request.
tests/_data/snapshots/poetry/no-dev_main-and-dev_lock21_1.5.xml.bin Updated as part of this pull request.
tests/_data/snapshots/poetry/no-dev_main-and-dev_lock21_1.5.json.bin Updated as part of this pull request.
tests/_data/snapshots/poetry/no-dev_main-and-dev_lock21_1.4.xml.bin Updated as part of this pull request.
tests/_data/snapshots/poetry/no-dev_main-and-dev_lock21_1.4.json.bin Updated as part of this pull request.
tests/_data/snapshots/poetry/no-dev_main-and-dev_lock21_1.3.xml.bin Updated as part of this pull request.
tests/_data/snapshots/poetry/no-dev_main-and-dev_lock21_1.3.json.bin Updated as part of this pull request.
tests/_data/snapshots/poetry/no-dev_main-and-dev_lock21_1.2.xml.bin Updated as part of this pull request.
tests/_data/snapshots/poetry/no-dev_main-and-dev_lock21_1.2.json.bin Updated as part of this pull request.
tests/_data/snapshots/poetry/no-dev_main-and-dev_lock20_1.5.xml.bin Updated as part of this pull request.
tests/_data/snapshots/poetry/no-dev_main-and-dev_lock20_1.5.json.bin Updated as part of this pull request.
tests/_data/snapshots/poetry/no-dev_main-and-dev_lock20_1.4.xml.bin Updated as part of this pull request.
tests/_data/snapshots/poetry/no-dev_main-and-dev_lock20_1.4.json.bin Updated as part of this pull request.
tests/_data/snapshots/poetry/no-dev_main-and-dev_lock20_1.3.xml.bin Updated as part of this pull request.
tests/_data/snapshots/poetry/no-dev_main-and-dev_lock20_1.3.json.bin Updated as part of this pull request.
tests/_data/snapshots/poetry/no-dev_main-and-dev_lock20_1.2.xml.bin Updated as part of this pull request.
tests/_data/snapshots/poetry/no-dev_main-and-dev_lock20_1.2.json.bin Updated as part of this pull request.
tests/_data/snapshots/poetry/no-dev_main-and-dev_lock11_1.5.xml.bin Updated as part of this pull request.
tests/_data/snapshots/poetry/no-dev_main-and-dev_lock11_1.5.json.bin Updated as part of this pull request.
tests/_data/snapshots/poetry/no-dev_main-and-dev_lock11_1.4.xml.bin Updated as part of this pull request.
tests/_data/snapshots/poetry/no-dev_main-and-dev_lock11_1.4.json.bin Updated as part of this pull request.
tests/_data/snapshots/poetry/no-dev_main-and-dev_lock11_1.3.xml.bin Updated as part of this pull request.
tests/_data/snapshots/poetry/no-dev_main-and-dev_lock11_1.3.json.bin Updated as part of this pull request.
tests/_data/snapshots/poetry/no-dev_main-and-dev_lock11_1.2.xml.bin Updated as part of this pull request.
tests/_data/snapshots/poetry/no-dev_main-and-dev_lock11_1.2.json.bin Updated as part of this pull request.
tests/_data/snapshots/poetry/no-dev_main-and-dev_lock10_1.5.xml.bin Updated as part of this pull request.
tests/_data/snapshots/poetry/no-dev_main-and-dev_lock10_1.5.json.bin Updated as part of this pull request.
tests/_data/snapshots/poetry/no-dev_main-and-dev_lock10_1.4.xml.bin Updated as part of this pull request.
tests/_data/snapshots/poetry/no-dev_main-and-dev_lock10_1.4.json.bin Updated as part of this pull request.
tests/_data/snapshots/poetry/no-dev_main-and-dev_lock10_1.3.xml.bin Updated as part of this pull request.
tests/_data/snapshots/poetry/no-dev_main-and-dev_lock10_1.3.json.bin Updated as part of this pull request.
tests/_data/snapshots/poetry/no-dev_main-and-dev_lock10_1.2.xml.bin Updated as part of this pull request.
tests/_data/snapshots/poetry/no-dev_main-and-dev_lock10_1.2.json.bin Updated as part of this pull request.
tests/_data/snapshots/poetry/no-dev_group-deps_lock21_1.5.xml.bin Updated as part of this pull request.
tests/_data/snapshots/poetry/no-dev_group-deps_lock21_1.5.json.bin Updated as part of this pull request.
tests/_data/snapshots/poetry/no-dev_group-deps_lock21_1.4.xml.bin Updated as part of this pull request.
tests/_data/snapshots/poetry/no-dev_group-deps_lock21_1.4.json.bin Updated as part of this pull request.
tests/_data/snapshots/poetry/no-dev_group-deps_lock21_1.3.xml.bin Updated as part of this pull request.
tests/_data/snapshots/poetry/no-dev_group-deps_lock21_1.3.json.bin Updated as part of this pull request.
tests/_data/snapshots/poetry/no-dev_group-deps_lock21_1.2.xml.bin Updated as part of this pull request.
tests/_data/snapshots/poetry/no-dev_group-deps_lock21_1.2.json.bin Updated as part of this pull request.
tests/_data/snapshots/poetry/no-dev_group-deps_lock20_1.5.xml.bin Updated as part of this pull request.
tests/_data/snapshots/poetry/no-dev_group-deps_lock20_1.5.json.bin Updated as part of this pull request.
tests/_data/snapshots/poetry/no-dev_group-deps_lock20_1.4.xml.bin Updated as part of this pull request.
tests/_data/snapshots/poetry/no-dev_group-deps_lock20_1.4.json.bin Updated as part of this pull request.
tests/_data/snapshots/poetry/no-dev_group-deps_lock20_1.3.xml.bin Updated as part of this pull request.
tests/_data/snapshots/poetry/no-dev_group-deps_lock20_1.3.json.bin Updated as part of this pull request.
tests/_data/snapshots/poetry/no-dev_group-deps_lock20_1.2.xml.bin Updated as part of this pull request.
tests/_data/snapshots/poetry/no-dev_group-deps_lock20_1.2.json.bin Updated as part of this pull request.
tests/_data/snapshots/poetry/no-dev_group-deps_lock11_1.5.xml.bin Updated as part of this pull request.
tests/_data/snapshots/poetry/no-dev_group-deps_lock11_1.5.json.bin Updated as part of this pull request.
tests/_data/snapshots/poetry/no-dev_group-deps_lock11_1.4.xml.bin Updated as part of this pull request.
tests/_data/snapshots/poetry/no-dev_group-deps_lock11_1.4.json.bin Updated as part of this pull request.
tests/_data/snapshots/poetry/no-dev_group-deps_lock11_1.3.xml.bin Updated as part of this pull request.
tests/_data/snapshots/poetry/no-dev_group-deps_lock11_1.3.json.bin Updated as part of this pull request.
tests/_data/snapshots/poetry/no-dev_group-deps_lock11_1.2.xml.bin Updated as part of this pull request.
tests/_data/snapshots/poetry/no-dev_group-deps_lock11_1.2.json.bin Updated as part of this pull request.
tests/_data/snapshots/poetry/all-extras_with-extras_lock21_1.5.xml.bin Updated as part of this pull request.
tests/_data/snapshots/poetry/all-extras_with-extras_lock21_1.5.json.bin Updated as part of this pull request.
tests/_data/snapshots/poetry/all-extras_with-extras_lock21_1.4.xml.bin Updated as part of this pull request.
tests/_data/snapshots/poetry/all-extras_with-extras_lock21_1.4.json.bin Updated as part of this pull request.
tests/_data/snapshots/poetry/all-extras_with-extras_lock21_1.3.xml.bin Updated as part of this pull request.
tests/_data/snapshots/poetry/all-extras_with-extras_lock21_1.3.json.bin Updated as part of this pull request.
tests/_data/snapshots/poetry/all-extras_with-extras_lock21_1.2.xml.bin Updated as part of this pull request.
tests/_data/snapshots/poetry/all-extras_with-extras_lock21_1.2.json.bin Updated as part of this pull request.
tests/_data/snapshots/poetry/all-extras_with-extras_lock20_1.5.xml.bin Updated as part of this pull request.
tests/_data/snapshots/poetry/all-extras_with-extras_lock20_1.5.json.bin Updated as part of this pull request.
tests/_data/snapshots/poetry/all-extras_with-extras_lock20_1.4.xml.bin Updated as part of this pull request.
tests/_data/snapshots/poetry/all-extras_with-extras_lock20_1.4.json.bin Updated as part of this pull request.
tests/_data/snapshots/poetry/all-extras_with-extras_lock20_1.3.xml.bin Updated as part of this pull request.
tests/_data/snapshots/poetry/all-extras_with-extras_lock20_1.3.json.bin Updated as part of this pull request.
tests/_data/snapshots/poetry/all-extras_with-extras_lock20_1.2.xml.bin Updated as part of this pull request.
tests/_data/snapshots/poetry/all-extras_with-extras_lock20_1.2.json.bin Updated as part of this pull request.
tests/_data/snapshots/poetry/all-extras_with-extras_lock11_1.5.xml.bin Updated as part of this pull request.
tests/_data/snapshots/poetry/all-extras_with-extras_lock11_1.5.json.bin Updated as part of this pull request.
tests/_data/snapshots/poetry/all-extras_with-extras_lock11_1.4.xml.bin Updated as part of this pull request.
tests/_data/snapshots/poetry/all-extras_with-extras_lock11_1.4.json.bin Updated as part of this pull request.
tests/_data/snapshots/poetry/all-extras_with-extras_lock11_1.3.xml.bin Updated as part of this pull request.
tests/_data/snapshots/poetry/all-extras_with-extras_lock11_1.3.json.bin Updated as part of this pull request.
tests/_data/snapshots/poetry/all-extras_with-extras_lock11_1.2.xml.bin Updated as part of this pull request.
tests/_data/snapshots/poetry/all-extras_with-extras_lock11_1.2.json.bin Updated as part of this pull request.
tests/_data/snapshots/poetry/all-extras_with-extras_lock10_1.5.xml.bin Updated as part of this pull request.
tests/_data/snapshots/poetry/all-extras_with-extras_lock10_1.5.json.bin Updated as part of this pull request.
tests/_data/snapshots/poetry/all-extras_with-extras_lock10_1.4.xml.bin Updated as part of this pull request.
tests/_data/snapshots/poetry/all-extras_with-extras_lock10_1.4.json.bin Updated as part of this pull request.
tests/_data/snapshots/poetry/all-extras_with-extras_lock10_1.3.xml.bin Updated as part of this pull request.
tests/_data/snapshots/poetry/all-extras_with-extras_lock10_1.3.json.bin Updated as part of this pull request.
tests/_data/snapshots/poetry/all-extras_with-extras_lock10_1.2.xml.bin Updated as part of this pull request.
tests/_data/snapshots/poetry/all-extras_with-extras_lock10_1.2.json.bin Updated as part of this pull request.
tests/_data/snapshots/environment/plain_editable-self_1.5.xml.bin Updated as part of this pull request.
tests/_data/snapshots/environment/plain_editable-self_1.5.json.bin Updated as part of this pull request.
tests/_data/snapshots/environment/plain_editable-self_1.4.xml.bin Updated as part of this pull request.
tests/_data/snapshots/environment/plain_editable-self_1.4.json.bin Updated as part of this pull request.
tests/_data/snapshots/environment/plain_editable-self_1.3.xml.bin Updated as part of this pull request.
tests/_data/snapshots/environment/plain_editable-self_1.3.json.bin Updated as part of this pull request.
tests/_data/snapshots/environment/plain_editable-self_1.2.xml.bin Updated as part of this pull request.
tests/_data/snapshots/environment/plain_editable-self_1.2.json.bin Updated as part of this pull request.
Review details

Suppressed comments (2)

cyclonedx_py/_internal/utils/contact.py:77

  • Component.authors normalizes contacts into a SortedSet, but this helper counts the raw iterable. Duplicate manifest entries therefore become one structured author while contacts2author() sees two and clears the legacy field; for CycloneDX 1.2–1.5 that loses the author entirely. Deduplicate before checking the count.
    cyclonedx_py/_internal/utils/contact.py:75
  • The email-only representation is documented as "<email>", but the implementation returns the bare email string. Update the docstring so callers are not given an incorrect output contract.
  • Files reviewed: 300/847 changed files
  • Comments generated: 2
  • Review effort level: Balanced

💡 Add a code-review agent skill or configure MCP servers for context-aware, tailored reviews. Learn more in the docs.

# this shape; treat it the same as "no usable name or email" rather than crash.
return None
name = m.group('name') or None
email = m.group('email') or None
Comment on lines +130 to +132
for name, email in addresses:
yield OrganizationalContact(name=name, email=email)
return
@jkowalleck jkowalleck linked an issue Sep 7, 2026 that may be closed by this pull request
@jkowalleck jkowalleck added the enhancement New feature or request label Sep 7, 2026

@jkowalleck jkowalleck left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Thank you for tackling this (draft!) PR.

I see a lot of arguable solutions here.
Let's discuss them in the respective ticket (not in this PR!)

_PERSON_STRING_MATCHER = re_compile(r'^\s*(?P<name>[^<]*?)\s*(?:<(?P<email>[^<>]*)>)?\s*$')


def person_string2contact(value: str) -> Optional[OrganizationalContact]:

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

why is this custom thing needed at all?
is it not as simple as

from email.utils import parseaddr
name, addr = parseaddr(text) if '@' in text else (text,'')

author = metadata.get('Author')
author_email = metadata.get('Author-email')
if author_email:
# `email.utils.getaddresses()` expects RFC 5322 address syntax. Fed something

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

please remove those comments - they only describe how getaddresses works - that is already well documented in the respective library.

if isinstance(author, str):
# Not per spec -- PEP 621 authors are tables, not strings -- but some
# real-world pyproject.toml files use Poetry's "Name <email>" convention
# here regardless. Be lenient and parse it the same way, rather than crash.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

nope. we will not be lenient here!
wrong format - info is dropped!

File is called "pip621" and docs say also...

Functionality related to PEP 621.

this thing shall implement the PEP621 only, not some "in the wild" observations.

yield contact
continue
if not isinstance(author, dict):
# Not per spec at all -- e.g. `authors = [123]` -- TOML happily allows it,

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

nope. we will not be lenient here!
wrong format - info is dropped!

File is called "pip621" and docs say also...

Functionality related to PEP 621.

this thing shall implement the PEP621 only, not some "in the wild" observations.

# see https://python-poetry.org/docs/pyproject/#authors
for author in poetry.get('authors', ()):
if not isinstance(author, str):
# Not per spec -- Poetry's `authors` is a list of "Name <email>" strings --

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Not per spec --

which spec?

anyway,just remove this comment. it has no value - it literally describes the code

description=poetry.get('description'),
external_references=poetry2extrefs(poetry),
authors=authors,
author=contacts2author(authors),

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

arguable - as described in the ticket for this PR.
see #648 (comment)

I'd rather go with ' & '.join(filter(lambda x: isInstance(x, str), poetry.authors))

description=dist_meta['Summary'] if 'Summary' in dist_meta else None,
external_references=metadata2extrefs(dist_meta),
authors=authors,
author=contacts2author(authors),

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

arguable - as described in the ticket for this PR.
see #648 (comment)

I'd rather go with ' & '.join(...))

- https://packaging.python.org/en/latest/specifications/core-metadata/#author
- https://packaging.python.org/en/latest/specifications/core-metadata/#author-email

`Author` and `Author-email` are two independent free-text fields; there is no

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Author-email is no "free-text fields".
it si clearly specced: https://packaging.python.org/en/latest/specifications/core-metadata/#author-email

A string containing the author’s e-mail address. It can contain a name and e-mail address in the legal forms for a RFC-822 From: header.

yield OrganizationalContact(name=name, email=email)
return
if author:
yield OrganizationalContact(name=author)

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

how comes?

python packaging's 'author` clearly corresponds to CycloneDX's author - bot are arbitrary strings ...

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

feat: populate component.authors

3 participants