• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

pantsbuild / pants / 24145945949

08 Apr 2026 04:14PM UTC coverage: 82.077% (-10.8%) from 92.91%
24145945949

Pull #23233

github

web-flow
Merge 089d98e3c into 9036734c9
Pull Request #23233: Introduce a LockfileFormat enum.

8 of 11 new or added lines in 4 files covered. (72.73%)

7635 existing lines in 306 files now uncovered.

63732 of 77649 relevant lines covered (82.08%)

2.96 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

79.49
/src/python/pants/backend/python/macros/pipenv_requirements.py
1
# Copyright 2022 Pants project contributors (see CONTRIBUTORS.md).
2
# Licensed under the Apache License, Version 2.0 (see LICENSE).
3

4
from __future__ import annotations
2✔
5

6
import json
2✔
7

8
from pants.backend.python.macros.common_fields import (
2✔
9
    ModuleMappingField,
10
    RequirementsOverrideField,
11
    TypeStubsModuleMappingField,
12
)
13
from pants.backend.python.macros.common_requirements_rule import _generate_requirements
2✔
14
from pants.backend.python.subsystems.setup import PythonSetup
2✔
15
from pants.backend.python.target_types import PythonRequirementResolveField, PythonRequirementTarget
2✔
16
from pants.engine.rules import collect_rules, rule
2✔
17
from pants.engine.target import (
2✔
18
    COMMON_TARGET_FIELDS,
19
    GeneratedTargets,
20
    GenerateTargetsRequest,
21
    SingleSourceField,
22
    TargetGenerator,
23
)
24
from pants.engine.unions import UnionMembership, UnionRule
2✔
25
from pants.util.logging import LogLevel
2✔
26
from pants.util.pip_requirement import PipRequirement
2✔
27

28

29
class PipenvSourceField(SingleSourceField):
2✔
30
    default = "Pipfile.lock"
2✔
31
    required = False
2✔
32

33

34
class PipenvRequirementsTargetGenerator(TargetGenerator):
2✔
35
    alias = "pipenv_requirements"
2✔
36
    help = "Generate a `python_requirement` for each entry in `Pipenv.lock`."
2✔
37
    generated_target_cls = PythonRequirementTarget
2✔
38
    # Note that this does not have a `dependencies` field.
39
    core_fields = (
2✔
40
        *COMMON_TARGET_FIELDS,
41
        ModuleMappingField,
42
        TypeStubsModuleMappingField,
43
        PipenvSourceField,
44
        RequirementsOverrideField,
45
    )
46
    copied_fields = COMMON_TARGET_FIELDS
2✔
47
    moved_fields = (PythonRequirementResolveField,)
2✔
48

49

50
class GenerateFromPipenvRequirementsRequest(GenerateTargetsRequest):
2✔
51
    generate_from = PipenvRequirementsTargetGenerator
2✔
52

53

54
# TODO(#10655): add support for PEP 440 direct references (aka VCS style).
55
# TODO(#10655): differentiate between Pipfile vs. Pipfile.lock.
56
@rule(desc="Generate `python_requirement` targets from Pipfile.lock", level=LogLevel.DEBUG)
2✔
57
async def generate_from_pipenv_requirements(
2✔
58
    request: GenerateFromPipenvRequirementsRequest,
59
    union_membership: UnionMembership,
60
    python_setup: PythonSetup,
61
) -> GeneratedTargets:
UNCOV
62
    result = await _generate_requirements(
×
63
        request,
64
        union_membership,
65
        python_setup,
66
        parse_requirements_callback=parse_pipenv_requirements,
67
    )
UNCOV
68
    return GeneratedTargets(request.generator, result)
×
69

70

71
def parse_pipenv_requirements(
2✔
72
    file_contents: bytes, file_path: str = ""
73
) -> tuple[PipRequirement, ...]:
74
    lock_info = json.loads(file_contents)
1✔
75

76
    def _parse_pipenv_requirement(raw_req: str, info: dict) -> PipRequirement:
1✔
UNCOV
77
        if info.get("extras"):
×
UNCOV
78
            raw_req += f"[{','.join(info['extras'])}]"
×
UNCOV
79
        raw_req += info.get("version", "")
×
UNCOV
80
        if info.get("markers"):
×
UNCOV
81
            raw_req += f";{info['markers']}"
×
82

UNCOV
83
        return PipRequirement.parse(raw_req)
×
84

85
    return tuple(
1✔
86
        _parse_pipenv_requirement(req, info)
87
        for req, info in {**lock_info.get("default", {}), **lock_info.get("develop", {})}.items()
88
    )
89

90

91
def rules():
2✔
92
    return (
2✔
93
        *collect_rules(),
94
        UnionRule(GenerateTargetsRequest, GenerateFromPipenvRequirementsRequest),
95
    )
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2026 Coveralls, Inc