Skip to content

Commit b2c9572

Browse files
authored
Add support for __init__.py as default scriptFile for Python (#7697)
1 parent c417188 commit b2c9572

File tree

2 files changed

+30
-9
lines changed

2 files changed

+30
-9
lines changed

src/WebJobs.Script/Host/HostFunctionMetadataProvider.cs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -240,11 +240,13 @@ internal static string DeterminePrimaryScriptFile(string scriptFile, string scri
240240
{
241241
// if there is a "run" file, that file is primary,
242242
// for Node, any index.js file is primary
243+
// for Python, __init__.py file is primary
243244
// TODO #6955: Get default function file name from language worker configs
244245
functionPrimary = functionFiles.FirstOrDefault(p =>
245246
fileSystem.Path.GetFileNameWithoutExtension(p).ToLowerInvariant() == "run" ||
246247
fileSystem.Path.GetFileName(p).ToLowerInvariant() == "index.js" ||
247-
fileSystem.Path.GetFileName(p).ToLowerInvariant() == "index.mjs");
248+
fileSystem.Path.GetFileName(p).ToLowerInvariant() == "index.mjs" ||
249+
fileSystem.Path.GetFileName(p).ToLowerInvariant() == "__init__.py");
248250
}
249251
}
250252

test/WebJobs.Script.Tests/FunctionMetadataProviderTests.cs

Lines changed: 27 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -217,6 +217,22 @@ public void DeterminePrimaryScriptFile_MultipleFiles_RunFilePresent()
217217
Assert.Equal(@"c:\functions\Run.csx", scriptFile);
218218
}
219219

220+
[Fact]
221+
public void DeterminePrimaryScriptFile_MultipleFiles_InitFilePresent()
222+
{
223+
var functionConfig = new JObject();
224+
var files = new Dictionary<string, MockFileData>
225+
{
226+
{ @"c:\functions\__init__.py", new MockFileData(string.Empty) },
227+
{ @"c:\functions\helloworld.py", new MockFileData(string.Empty) },
228+
{ @"c:\functions\test.txt", new MockFileData(string.Empty) }
229+
};
230+
var fileSystem = new MockFileSystem(files);
231+
232+
string scriptFile = HostFunctionMetadataProvider.DeterminePrimaryScriptFile(null, @"c:\functions", fileSystem);
233+
Assert.Equal(@"c:\functions\__init__.py", scriptFile);
234+
}
235+
220236
[Fact]
221237
public void DeterminePrimaryScriptFile_SingleFile()
222238
{
@@ -245,35 +261,37 @@ public void DeterminePrimaryScriptFile_MultipleFiles_RunTrumpsIndex()
245261
Assert.Equal(@"c:\functions\run.js", scriptFile);
246262
}
247263

248-
[Fact]
249-
public void DeterminePrimaryScriptFile_MultipleFiles_IndexFilePresent()
264+
[Theory]
265+
[InlineData("index.js", @"c:\functions\index.js")]
266+
[InlineData("__init__.py", @"c:\functions\__init__.py")]
267+
public void DeterminePrimaryScriptFile_MultipleFiles_DefaultFilePresent(string scriptFileProperty, string expectedScriptFilePath)
250268
{
251269
var files = new Dictionary<string, MockFileData>
252270
{
253-
{ @"c:\functions\index.js", new MockFileData(string.Empty) },
271+
{ expectedScriptFilePath, new MockFileData(string.Empty) },
254272
{ @"c:\functions\test.txt", new MockFileData(string.Empty) }
255273
};
256274
var fileSystem = new MockFileSystem(files);
257275

258-
string scriptFile = HostFunctionMetadataProvider.DeterminePrimaryScriptFile("index.js", @"c:\functions", fileSystem);
259-
Assert.Equal(@"c:\functions\index.js", scriptFile);
276+
string scriptFile = HostFunctionMetadataProvider.DeterminePrimaryScriptFile(scriptFileProperty, @"c:\functions", fileSystem);
277+
Assert.Equal(expectedScriptFilePath, scriptFile);
260278
}
261279

262280
[Theory]
263281
[InlineData("run.py", @"c:\functions\run.py")]
264282
[InlineData("queueTrigger.py", @"c:\functions\queueTrigger.py")]
265283
[InlineData("helper.py", @"c:\functions\helper.py")]
266284
[InlineData("test.txt", @"c:\functions\test.txt")]
267-
public void DeterminePrimaryScriptFile_MultipleFiles_ConfigTrumpsConvention(string scriptFileProperty, string expedtedScriptFilePath)
285+
public void DeterminePrimaryScriptFile_MultipleFiles_ConfigTrumpsConvention(string scriptFileProperty, string expectedScriptFilePath)
268286
{
269287
var files = new Dictionary<string, MockFileData>
270288
{
271-
{ expedtedScriptFilePath, new MockFileData(string.Empty) }
289+
{ expectedScriptFilePath, new MockFileData(string.Empty) }
272290
};
273291
var fileSystem = new MockFileSystem(files);
274292

275293
string actualScriptFilePath = HostFunctionMetadataProvider.DeterminePrimaryScriptFile(scriptFileProperty, @"c:\functions", fileSystem);
276-
Assert.Equal(expedtedScriptFilePath, actualScriptFilePath);
294+
Assert.Equal(expectedScriptFilePath, actualScriptFilePath);
277295
}
278296

279297
[Theory]
@@ -285,6 +303,7 @@ public void DeterminePrimaryScriptFile_MultipleFiles_SourceFileSpecified(string
285303
{
286304
{ @"c:\functions\queueTrigger.py", new MockFileData(string.Empty) },
287305
{ @"c:\functions\helper.py", new MockFileData(string.Empty) },
306+
{ @"c:\functions\__init__.py", new MockFileData(string.Empty) },
288307
{ @"c:\functions\test.txt", new MockFileData(string.Empty) }
289308
};
290309
var fileSystem = new MockFileSystem(files);

0 commit comments

Comments
 (0)