aws-lambda-builders 1.27.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.27.0 → aws_lambda_builders-1.28.0}/PKG-INFO +2 -1
  2. {aws_lambda_builders-1.27.0 → aws_lambda_builders-1.28.0}/aws_lambda_builders/__init__.py +1 -1
  3. {aws_lambda_builders-1.27.0 → aws_lambda_builders-1.28.0}/aws_lambda_builders/__main__.py +0 -1
  4. {aws_lambda_builders-1.27.0 → aws_lambda_builders-1.28.0}/aws_lambda_builders/actions.py +40 -13
  5. {aws_lambda_builders-1.27.0 → aws_lambda_builders-1.28.0}/aws_lambda_builders/builder.py +0 -1
  6. {aws_lambda_builders-1.27.0 → aws_lambda_builders-1.28.0}/aws_lambda_builders/exceptions.py +0 -1
  7. {aws_lambda_builders-1.27.0 → aws_lambda_builders-1.28.0}/aws_lambda_builders/registry.py +0 -1
  8. {aws_lambda_builders-1.27.0 → aws_lambda_builders-1.28.0}/aws_lambda_builders/utils.py +29 -20
  9. {aws_lambda_builders-1.27.0 → aws_lambda_builders-1.28.0}/aws_lambda_builders/validator.py +1 -0
  10. {aws_lambda_builders-1.27.0 → aws_lambda_builders-1.28.0}/aws_lambda_builders/workflow.py +0 -2
  11. {aws_lambda_builders-1.27.0 → aws_lambda_builders-1.28.0}/aws_lambda_builders/workflows/custom_make/make.py +0 -1
  12. {aws_lambda_builders-1.27.0 → aws_lambda_builders-1.28.0}/aws_lambda_builders/workflows/custom_make/workflow.py +0 -1
  13. {aws_lambda_builders-1.27.0 → aws_lambda_builders-1.28.0}/aws_lambda_builders/workflows/dotnet_clipackage/dotnetcli_resolver.py +0 -1
  14. {aws_lambda_builders-1.27.0 → aws_lambda_builders-1.28.0}/aws_lambda_builders/workflows/dotnet_clipackage/utils.py +0 -1
  15. {aws_lambda_builders-1.27.0 → aws_lambda_builders-1.28.0}/aws_lambda_builders/workflows/dotnet_clipackage/workflow.py +0 -1
  16. {aws_lambda_builders-1.27.0 → aws_lambda_builders-1.28.0}/aws_lambda_builders/workflows/go_modules/actions.py +0 -1
  17. {aws_lambda_builders-1.27.0 → aws_lambda_builders-1.28.0}/aws_lambda_builders/workflows/go_modules/builder.py +0 -1
  18. {aws_lambda_builders-1.27.0 → aws_lambda_builders-1.28.0}/aws_lambda_builders/workflows/go_modules/workflow.py +0 -2
  19. {aws_lambda_builders-1.27.0 → aws_lambda_builders-1.28.0}/aws_lambda_builders/workflows/nodejs_npm/actions.py +32 -20
  20. {aws_lambda_builders-1.27.0 → aws_lambda_builders-1.28.0}/aws_lambda_builders/workflows/nodejs_npm/npm.py +0 -1
  21. aws_lambda_builders-1.28.0/aws_lambda_builders/workflows/nodejs_npm/workflow.py +213 -0
  22. {aws_lambda_builders-1.27.0 → aws_lambda_builders-1.28.0}/aws_lambda_builders/workflows/nodejs_npm_esbuild/esbuild.py +0 -1
  23. {aws_lambda_builders-1.27.0 → aws_lambda_builders-1.28.0}/aws_lambda_builders/workflows/nodejs_npm_esbuild/workflow.py +1 -1
  24. {aws_lambda_builders-1.27.0 → aws_lambda_builders-1.28.0}/aws_lambda_builders/workflows/python_pip/DESIGN.md +1 -1
  25. {aws_lambda_builders-1.27.0 → aws_lambda_builders-1.28.0}/aws_lambda_builders/workflows/python_pip/actions.py +0 -1
  26. {aws_lambda_builders-1.27.0 → aws_lambda_builders-1.28.0}/aws_lambda_builders/workflows/python_pip/packager.py +7 -7
  27. {aws_lambda_builders-1.27.0 → aws_lambda_builders-1.28.0}/aws_lambda_builders/workflows/python_pip/workflow.py +0 -2
  28. {aws_lambda_builders-1.27.0 → aws_lambda_builders-1.28.0}/aws_lambda_builders/workflows/ruby_bundler/workflow.py +7 -9
  29. {aws_lambda_builders-1.27.0 → aws_lambda_builders-1.28.0}/aws_lambda_builders.egg-info/PKG-INFO +2 -1
  30. {aws_lambda_builders-1.27.0 → aws_lambda_builders-1.28.0}/aws_lambda_builders.egg-info/requires.txt +6 -7
  31. {aws_lambda_builders-1.27.0 → aws_lambda_builders-1.28.0}/pyproject.toml +3 -0
  32. {aws_lambda_builders-1.27.0 → aws_lambda_builders-1.28.0}/requirements/dev.txt +6 -7
  33. {aws_lambda_builders-1.27.0 → aws_lambda_builders-1.28.0}/setup.py +1 -0
  34. aws_lambda_builders-1.27.0/aws_lambda_builders/workflows/nodejs_npm/workflow.py +0 -186
  35. {aws_lambda_builders-1.27.0 → aws_lambda_builders-1.28.0}/LICENSE +0 -0
  36. {aws_lambda_builders-1.27.0 → aws_lambda_builders-1.28.0}/MANIFEST.in +0 -0
  37. {aws_lambda_builders-1.27.0 → aws_lambda_builders-1.28.0}/NOTICE +0 -0
  38. {aws_lambda_builders-1.27.0 → aws_lambda_builders-1.28.0}/README.md +0 -0
  39. {aws_lambda_builders-1.27.0 → aws_lambda_builders-1.28.0}/aws_lambda_builders/architecture.py +0 -0
  40. {aws_lambda_builders-1.27.0 → aws_lambda_builders-1.28.0}/aws_lambda_builders/binary_path.py +0 -0
  41. {aws_lambda_builders-1.27.0 → aws_lambda_builders-1.28.0}/aws_lambda_builders/path_resolver.py +0 -0
  42. {aws_lambda_builders-1.27.0 → aws_lambda_builders-1.28.0}/aws_lambda_builders/workflows/__init__.py +0 -0
  43. {aws_lambda_builders-1.27.0 → aws_lambda_builders-1.28.0}/aws_lambda_builders/workflows/custom_make/DESIGN.md +0 -0
  44. {aws_lambda_builders-1.27.0 → aws_lambda_builders-1.28.0}/aws_lambda_builders/workflows/custom_make/__init__.py +0 -0
  45. {aws_lambda_builders-1.27.0 → aws_lambda_builders-1.28.0}/aws_lambda_builders/workflows/custom_make/actions.py +0 -0
  46. {aws_lambda_builders-1.27.0 → aws_lambda_builders-1.28.0}/aws_lambda_builders/workflows/custom_make/exceptions.py +0 -0
  47. {aws_lambda_builders-1.27.0 → aws_lambda_builders-1.28.0}/aws_lambda_builders/workflows/custom_make/utils.py +0 -0
  48. {aws_lambda_builders-1.27.0 → aws_lambda_builders-1.28.0}/aws_lambda_builders/workflows/custom_make/validator.py +0 -0
  49. {aws_lambda_builders-1.27.0 → aws_lambda_builders-1.28.0}/aws_lambda_builders/workflows/dotnet_clipackage/DESIGN.md +0 -0
  50. {aws_lambda_builders-1.27.0 → aws_lambda_builders-1.28.0}/aws_lambda_builders/workflows/dotnet_clipackage/__init__.py +0 -0
  51. {aws_lambda_builders-1.27.0 → aws_lambda_builders-1.28.0}/aws_lambda_builders/workflows/dotnet_clipackage/actions.py +0 -0
  52. {aws_lambda_builders-1.27.0 → aws_lambda_builders-1.28.0}/aws_lambda_builders/workflows/dotnet_clipackage/dotnetcli.py +0 -0
  53. {aws_lambda_builders-1.27.0 → aws_lambda_builders-1.28.0}/aws_lambda_builders/workflows/go_modules/DESIGN.md +0 -0
  54. {aws_lambda_builders-1.27.0 → aws_lambda_builders-1.28.0}/aws_lambda_builders/workflows/go_modules/__init__.py +0 -0
  55. {aws_lambda_builders-1.27.0 → aws_lambda_builders-1.28.0}/aws_lambda_builders/workflows/go_modules/utils.py +0 -0
  56. {aws_lambda_builders-1.27.0 → aws_lambda_builders-1.28.0}/aws_lambda_builders/workflows/go_modules/validator.py +0 -0
  57. {aws_lambda_builders-1.27.0 → aws_lambda_builders-1.28.0}/aws_lambda_builders/workflows/java/__init__.py +0 -0
  58. {aws_lambda_builders-1.27.0 → aws_lambda_builders-1.28.0}/aws_lambda_builders/workflows/java/actions.py +0 -0
  59. {aws_lambda_builders-1.27.0 → aws_lambda_builders-1.28.0}/aws_lambda_builders/workflows/java/utils.py +0 -0
  60. {aws_lambda_builders-1.27.0 → aws_lambda_builders-1.28.0}/aws_lambda_builders/workflows/java_gradle/DESIGN.md +0 -0
  61. {aws_lambda_builders-1.27.0 → aws_lambda_builders-1.28.0}/aws_lambda_builders/workflows/java_gradle/__init__.py +0 -0
  62. {aws_lambda_builders-1.27.0 → aws_lambda_builders-1.28.0}/aws_lambda_builders/workflows/java_gradle/actions.py +0 -0
  63. {aws_lambda_builders-1.27.0 → aws_lambda_builders-1.28.0}/aws_lambda_builders/workflows/java_gradle/gradle.py +0 -0
  64. {aws_lambda_builders-1.27.0 → aws_lambda_builders-1.28.0}/aws_lambda_builders/workflows/java_gradle/gradle_resolver.py +0 -0
  65. {aws_lambda_builders-1.27.0 → aws_lambda_builders-1.28.0}/aws_lambda_builders/workflows/java_gradle/gradle_validator.py +0 -0
  66. {aws_lambda_builders-1.27.0 → aws_lambda_builders-1.28.0}/aws_lambda_builders/workflows/java_gradle/resources/lambda-build-init.gradle +0 -0
  67. {aws_lambda_builders-1.27.0 → aws_lambda_builders-1.28.0}/aws_lambda_builders/workflows/java_gradle/workflow.py +0 -0
  68. {aws_lambda_builders-1.27.0 → aws_lambda_builders-1.28.0}/aws_lambda_builders/workflows/java_maven/DESIGN.md +0 -0
  69. {aws_lambda_builders-1.27.0 → aws_lambda_builders-1.28.0}/aws_lambda_builders/workflows/java_maven/__init__.py +0 -0
  70. {aws_lambda_builders-1.27.0 → aws_lambda_builders-1.28.0}/aws_lambda_builders/workflows/java_maven/actions.py +0 -0
  71. {aws_lambda_builders-1.27.0 → aws_lambda_builders-1.28.0}/aws_lambda_builders/workflows/java_maven/maven.py +0 -0
  72. {aws_lambda_builders-1.27.0 → aws_lambda_builders-1.28.0}/aws_lambda_builders/workflows/java_maven/maven_resolver.py +0 -0
  73. {aws_lambda_builders-1.27.0 → aws_lambda_builders-1.28.0}/aws_lambda_builders/workflows/java_maven/maven_validator.py +0 -0
  74. {aws_lambda_builders-1.27.0 → aws_lambda_builders-1.28.0}/aws_lambda_builders/workflows/java_maven/workflow.py +0 -0
  75. {aws_lambda_builders-1.27.0 → aws_lambda_builders-1.28.0}/aws_lambda_builders/workflows/nodejs_npm/DESIGN.md +0 -0
  76. {aws_lambda_builders-1.27.0 → aws_lambda_builders-1.28.0}/aws_lambda_builders/workflows/nodejs_npm/__init__.py +0 -0
  77. {aws_lambda_builders-1.27.0 → aws_lambda_builders-1.28.0}/aws_lambda_builders/workflows/nodejs_npm/utils.py +0 -0
  78. {aws_lambda_builders-1.27.0 → aws_lambda_builders-1.28.0}/aws_lambda_builders/workflows/nodejs_npm_esbuild/DESIGN.md +0 -0
  79. {aws_lambda_builders-1.27.0 → aws_lambda_builders-1.28.0}/aws_lambda_builders/workflows/nodejs_npm_esbuild/__init__.py +0 -0
  80. {aws_lambda_builders-1.27.0 → aws_lambda_builders-1.28.0}/aws_lambda_builders/workflows/nodejs_npm_esbuild/actions.py +0 -0
  81. {aws_lambda_builders-1.27.0 → aws_lambda_builders-1.28.0}/aws_lambda_builders/workflows/nodejs_npm_esbuild/exceptions.py +0 -0
  82. {aws_lambda_builders-1.27.0 → aws_lambda_builders-1.28.0}/aws_lambda_builders/workflows/python_pip/__init__.py +0 -0
  83. {aws_lambda_builders-1.27.0 → aws_lambda_builders-1.28.0}/aws_lambda_builders/workflows/python_pip/compat.py +0 -0
  84. {aws_lambda_builders-1.27.0 → aws_lambda_builders-1.28.0}/aws_lambda_builders/workflows/python_pip/exceptions.py +0 -0
  85. {aws_lambda_builders-1.27.0 → aws_lambda_builders-1.28.0}/aws_lambda_builders/workflows/python_pip/utils.py +0 -0
  86. {aws_lambda_builders-1.27.0 → aws_lambda_builders-1.28.0}/aws_lambda_builders/workflows/python_pip/validator.py +0 -0
  87. {aws_lambda_builders-1.27.0 → aws_lambda_builders-1.28.0}/aws_lambda_builders/workflows/ruby_bundler/DESIGN.md +0 -0
  88. {aws_lambda_builders-1.27.0 → aws_lambda_builders-1.28.0}/aws_lambda_builders/workflows/ruby_bundler/__init__.py +0 -0
  89. {aws_lambda_builders-1.27.0 → aws_lambda_builders-1.28.0}/aws_lambda_builders/workflows/ruby_bundler/actions.py +0 -0
  90. {aws_lambda_builders-1.27.0 → aws_lambda_builders-1.28.0}/aws_lambda_builders/workflows/ruby_bundler/bundler.py +0 -0
  91. {aws_lambda_builders-1.27.0 → aws_lambda_builders-1.28.0}/aws_lambda_builders/workflows/ruby_bundler/utils.py +0 -0
  92. {aws_lambda_builders-1.27.0 → aws_lambda_builders-1.28.0}/aws_lambda_builders/workflows/rust_cargo/DESIGN.md +0 -0
  93. {aws_lambda_builders-1.27.0 → aws_lambda_builders-1.28.0}/aws_lambda_builders/workflows/rust_cargo/__init__.py +0 -0
  94. {aws_lambda_builders-1.27.0 → aws_lambda_builders-1.28.0}/aws_lambda_builders/workflows/rust_cargo/actions.py +0 -0
  95. {aws_lambda_builders-1.27.0 → aws_lambda_builders-1.28.0}/aws_lambda_builders/workflows/rust_cargo/cargo_lambda.py +0 -0
  96. {aws_lambda_builders-1.27.0 → aws_lambda_builders-1.28.0}/aws_lambda_builders/workflows/rust_cargo/exceptions.py +0 -0
  97. {aws_lambda_builders-1.27.0 → aws_lambda_builders-1.28.0}/aws_lambda_builders/workflows/rust_cargo/feature_flag.py +0 -0
  98. {aws_lambda_builders-1.27.0 → aws_lambda_builders-1.28.0}/aws_lambda_builders/workflows/rust_cargo/utils.py +0 -0
  99. {aws_lambda_builders-1.27.0 → aws_lambda_builders-1.28.0}/aws_lambda_builders/workflows/rust_cargo/workflow.py +0 -0
  100. {aws_lambda_builders-1.27.0 → aws_lambda_builders-1.28.0}/aws_lambda_builders.egg-info/SOURCES.txt +0 -0
  101. {aws_lambda_builders-1.27.0 → aws_lambda_builders-1.28.0}/aws_lambda_builders.egg-info/dependency_links.txt +0 -0
  102. {aws_lambda_builders-1.27.0 → aws_lambda_builders-1.28.0}/aws_lambda_builders.egg-info/entry_points.txt +0 -0
  103. {aws_lambda_builders-1.27.0 → aws_lambda_builders-1.28.0}/aws_lambda_builders.egg-info/top_level.txt +0 -0
  104. {aws_lambda_builders-1.27.0 → aws_lambda_builders-1.28.0}/requirements/base.txt +0 -0
  105. {aws_lambda_builders-1.27.0 → aws_lambda_builders-1.28.0}/requirements/python_pip.txt +0 -0
  106. {aws_lambda_builders-1.27.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.27.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
@@ -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.27.0"
7
+ __version__ = "1.28.0"
8
8
  RPC_PROTOCOL_VERSION = "0.3"
@@ -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 Iterator, Set, 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)
@@ -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:
@@ -7,36 +7,40 @@ import os
7
7
  import shutil
8
8
  import sys
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)
@@ -17,6 +17,7 @@ SUPPORTED_RUNTIMES = {
17
17
  "python3.7": [X86_64],
18
18
  "python3.8": [ARM64, X86_64],
19
19
  "python3.9": [ARM64, X86_64],
20
+ "python3.10": [ARM64, X86_64],
20
21
  "ruby2.7": [ARM64, X86_64],
21
22
  "java8": [ARM64, X86_64],
22
23
  "java11": [ARM64, X86_64],
@@ -32,7 +32,6 @@ Capability = namedtuple("Capability", ["language", "dependency_manager", "applic
32
32
 
33
33
 
34
34
  class BuildMode(object):
35
-
36
35
  DEBUG = "debug"
37
36
  RELEASE = "release"
38
37
 
@@ -376,7 +375,6 @@ class BaseWorkflow(object, metaclass=_WorkflowMetaClass):
376
375
 
377
376
  raise WorkflowFailedError(workflow_name=self.NAME, action_name=action.NAME, reason=str(ex))
378
377
  except Exception as ex:
379
-
380
378
  LOG.debug("%s raised unhandled exception", action_info, exc_info=ex)
381
379
 
382
380
  raise WorkflowUnknownError(workflow_name=self.NAME, action_name=action.NAME, reason=str(ex))
@@ -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
 
@@ -28,7 +28,6 @@ class CustomMakeWorkflow(BaseWorkflow):
28
28
  BUILD_IN_SOURCE_SUPPORT = BuildInSourceSupport.OPTIONALLY_SUPPORTED
29
29
 
30
30
  def __init__(self, source_dir, artifacts_dir, scratch_dir, manifest_path, runtime=None, osutils=None, **kwargs):
31
-
32
31
  super(CustomMakeWorkflow, self).__init__(
33
32
  source_dir, artifacts_dir, scratch_dir, manifest_path, runtime=runtime, **kwargs
34
33
  )
@@ -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:
@@ -44,7 +44,6 @@ class OSUtils(object):
44
44
  """
45
45
 
46
46
  with zipfile.ZipFile(zip_file_path, "r") as zip_ref:
47
-
48
47
  # For each item in the zip file, extract the file and set permissions if available
49
48
  for file_info in zip_ref.infolist():
50
49
  extracted_path = self._extract(file_info, output_dir, zip_ref)
@@ -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
  )
@@ -8,7 +8,6 @@ from .builder import BuilderError
8
8
 
9
9
 
10
10
  class GoModulesBuildAction(BaseAction):
11
-
12
11
  NAME = "Build"
13
12
  DESCRIPTION = "Building Go package with Go Modules"
14
13
  PURPOSE = Purpose.COMPILE_SOURCE
@@ -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):
@@ -10,7 +10,6 @@ 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,11 +3,12 @@ Action to resolve NodeJS dependencies using NPM
3
3
  """
4
4
 
5
5
  import logging
6
+ from typing import Optional
6
7
 
7
8
  from aws_lambda_builders.actions import ActionFailedError, BaseAction, Purpose
8
9
  from aws_lambda_builders.utils import extract_tarfile
9
10
 
10
- from .npm import NpmExecutionError
11
+ from .npm import NpmExecutionError, SubprocessNpm
11
12
 
12
13
  LOG = logging.getLogger(__name__)
13
14
 
@@ -82,21 +83,22 @@ class NodejsNpmInstallAction(BaseAction):
82
83
  DESCRIPTION = "Installing dependencies from NPM"
83
84
  PURPOSE = Purpose.RESOLVE_DEPENDENCIES
84
85
 
85
- def __init__(self, install_dir, subprocess_npm):
86
+ def __init__(self, install_dir: str, subprocess_npm: SubprocessNpm, install_links: Optional[bool] = False):
86
87
  """
87
- :type install_dir: str
88
- :param install_dir: Dependencies will be installed in this directory.
89
-
90
- :type subprocess_npm: aws_lambda_builders.workflows.nodejs_npm.npm.SubprocessNpm
91
- :param subprocess_npm: An instance of the NPM process wrapper
92
-
93
- :type is_production: bool
94
- :param is_production: NPM installation mode is production (eg --production=false to force dev dependencies)
88
+ Parameters
89
+ ----------
90
+ install_dir : str
91
+ Dependencies will be installed in this directory.
92
+ subprocess_npm : SubprocessNpm
93
+ An instance of the NPM process wrapper
94
+ install_links : Optional[bool]
95
+ Uses the --install-links npm option if True, by default False
95
96
  """
96
97
 
97
98
  super(NodejsNpmInstallAction, self).__init__()
98
99
  self.install_dir = install_dir
99
100
  self.subprocess_npm = subprocess_npm
101
+ self.install_links = install_links
100
102
 
101
103
  def execute(self):
102
104
  """
@@ -107,9 +109,11 @@ class NodejsNpmInstallAction(BaseAction):
107
109
  try:
108
110
  LOG.debug("NODEJS installing in: %s", self.install_dir)
109
111
 
110
- self.subprocess_npm.run(
111
- ["install", "-q", "--no-audit", "--no-save", "--unsafe-perm", "--production"], cwd=self.install_dir
112
- )
112
+ command = ["install", "-q", "--no-audit", "--no-save", "--unsafe-perm", "--production"]
113
+ if self.install_links:
114
+ command.append("--install-links")
115
+
116
+ self.subprocess_npm.run(command, cwd=self.install_dir)
113
117
 
114
118
  except NpmExecutionError as ex:
115
119
  raise ActionFailedError(str(ex))
@@ -128,18 +132,22 @@ class NodejsNpmCIAction(BaseAction):
128
132
  DESCRIPTION = "Installing dependencies from NPM using the CI method"
129
133
  PURPOSE = Purpose.RESOLVE_DEPENDENCIES
130
134
 
131
- def __init__(self, install_dir, subprocess_npm):
135
+ def __init__(self, install_dir: str, subprocess_npm: SubprocessNpm, install_links: Optional[bool] = False):
132
136
  """
133
- :type install_dir: str
134
- :param install_dir: Dependencies will be installed in this directory.
135
-
136
- :type subprocess_npm: aws_lambda_builders.workflows.nodejs_npm.npm.SubprocessNpm
137
- :param subprocess_npm: An instance of the NPM process wrapper
137
+ Parameters
138
+ ----------
139
+ install_dir : str
140
+ Dependencies will be installed in this directory.
141
+ subprocess_npm : SubprocessNpm
142
+ An instance of the NPM process wrapper
143
+ install_links : Optional[bool]
144
+ Uses the --install-links npm option if True, by default False
138
145
  """
139
146
 
140
147
  super(NodejsNpmCIAction, self).__init__()
141
148
  self.install_dir = install_dir
142
149
  self.subprocess_npm = subprocess_npm
150
+ self.install_links = install_links
143
151
 
144
152
  def execute(self):
145
153
  """
@@ -151,7 +159,11 @@ class NodejsNpmCIAction(BaseAction):
151
159
  try:
152
160
  LOG.debug("NODEJS installing ci in: %s", self.install_dir)
153
161
 
154
- self.subprocess_npm.run(["ci"], cwd=self.install_dir)
162
+ command = ["ci"]
163
+ if self.install_links:
164
+ command.append("--install-links")
165
+
166
+ self.subprocess_npm.run(command, cwd=self.install_dir)
155
167
 
156
168
  except NpmExecutionError as ex:
157
169
  raise ActionFailedError(str(ex))
@@ -47,7 +47,6 @@ class SubprocessNpm(object):
47
47
  self.npm_exe = npm_exe
48
48
 
49
49
  def run(self, args, cwd=None):
50
-
51
50
  """
52
51
  Runs the action.
53
52