aws-lambda-builders 1.26.0__tar.gz → 1.28.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.26.0 → aws_lambda_builders-1.28.0}/PKG-INFO +3 -1
  2. {aws_lambda_builders-1.26.0 → aws_lambda_builders-1.28.0}/README.md +1 -0
  3. {aws_lambda_builders-1.26.0 → aws_lambda_builders-1.28.0}/aws_lambda_builders/__init__.py +1 -1
  4. {aws_lambda_builders-1.26.0 → aws_lambda_builders-1.28.0}/aws_lambda_builders/__main__.py +4 -5
  5. {aws_lambda_builders-1.26.0 → aws_lambda_builders-1.28.0}/aws_lambda_builders/actions.py +40 -13
  6. {aws_lambda_builders-1.26.0 → aws_lambda_builders-1.28.0}/aws_lambda_builders/builder.py +2 -3
  7. {aws_lambda_builders-1.26.0 → aws_lambda_builders-1.28.0}/aws_lambda_builders/exceptions.py +0 -1
  8. {aws_lambda_builders-1.26.0 → aws_lambda_builders-1.28.0}/aws_lambda_builders/registry.py +0 -1
  9. {aws_lambda_builders-1.26.0 → aws_lambda_builders-1.28.0}/aws_lambda_builders/utils.py +31 -22
  10. {aws_lambda_builders-1.26.0 → aws_lambda_builders-1.28.0}/aws_lambda_builders/validator.py +2 -2
  11. {aws_lambda_builders-1.26.0 → aws_lambda_builders-1.28.0}/aws_lambda_builders/workflow.py +8 -12
  12. {aws_lambda_builders-1.26.0 → aws_lambda_builders-1.28.0}/aws_lambda_builders/workflows/__init__.py +6 -5
  13. {aws_lambda_builders-1.26.0 → aws_lambda_builders-1.28.0}/aws_lambda_builders/workflows/custom_make/actions.py +2 -1
  14. {aws_lambda_builders-1.26.0 → aws_lambda_builders-1.28.0}/aws_lambda_builders/workflows/custom_make/make.py +0 -1
  15. {aws_lambda_builders-1.26.0 → aws_lambda_builders-1.28.0}/aws_lambda_builders/workflows/custom_make/workflow.py +5 -5
  16. {aws_lambda_builders-1.26.0 → aws_lambda_builders-1.28.0}/aws_lambda_builders/workflows/dotnet_clipackage/actions.py +6 -5
  17. {aws_lambda_builders-1.26.0 → aws_lambda_builders-1.28.0}/aws_lambda_builders/workflows/dotnet_clipackage/dotnetcli_resolver.py +0 -1
  18. {aws_lambda_builders-1.26.0 → aws_lambda_builders-1.28.0}/aws_lambda_builders/workflows/dotnet_clipackage/workflow.py +1 -2
  19. {aws_lambda_builders-1.26.0 → aws_lambda_builders-1.28.0}/aws_lambda_builders/workflows/go_modules/actions.py +2 -2
  20. {aws_lambda_builders-1.26.0 → aws_lambda_builders-1.28.0}/aws_lambda_builders/workflows/go_modules/builder.py +1 -2
  21. {aws_lambda_builders-1.26.0 → aws_lambda_builders-1.28.0}/aws_lambda_builders/workflows/go_modules/workflow.py +2 -4
  22. {aws_lambda_builders-1.26.0 → aws_lambda_builders-1.28.0}/aws_lambda_builders/workflows/java/actions.py +1 -0
  23. {aws_lambda_builders-1.26.0 → aws_lambda_builders-1.28.0}/aws_lambda_builders/workflows/java/utils.py +2 -1
  24. {aws_lambda_builders-1.26.0 → aws_lambda_builders-1.28.0}/aws_lambda_builders/workflows/java_gradle/actions.py +3 -1
  25. {aws_lambda_builders-1.26.0 → aws_lambda_builders-1.28.0}/aws_lambda_builders/workflows/java_gradle/gradle_validator.py +1 -2
  26. {aws_lambda_builders-1.26.0 → aws_lambda_builders-1.28.0}/aws_lambda_builders/workflows/java_gradle/workflow.py +2 -1
  27. {aws_lambda_builders-1.26.0 → aws_lambda_builders-1.28.0}/aws_lambda_builders/workflows/java_maven/actions.py +3 -2
  28. {aws_lambda_builders-1.26.0 → aws_lambda_builders-1.28.0}/aws_lambda_builders/workflows/java_maven/workflow.py +3 -3
  29. {aws_lambda_builders-1.26.0 → aws_lambda_builders-1.28.0}/aws_lambda_builders/workflows/nodejs_npm/actions.py +34 -21
  30. {aws_lambda_builders-1.26.0 → aws_lambda_builders-1.28.0}/aws_lambda_builders/workflows/nodejs_npm/npm.py +0 -1
  31. aws_lambda_builders-1.28.0/aws_lambda_builders/workflows/nodejs_npm/workflow.py +213 -0
  32. {aws_lambda_builders-1.26.0 → aws_lambda_builders-1.28.0}/aws_lambda_builders/workflows/nodejs_npm_esbuild/actions.py +1 -1
  33. {aws_lambda_builders-1.26.0 → aws_lambda_builders-1.28.0}/aws_lambda_builders/workflows/nodejs_npm_esbuild/esbuild.py +3 -4
  34. {aws_lambda_builders-1.26.0 → aws_lambda_builders-1.28.0}/aws_lambda_builders/workflows/nodejs_npm_esbuild/workflow.py +10 -9
  35. {aws_lambda_builders-1.26.0 → aws_lambda_builders-1.28.0}/aws_lambda_builders/workflows/python_pip/DESIGN.md +1 -1
  36. {aws_lambda_builders-1.26.0 → aws_lambda_builders-1.28.0}/aws_lambda_builders/workflows/python_pip/actions.py +3 -3
  37. {aws_lambda_builders-1.26.0 → aws_lambda_builders-1.28.0}/aws_lambda_builders/workflows/python_pip/compat.py +0 -1
  38. {aws_lambda_builders-1.26.0 → aws_lambda_builders-1.28.0}/aws_lambda_builders/workflows/python_pip/packager.py +11 -12
  39. {aws_lambda_builders-1.26.0 → aws_lambda_builders-1.28.0}/aws_lambda_builders/workflows/python_pip/utils.py +4 -4
  40. {aws_lambda_builders-1.26.0 → aws_lambda_builders-1.28.0}/aws_lambda_builders/workflows/python_pip/validator.py +2 -1
  41. {aws_lambda_builders-1.26.0 → aws_lambda_builders-1.28.0}/aws_lambda_builders/workflows/python_pip/workflow.py +2 -4
  42. {aws_lambda_builders-1.26.0 → aws_lambda_builders-1.28.0}/aws_lambda_builders/workflows/ruby_bundler/actions.py +2 -1
  43. {aws_lambda_builders-1.26.0 → aws_lambda_builders-1.28.0}/aws_lambda_builders/workflows/ruby_bundler/workflow.py +10 -11
  44. aws_lambda_builders-1.28.0/aws_lambda_builders/workflows/rust_cargo/DESIGN.md +28 -0
  45. aws_lambda_builders-1.28.0/aws_lambda_builders/workflows/rust_cargo/__init__.py +5 -0
  46. aws_lambda_builders-1.28.0/aws_lambda_builders/workflows/rust_cargo/actions.py +146 -0
  47. aws_lambda_builders-1.28.0/aws_lambda_builders/workflows/rust_cargo/cargo_lambda.py +130 -0
  48. aws_lambda_builders-1.28.0/aws_lambda_builders/workflows/rust_cargo/exceptions.py +14 -0
  49. aws_lambda_builders-1.28.0/aws_lambda_builders/workflows/rust_cargo/feature_flag.py +12 -0
  50. aws_lambda_builders-1.28.0/aws_lambda_builders/workflows/rust_cargo/utils.py +20 -0
  51. aws_lambda_builders-1.28.0/aws_lambda_builders/workflows/rust_cargo/workflow.py +60 -0
  52. {aws_lambda_builders-1.26.0 → aws_lambda_builders-1.28.0}/aws_lambda_builders.egg-info/PKG-INFO +3 -1
  53. {aws_lambda_builders-1.26.0 → aws_lambda_builders-1.28.0}/aws_lambda_builders.egg-info/SOURCES.txt +8 -0
  54. {aws_lambda_builders-1.26.0 → aws_lambda_builders-1.28.0}/aws_lambda_builders.egg-info/requires.txt +6 -7
  55. {aws_lambda_builders-1.26.0 → aws_lambda_builders-1.28.0}/pyproject.toml +4 -0
  56. {aws_lambda_builders-1.26.0 → aws_lambda_builders-1.28.0}/requirements/dev.txt +6 -7
  57. {aws_lambda_builders-1.26.0 → aws_lambda_builders-1.28.0}/setup.py +1 -0
  58. aws_lambda_builders-1.26.0/aws_lambda_builders/workflows/nodejs_npm/workflow.py +0 -186
  59. {aws_lambda_builders-1.26.0 → aws_lambda_builders-1.28.0}/LICENSE +0 -0
  60. {aws_lambda_builders-1.26.0 → aws_lambda_builders-1.28.0}/MANIFEST.in +0 -0
  61. {aws_lambda_builders-1.26.0 → aws_lambda_builders-1.28.0}/NOTICE +0 -0
  62. {aws_lambda_builders-1.26.0 → aws_lambda_builders-1.28.0}/aws_lambda_builders/architecture.py +0 -0
  63. {aws_lambda_builders-1.26.0 → aws_lambda_builders-1.28.0}/aws_lambda_builders/binary_path.py +0 -0
  64. {aws_lambda_builders-1.26.0 → aws_lambda_builders-1.28.0}/aws_lambda_builders/path_resolver.py +0 -0
  65. {aws_lambda_builders-1.26.0 → aws_lambda_builders-1.28.0}/aws_lambda_builders/workflows/custom_make/DESIGN.md +0 -0
  66. {aws_lambda_builders-1.26.0 → aws_lambda_builders-1.28.0}/aws_lambda_builders/workflows/custom_make/__init__.py +0 -0
  67. {aws_lambda_builders-1.26.0 → aws_lambda_builders-1.28.0}/aws_lambda_builders/workflows/custom_make/exceptions.py +0 -0
  68. {aws_lambda_builders-1.26.0 → aws_lambda_builders-1.28.0}/aws_lambda_builders/workflows/custom_make/utils.py +0 -0
  69. {aws_lambda_builders-1.26.0 → aws_lambda_builders-1.28.0}/aws_lambda_builders/workflows/custom_make/validator.py +0 -0
  70. {aws_lambda_builders-1.26.0 → aws_lambda_builders-1.28.0}/aws_lambda_builders/workflows/dotnet_clipackage/DESIGN.md +0 -0
  71. {aws_lambda_builders-1.26.0 → aws_lambda_builders-1.28.0}/aws_lambda_builders/workflows/dotnet_clipackage/__init__.py +0 -0
  72. {aws_lambda_builders-1.26.0 → aws_lambda_builders-1.28.0}/aws_lambda_builders/workflows/dotnet_clipackage/dotnetcli.py +1 -1
  73. {aws_lambda_builders-1.26.0 → aws_lambda_builders-1.28.0}/aws_lambda_builders/workflows/dotnet_clipackage/utils.py +1 -1
  74. {aws_lambda_builders-1.26.0 → aws_lambda_builders-1.28.0}/aws_lambda_builders/workflows/go_modules/DESIGN.md +0 -0
  75. {aws_lambda_builders-1.26.0 → aws_lambda_builders-1.28.0}/aws_lambda_builders/workflows/go_modules/__init__.py +0 -0
  76. {aws_lambda_builders-1.26.0 → aws_lambda_builders-1.28.0}/aws_lambda_builders/workflows/go_modules/utils.py +0 -0
  77. {aws_lambda_builders-1.26.0 → aws_lambda_builders-1.28.0}/aws_lambda_builders/workflows/go_modules/validator.py +2 -2
  78. {aws_lambda_builders-1.26.0 → aws_lambda_builders-1.28.0}/aws_lambda_builders/workflows/java/__init__.py +0 -0
  79. {aws_lambda_builders-1.26.0 → aws_lambda_builders-1.28.0}/aws_lambda_builders/workflows/java_gradle/DESIGN.md +0 -0
  80. {aws_lambda_builders-1.26.0 → aws_lambda_builders-1.28.0}/aws_lambda_builders/workflows/java_gradle/__init__.py +0 -0
  81. {aws_lambda_builders-1.26.0 → aws_lambda_builders-1.28.0}/aws_lambda_builders/workflows/java_gradle/gradle.py +0 -0
  82. {aws_lambda_builders-1.26.0 → aws_lambda_builders-1.28.0}/aws_lambda_builders/workflows/java_gradle/gradle_resolver.py +0 -0
  83. {aws_lambda_builders-1.26.0 → aws_lambda_builders-1.28.0}/aws_lambda_builders/workflows/java_gradle/resources/lambda-build-init.gradle +0 -0
  84. {aws_lambda_builders-1.26.0 → aws_lambda_builders-1.28.0}/aws_lambda_builders/workflows/java_maven/DESIGN.md +0 -0
  85. {aws_lambda_builders-1.26.0 → aws_lambda_builders-1.28.0}/aws_lambda_builders/workflows/java_maven/__init__.py +0 -0
  86. {aws_lambda_builders-1.26.0 → aws_lambda_builders-1.28.0}/aws_lambda_builders/workflows/java_maven/maven.py +0 -0
  87. {aws_lambda_builders-1.26.0 → aws_lambda_builders-1.28.0}/aws_lambda_builders/workflows/java_maven/maven_resolver.py +0 -0
  88. {aws_lambda_builders-1.26.0 → aws_lambda_builders-1.28.0}/aws_lambda_builders/workflows/java_maven/maven_validator.py +1 -1
  89. {aws_lambda_builders-1.26.0 → aws_lambda_builders-1.28.0}/aws_lambda_builders/workflows/nodejs_npm/DESIGN.md +0 -0
  90. {aws_lambda_builders-1.26.0 → aws_lambda_builders-1.28.0}/aws_lambda_builders/workflows/nodejs_npm/__init__.py +0 -0
  91. {aws_lambda_builders-1.26.0 → aws_lambda_builders-1.28.0}/aws_lambda_builders/workflows/nodejs_npm/utils.py +2 -2
  92. {aws_lambda_builders-1.26.0 → aws_lambda_builders-1.28.0}/aws_lambda_builders/workflows/nodejs_npm_esbuild/DESIGN.md +0 -0
  93. {aws_lambda_builders-1.26.0 → aws_lambda_builders-1.28.0}/aws_lambda_builders/workflows/nodejs_npm_esbuild/__init__.py +0 -0
  94. {aws_lambda_builders-1.26.0 → aws_lambda_builders-1.28.0}/aws_lambda_builders/workflows/nodejs_npm_esbuild/exceptions.py +0 -0
  95. {aws_lambda_builders-1.26.0 → aws_lambda_builders-1.28.0}/aws_lambda_builders/workflows/python_pip/__init__.py +0 -0
  96. {aws_lambda_builders-1.26.0 → aws_lambda_builders-1.28.0}/aws_lambda_builders/workflows/python_pip/exceptions.py +0 -0
  97. {aws_lambda_builders-1.26.0 → aws_lambda_builders-1.28.0}/aws_lambda_builders/workflows/ruby_bundler/DESIGN.md +0 -0
  98. {aws_lambda_builders-1.26.0 → aws_lambda_builders-1.28.0}/aws_lambda_builders/workflows/ruby_bundler/__init__.py +0 -0
  99. {aws_lambda_builders-1.26.0 → aws_lambda_builders-1.28.0}/aws_lambda_builders/workflows/ruby_bundler/bundler.py +0 -0
  100. {aws_lambda_builders-1.26.0 → aws_lambda_builders-1.28.0}/aws_lambda_builders/workflows/ruby_bundler/utils.py +1 -1
  101. {aws_lambda_builders-1.26.0 → aws_lambda_builders-1.28.0}/aws_lambda_builders.egg-info/dependency_links.txt +0 -0
  102. {aws_lambda_builders-1.26.0 → aws_lambda_builders-1.28.0}/aws_lambda_builders.egg-info/entry_points.txt +0 -0
  103. {aws_lambda_builders-1.26.0 → aws_lambda_builders-1.28.0}/aws_lambda_builders.egg-info/top_level.txt +0 -0
  104. {aws_lambda_builders-1.26.0 → aws_lambda_builders-1.28.0}/requirements/base.txt +0 -0
  105. {aws_lambda_builders-1.26.0 → aws_lambda_builders-1.28.0}/requirements/python_pip.txt +0 -0
  106. {aws_lambda_builders-1.26.0 → aws_lambda_builders-1.28.0}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: aws_lambda_builders
3
- Version: 1.26.0
3
+ Version: 1.28.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
@@ -18,6 +18,7 @@ Classifier: Programming Language :: Python
18
18
  Classifier: Programming Language :: Python :: 3.7
19
19
  Classifier: Programming Language :: Python :: 3.8
20
20
  Classifier: Programming Language :: Python :: 3.9
21
+ Classifier: Programming Language :: Python :: 3.10
21
22
  Classifier: Topic :: Internet
22
23
  Classifier: Topic :: Software Development :: Build Tools
23
24
  Classifier: Topic :: Utilities
@@ -46,6 +47,7 @@ Lambda Builders currently contains the following workflows
46
47
  * Typescript with esbuild
47
48
  * Ruby with Bundler
48
49
  * Go with Mod
50
+ * Rust with Cargo
49
51
 
50
52
  In Addition to above workflows, AWS Lambda Builders also supports *Custom Workflows* through a Makefile.
51
53
 
@@ -18,6 +18,7 @@ Lambda Builders currently contains the following workflows
18
18
  * Typescript with esbuild
19
19
  * Ruby with Bundler
20
20
  * Go with Mod
21
+ * Rust with Cargo
21
22
 
22
23
  In Addition to above workflows, AWS Lambda Builders also supports *Custom Workflows* through a Makefile.
23
24
 
@@ -4,5 +4,5 @@ AWS Lambda Builder Library
4
4
 
5
5
  # Changing version will trigger a new release!
6
6
  # Please make the version change as the last step of your development.
7
- __version__ = "1.26.0"
7
+ __version__ = "1.28.0"
8
8
  RPC_PROTOCOL_VERSION = "0.3"
@@ -6,16 +6,16 @@ a JSON-RPC interface over stdin/stdout to invoke the builder and get response.
6
6
  Read the design document for explanation of the JSON-RPC interface
7
7
  """
8
8
 
9
- import sys
10
9
  import json
11
- import os
12
10
  import logging
11
+ import os
13
12
  import re
13
+ import sys
14
14
 
15
+ from aws_lambda_builders import RPC_PROTOCOL_VERSION as lambda_builders_protocol_version
15
16
  from aws_lambda_builders.architecture import X86_64
16
17
  from aws_lambda_builders.builder import LambdaBuilder
17
- from aws_lambda_builders.exceptions import WorkflowNotFoundError, WorkflowUnknownError, WorkflowFailedError
18
- from aws_lambda_builders import RPC_PROTOCOL_VERSION as lambda_builders_protocol_version
18
+ from aws_lambda_builders.exceptions import WorkflowFailedError, WorkflowNotFoundError, WorkflowUnknownError
19
19
 
20
20
  log_level = int(os.environ.get("LAMBDA_BUILDERS_LOG_LEVEL", logging.INFO))
21
21
 
@@ -36,7 +36,6 @@ def _error_response(request_id, http_status_code, message):
36
36
 
37
37
 
38
38
  def _parse_version(version_string):
39
-
40
39
  if VERSION_REGEX.match(version_string):
41
40
  return float(version_string)
42
41
  else:
@@ -6,10 +6,10 @@ import logging
6
6
  import os
7
7
  import shutil
8
8
  from pathlib import Path
9
- from typing import Set, Iterator, Tuple
9
+ from typing import Iterator, Set, Tuple, Union
10
10
 
11
11
  from aws_lambda_builders import utils
12
- from aws_lambda_builders.utils import copytree
12
+ from aws_lambda_builders.utils import copytree, create_symlink_or_copy
13
13
 
14
14
  LOG = logging.getLogger(__name__)
15
15
 
@@ -55,7 +55,6 @@ class Purpose(object):
55
55
 
56
56
  class _ActionMetaClass(type):
57
57
  def __new__(mcs, name, bases, class_dict):
58
-
59
58
  cls = type.__new__(mcs, name, bases, class_dict)
60
59
 
61
60
  if cls.__name__ == "BaseAction":
@@ -100,24 +99,28 @@ class BaseAction(object, metaclass=_ActionMetaClass):
100
99
 
101
100
 
102
101
  class CopySourceAction(BaseAction):
103
-
104
102
  NAME = "CopySource"
105
103
 
106
104
  DESCRIPTION = "Copying source code while skipping certain commonly excluded files"
107
105
 
108
106
  PURPOSE = Purpose.COPY_SOURCE
109
107
 
110
- def __init__(self, source_dir, dest_dir, excludes=None):
108
+ def __init__(self, source_dir, dest_dir, excludes=None, maintain_symlinks=False):
111
109
  self.source_dir = source_dir
112
110
  self.dest_dir = dest_dir
113
111
  self.excludes = excludes or []
112
+ self.maintain_symlinks = maintain_symlinks
114
113
 
115
114
  def execute(self):
116
- copytree(self.source_dir, self.dest_dir, ignore=shutil.ignore_patterns(*self.excludes))
115
+ copytree(
116
+ self.source_dir,
117
+ self.dest_dir,
118
+ ignore=shutil.ignore_patterns(*self.excludes),
119
+ maintain_symlinks=self.maintain_symlinks,
120
+ )
117
121
 
118
122
 
119
123
  class LinkSourceAction(BaseAction):
120
-
121
124
  NAME = "LinkSource"
122
125
 
123
126
  DESCRIPTION = "Linking source code to the target folder"
@@ -141,32 +144,54 @@ class LinkSourceAction(BaseAction):
141
144
  utils.create_symlink_or_copy(str(source_path), str(destination_path))
142
145
 
143
146
 
144
- class CopyDependenciesAction(BaseAction):
147
+ class LinkSinglePathAction(BaseAction):
148
+ NAME = "LinkSource"
149
+
150
+ DESCRIPTION = "Creates symbolic link at destination, pointing to source"
151
+
152
+ PURPOSE = Purpose.LINK_SOURCE
145
153
 
154
+ def __init__(self, source: Union[str, os.PathLike], dest: Union[str, os.PathLike]):
155
+ self._source = source
156
+ self._dest = dest
157
+
158
+ def execute(self):
159
+ destination_path = Path(self._dest)
160
+ if not destination_path.exists():
161
+ os.makedirs(destination_path.parent, exist_ok=True)
162
+ utils.create_symlink_or_copy(str(self._source), str(destination_path))
163
+
164
+
165
+ class CopyDependenciesAction(BaseAction):
146
166
  NAME = "CopyDependencies"
147
167
 
148
168
  DESCRIPTION = "Copying dependencies while skipping source file"
149
169
 
150
170
  PURPOSE = Purpose.COPY_DEPENDENCIES
151
171
 
152
- def __init__(self, source_dir, artifact_dir, destination_dir):
172
+ def __init__(self, source_dir, artifact_dir, destination_dir, maintain_symlinks=False):
153
173
  self.source_dir = source_dir
154
174
  self.artifact_dir = artifact_dir
155
175
  self.dest_dir = destination_dir
176
+ self.maintain_symlinks = maintain_symlinks
156
177
 
157
178
  def execute(self):
158
179
  deps_manager = DependencyManager(self.source_dir, self.artifact_dir, self.dest_dir)
159
180
 
160
181
  for dependencies_source, new_destination in deps_manager.yield_source_dest():
161
- if os.path.isdir(dependencies_source):
162
- copytree(dependencies_source, new_destination)
182
+ if os.path.islink(dependencies_source) and self.maintain_symlinks:
183
+ os.makedirs(os.path.dirname(new_destination), exist_ok=True)
184
+ linkto = os.readlink(dependencies_source)
185
+ create_symlink_or_copy(linkto, new_destination)
186
+ shutil.copystat(dependencies_source, new_destination, follow_symlinks=False)
187
+ elif os.path.isdir(dependencies_source):
188
+ copytree(dependencies_source, new_destination, maintain_symlinks=self.maintain_symlinks)
163
189
  else:
164
190
  os.makedirs(os.path.dirname(new_destination), exist_ok=True)
165
191
  shutil.copy2(dependencies_source, new_destination)
166
192
 
167
193
 
168
194
  class MoveDependenciesAction(BaseAction):
169
-
170
195
  NAME = "MoveDependencies"
171
196
 
172
197
  DESCRIPTION = "Moving dependencies while skipping source file"
@@ -214,7 +239,9 @@ class CleanUpAction(BaseAction):
214
239
  target_path = os.path.join(self.target_dir, name)
215
240
  LOG.debug("Clean up action: %s is deleted", str(target_path))
216
241
 
217
- if os.path.isdir(target_path):
242
+ if os.path.islink(target_path):
243
+ os.unlink(target_path)
244
+ elif os.path.isdir(target_path):
218
245
  shutil.rmtree(target_path)
219
246
  else:
220
247
  os.remove(target_path)
@@ -3,11 +3,11 @@ Entrypoint for the AWS Lambda Builder library
3
3
  """
4
4
 
5
5
  import importlib
6
- import os
7
6
  import logging
7
+ import os
8
8
 
9
9
  from aws_lambda_builders.architecture import X86_64
10
- from aws_lambda_builders.registry import get_workflow, DEFAULT_REGISTRY
10
+ from aws_lambda_builders.registry import DEFAULT_REGISTRY, get_workflow
11
11
  from aws_lambda_builders.workflow import Capability
12
12
 
13
13
  LOG = logging.getLogger(__name__)
@@ -21,7 +21,6 @@ class LambdaBuilder(object):
21
21
  """
22
22
 
23
23
  def __init__(self, language, dependency_manager, application_framework, supported_workflows=None):
24
-
25
24
  """
26
25
  Initialize the builder.
27
26
  :type supported_workflows: list
@@ -4,7 +4,6 @@ Collection of public exceptions raised by this library
4
4
 
5
5
 
6
6
  class LambdaBuilderError(Exception):
7
-
8
7
  MESSAGE = ""
9
8
 
10
9
  def __init__(self, **kwargs):
@@ -24,7 +24,6 @@ class Registry(object):
24
24
  return self._data[key]
25
25
 
26
26
  def __setitem__(self, capability, value):
27
-
28
27
  key = self._make_key(capability)
29
28
 
30
29
  try:
@@ -2,41 +2,45 @@
2
2
  Common utilities for the library
3
3
  """
4
4
 
5
+ import logging
6
+ import os
5
7
  import shutil
6
8
  import sys
7
- import os
8
- import logging
9
9
  from pathlib import Path
10
- from typing import Union
10
+ from typing import Callable, List, Optional, Set, Union
11
11
 
12
12
  from aws_lambda_builders.architecture import ARM64
13
13
 
14
14
  LOG = logging.getLogger(__name__)
15
15
 
16
16
 
17
- def copytree(source, destination, ignore=None, include=None):
17
+ def copytree(
18
+ source: str,
19
+ destination: str,
20
+ ignore: Optional[Callable[[str, List[str]], Set[str]]] = None,
21
+ include: Optional[Callable[[str], bool]] = None,
22
+ maintain_symlinks: bool = False,
23
+ ) -> None:
18
24
  """
19
25
  Similar to shutil.copytree except that it removes the limitation that the destination directory should
20
26
  be present.
21
27
 
22
- :type source: str
23
- :param source:
24
- Path to the source folder to copy
25
-
26
- :type destination: str
27
- :param destination:
28
- Path to destination folder
29
-
30
- :type ignore: function
31
- :param ignore:
28
+ Parameters
29
+ ----------
30
+ source : str
31
+ Path to the source folder to copy.
32
+ destination : str
33
+ Path to destination folder.
34
+ ignore : Optional[Callable[[str, List[str]], Set[str]]]
32
35
  A function that returns a set of file names to ignore, given a list of available file names. Similar to the
33
- ``ignore`` property of ``shutils.copytree`` method
34
-
35
- :type include: Callable[[str], bool]
36
- :param include:
36
+ ``ignore`` property of ``shutils.copytree`` method. By default None.
37
+ include : Optional[Callable[[str], bool]]
37
38
  A function that will decide whether a file should be copied or skipped it. It accepts file name as parameter
38
39
  and return True or False. Returning True will continue copy operation, returning False will skip copy operation
39
- for that file
40
+ for that file. By default None.
41
+ maintain_symlinks : bool, optional
42
+ If True, symbolic links in the source are represented as symbolic links in the destination.
43
+ If False, the contents are copied over. By default False.
40
44
  """
41
45
 
42
46
  if not os.path.exists(source):
@@ -74,8 +78,12 @@ def copytree(source, destination, ignore=None, include=None):
74
78
  LOG.debug("File (%s) doesn't satisfy the include rule, skipping it", name)
75
79
  continue
76
80
 
77
- if os.path.isdir(new_source):
78
- copytree(new_source, new_destination, ignore=ignore, include=include)
81
+ if os.path.islink(new_source) and maintain_symlinks:
82
+ linkto = os.readlink(new_source)
83
+ create_symlink_or_copy(linkto, new_destination)
84
+ shutil.copystat(new_source, new_destination, follow_symlinks=False)
85
+ elif os.path.isdir(new_source):
86
+ copytree(new_source, new_destination, ignore=ignore, include=include, maintain_symlinks=maintain_symlinks)
79
87
  else:
80
88
  LOG.debug("Copying source file (%s) to destination (%s)", new_source, new_destination)
81
89
  shutil.copy2(new_source, new_destination)
@@ -193,7 +201,8 @@ def create_symlink_or_copy(source: str, destination: str) -> None:
193
201
  os.symlink(Path(source).absolute(), Path(destination).absolute())
194
202
  except OSError as ex:
195
203
  LOG.warning(
196
- "Symlink operation is failed, falling back to copying files",
204
+ "Symbolic link creation failed, falling back to copying files instead. To optimize speed, "
205
+ "consider enabling the necessary settings or privileges on your system to support symbolic links.",
197
206
  exc_info=ex if LOG.isEnabledFor(logging.DEBUG) else None,
198
207
  )
199
208
  copytree(source, destination)
@@ -5,8 +5,7 @@ No-op validator that does not validate the runtime_path for a specified language
5
5
  import logging
6
6
 
7
7
  from aws_lambda_builders.architecture import ARM64, X86_64
8
- from aws_lambda_builders.exceptions import UnsupportedRuntimeError, UnsupportedArchitectureError
9
-
8
+ from aws_lambda_builders.exceptions import UnsupportedArchitectureError, UnsupportedRuntimeError
10
9
 
11
10
  LOG = logging.getLogger(__name__)
12
11
 
@@ -18,6 +17,7 @@ SUPPORTED_RUNTIMES = {
18
17
  "python3.7": [X86_64],
19
18
  "python3.8": [ARM64, X86_64],
20
19
  "python3.9": [ARM64, X86_64],
20
+ "python3.10": [ARM64, X86_64],
21
21
  "ruby2.7": [ARM64, X86_64],
22
22
  "java8": [ARM64, X86_64],
23
23
  "java11": [ARM64, X86_64],
@@ -2,26 +2,24 @@
2
2
  Implementation of a base workflow
3
3
  """
4
4
  import functools
5
- import os
6
5
  import logging
7
-
6
+ import os
8
7
  from collections import namedtuple
9
8
  from enum import Enum
10
9
  from typing import Optional
11
10
 
11
+ from aws_lambda_builders.actions import ActionFailedError
12
+ from aws_lambda_builders.architecture import X86_64
12
13
  from aws_lambda_builders.binary_path import BinaryPath
13
- from aws_lambda_builders.path_resolver import PathResolver
14
- from aws_lambda_builders.validator import RuntimeValidator
15
- from aws_lambda_builders.registry import DEFAULT_REGISTRY
16
14
  from aws_lambda_builders.exceptions import (
17
- WorkflowFailedError,
18
- WorkflowUnknownError,
19
15
  MisMatchRuntimeError,
20
16
  RuntimeValidatorError,
17
+ WorkflowFailedError,
18
+ WorkflowUnknownError,
21
19
  )
22
- from aws_lambda_builders.actions import ActionFailedError
23
- from aws_lambda_builders.architecture import X86_64
24
-
20
+ from aws_lambda_builders.path_resolver import PathResolver
21
+ from aws_lambda_builders.registry import DEFAULT_REGISTRY
22
+ from aws_lambda_builders.validator import RuntimeValidator
25
23
 
26
24
  LOG = logging.getLogger(__name__)
27
25
 
@@ -34,7 +32,6 @@ Capability = namedtuple("Capability", ["language", "dependency_manager", "applic
34
32
 
35
33
 
36
34
  class BuildMode(object):
37
-
38
35
  DEBUG = "debug"
39
36
  RELEASE = "release"
40
37
 
@@ -378,7 +375,6 @@ class BaseWorkflow(object, metaclass=_WorkflowMetaClass):
378
375
 
379
376
  raise WorkflowFailedError(workflow_name=self.NAME, action_name=action.NAME, reason=str(ex))
380
377
  except Exception as ex:
381
-
382
378
  LOG.debug("%s raised unhandled exception", action_info, exc_info=ex)
383
379
 
384
380
  raise WorkflowUnknownError(workflow_name=self.NAME, action_name=action.NAME, reason=str(ex))
@@ -2,12 +2,13 @@
2
2
  Officially supported builder workflows
3
3
  """
4
4
 
5
- import aws_lambda_builders.workflows.python_pip
6
- import aws_lambda_builders.workflows.nodejs_npm
7
- import aws_lambda_builders.workflows.ruby_bundler
5
+ import aws_lambda_builders.workflows.custom_make
6
+ import aws_lambda_builders.workflows.dotnet_clipackage
8
7
  import aws_lambda_builders.workflows.go_modules
9
8
  import aws_lambda_builders.workflows.java_gradle
10
9
  import aws_lambda_builders.workflows.java_maven
11
- import aws_lambda_builders.workflows.dotnet_clipackage
12
- import aws_lambda_builders.workflows.custom_make
10
+ import aws_lambda_builders.workflows.nodejs_npm
13
11
  import aws_lambda_builders.workflows.nodejs_npm_esbuild
12
+ import aws_lambda_builders.workflows.python_pip
13
+ import aws_lambda_builders.workflows.ruby_bundler
14
+ import aws_lambda_builders.workflows.rust_cargo
@@ -5,7 +5,8 @@ Action to build a specific Makefile target
5
5
  import logging
6
6
  from pathlib import Path
7
7
 
8
- from aws_lambda_builders.actions import BaseAction, Purpose, ActionFailedError
8
+ from aws_lambda_builders.actions import ActionFailedError, BaseAction, Purpose
9
+
9
10
  from .exceptions import MakeFileNotFoundError
10
11
  from .make import MakeExecutionError
11
12
 
@@ -49,7 +49,6 @@ class SubProcessMake(object):
49
49
  self.make_exe = make_exe
50
50
 
51
51
  def run(self, args, env=None, cwd=None):
52
-
53
52
  """
54
53
  Runs the action.
55
54
 
@@ -1,14 +1,15 @@
1
1
  """
2
2
  ProvidedMakeWorkflow
3
3
  """
4
- from aws_lambda_builders.workflows.custom_make.validator import CustomMakeRuntimeValidator
5
- from aws_lambda_builders.workflow import BaseWorkflow, Capability, BuildInSourceSupport, BuildDirectory
6
4
  from aws_lambda_builders.actions import CopySourceAction
7
5
  from aws_lambda_builders.path_resolver import PathResolver
6
+ from aws_lambda_builders.workflow import BaseWorkflow, BuildDirectory, BuildInSourceSupport, Capability
7
+ from aws_lambda_builders.workflows.custom_make.validator import CustomMakeRuntimeValidator
8
+
9
+ from ...exceptions import WorkflowFailedError
8
10
  from .actions import CustomMakeAction
9
- from .utils import OSUtils
10
11
  from .make import SubProcessMake
11
- from ...exceptions import WorkflowFailedError
12
+ from .utils import OSUtils
12
13
 
13
14
 
14
15
  class CustomMakeWorkflow(BaseWorkflow):
@@ -27,7 +28,6 @@ class CustomMakeWorkflow(BaseWorkflow):
27
28
  BUILD_IN_SOURCE_SUPPORT = BuildInSourceSupport.OPTIONALLY_SUPPORTED
28
29
 
29
30
  def __init__(self, source_dir, artifacts_dir, scratch_dir, manifest_path, runtime=None, osutils=None, **kwargs):
30
-
31
31
  super(CustomMakeWorkflow, self).__init__(
32
32
  source_dir, artifacts_dir, scratch_dir, manifest_path, runtime=runtime, **kwargs
33
33
  )
@@ -2,15 +2,16 @@
2
2
  Actions for .NET dependency resolution with CLI Package
3
3
  """
4
4
 
5
- import threading
6
- import os
7
5
  import logging
6
+ import os
7
+ import threading
8
8
 
9
- from aws_lambda_builders.actions import BaseAction, Purpose, ActionFailedError
10
- from aws_lambda_builders.workflow import BuildMode
9
+ from aws_lambda_builders.actions import ActionFailedError, BaseAction, Purpose
11
10
  from aws_lambda_builders.architecture import ARM64
12
- from .utils import OSUtils
11
+ from aws_lambda_builders.workflow import BuildMode
12
+
13
13
  from .dotnetcli import DotnetCLIExecutionError
14
+ from .utils import OSUtils
14
15
 
15
16
  LOG = logging.getLogger(__name__)
16
17
 
@@ -13,7 +13,6 @@ class DotnetCliResolver(object):
13
13
 
14
14
  @property
15
15
  def exec_paths(self):
16
-
17
16
  # look for the windows executable
18
17
  paths = self.os_utils.which("dotnet.exe", executable_search_paths=self.executable_search_paths)
19
18
  if not paths:
@@ -1,7 +1,7 @@
1
1
  """
2
2
  .NET Core CLI Package Workflow
3
3
  """
4
- from aws_lambda_builders.workflow import BaseWorkflow, BuildDirectory, Capability, BuildInSourceSupport
4
+ from aws_lambda_builders.workflow import BaseWorkflow, BuildDirectory, BuildInSourceSupport, Capability
5
5
 
6
6
  from .actions import GlobalToolInstallAction, RunPackageAction
7
7
  from .dotnetcli import SubprocessDotnetCLI
@@ -23,7 +23,6 @@ class DotnetCliPackageWorkflow(BaseWorkflow):
23
23
  BUILD_IN_SOURCE_SUPPORT = BuildInSourceSupport.EXCLUSIVELY_SUPPORTED
24
24
 
25
25
  def __init__(self, source_dir, artifacts_dir, scratch_dir, manifest_path, runtime=None, mode=None, **kwargs):
26
-
27
26
  super(DotnetCliPackageWorkflow, self).__init__(
28
27
  source_dir, artifacts_dir, scratch_dir, manifest_path, runtime=runtime, mode=mode, **kwargs
29
28
  )
@@ -2,12 +2,12 @@
2
2
  Action to build a Go project using standard Go tooling
3
3
  """
4
4
 
5
- from aws_lambda_builders.actions import BaseAction, Purpose, ActionFailedError
5
+ from aws_lambda_builders.actions import ActionFailedError, BaseAction, Purpose
6
+
6
7
  from .builder import BuilderError
7
8
 
8
9
 
9
10
  class GoModulesBuildAction(BaseAction):
10
-
11
11
  NAME = "Build"
12
12
  DESCRIPTION = "Building Go package with Go Modules"
13
13
  PURPOSE = Purpose.COMPILE_SOURCE
@@ -4,9 +4,9 @@ Build a Go project using standard Go tooling
4
4
  import logging
5
5
  from pathlib import Path
6
6
 
7
- from aws_lambda_builders.workflow import BuildMode
8
7
  from aws_lambda_builders.architecture import X86_64
9
8
  from aws_lambda_builders.utils import get_goarch
9
+ from aws_lambda_builders.workflow import BuildMode
10
10
 
11
11
  LOG = logging.getLogger(__name__)
12
12
 
@@ -19,7 +19,6 @@ class BuilderError(Exception):
19
19
 
20
20
 
21
21
  class GoModulesBuilder(object):
22
-
23
22
  LANGUAGE = "go"
24
23
 
25
24
  def __init__(self, osutils, binaries, handler, mode=BuildMode.RELEASE, architecture=X86_64, trim_go_path=False):
@@ -1,16 +1,15 @@
1
1
  """
2
2
  Go Modules Workflow
3
3
  """
4
- from aws_lambda_builders.workflow import BaseWorkflow, BuildDirectory, Capability, BuildInSourceSupport
4
+ from aws_lambda_builders.workflow import BaseWorkflow, BuildDirectory, BuildInSourceSupport, Capability
5
5
 
6
6
  from .actions import GoModulesBuildAction
7
7
  from .builder import GoModulesBuilder
8
- from .validator import GoRuntimeValidator
9
8
  from .utils import OSUtils
9
+ from .validator import GoRuntimeValidator
10
10
 
11
11
 
12
12
  class GoModulesWorkflow(BaseWorkflow):
13
-
14
13
  NAME = "GoModulesBuilder"
15
14
 
16
15
  CAPABILITY = Capability(language="go", dependency_manager="modules", application_framework=None)
@@ -21,7 +20,6 @@ class GoModulesWorkflow(BaseWorkflow):
21
20
  def __init__(
22
21
  self, source_dir, artifacts_dir, scratch_dir, manifest_path, runtime=None, osutils=None, mode=None, **kwargs
23
22
  ):
24
-
25
23
  super(GoModulesWorkflow, self).__init__(
26
24
  source_dir, artifacts_dir, scratch_dir, manifest_path, runtime=runtime, **kwargs
27
25
  )
@@ -3,6 +3,7 @@ Common Actions for the Java Workflows
3
3
  """
4
4
 
5
5
  import os
6
+
6
7
  from aws_lambda_builders.actions import ActionFailedError, BaseAction, Purpose
7
8
 
8
9
 
@@ -6,7 +6,8 @@ import os
6
6
  import platform
7
7
  import shutil
8
8
  import subprocess
9
- from aws_lambda_builders.utils import which, copytree
9
+
10
+ from aws_lambda_builders.utils import copytree, which
10
11
 
11
12
 
12
13
  class OSUtils(object):
@@ -3,9 +3,11 @@ Actions for the Java Gradle Workflow
3
3
  """
4
4
 
5
5
  import os
6
+
6
7
  from aws_lambda_builders.actions import ActionFailedError, BaseAction, Purpose
7
- from .gradle import GradleExecutionError
8
+
8
9
  from ..java.utils import jar_file_filter
10
+ from .gradle import GradleExecutionError
9
11
 
10
12
 
11
13
  class JavaGradleBuildAction(BaseAction):
@@ -5,9 +5,8 @@ Gradle Binary Validation
5
5
  import logging
6
6
  import re
7
7
 
8
- from aws_lambda_builders.workflows.java.utils import OSUtils
9
8
  from aws_lambda_builders.validator import RuntimeValidator
10
-
9
+ from aws_lambda_builders.workflows.java.utils import OSUtils
11
10
 
12
11
  LOG = logging.getLogger(__name__)
13
12
 
@@ -3,8 +3,9 @@ Java Gradle Workflow
3
3
  """
4
4
  import hashlib
5
5
  import os
6
+
6
7
  from aws_lambda_builders.actions import CleanUpAction
7
- from aws_lambda_builders.workflow import BaseWorkflow, BuildDirectory, Capability, BuildInSourceSupport
8
+ from aws_lambda_builders.workflow import BaseWorkflow, BuildDirectory, BuildInSourceSupport, Capability
8
9
  from aws_lambda_builders.workflows.java.actions import JavaCopyDependenciesAction, JavaMoveDependenciesAction
9
10
  from aws_lambda_builders.workflows.java.utils import OSUtils
10
11
 
@@ -2,13 +2,14 @@
2
2
  Actions for the Java Maven Workflow
3
3
  """
4
4
 
5
- import os
6
5
  import logging
6
+ import os
7
7
  import shutil
8
8
 
9
9
  from aws_lambda_builders.actions import ActionFailedError, BaseAction, Purpose
10
- from .maven import MavenExecutionError
10
+
11
11
  from ..java.utils import jar_file_filter
12
+ from .maven import MavenExecutionError
12
13
 
13
14
  LOG = logging.getLogger(__name__)
14
15