Skip to content

Commit 88abd1d

Browse files
authored
Add --no-interactive to init (#785)
1 parent b32e074 commit 88abd1d

File tree

7 files changed

+101
-13
lines changed

7 files changed

+101
-13
lines changed
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
{
2+
"type": "Bug Fix",
3+
"description": "Add '--no-interactive' flag to 'sam init' calls when SAM CLI version is greater than or equal to 0.30.0"
4+
}

src/integrationTest/sam.test.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -136,7 +136,7 @@ for (const runtime of runtimes) {
136136
runtime: projectSDK as SamLambdaRuntime
137137
}
138138
const samCliContext = getSamCliContext()
139-
await runSamCliInit(initArguments, samCliContext.invoker)
139+
await runSamCliInit(initArguments, samCliContext)
140140
// Activate the relevent extensions if needed
141141
if (projectSDK.includes('dotnet')) {
142142
await activateExtension('ms-vscode.csharp')
@@ -165,7 +165,7 @@ for (const runtime of runtimes) {
165165
}
166166
console.log(initArguments.location)
167167
const samCliContext = getSamCliContext()
168-
const err = await assertThrowsError(async () => runSamCliInit(initArguments, samCliContext.invoker))
168+
const err = await assertThrowsError(async () => runSamCliInit(initArguments, samCliContext))
169169
assert(err.message.includes('directory already exists'))
170170
}).timeout(TIMEOUT)
171171

src/lambda/commands/createNewSamApp.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -91,7 +91,7 @@ export async function createNewSamApplication(
9191
location: config.location.fsPath,
9292
runtime: config.runtime
9393
}
94-
await runSamCliInit(initArguments, samCliContext.invoker)
94+
await runSamCliInit(initArguments, samCliContext)
9595

9696
results.result = 'pass'
9797

src/shared/sam/cli/samCliContext.ts

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import { DefaultSamCliConfiguration } from './samCliConfiguration'
88
import { DefaultSamCliProcessInvoker, SamCliProcessInvokerContext } from './samCliInvoker'
99
import { SamCliProcessInvoker } from './samCliInvokerUtils'
1010
import { DefaultSamCliLocationProvider } from './samCliLocator'
11+
import { throwAndNotifyIfInvalid } from './samCliValidationUtils'
1112
import { DefaultSamCliValidator, DefaultSamCliValidatorContext, SamCliValidator } from './samCliValidator'
1213

1314
export interface SamCliContext {
@@ -45,6 +46,13 @@ export function getSamCliContext() {
4546
return samCliContext
4647
}
4748

49+
export async function getSamCliVersion(context: SamCliContext): Promise<string> {
50+
const result = await context.validator.detectValidSamCli()
51+
throwAndNotifyIfInvalid(result)
52+
53+
return result.versionValidation!.version!
54+
}
55+
4856
function makeSamCliContext(): SamCliContext {
4957
const samCliConfiguration = new DefaultSamCliConfiguration(
5058
settingsConfiguration,

src/shared/sam/cli/samCliInit.ts

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,19 +3,29 @@
33
* SPDX-License-Identifier: Apache-2.0
44
*/
55

6+
import * as semver from 'semver'
67
import { SamLambdaRuntime } from '../../../lambda/models/samLambdaRuntime'
7-
import { logAndThrowIfUnexpectedExitCode, SamCliProcessInvoker } from './samCliInvokerUtils'
8+
import { getSamCliVersion, SamCliContext } from './samCliContext'
9+
import { logAndThrowIfUnexpectedExitCode } from './samCliInvokerUtils'
10+
import { SAM_CLI_VERSION_0_30 } from './samCliValidator'
811

912
export interface SamCliInitArgs {
1013
runtime: SamLambdaRuntime
1114
location: string
1215
name: string
1316
}
1417

15-
export async function runSamCliInit(initArguments: SamCliInitArgs, invoker: SamCliProcessInvoker): Promise<void> {
16-
const childProcessResult = await invoker.invoke({
18+
export async function runSamCliInit(initArguments: SamCliInitArgs, context: SamCliContext): Promise<void> {
19+
const args = ['init', '--name', initArguments.name, '--runtime', initArguments.runtime]
20+
const samCliVersion = await getSamCliVersion(context)
21+
22+
if (semver.gte(samCliVersion, SAM_CLI_VERSION_0_30)) {
23+
args.push('--no-interactive')
24+
}
25+
26+
const childProcessResult = await context.invoker.invoke({
1727
spawnOptions: { cwd: initArguments.location },
18-
arguments: ['init', '--name', initArguments.name, '--runtime', initArguments.runtime]
28+
arguments: args
1929
})
2030

2131
logAndThrowIfUnexpectedExitCode(childProcessResult, 0)

src/shared/sam/cli/samCliValidator.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import { SamCliProcessInvoker } from './samCliInvokerUtils'
1111

1212
export const MINIMUM_SAM_CLI_VERSION_INCLUSIVE = '0.16.0'
1313
export const MAXIMUM_SAM_CLI_VERSION_EXCLUSIVE = '0.30.0'
14+
export const SAM_CLI_VERSION_0_30 = '0.30.0'
1415

1516
// Errors
1617
export class InvalidSamCliError extends Error {

src/test/shared/sam/cli/samCliInit.test.ts

Lines changed: 71 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -5,12 +5,20 @@
55

66
import * as assert from 'assert'
77
import { SpawnOptions } from 'child_process'
8+
import { SamCliContext } from '../../../../shared/sam/cli/samCliContext'
89
import { runSamCliInit, SamCliInitArgs } from '../../../../shared/sam/cli/samCliInit'
910
import { SamCliProcessInvoker } from '../../../../shared/sam/cli/samCliInvokerUtils'
11+
import {
12+
MINIMUM_SAM_CLI_VERSION_INCLUSIVE,
13+
SAM_CLI_VERSION_0_30,
14+
SamCliValidator,
15+
SamCliValidatorResult,
16+
SamCliVersionValidation
17+
} from '../../../../shared/sam/cli/samCliValidator'
1018
import { ChildProcessResult } from '../../../../shared/utilities/childProcess'
1119
import { getTestLogger } from '../../../globalSetup.test'
1220
import { assertThrowsError } from '../../utilities/assertUtils'
13-
import { assertArgsContainArgument } from './samCliTestUtils'
21+
import { assertArgIsPresent, assertArgsContainArgument } from './samCliTestUtils'
1422
import {
1523
assertErrorContainsBadExitMessage,
1624
assertLogContainsBadExitInformation,
@@ -37,6 +45,24 @@ describe('runSamCliInit', async () => {
3745
}
3846
}
3947

48+
class FakeSamCliValidator implements SamCliValidator {
49+
private readonly version: string
50+
public constructor(version: string = MINIMUM_SAM_CLI_VERSION_INCLUSIVE) {
51+
this.version = version
52+
}
53+
public async detectValidSamCli(): Promise<SamCliValidatorResult> {
54+
return {
55+
samCliFound: true,
56+
versionValidation: {
57+
version: this.version,
58+
validation: SamCliVersionValidation.Valid
59+
}
60+
}
61+
}
62+
}
63+
64+
const defaultFakeValidator = new FakeSamCliValidator()
65+
4066
const sampleSamInitArgs: SamCliInitArgs = {
4167
name: 'qwerty',
4268
location: '/some/path/to/code.js',
@@ -51,7 +77,12 @@ describe('runSamCliInit', async () => {
5177
}
5278
)
5379

54-
await runSamCliInit(sampleSamInitArgs, processInvoker)
80+
const context: SamCliContext = {
81+
validator: defaultFakeValidator,
82+
invoker: processInvoker
83+
}
84+
85+
await runSamCliInit(sampleSamInitArgs, context)
5586
})
5687

5788
it('Passes name to sam cli', async () => {
@@ -61,7 +92,12 @@ describe('runSamCliInit', async () => {
6192
}
6293
)
6394

64-
await runSamCliInit(sampleSamInitArgs, processInvoker)
95+
const context: SamCliContext = {
96+
validator: defaultFakeValidator,
97+
invoker: processInvoker
98+
}
99+
100+
await runSamCliInit(sampleSamInitArgs, context)
65101
})
66102

67103
it('Passes location to sam cli', async () => {
@@ -71,7 +107,12 @@ describe('runSamCliInit', async () => {
71107
}
72108
)
73109

74-
await runSamCliInit(sampleSamInitArgs, processInvoker)
110+
const context: SamCliContext = {
111+
validator: defaultFakeValidator,
112+
invoker: processInvoker
113+
}
114+
115+
await runSamCliInit(sampleSamInitArgs, context)
75116
})
76117

77118
it('Passes runtime to sam cli', async () => {
@@ -81,14 +122,23 @@ describe('runSamCliInit', async () => {
81122
}
82123
)
83124

84-
await runSamCliInit(sampleSamInitArgs, processInvoker)
125+
const context: SamCliContext = {
126+
validator: defaultFakeValidator,
127+
invoker: processInvoker
128+
}
129+
130+
await runSamCliInit(sampleSamInitArgs, context)
85131
})
86132

87133
it('throws on unexpected exit code', async () => {
88134
const badExitCodeProcessInvoker = new BadExitCodeSamCliProcessInvoker({})
135+
const context: SamCliContext = {
136+
validator: defaultFakeValidator,
137+
invoker: badExitCodeProcessInvoker
138+
}
89139

90140
const error = await assertThrowsError(async () => {
91-
await runSamCliInit(sampleSamInitArgs, badExitCodeProcessInvoker)
141+
await runSamCliInit(sampleSamInitArgs, context)
92142
}, 'Expected an error to be thrown')
93143

94144
assertErrorContainsBadExitMessage(error, badExitCodeProcessInvoker.error.message)
@@ -98,4 +148,19 @@ describe('runSamCliInit', async () => {
98148
0
99149
)
100150
})
151+
152+
it('Passes --no-interactive if version >= 0.30.0', async () => {
153+
const processInvoker: SamCliProcessInvoker = new ExtendedTestSamCliProcessInvoker(
154+
(spawnOptions: SpawnOptions, args: any[]) => {
155+
assertArgIsPresent(args, '--no-interactive')
156+
}
157+
)
158+
159+
const context: SamCliContext = {
160+
validator: new FakeSamCliValidator(SAM_CLI_VERSION_0_30),
161+
invoker: processInvoker
162+
}
163+
164+
await runSamCliInit(sampleSamInitArgs, context)
165+
})
101166
})

0 commit comments

Comments
 (0)