aws-lambda-builders 1.56.0__tar.gz → 1.58.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (106) hide show
  1. {aws_lambda_builders-1.56.0/aws_lambda_builders.egg-info → aws_lambda_builders-1.58.0}/PKG-INFO +2 -2
  2. {aws_lambda_builders-1.56.0 → aws_lambda_builders-1.58.0}/aws_lambda_builders/__init__.py +1 -1
  3. {aws_lambda_builders-1.56.0 → aws_lambda_builders-1.58.0}/aws_lambda_builders/builder.py +1 -1
  4. {aws_lambda_builders-1.56.0 → aws_lambda_builders-1.58.0}/aws_lambda_builders/workflow.py +1 -1
  5. {aws_lambda_builders-1.56.0 → aws_lambda_builders-1.58.0}/aws_lambda_builders/workflows/java_gradle/gradle.py +2 -2
  6. {aws_lambda_builders-1.56.0 → aws_lambda_builders-1.58.0}/aws_lambda_builders/workflows/java_gradle/resources/lambda-build-init.gradle +2 -1
  7. {aws_lambda_builders-1.56.0 → aws_lambda_builders-1.58.0}/aws_lambda_builders/workflows/python_pip/DESIGN.md +44 -0
  8. {aws_lambda_builders-1.56.0 → aws_lambda_builders-1.58.0}/aws_lambda_builders/workflows/python_pip/actions.py +49 -0
  9. {aws_lambda_builders-1.56.0 → aws_lambda_builders-1.58.0}/aws_lambda_builders/workflows/python_pip/workflow.py +29 -7
  10. {aws_lambda_builders-1.56.0 → aws_lambda_builders-1.58.0/aws_lambda_builders.egg-info}/PKG-INFO +2 -2
  11. {aws_lambda_builders-1.56.0 → aws_lambda_builders-1.58.0}/aws_lambda_builders.egg-info/requires.txt +1 -1
  12. {aws_lambda_builders-1.56.0 → aws_lambda_builders-1.58.0}/requirements/dev.txt +1 -1
  13. {aws_lambda_builders-1.56.0 → aws_lambda_builders-1.58.0}/LICENSE +0 -0
  14. {aws_lambda_builders-1.56.0 → aws_lambda_builders-1.58.0}/MANIFEST.in +0 -0
  15. {aws_lambda_builders-1.56.0 → aws_lambda_builders-1.58.0}/NOTICE +0 -0
  16. {aws_lambda_builders-1.56.0 → aws_lambda_builders-1.58.0}/README.md +0 -0
  17. {aws_lambda_builders-1.56.0 → aws_lambda_builders-1.58.0}/aws_lambda_builders/__main__.py +0 -0
  18. {aws_lambda_builders-1.56.0 → aws_lambda_builders-1.58.0}/aws_lambda_builders/actions.py +0 -0
  19. {aws_lambda_builders-1.56.0 → aws_lambda_builders-1.58.0}/aws_lambda_builders/architecture.py +0 -0
  20. {aws_lambda_builders-1.56.0 → aws_lambda_builders-1.58.0}/aws_lambda_builders/binary_path.py +0 -0
  21. {aws_lambda_builders-1.56.0 → aws_lambda_builders-1.58.0}/aws_lambda_builders/exceptions.py +0 -0
  22. {aws_lambda_builders-1.56.0 → aws_lambda_builders-1.58.0}/aws_lambda_builders/path_resolver.py +0 -0
  23. {aws_lambda_builders-1.56.0 → aws_lambda_builders-1.58.0}/aws_lambda_builders/registry.py +0 -0
  24. {aws_lambda_builders-1.56.0 → aws_lambda_builders-1.58.0}/aws_lambda_builders/utils.py +0 -0
  25. {aws_lambda_builders-1.56.0 → aws_lambda_builders-1.58.0}/aws_lambda_builders/validator.py +0 -0
  26. {aws_lambda_builders-1.56.0 → aws_lambda_builders-1.58.0}/aws_lambda_builders/workflows/__init__.py +0 -0
  27. {aws_lambda_builders-1.56.0 → aws_lambda_builders-1.58.0}/aws_lambda_builders/workflows/custom_make/DESIGN.md +0 -0
  28. {aws_lambda_builders-1.56.0 → aws_lambda_builders-1.58.0}/aws_lambda_builders/workflows/custom_make/__init__.py +0 -0
  29. {aws_lambda_builders-1.56.0 → aws_lambda_builders-1.58.0}/aws_lambda_builders/workflows/custom_make/actions.py +0 -0
  30. {aws_lambda_builders-1.56.0 → aws_lambda_builders-1.58.0}/aws_lambda_builders/workflows/custom_make/exceptions.py +0 -0
  31. {aws_lambda_builders-1.56.0 → aws_lambda_builders-1.58.0}/aws_lambda_builders/workflows/custom_make/make.py +0 -0
  32. {aws_lambda_builders-1.56.0 → aws_lambda_builders-1.58.0}/aws_lambda_builders/workflows/custom_make/utils.py +0 -0
  33. {aws_lambda_builders-1.56.0 → aws_lambda_builders-1.58.0}/aws_lambda_builders/workflows/custom_make/validator.py +0 -0
  34. {aws_lambda_builders-1.56.0 → aws_lambda_builders-1.58.0}/aws_lambda_builders/workflows/custom_make/workflow.py +0 -0
  35. {aws_lambda_builders-1.56.0 → aws_lambda_builders-1.58.0}/aws_lambda_builders/workflows/dotnet_clipackage/DESIGN.md +0 -0
  36. {aws_lambda_builders-1.56.0 → aws_lambda_builders-1.58.0}/aws_lambda_builders/workflows/dotnet_clipackage/__init__.py +0 -0
  37. {aws_lambda_builders-1.56.0 → aws_lambda_builders-1.58.0}/aws_lambda_builders/workflows/dotnet_clipackage/actions.py +0 -0
  38. {aws_lambda_builders-1.56.0 → aws_lambda_builders-1.58.0}/aws_lambda_builders/workflows/dotnet_clipackage/dotnetcli.py +0 -0
  39. {aws_lambda_builders-1.56.0 → aws_lambda_builders-1.58.0}/aws_lambda_builders/workflows/dotnet_clipackage/dotnetcli_resolver.py +0 -0
  40. {aws_lambda_builders-1.56.0 → aws_lambda_builders-1.58.0}/aws_lambda_builders/workflows/dotnet_clipackage/utils.py +0 -0
  41. {aws_lambda_builders-1.56.0 → aws_lambda_builders-1.58.0}/aws_lambda_builders/workflows/dotnet_clipackage/workflow.py +0 -0
  42. {aws_lambda_builders-1.56.0 → aws_lambda_builders-1.58.0}/aws_lambda_builders/workflows/go_modules/DESIGN.md +0 -0
  43. {aws_lambda_builders-1.56.0 → aws_lambda_builders-1.58.0}/aws_lambda_builders/workflows/go_modules/__init__.py +0 -0
  44. {aws_lambda_builders-1.56.0 → aws_lambda_builders-1.58.0}/aws_lambda_builders/workflows/go_modules/actions.py +0 -0
  45. {aws_lambda_builders-1.56.0 → aws_lambda_builders-1.58.0}/aws_lambda_builders/workflows/go_modules/builder.py +0 -0
  46. {aws_lambda_builders-1.56.0 → aws_lambda_builders-1.58.0}/aws_lambda_builders/workflows/go_modules/utils.py +0 -0
  47. {aws_lambda_builders-1.56.0 → aws_lambda_builders-1.58.0}/aws_lambda_builders/workflows/go_modules/validator.py +0 -0
  48. {aws_lambda_builders-1.56.0 → aws_lambda_builders-1.58.0}/aws_lambda_builders/workflows/go_modules/workflow.py +0 -0
  49. {aws_lambda_builders-1.56.0 → aws_lambda_builders-1.58.0}/aws_lambda_builders/workflows/java/__init__.py +0 -0
  50. {aws_lambda_builders-1.56.0 → aws_lambda_builders-1.58.0}/aws_lambda_builders/workflows/java/actions.py +0 -0
  51. {aws_lambda_builders-1.56.0 → aws_lambda_builders-1.58.0}/aws_lambda_builders/workflows/java/utils.py +0 -0
  52. {aws_lambda_builders-1.56.0 → aws_lambda_builders-1.58.0}/aws_lambda_builders/workflows/java_gradle/DESIGN.md +0 -0
  53. {aws_lambda_builders-1.56.0 → aws_lambda_builders-1.58.0}/aws_lambda_builders/workflows/java_gradle/__init__.py +0 -0
  54. {aws_lambda_builders-1.56.0 → aws_lambda_builders-1.58.0}/aws_lambda_builders/workflows/java_gradle/actions.py +0 -0
  55. {aws_lambda_builders-1.56.0 → aws_lambda_builders-1.58.0}/aws_lambda_builders/workflows/java_gradle/gradle_resolver.py +0 -0
  56. {aws_lambda_builders-1.56.0 → aws_lambda_builders-1.58.0}/aws_lambda_builders/workflows/java_gradle/gradle_validator.py +0 -0
  57. {aws_lambda_builders-1.56.0 → aws_lambda_builders-1.58.0}/aws_lambda_builders/workflows/java_gradle/workflow.py +0 -0
  58. {aws_lambda_builders-1.56.0 → aws_lambda_builders-1.58.0}/aws_lambda_builders/workflows/java_maven/DESIGN.md +0 -0
  59. {aws_lambda_builders-1.56.0 → aws_lambda_builders-1.58.0}/aws_lambda_builders/workflows/java_maven/__init__.py +0 -0
  60. {aws_lambda_builders-1.56.0 → aws_lambda_builders-1.58.0}/aws_lambda_builders/workflows/java_maven/actions.py +0 -0
  61. {aws_lambda_builders-1.56.0 → aws_lambda_builders-1.58.0}/aws_lambda_builders/workflows/java_maven/maven.py +0 -0
  62. {aws_lambda_builders-1.56.0 → aws_lambda_builders-1.58.0}/aws_lambda_builders/workflows/java_maven/maven_resolver.py +0 -0
  63. {aws_lambda_builders-1.56.0 → aws_lambda_builders-1.58.0}/aws_lambda_builders/workflows/java_maven/maven_validator.py +0 -0
  64. {aws_lambda_builders-1.56.0 → aws_lambda_builders-1.58.0}/aws_lambda_builders/workflows/java_maven/workflow.py +0 -0
  65. {aws_lambda_builders-1.56.0 → aws_lambda_builders-1.58.0}/aws_lambda_builders/workflows/nodejs_npm/DESIGN.md +0 -0
  66. {aws_lambda_builders-1.56.0 → aws_lambda_builders-1.58.0}/aws_lambda_builders/workflows/nodejs_npm/__init__.py +0 -0
  67. {aws_lambda_builders-1.56.0 → aws_lambda_builders-1.58.0}/aws_lambda_builders/workflows/nodejs_npm/actions.py +0 -0
  68. {aws_lambda_builders-1.56.0 → aws_lambda_builders-1.58.0}/aws_lambda_builders/workflows/nodejs_npm/exceptions.py +0 -0
  69. {aws_lambda_builders-1.56.0 → aws_lambda_builders-1.58.0}/aws_lambda_builders/workflows/nodejs_npm/npm.py +0 -0
  70. {aws_lambda_builders-1.56.0 → aws_lambda_builders-1.58.0}/aws_lambda_builders/workflows/nodejs_npm/utils.py +0 -0
  71. {aws_lambda_builders-1.56.0 → aws_lambda_builders-1.58.0}/aws_lambda_builders/workflows/nodejs_npm/workflow.py +0 -0
  72. {aws_lambda_builders-1.56.0 → aws_lambda_builders-1.58.0}/aws_lambda_builders/workflows/nodejs_npm_esbuild/DESIGN.md +0 -0
  73. {aws_lambda_builders-1.56.0 → aws_lambda_builders-1.58.0}/aws_lambda_builders/workflows/nodejs_npm_esbuild/__init__.py +0 -0
  74. {aws_lambda_builders-1.56.0 → aws_lambda_builders-1.58.0}/aws_lambda_builders/workflows/nodejs_npm_esbuild/actions.py +0 -0
  75. {aws_lambda_builders-1.56.0 → aws_lambda_builders-1.58.0}/aws_lambda_builders/workflows/nodejs_npm_esbuild/esbuild.py +0 -0
  76. {aws_lambda_builders-1.56.0 → aws_lambda_builders-1.58.0}/aws_lambda_builders/workflows/nodejs_npm_esbuild/exceptions.py +0 -0
  77. {aws_lambda_builders-1.56.0 → aws_lambda_builders-1.58.0}/aws_lambda_builders/workflows/nodejs_npm_esbuild/workflow.py +0 -0
  78. {aws_lambda_builders-1.56.0 → aws_lambda_builders-1.58.0}/aws_lambda_builders/workflows/python_pip/__init__.py +0 -0
  79. {aws_lambda_builders-1.56.0 → aws_lambda_builders-1.58.0}/aws_lambda_builders/workflows/python_pip/compat.py +0 -0
  80. {aws_lambda_builders-1.56.0 → aws_lambda_builders-1.58.0}/aws_lambda_builders/workflows/python_pip/exceptions.py +0 -0
  81. {aws_lambda_builders-1.56.0 → aws_lambda_builders-1.58.0}/aws_lambda_builders/workflows/python_pip/packager.py +0 -0
  82. {aws_lambda_builders-1.56.0 → aws_lambda_builders-1.58.0}/aws_lambda_builders/workflows/python_pip/utils.py +0 -0
  83. {aws_lambda_builders-1.56.0 → aws_lambda_builders-1.58.0}/aws_lambda_builders/workflows/python_pip/validator.py +0 -0
  84. {aws_lambda_builders-1.56.0 → aws_lambda_builders-1.58.0}/aws_lambda_builders/workflows/ruby_bundler/DESIGN.md +0 -0
  85. {aws_lambda_builders-1.56.0 → aws_lambda_builders-1.58.0}/aws_lambda_builders/workflows/ruby_bundler/__init__.py +0 -0
  86. {aws_lambda_builders-1.56.0 → aws_lambda_builders-1.58.0}/aws_lambda_builders/workflows/ruby_bundler/actions.py +0 -0
  87. {aws_lambda_builders-1.56.0 → aws_lambda_builders-1.58.0}/aws_lambda_builders/workflows/ruby_bundler/bundler.py +0 -0
  88. {aws_lambda_builders-1.56.0 → aws_lambda_builders-1.58.0}/aws_lambda_builders/workflows/ruby_bundler/utils.py +0 -0
  89. {aws_lambda_builders-1.56.0 → aws_lambda_builders-1.58.0}/aws_lambda_builders/workflows/ruby_bundler/workflow.py +0 -0
  90. {aws_lambda_builders-1.56.0 → aws_lambda_builders-1.58.0}/aws_lambda_builders/workflows/rust_cargo/DESIGN.md +0 -0
  91. {aws_lambda_builders-1.56.0 → aws_lambda_builders-1.58.0}/aws_lambda_builders/workflows/rust_cargo/__init__.py +0 -0
  92. {aws_lambda_builders-1.56.0 → aws_lambda_builders-1.58.0}/aws_lambda_builders/workflows/rust_cargo/actions.py +0 -0
  93. {aws_lambda_builders-1.56.0 → aws_lambda_builders-1.58.0}/aws_lambda_builders/workflows/rust_cargo/cargo_lambda.py +0 -0
  94. {aws_lambda_builders-1.56.0 → aws_lambda_builders-1.58.0}/aws_lambda_builders/workflows/rust_cargo/exceptions.py +0 -0
  95. {aws_lambda_builders-1.56.0 → aws_lambda_builders-1.58.0}/aws_lambda_builders/workflows/rust_cargo/feature_flag.py +0 -0
  96. {aws_lambda_builders-1.56.0 → aws_lambda_builders-1.58.0}/aws_lambda_builders/workflows/rust_cargo/utils.py +0 -0
  97. {aws_lambda_builders-1.56.0 → aws_lambda_builders-1.58.0}/aws_lambda_builders/workflows/rust_cargo/workflow.py +0 -0
  98. {aws_lambda_builders-1.56.0 → aws_lambda_builders-1.58.0}/aws_lambda_builders.egg-info/SOURCES.txt +0 -0
  99. {aws_lambda_builders-1.56.0 → aws_lambda_builders-1.58.0}/aws_lambda_builders.egg-info/dependency_links.txt +0 -0
  100. {aws_lambda_builders-1.56.0 → aws_lambda_builders-1.58.0}/aws_lambda_builders.egg-info/entry_points.txt +0 -0
  101. {aws_lambda_builders-1.56.0 → aws_lambda_builders-1.58.0}/aws_lambda_builders.egg-info/top_level.txt +0 -0
  102. {aws_lambda_builders-1.56.0 → aws_lambda_builders-1.58.0}/pyproject.toml +0 -0
  103. {aws_lambda_builders-1.56.0 → aws_lambda_builders-1.58.0}/requirements/base.txt +0 -0
  104. {aws_lambda_builders-1.56.0 → aws_lambda_builders-1.58.0}/requirements/python_pip.txt +0 -0
  105. {aws_lambda_builders-1.56.0 → aws_lambda_builders-1.58.0}/setup.cfg +0 -0
  106. {aws_lambda_builders-1.56.0 → aws_lambda_builders-1.58.0}/setup.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: aws_lambda_builders
3
- Version: 1.56.0
3
+ Version: 1.58.0
4
4
  Summary: Python library to compile, build & package AWS Lambda functions for several runtimes & frameworks.
5
5
  Home-page: https://github.com/awslabs/aws-lambda-builders
6
6
  Author: Amazon Web Services
@@ -33,7 +33,7 @@ Provides-Extra: dev
33
33
  Requires-Dist: coverage==7.9.2; python_version >= "3.9" and extra == "dev"
34
34
  Requires-Dist: coverage==7.6.1; python_version < "3.9" and extra == "dev"
35
35
  Requires-Dist: flake8==3.8.4; extra == "dev"
36
- Requires-Dist: pytest-cov==6.1.1; python_version >= "3.9" and extra == "dev"
36
+ Requires-Dist: pytest-cov==6.2.1; python_version >= "3.9" and extra == "dev"
37
37
  Requires-Dist: pytest-cov==5.0.0; python_version < "3.9" and extra == "dev"
38
38
  Requires-Dist: pytest>=6.1.1; extra == "dev"
39
39
  Requires-Dist: parameterized==0.9.0; extra == "dev"
@@ -5,5 +5,5 @@ AWS Lambda Builder Library
5
5
  # Changing version will trigger a new release!
6
6
  # Please make the version change as the last step of your development.
7
7
 
8
- __version__ = "1.56.0"
8
+ __version__ = "1.58.0"
9
9
  RPC_PROTOCOL_VERSION = "0.3"
@@ -105,7 +105,7 @@ class LambdaBuilder(object):
105
105
 
106
106
  :type options: dict
107
107
  :param options:
108
- Optional dictionary of options ot pass to build action. **Not supported**.
108
+ Optional dictionary of options to pass to build action.
109
109
 
110
110
  :type executable_search_paths: list
111
111
  :param executable_search_paths:
@@ -227,7 +227,7 @@ class BaseWorkflow(object, metaclass=_WorkflowMetaClass):
227
227
  optimizations : dict, optional
228
228
  dictionary of optimization flags to pass to the build action. **Not supported**, by default None
229
229
  options : dict, optional
230
- dictionary of options ot pass to build action. **Not supported**., by default None
230
+ dictionary of options to pass to build action. By default None
231
231
  mode : str, optional
232
232
  Mode the build should produce, by default BuildMode.RELEASE
233
233
  download_dependencies: bool, optional
@@ -30,10 +30,10 @@ class SubprocessGradle(object):
30
30
  self.os_utils = os_utils
31
31
 
32
32
  def build(self, source_dir, build_file, cache_dir=None, init_script_path=None, properties=None):
33
+ ## Note: build_file parameter is not supported anymore, but kept for backward compatibility
33
34
  if not self.os_utils.exists(build_file):
34
35
  raise BuildFileNotFoundError(build_file)
35
-
36
- args = ["build", "--build-file", build_file]
36
+ args = ["build"]
37
37
  if cache_dir is not None:
38
38
  args.extend(["--project-cache-dir", cache_dir])
39
39
  if properties is not None:
@@ -54,7 +54,8 @@ def assertExpectedBuildDir(p) {
54
54
  }
55
55
 
56
56
  def createArtifactDir(project) {
57
- def distsDir = project.buildDir.toPath().resolve(project.distsDirName).resolve('lambda-build')
57
+ // In Gradle 9, distsDirName was removed. Use 'distributions' as the default directory name
58
+ def distsDir = project.buildDir.toPath().resolve('distributions').resolve('lambda-build')
58
59
  return makeDirs(distsDir)
59
60
  }
60
61
 
@@ -147,3 +147,47 @@ bundle has an `__init__.py` and is on the `PYTHONPATH`.
147
147
  The dependencies should now be succesfully installed in the target directory.
148
148
  All the temporary/intermediate files can now be deleting including all the
149
149
  wheel files and sdists.
150
+
151
+ ### Configuring the builder
152
+
153
+ The Lambda builder supports the following optional sub-properties of the `aws_sam` configuration property.
154
+
155
+ #### `parent_python_packages`
156
+
157
+ `parent_python_packages` must be a string, corresponding to a dot-separated list of parent packages to create in the destination directory. This is useful when the source code has a package structure that needs to be preserved in the built artifacts.
158
+
159
+ For example, if your source code is structured like this:
160
+
161
+ ```
162
+ ├── app
163
+ | ├── main.py
164
+ | └── utils
165
+ | └── logger.py
166
+ └── tests
167
+ └── unit/test_handler.py
168
+ ```
169
+
170
+ Then the SAM build output will look like this:
171
+
172
+ ```
173
+ └── .aws-sam
174
+ └── build
175
+ └── AppLogicalId
176
+ ├── main.py
177
+ └── utils
178
+ └── logger.py
179
+ ```
180
+
181
+ The tests would break because `main.py` is importing `logger` as `from .utils import logger`, but the built artifacts would not have the `app` package.
182
+
183
+ To fix this, you can set the `parent_python_packages` property to `app` and the SAM build output will look like this:
184
+
185
+ ```
186
+ └── .aws-sam
187
+ └── build
188
+ └── AppLogicalId
189
+ └── app
190
+ ├── main.py
191
+ └── utils
192
+ └── logger.py
193
+ ```
@@ -3,6 +3,7 @@ Action to resolve Python dependencies using PIP
3
3
  """
4
4
 
5
5
  import logging
6
+ from pathlib import Path
6
7
  from typing import Optional, Tuple
7
8
 
8
9
  from aws_lambda_builders.actions import ActionFailedError, BaseAction, Purpose
@@ -21,6 +22,8 @@ from aws_lambda_builders.workflows.python_pip.utils import OSUtils
21
22
 
22
23
  LOG = logging.getLogger(__name__)
23
24
 
25
+ PARENT_PYTHON_PKGS_KEY = "parent_python_packages"
26
+
24
27
 
25
28
  class PythonPipBuildAction(BaseAction):
26
29
  NAME = "ResolveDependencies"
@@ -115,3 +118,49 @@ class PythonPipBuildAction(BaseAction):
115
118
  LOG.debug(f"Python runtime path '{python_path}' does not contain pip")
116
119
 
117
120
  raise ActionFailedError("Failed to find a Python runtime containing pip on the PATH.")
121
+
122
+
123
+ class PythonCreateParentPackagesAction(BaseAction):
124
+ NAME = "CreateParentPackages"
125
+ DESCRIPTION = "Creating parent Python packages"
126
+ PURPOSE = Purpose.COPY_SOURCE
127
+ LANGUAGE = "python"
128
+
129
+ def __init__(self, source_dir, dest_dir, options=None):
130
+ self.source_dir = source_dir
131
+ self.dest_dir = dest_dir
132
+ self.options = options or {}
133
+
134
+ def execute(self):
135
+ pkg_parts = self._get_parent_python_packages()
136
+ if not pkg_parts:
137
+ return
138
+
139
+ source_path = Path(self.source_dir)
140
+ dest_path = Path(self.dest_dir)
141
+
142
+ target_pkg_path = dest_path.joinpath(*pkg_parts)
143
+ try:
144
+ target_pkg_path.mkdir(parents=True, exist_ok=False)
145
+ except FileExistsError:
146
+ LOG.warning("Skipping creating package %s as it would overwrite existing folder", target_pkg_path)
147
+ return
148
+
149
+ for item in source_path.glob(pattern="*"):
150
+ if (dest_path / item.name).exists():
151
+ (dest_path / item.name).rename(target_pkg_path / item.name)
152
+ else:
153
+ LOG.debug(f"{item} does not exist in the build path, skipping.")
154
+
155
+ def _get_parent_python_packages(self) -> Optional[list]:
156
+ """
157
+ Returns the parent Python packages to be created.
158
+ """
159
+ if not isinstance(self.options, dict):
160
+ return None
161
+
162
+ parent_python_pkgs = self.options.get(PARENT_PYTHON_PKGS_KEY)
163
+ if isinstance(parent_python_pkgs, str) and len(parent_python_pkgs) > 0:
164
+ return parent_python_pkgs.split(".")
165
+
166
+ return None
@@ -9,7 +9,7 @@ from aws_lambda_builders.path_resolver import PathResolver
9
9
  from aws_lambda_builders.workflow import BaseWorkflow, BuildDirectory, BuildInSourceSupport, Capability
10
10
  from aws_lambda_builders.workflows.python_pip.validator import PythonRuntimeValidator
11
11
 
12
- from .actions import PythonPipBuildAction
12
+ from .actions import PARENT_PYTHON_PKGS_KEY, PythonCreateParentPackagesAction, PythonPipBuildAction
13
13
  from .utils import OSUtils, is_experimental_build_improvements_enabled
14
14
 
15
15
  LOG = logging.getLogger(__name__)
@@ -87,15 +87,15 @@ class PythonPipWorkflow(BaseWorkflow):
87
87
  self.actions = []
88
88
  if not osutils.file_exists(manifest_path):
89
89
  LOG.warning("requirements.txt file not found. Continuing the build without dependencies.")
90
- self.actions.append(CopySourceAction(source_dir, artifacts_dir, excludes=self.EXCLUDED_FILES))
90
+ self._actions.append(CopySourceAction(source_dir, artifacts_dir, excludes=self.EXCLUDED_FILES))
91
91
  return
92
92
 
93
93
  # If a requirements.txt exists, run pip builder before copy action.
94
94
  if self.download_dependencies:
95
95
  if self.dependencies_dir:
96
96
  # clean up the dependencies folder before installing
97
- self.actions.append(CleanUpAction(self.dependencies_dir))
98
- self.actions.append(
97
+ self._actions.append(CleanUpAction(self.dependencies_dir))
98
+ self._actions.append(
99
99
  PythonPipBuildAction(
100
100
  artifacts_dir,
101
101
  scratch_dir,
@@ -113,11 +113,25 @@ class PythonPipWorkflow(BaseWorkflow):
113
113
  # when copying downloaded dependencies back to artifacts folder, don't exclude anything
114
114
  # symlinking python dependencies is disabled for now since it is breaking sam local commands
115
115
  if False and is_experimental_build_improvements_enabled(self.experimental_flags):
116
- self.actions.append(LinkSourceAction(self.dependencies_dir, artifacts_dir))
116
+ self._actions.append(LinkSourceAction(self.dependencies_dir, artifacts_dir))
117
117
  else:
118
- self.actions.append(CopySourceAction(self.dependencies_dir, artifacts_dir))
118
+ self._actions.append(CopySourceAction(self.dependencies_dir, artifacts_dir))
119
119
 
120
- self.actions.append(CopySourceAction(source_dir, artifacts_dir, excludes=self.EXCLUDED_FILES))
120
+ self._actions.append(CopySourceAction(source_dir, artifacts_dir, excludes=self.EXCLUDED_FILES))
121
+
122
+ @property
123
+ def actions(self):
124
+ """
125
+ Returns the list of actions to be executed in this workflow.
126
+ If required, creating the parent package(s) must be executed last.
127
+ """
128
+ if self._should_create_parent_packages():
129
+ return self._actions + [PythonCreateParentPackagesAction(self.source_dir, self.artifacts_dir, self.options)]
130
+ return self._actions
131
+
132
+ @actions.setter
133
+ def actions(self, value):
134
+ self._actions = value
121
135
 
122
136
  def get_resolvers(self):
123
137
  """
@@ -138,5 +152,13 @@ class PythonPipWorkflow(BaseWorkflow):
138
152
  major, _ = self.runtime.replace(self.CAPABILITY.language, "").split(".")
139
153
  return [f"{self.CAPABILITY.language}{major}"] if major == self.PYTHON_VERSION_THREE else None
140
154
 
155
+ def _should_create_parent_packages(self):
156
+ """
157
+ Determines if the parent package(s) should be created based on the options provided.
158
+ """
159
+ if isinstance(self.options, dict):
160
+ return PARENT_PYTHON_PKGS_KEY in self.options
161
+ return False
162
+
141
163
  def get_validators(self):
142
164
  return [PythonRuntimeValidator(runtime=self.runtime, architecture=self.architecture)]
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: aws_lambda_builders
3
- Version: 1.56.0
3
+ Version: 1.58.0
4
4
  Summary: Python library to compile, build & package AWS Lambda functions for several runtimes & frameworks.
5
5
  Home-page: https://github.com/awslabs/aws-lambda-builders
6
6
  Author: Amazon Web Services
@@ -33,7 +33,7 @@ Provides-Extra: dev
33
33
  Requires-Dist: coverage==7.9.2; python_version >= "3.9" and extra == "dev"
34
34
  Requires-Dist: coverage==7.6.1; python_version < "3.9" and extra == "dev"
35
35
  Requires-Dist: flake8==3.8.4; extra == "dev"
36
- Requires-Dist: pytest-cov==6.1.1; python_version >= "3.9" and extra == "dev"
36
+ Requires-Dist: pytest-cov==6.2.1; python_version >= "3.9" and extra == "dev"
37
37
  Requires-Dist: pytest-cov==5.0.0; python_version < "3.9" and extra == "dev"
38
38
  Requires-Dist: pytest>=6.1.1; extra == "dev"
39
39
  Requires-Dist: parameterized==0.9.0; extra == "dev"
@@ -15,5 +15,5 @@ black==24.8.0
15
15
 
16
16
  [dev:python_version >= "3.9"]
17
17
  coverage==7.9.2
18
- pytest-cov==6.1.1
18
+ pytest-cov==6.2.1
19
19
  black==25.1.0
@@ -1,7 +1,7 @@
1
1
  coverage==7.9.2; python_version>="3.9"
2
2
  coverage==7.6.1; python_version<"3.9"
3
3
  flake8==3.8.4
4
- pytest-cov==6.1.1; python_version>="3.9"
4
+ pytest-cov==6.2.1; python_version>="3.9"
5
5
  pytest-cov==5.0.0; python_version<"3.9"
6
6
 
7
7
  # Test requirements