Skip to content

Commit 75927e3

Browse files
authored
feat: handle default and supported values for building in source per workflow (#418)
1 parent b48bc30 commit 75927e3

File tree

13 files changed

+191
-16
lines changed

13 files changed

+191
-16
lines changed

aws_lambda_builders/workflow.py

+42
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
import logging
77

88
from collections import namedtuple
9+
from enum import Enum
910

1011
from aws_lambda_builders.binary_path import BinaryPath
1112
from aws_lambda_builders.path_resolver import PathResolver
@@ -37,6 +38,21 @@ class BuildMode(object):
3738
RELEASE = "release"
3839

3940

41+
class BuildInSourceSupport(Enum):
42+
"""
43+
Enum to define a workflow's support for building in source.
44+
"""
45+
46+
# can't build in source directory (e.g. only able to build in temporary or artifacts directories)
47+
NOT_SUPPORTED = [False]
48+
49+
# can build in source directory but not required to
50+
OPTIONALLY_SUPPORTED = [False, True]
51+
52+
# only able to build in source directory and not somewhere else
53+
EXCLUSIVELY_SUPPORTED = [True]
54+
55+
4056
# TODO: Move sanitize out to its own class.
4157
def sanitize(func): # pylint: disable=too-many-statements
4258
"""
@@ -124,6 +140,15 @@ def __new__(mcs, name, bases, class_dict):
124140
if not isinstance(cls.CAPABILITY, Capability):
125141
raise ValueError("Workflow '{}' must register valid capabilities".format(cls.NAME))
126142

143+
# All workflows must define valid default and supported values for build in source
144+
if (
145+
not isinstance(cls.BUILD_IN_SOURCE_SUPPORT, BuildInSourceSupport)
146+
or cls.BUILD_IN_SOURCE_BY_DEFAULT not in cls.BUILD_IN_SOURCE_SUPPORT.value
147+
):
148+
raise ValueError(
149+
"Workflow '{}' must define valid default and supported values for build in source".format(cls.NAME)
150+
)
151+
127152
LOG.debug("Registering workflow '%s' with capability '%s'", cls.NAME, cls.CAPABILITY)
128153
DEFAULT_REGISTRY[cls.CAPABILITY] = cls
129154

@@ -148,6 +173,12 @@ class BaseWorkflow(object, metaclass=_WorkflowMetaClass):
148173
# Optional list of manifests file/folder names supported by this workflow.
149174
SUPPORTED_MANIFESTS = []
150175

176+
# Whether the workflow builds in source by default, each workflow should define this.
177+
# (some workflows build in temporary or artifact directories by default)
178+
BUILD_IN_SOURCE_BY_DEFAULT = None
179+
# Support for building in source, each workflow should define this.
180+
BUILD_IN_SOURCE_SUPPORT = None
181+
151182
def __init__(
152183
self,
153184
source_dir,
@@ -229,7 +260,18 @@ def __init__(
229260
self.architecture = architecture
230261
self.is_building_layer = is_building_layer
231262
self.experimental_flags = experimental_flags if experimental_flags else []
263+
232264
self.build_in_source = build_in_source
265+
if build_in_source not in self.BUILD_IN_SOURCE_SUPPORT.value:
266+
# only show warning if an unsupported value was explicitly passed in
267+
if build_in_source is not None:
268+
LOG.warning(
269+
'Workflow %s does not support value "%s" for building in source. Using default value "%s".',
270+
self.NAME,
271+
build_in_source,
272+
self.BUILD_IN_SOURCE_BY_DEFAULT,
273+
)
274+
self.build_in_source = self.BUILD_IN_SOURCE_BY_DEFAULT
233275

234276
# Actions are registered by the subclasses as they seem fit
235277
self.actions = []

aws_lambda_builders/workflows/custom_make/workflow.py

+4-5
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
ProvidedMakeWorkflow
33
"""
44
from aws_lambda_builders.workflows.custom_make.validator import CustomMakeRuntimeValidator
5-
from aws_lambda_builders.workflow import BaseWorkflow, Capability
5+
from aws_lambda_builders.workflow import BaseWorkflow, Capability, BuildInSourceSupport
66
from aws_lambda_builders.actions import CopySourceAction
77
from aws_lambda_builders.path_resolver import PathResolver
88
from .actions import CustomMakeAction
@@ -23,6 +23,9 @@ class CustomMakeWorkflow(BaseWorkflow):
2323

2424
EXCLUDED_FILES = (".aws-sam", ".git")
2525

26+
BUILD_IN_SOURCE_BY_DEFAULT = False
27+
BUILD_IN_SOURCE_SUPPORT = BuildInSourceSupport.OPTIONALLY_SUPPORTED
28+
2629
def __init__(self, source_dir, artifacts_dir, scratch_dir, manifest_path, runtime=None, osutils=None, **kwargs):
2730

2831
super(CustomMakeWorkflow, self).__init__(
@@ -44,10 +47,6 @@ def __init__(self, source_dir, artifacts_dir, scratch_dir, manifest_path, runtim
4447

4548
subprocess_make = SubProcessMake(make_exe=self.binaries["make"].binary_path, osutils=self.os_utils)
4649

47-
# Don't build in source by default (backwards compatibility)
48-
if build_in_source is None:
49-
build_in_source = False
50-
5150
# an explicitly definied working directory should take precedence
5251
working_directory = options.get("working_directory") or self._select_working_directory(
5352
source_dir, scratch_dir, build_in_source

aws_lambda_builders/workflows/dotnet_clipackage/workflow.py

+4-1
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
"""
22
.NET Core CLI Package Workflow
33
"""
4-
from aws_lambda_builders.workflow import BaseWorkflow, Capability
4+
from aws_lambda_builders.workflow import BaseWorkflow, Capability, BuildInSourceSupport
55

66
from .actions import GlobalToolInstallAction, RunPackageAction
77
from .dotnetcli import SubprocessDotnetCLI
@@ -19,6 +19,9 @@ class DotnetCliPackageWorkflow(BaseWorkflow):
1919

2020
CAPABILITY = Capability(language="dotnet", dependency_manager="cli-package", application_framework=None)
2121

22+
BUILD_IN_SOURCE_BY_DEFAULT = True
23+
BUILD_IN_SOURCE_SUPPORT = BuildInSourceSupport.EXCLUSIVELY_SUPPORTED
24+
2225
def __init__(self, source_dir, artifacts_dir, scratch_dir, manifest_path, runtime=None, mode=None, **kwargs):
2326

2427
super(DotnetCliPackageWorkflow, self).__init__(

aws_lambda_builders/workflows/go_modules/workflow.py

+4-1
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
"""
22
Go Modules Workflow
33
"""
4-
from aws_lambda_builders.workflow import BaseWorkflow, Capability
4+
from aws_lambda_builders.workflow import BaseWorkflow, Capability, BuildInSourceSupport
55

66
from .actions import GoModulesBuildAction
77
from .builder import GoModulesBuilder
@@ -15,6 +15,9 @@ class GoModulesWorkflow(BaseWorkflow):
1515

1616
CAPABILITY = Capability(language="go", dependency_manager="modules", application_framework=None)
1717

18+
BUILD_IN_SOURCE_BY_DEFAULT = True
19+
BUILD_IN_SOURCE_SUPPORT = BuildInSourceSupport.EXCLUSIVELY_SUPPORTED
20+
1821
def __init__(
1922
self, source_dir, artifacts_dir, scratch_dir, manifest_path, runtime=None, osutils=None, mode=None, **kwargs
2023
):

aws_lambda_builders/workflows/java_gradle/workflow.py

+4-1
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
import hashlib
55
import os
66
from aws_lambda_builders.actions import CleanUpAction
7-
from aws_lambda_builders.workflow import BaseWorkflow, Capability
7+
from aws_lambda_builders.workflow import BaseWorkflow, Capability, BuildInSourceSupport
88
from aws_lambda_builders.workflows.java.actions import JavaCopyDependenciesAction, JavaMoveDependenciesAction
99
from aws_lambda_builders.workflows.java.utils import OSUtils
1010

@@ -25,6 +25,9 @@ class JavaGradleWorkflow(BaseWorkflow):
2525

2626
INIT_FILE = "lambda-build-init.gradle"
2727

28+
BUILD_IN_SOURCE_BY_DEFAULT = False
29+
BUILD_IN_SOURCE_SUPPORT = BuildInSourceSupport.NOT_SUPPORTED
30+
2831
def __init__(self, source_dir, artifacts_dir, scratch_dir, manifest_path, **kwargs):
2932
super(JavaGradleWorkflow, self).__init__(source_dir, artifacts_dir, scratch_dir, manifest_path, **kwargs)
3033

aws_lambda_builders/workflows/java_maven/workflow.py

+4-1
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
"""
22
Java Maven Workflow
33
"""
4-
from aws_lambda_builders.workflow import BaseWorkflow, Capability
4+
from aws_lambda_builders.workflow import BaseWorkflow, Capability, BuildInSourceSupport
55
from aws_lambda_builders.actions import CopySourceAction, CleanUpAction
66
from aws_lambda_builders.workflows.java.actions import JavaCopyDependenciesAction, JavaMoveDependenciesAction
77
from aws_lambda_builders.workflows.java.utils import OSUtils
@@ -28,6 +28,9 @@ class JavaMavenWorkflow(BaseWorkflow):
2828

2929
EXCLUDED_FILES = (".aws-sam", ".git")
3030

31+
BUILD_IN_SOURCE_BY_DEFAULT = False
32+
BUILD_IN_SOURCE_SUPPORT = BuildInSourceSupport.NOT_SUPPORTED
33+
3134
def __init__(self, source_dir, artifacts_dir, scratch_dir, manifest_path, **kwargs):
3235
super(JavaMavenWorkflow, self).__init__(source_dir, artifacts_dir, scratch_dir, manifest_path, **kwargs)
3336

aws_lambda_builders/workflows/nodejs_npm/workflow.py

+4-1
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
import logging
66

77
from aws_lambda_builders.path_resolver import PathResolver
8-
from aws_lambda_builders.workflow import BaseWorkflow, Capability
8+
from aws_lambda_builders.workflow import BaseWorkflow, Capability, BuildInSourceSupport
99
from aws_lambda_builders.actions import (
1010
CopySourceAction,
1111
CleanUpAction,
@@ -42,6 +42,9 @@ class NodejsNpmWorkflow(BaseWorkflow):
4242

4343
CONFIG_PROPERTY = "aws_sam"
4444

45+
BUILD_IN_SOURCE_BY_DEFAULT = False
46+
BUILD_IN_SOURCE_SUPPORT = BuildInSourceSupport.NOT_SUPPORTED
47+
4548
def __init__(self, source_dir, artifacts_dir, scratch_dir, manifest_path, runtime=None, osutils=None, **kwargs):
4649

4750
super(NodejsNpmWorkflow, self).__init__(

aws_lambda_builders/workflows/nodejs_npm_esbuild/workflow.py

+4-1
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
from pathlib import Path
88
from typing import List
99

10-
from aws_lambda_builders.workflow import BaseWorkflow, Capability
10+
from aws_lambda_builders.workflow import BaseWorkflow, Capability, BuildInSourceSupport
1111
from aws_lambda_builders.actions import (
1212
CopySourceAction,
1313
CleanUpAction,
@@ -44,6 +44,9 @@ class NodejsNpmEsbuildWorkflow(BaseWorkflow):
4444

4545
CONFIG_PROPERTY = "aws_sam"
4646

47+
BUILD_IN_SOURCE_BY_DEFAULT = False
48+
BUILD_IN_SOURCE_SUPPORT = BuildInSourceSupport.NOT_SUPPORTED
49+
4750
def __init__(self, source_dir, artifacts_dir, scratch_dir, manifest_path, runtime=None, osutils=None, **kwargs):
4851

4952
super(NodejsNpmEsbuildWorkflow, self).__init__(

aws_lambda_builders/workflows/python_pip/workflow.py

+4-1
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
"""
44
import logging
55

6-
from aws_lambda_builders.workflow import BaseWorkflow, Capability
6+
from aws_lambda_builders.workflow import BaseWorkflow, BuildInSourceSupport, Capability
77
from aws_lambda_builders.actions import CopySourceAction, CleanUpAction, LinkSourceAction
88
from aws_lambda_builders.workflows.python_pip.validator import PythonRuntimeValidator
99
from aws_lambda_builders.path_resolver import PathResolver
@@ -67,6 +67,9 @@ class PythonPipWorkflow(BaseWorkflow):
6767

6868
PYTHON_VERSION_THREE = "3"
6969

70+
BUILD_IN_SOURCE_BY_DEFAULT = False
71+
BUILD_IN_SOURCE_SUPPORT = BuildInSourceSupport.NOT_SUPPORTED
72+
7073
def __init__(self, source_dir, artifacts_dir, scratch_dir, manifest_path, runtime=None, osutils=None, **kwargs):
7174

7275
super(PythonPipWorkflow, self).__init__(

aws_lambda_builders/workflows/ruby_bundler/workflow.py

+4-1
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
"""
44
import logging
55

6-
from aws_lambda_builders.workflow import BaseWorkflow, Capability
6+
from aws_lambda_builders.workflow import BaseWorkflow, BuildInSourceSupport, Capability
77
from aws_lambda_builders.actions import CopySourceAction, CopyDependenciesAction, CleanUpAction
88
from .actions import RubyBundlerInstallAction, RubyBundlerVendorAction
99
from .utils import OSUtils
@@ -25,6 +25,9 @@ class RubyBundlerWorkflow(BaseWorkflow):
2525

2626
EXCLUDED_FILES = (".aws-sam", ".git")
2727

28+
BUILD_IN_SOURCE_BY_DEFAULT = False
29+
BUILD_IN_SOURCE_SUPPORT = BuildInSourceSupport.NOT_SUPPORTED
30+
2831
def __init__(self, source_dir, artifacts_dir, scratch_dir, manifest_path, runtime=None, osutils=None, **kwargs):
2932

3033
super(RubyBundlerWorkflow, self).__init__(

tests/functional/testdata/workflows/hello_workflow/write_hello.py

+3-1
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44

55
import os
66

7-
from aws_lambda_builders.workflow import BaseWorkflow, Capability
7+
from aws_lambda_builders.workflow import BaseWorkflow, BuildInSourceSupport, Capability
88
from aws_lambda_builders.actions import BaseAction, Purpose
99

1010

@@ -34,6 +34,8 @@ class WriteHelloWorkflow(BaseWorkflow):
3434

3535
NAME = "WriteHelloWorkflow"
3636
CAPABILITY = Capability(language="python", dependency_manager="test", application_framework="test")
37+
BUILD_IN_SOURCE_BY_DEFAULT = False
38+
BUILD_IN_SOURCE_SUPPORT = BuildInSourceSupport.OPTIONALLY_SUPPORTED
3739

3840
def __init__(self, source_dir, artifacts_dir, *args, **kwargs):
3941
super(WriteHelloWorkflow, self).__init__(source_dir, artifacts_dir, *args, **kwargs)

tests/unit/test_builder.py

+3-1
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
from parameterized import parameterized, param
55

66
from aws_lambda_builders.builder import LambdaBuilder
7-
from aws_lambda_builders.workflow import Capability, BaseWorkflow
7+
from aws_lambda_builders.workflow import BuildInSourceSupport, Capability, BaseWorkflow
88
from aws_lambda_builders.registry import DEFAULT_REGISTRY
99

1010

@@ -71,6 +71,8 @@ class MyWorkflow(BaseWorkflow):
7171
CAPABILITY = Capability(
7272
language=self.lang, dependency_manager=self.lang_framework, application_framework=self.app_framework
7373
)
74+
BUILD_IN_SOURCE_BY_DEFAULT = False
75+
BUILD_IN_SOURCE_SUPPORT = BuildInSourceSupport.OPTIONALLY_SUPPORTED
7476

7577
def __init__(
7678
self,

0 commit comments

Comments
 (0)