Skip to content

Commit 52bd774

Browse files
authored
Allow snake case for binding names (#10764)
1 parent fda8e41 commit 52bd774

File tree

6 files changed

+42
-21
lines changed

6 files changed

+42
-21
lines changed

release_notes.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,3 +14,4 @@
1414
- Fix modification of ISO strings during the parsing of function metadata bindings.
1515
- This fixes the listener errors related to the CosmosDB trigger's `StartFromTime` parameter. (#10735)
1616
- Updated `WebJobs.Script` to target .NET 8 (instead of .NET Standard 2.1)
17+
- Allow for binding names to use snake case (#10764). Examples include `_`, `binding_name`, and `_binding`.

src/WebJobs.Script/Host/HostFunctionMetadataProvider.cs

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -116,14 +116,6 @@ private FunctionMetadata ReadFunctionMetadata(string functionDirectory, IFileSys
116116
}
117117
}
118118

119-
internal void ValidateName(string name, bool isProxy = false)
120-
{
121-
if (!Utility.IsValidFunctionName(name))
122-
{
123-
throw new InvalidOperationException(string.Format("'{0}' is not a valid {1} name.", name, isProxy ? "proxy" : "function"));
124-
}
125-
}
126-
127119
internal static FunctionMetadata ParseFunctionMetadata(string functionName, JObject configMetadata, string scriptDirectory, IFileSystem fileSystem,
128120
IEnumerable<RpcWorkerConfig> workerConfigs, string functionsWorkerRuntime)
129121
{

src/WebJobs.Script/Utility.cs

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,6 @@
99
using System.IO;
1010
using System.IO.Abstractions;
1111
using System.Linq;
12-
using System.Net;
1312
using System.Net.Http.Headers;
1413
using System.Reflection;
1514
using System.Text;
@@ -57,7 +56,7 @@ public static class Utility
5756
#endif
5857

5958
private static readonly Regex FunctionNameValidationRegex = new Regex(@"^[a-z][a-z0-9_\-]{0,127}$(?<!^host$)", RegexOptions.IgnoreCase | RegexOptions.CultureInvariant);
60-
private static readonly Regex BindingNameValidationRegex = new Regex(string.Format("^([a-zA-Z][a-zA-Z0-9]{{0,127}}|{0})$", Regex.Escape(ScriptConstants.SystemReturnParameterBindingName)));
59+
private static readonly Regex BindingNameValidationRegex = new Regex(string.Format("^([a-zA-Z_][a-zA-Z0-9_]{{0,127}}|{0})$", Regex.Escape(ScriptConstants.SystemReturnParameterBindingName)));
6160

6261
private static readonly string UTF8ByteOrderMark = Encoding.UTF8.GetString(Encoding.UTF8.GetPreamble());
6362
private static readonly FilteredExpandoObjectConverter _filteredExpandoObjectConverter = new FilteredExpandoObjectConverter();
@@ -591,7 +590,7 @@ public static void ValidateBinding(BindingMetadata bindingMetadata)
591590
{
592591
if (bindingMetadata.Name == null || !BindingNameValidationRegex.IsMatch(bindingMetadata.Name))
593592
{
594-
throw new ArgumentException($"The binding name {bindingMetadata.Name} is invalid. Please assign a valid name to the binding.");
593+
throw new ArgumentException($"The binding name {bindingMetadata.Name} is invalid. Please assign a valid name to the binding. See https://aka.ms/azure-functions-binding-name-rules for more details.");
595594
}
596595

597596
if (bindingMetadata.IsReturn && bindingMetadata.Direction != BindingDirection.Out)

test/WebJobs.Script.Tests/Description/FunctionDescriptorProviderTests.cs

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,15 +4,13 @@
44
using System;
55
using System.Collections.Generic;
66
using System.Collections.ObjectModel;
7-
using System.Diagnostics.Metrics;
87
using System.IO;
98
using System.Linq;
109
using System.Threading.Tasks;
1110
using Microsoft.Azure.WebJobs.Script.Binding;
1211
using Microsoft.Azure.WebJobs.Script.Description;
1312
using Microsoft.Azure.WebJobs.Script.Extensibility;
1413
using Microsoft.Azure.WebJobs.Script.Metrics;
15-
using Microsoft.Extensions.Configuration;
1614
using Microsoft.Extensions.DependencyInjection;
1715
using Microsoft.Extensions.Hosting;
1816
using Microsoft.Extensions.Options;
@@ -206,7 +204,6 @@ public async Task CreateTriggerParameter_WithNoBindingMatch_ThrowsExpectedExcept
206204
[Theory]
207205
[InlineData(null)]
208206
[InlineData("")]
209-
[InlineData("_binding")]
210207
[InlineData("binding-test")]
211208
[InlineData("binding name")]
212209
public void ValidateBinding_InvalidName_Throws(string bindingName)
@@ -221,10 +218,22 @@ public void ValidateBinding_InvalidName_Throws(string bindingName)
221218
_provider.ValidateBinding(bindingMetadata);
222219
});
223220

224-
Assert.Equal($"The binding name {bindingName} is invalid. Please assign a valid name to the binding.", ex.Message);
221+
Assert.Equal($"The binding name {bindingName} is invalid. Please assign a valid name to the binding. See https://aka.ms/azure-functions-binding-name-rules for more details.", ex.Message);
225222
}
226223

227224
[Theory]
225+
[InlineData("__")]
226+
[InlineData("__binding")]
227+
[InlineData("binding__")]
228+
[InlineData("bind__ing")]
229+
[InlineData("__binding__")]
230+
[InlineData("_binding")]
231+
[InlineData("binding_")]
232+
[InlineData("_binding_")]
233+
[InlineData("_another_binding_test_")]
234+
[InlineData("long_binding_name_that_is_valid")]
235+
[InlineData("binding_name")]
236+
[InlineData("_")]
228237
[InlineData("bindingName")]
229238
[InlineData("binding1")]
230239
[InlineData(ScriptConstants.SystemReturnParameterBindingName)]

test/WebJobs.Script.Tests/UtilityTests.cs

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -14,15 +14,13 @@
1414
using Microsoft.Azure.WebJobs.Script.Config;
1515
using Microsoft.Azure.WebJobs.Script.Description;
1616
using Microsoft.Azure.WebJobs.Script.Diagnostics;
17-
using Microsoft.Azure.WebJobs.Script.ExtensionBundle;
1817
using Microsoft.Azure.WebJobs.Script.Models;
1918
using Microsoft.Azure.WebJobs.Script.Workers.Rpc;
2019
using Microsoft.Extensions.Logging;
2120
using Microsoft.Extensions.Options;
2221
using Microsoft.WebJobs.Script.Tests;
2322
using Moq;
2423
using Newtonsoft.Json.Linq;
25-
using NuGet.Versioning;
2624
using Xunit;
2725

2826
namespace Microsoft.Azure.WebJobs.Script.Tests
@@ -531,7 +529,6 @@ public void ValidateFunctionName_DoesNotThrowOnValidName(string functionName)
531529
[Theory]
532530
[InlineData(null)]
533531
[InlineData("")]
534-
[InlineData("_binding")]
535532
[InlineData("binding-test")]
536533
[InlineData("binding name")]
537534
public void ValidateBinding_InvalidName_Throws(string bindingName)
@@ -546,10 +543,22 @@ public void ValidateBinding_InvalidName_Throws(string bindingName)
546543
Utility.ValidateBinding(bindingMetadata);
547544
});
548545

549-
Assert.Equal($"The binding name {bindingName} is invalid. Please assign a valid name to the binding.", ex.Message);
546+
Assert.Equal($"The binding name {bindingName} is invalid. Please assign a valid name to the binding. See https://aka.ms/azure-functions-binding-name-rules for more details.", ex.Message);
550547
}
551548

552549
[Theory]
550+
[InlineData("__")]
551+
[InlineData("__binding")]
552+
[InlineData("binding__")]
553+
[InlineData("bind__ing")]
554+
[InlineData("__binding__")]
555+
[InlineData("_binding")]
556+
[InlineData("binding_")]
557+
[InlineData("_binding_")]
558+
[InlineData("_another_binding_test_")]
559+
[InlineData("long_binding_name_that_is_valid")]
560+
[InlineData("binding_name")]
561+
[InlineData("_")]
553562
[InlineData("bindingName")]
554563
[InlineData("binding1")]
555564
[InlineData(ScriptConstants.SystemReturnParameterBindingName)]

test/WebJobs.Script.Tests/WorkerFunctionMetadataProviderTests.cs

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -85,7 +85,6 @@ public void ValidateBindings_NoTriggerBinding_Throws()
8585
[Theory]
8686
[InlineData(null)]
8787
[InlineData("")]
88-
[InlineData("_binding")]
8988
[InlineData("binding-test")]
9089
[InlineData("binding name")]
9190
public void ValidateBindings_InvalidName_Throws(string bindingName)
@@ -100,10 +99,22 @@ public void ValidateBindings_InvalidName_Throws(string bindingName)
10099
_workerFunctionMetadataProvider.ValidateBindings(rawBindings, functionMetadata);
101100
});
102101

103-
Assert.Equal($"The binding name {bindingName} is invalid. Please assign a valid name to the binding.", ex.Message);
102+
Assert.Equal($"The binding name {bindingName} is invalid. Please assign a valid name to the binding. See https://aka.ms/azure-functions-binding-name-rules for more details.", ex.Message);
104103
}
105104

106105
[Theory]
106+
[InlineData("__")]
107+
[InlineData("__binding")]
108+
[InlineData("binding__")]
109+
[InlineData("bind__ing")]
110+
[InlineData("__binding__")]
111+
[InlineData("_binding")]
112+
[InlineData("binding_")]
113+
[InlineData("_binding_")]
114+
[InlineData("_another_binding_test_")]
115+
[InlineData("long_binding_name_that_is_valid")]
116+
[InlineData("binding_name")]
117+
[InlineData("_")]
107118
[InlineData("bindingName")]
108119
[InlineData("binding1")]
109120
[InlineData(ScriptConstants.SystemReturnParameterBindingName)]

0 commit comments

Comments
 (0)