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

pantsbuild / pants / 22740642519

05 Mar 2026 11:00PM UTC coverage: 52.677% (-40.3%) from 92.931%
22740642519

Pull #23157

github

web-flow
Merge 2aa18e6d4 into f0030f5e7
Pull Request #23157: [pants ng] Partition source files by config.

31678 of 60136 relevant lines covered (52.68%)

0.53 hits per line

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

0.0
/src/python/pants/backend/awslambda/python/rules.py
1
# Copyright 2019 Pants project contributors (see CONTRIBUTORS.md).
2
# Licensed under the Apache License, Version 2.0 (see LICENSE).
3

4
from __future__ import annotations
×
5

6
import logging
×
7
from dataclasses import dataclass
×
8

9
from pants.backend.awslambda.python.target_types import (
×
10
    AWSLambdaArchitectureField,
11
    PythonAWSLambda,
12
    PythonAwsLambdaHandlerField,
13
    PythonAwsLambdaIncludeRequirements,
14
    PythonAwsLambdaIncludeSources,
15
    PythonAWSLambdaLayer,
16
    PythonAwsLambdaLayerDependenciesField,
17
    PythonAwsLambdaRuntime,
18
)
19
from pants.backend.python.util_rules.faas import (
×
20
    BuildPythonFaaSRequest,
21
    FaaSArchitecture,
22
    PythonFaaSCompletePlatforms,
23
    PythonFaaSLayoutField,
24
    PythonFaaSPex3VenvCreateExtraArgsField,
25
    PythonFaaSPexBuildExtraArgs,
26
    build_python_faas,
27
)
28
from pants.backend.python.util_rules.faas import rules as faas_rules
×
29
from pants.core.environments.target_types import EnvironmentField
×
30
from pants.core.goals.package import BuiltPackage, OutputPathField, PackageFieldSet
×
31
from pants.engine.rules import collect_rules, rule
×
32
from pants.engine.unions import UnionRule
×
33
from pants.util.logging import LogLevel
×
34

35
logger = logging.getLogger(__name__)
×
36

37

38
@dataclass(frozen=True)
×
39
class _BaseFieldSet(PackageFieldSet):
×
40
    include_requirements: PythonAwsLambdaIncludeRequirements
×
41
    runtime: PythonAwsLambdaRuntime
×
42
    architecture: AWSLambdaArchitectureField
×
43
    complete_platforms: PythonFaaSCompletePlatforms
×
44
    pex3_venv_create_extra_args: PythonFaaSPex3VenvCreateExtraArgsField
×
45
    pex_build_extra_args: PythonFaaSPexBuildExtraArgs
×
46
    layout: PythonFaaSLayoutField
×
47
    output_path: OutputPathField
×
48
    environment: EnvironmentField
×
49

50

51
@dataclass(frozen=True)
×
52
class PythonAwsLambdaFieldSet(_BaseFieldSet):
×
53
    required_fields = (PythonAwsLambdaHandlerField,)
×
54

55
    handler: PythonAwsLambdaHandlerField
×
56

57

58
@dataclass(frozen=True)
×
59
class PythonAwsLambdaLayerFieldSet(_BaseFieldSet):
×
60
    required_fields = (PythonAwsLambdaLayerDependenciesField,)
×
61

62
    dependencies: PythonAwsLambdaLayerDependenciesField
×
63
    include_sources: PythonAwsLambdaIncludeSources
×
64

65

66
@rule(desc="Create Python AWS Lambda Function", level=LogLevel.DEBUG)
×
67
async def package_python_aws_lambda_function(
×
68
    field_set: PythonAwsLambdaFieldSet,
69
) -> BuiltPackage:
70
    assert field_set.architecture.value is not None  # Has default, never None
×
71
    return await build_python_faas(
×
72
        BuildPythonFaaSRequest(
73
            address=field_set.address,
74
            target_name=PythonAWSLambda.alias,
75
            complete_platforms=field_set.complete_platforms,
76
            runtime=field_set.runtime,
77
            architecture=FaaSArchitecture(field_set.architecture.value),
78
            handler=field_set.handler,
79
            output_path=field_set.output_path,
80
            include_requirements=field_set.include_requirements.value,
81
            include_sources=True,
82
            pex3_venv_create_extra_args=field_set.pex3_venv_create_extra_args,
83
            pex_build_extra_args=field_set.pex_build_extra_args,
84
            layout=field_set.layout,
85
            reexported_handler_module=PythonAwsLambdaHandlerField.reexported_handler_module,
86
        )
87
    )
88

89

90
@rule(desc="Create Python AWS Lambda Layer", level=LogLevel.DEBUG)
×
91
async def package_python_aws_lambda_layer(
×
92
    field_set: PythonAwsLambdaLayerFieldSet,
93
) -> BuiltPackage:
94
    assert field_set.architecture.value is not None  # Has default, never None
×
95
    return await build_python_faas(
×
96
        BuildPythonFaaSRequest(
97
            address=field_set.address,
98
            target_name=PythonAWSLambdaLayer.alias,
99
            complete_platforms=field_set.complete_platforms,
100
            runtime=field_set.runtime,
101
            architecture=FaaSArchitecture(field_set.architecture.value),
102
            output_path=field_set.output_path,
103
            include_requirements=field_set.include_requirements.value,
104
            include_sources=field_set.include_sources.value,
105
            pex3_venv_create_extra_args=field_set.pex3_venv_create_extra_args,
106
            pex_build_extra_args=field_set.pex_build_extra_args,
107
            layout=field_set.layout,
108
            # See
109
            # https://docs.aws.amazon.com/lambda/latest/dg/configuration-layers.html#configuration-layers-path
110
            #
111
            # Runtime | Path
112
            # ...
113
            # Python  | `python`
114
            #         | `python/lib/python3.10/site-packages`
115
            # ...
116
            #
117
            # The one independent on the runtime-version is more convenient:
118
            prefix_in_artifact="python",
119
            # a layer doesn't have a handler, just pulls in things via `dependencies`
120
            handler=None,
121
            reexported_handler_module=None,
122
        )
123
    )
124

125

126
def rules():
×
127
    return [
×
128
        *collect_rules(),
129
        UnionRule(PackageFieldSet, PythonAwsLambdaFieldSet),
130
        UnionRule(PackageFieldSet, PythonAwsLambdaLayerFieldSet),
131
        *faas_rules(),
132
    ]
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