Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Allow snake case for binding names #10764

Merged
merged 13 commits into from
Feb 6, 2025
18 changes: 7 additions & 11 deletions src/WebJobs.Script/Description/FunctionDescriptorProvider.cs
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
using System.Reflection;
using System.Reflection.Emit;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Mvc.ModelBinding.Metadata;
using Microsoft.Azure.WebJobs.Script.Binding;
using Microsoft.Azure.WebJobs.Script.Extensibility;
using Microsoft.Azure.WebJobs.Script.Extensions;
Expand Down Expand Up @@ -184,7 +185,12 @@ protected internal virtual void ValidateFunction(FunctionMetadata functionMetada
HashSet<string> names = new HashSet<string>(StringComparer.OrdinalIgnoreCase);
foreach (var binding in functionMetadata.Bindings)
{
ValidateBinding(binding);
Utility.ValidateBinding(binding);

if (binding.Type == null)
{
throw new ArgumentException($"Binding '{binding.Name}' is invalid. Bindings must specify a Type.");
}

// Ensure no duplicate binding names
if (names.Contains(binding.Name))
Expand Down Expand Up @@ -212,16 +218,6 @@ protected internal virtual void ValidateFunction(FunctionMetadata functionMetada
}
}

protected internal virtual void ValidateBinding(BindingMetadata bindingMetadata)
{
Utility.ValidateBinding(bindingMetadata);

if (bindingMetadata.Type == null)
{
throw new ArgumentException($"Binding '{bindingMetadata.Name}' is invalid. Bindings must specify a Type.");
}
}

protected static void ApplyMethodLevelAttributes(FunctionMetadata functionMetadata, BindingMetadata triggerMetadata, Collection<CustomAttributeBuilder> methodAttributes)
{
if (Utility.IsHttporManualTrigger(triggerMetadata.Type))
Expand Down
8 changes: 0 additions & 8 deletions src/WebJobs.Script/Host/HostFunctionMetadataProvider.cs
Original file line number Diff line number Diff line change
Expand Up @@ -116,14 +116,6 @@ private FunctionMetadata ReadFunctionMetadata(string functionDirectory, IFileSys
}
}

internal void ValidateName(string name, bool isProxy = false)
satvu marked this conversation as resolved.
Show resolved Hide resolved
{
if (!Utility.IsValidFunctionName(name))
{
throw new InvalidOperationException(string.Format("'{0}' is not a valid {1} name.", name, isProxy ? "proxy" : "function"));
}
}

internal static FunctionMetadata ParseFunctionMetadata(string functionName, JObject configMetadata, string scriptDirectory, IFileSystem fileSystem,
IEnumerable<RpcWorkerConfig> workerConfigs, string functionsWorkerRuntime)
{
Expand Down
2 changes: 1 addition & 1 deletion src/WebJobs.Script/Utility.cs
Original file line number Diff line number Diff line change
Expand Up @@ -57,7 +57,7 @@ public static class Utility
#endif

private static readonly Regex FunctionNameValidationRegex = new Regex(@"^[a-z][a-z0-9_\-]{0,127}$(?<!^host$)", RegexOptions.IgnoreCase | RegexOptions.CultureInvariant);
private static readonly Regex BindingNameValidationRegex = new Regex(string.Format("^([a-zA-Z][a-zA-Z0-9]{{0,127}}|{0})$", Regex.Escape(ScriptConstants.SystemReturnParameterBindingName)));
private static readonly Regex BindingNameValidationRegex = new Regex(string.Format("^(?!.*__)([a-zA-Z_][a-zA-Z0-9_]{{0,127}}|{0})$", Regex.Escape(ScriptConstants.SystemReturnParameterBindingName)));
mathewc marked this conversation as resolved.
Show resolved Hide resolved

private static readonly string UTF8ByteOrderMark = Encoding.UTF8.GetString(Encoding.UTF8.GetPreamble());
private static readonly FilteredExpandoObjectConverter _filteredExpandoObjectConverter = new FilteredExpandoObjectConverter();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -203,54 +203,6 @@ public async Task CreateTriggerParameter_WithNoBindingMatch_ThrowsExpectedExcept
Assert.Contains("someInvalidTrigger", ex.Message);
}

[Theory]
satvu marked this conversation as resolved.
Show resolved Hide resolved
[InlineData(null)]
[InlineData("")]
[InlineData("_binding")]
[InlineData("binding-test")]
[InlineData("binding name")]
public void ValidateBinding_InvalidName_Throws(string bindingName)
{
BindingMetadata bindingMetadata = new BindingMetadata
{
Name = bindingName
};

var ex = Assert.Throws<ArgumentException>(() =>
{
_provider.ValidateBinding(bindingMetadata);
});

Assert.Equal($"The binding name {bindingName} is invalid. Please assign a valid name to the binding.", ex.Message);
}

[Theory]
[InlineData("bindingName")]
[InlineData("binding1")]
[InlineData(ScriptConstants.SystemReturnParameterBindingName)]
public void ValidateBinding_ValidName_DoesNotThrow(string bindingName)
{
BindingMetadata bindingMetadata = new BindingMetadata
{
Name = bindingName,
Type = "Blob"
};

if (bindingMetadata.IsReturn)
{
bindingMetadata.Direction = BindingDirection.Out;
}

try
{
_provider.ValidateBinding(bindingMetadata);
}
catch (ArgumentException)
{
Assert.True(false, $"Valid binding name '{bindingName}' failed validation.");
}
}

protected virtual void Dispose(bool disposing)
{
if (disposing)
Expand Down
5 changes: 4 additions & 1 deletion test/WebJobs.Script.Tests/UtilityTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -531,7 +531,7 @@ public void ValidateFunctionName_DoesNotThrowOnValidName(string functionName)
[Theory]
[InlineData(null)]
[InlineData("")]
[InlineData("_binding")]
[InlineData("__binding__")]
satvu marked this conversation as resolved.
Show resolved Hide resolved
[InlineData("binding-test")]
[InlineData("binding name")]
public void ValidateBinding_InvalidName_Throws(string bindingName)
Expand All @@ -550,6 +550,9 @@ public void ValidateBinding_InvalidName_Throws(string bindingName)
}

[Theory]
[InlineData("_binding")]
mathewc marked this conversation as resolved.
Show resolved Hide resolved
[InlineData("binding_name")]
[InlineData("_")]
mathewc marked this conversation as resolved.
Show resolved Hide resolved
[InlineData("bindingName")]
[InlineData("binding1")]
[InlineData(ScriptConstants.SystemReturnParameterBindingName)]
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -69,7 +69,7 @@ public void ValidateBindings_NoTriggerBinding_Throws()
[Theory]
[InlineData(null)]
[InlineData("")]
[InlineData("_binding")]
[InlineData("__binding__")]
[InlineData("binding-test")]
[InlineData("binding name")]
public void ValidateBindings_InvalidName_Throws(string bindingName)
Expand All @@ -88,6 +88,9 @@ public void ValidateBindings_InvalidName_Throws(string bindingName)
}

[Theory]
[InlineData("binding_name")]
[InlineData("_")]
[InlineData("_binding")]
[InlineData("bindingName")]
[InlineData("binding1")]
[InlineData(ScriptConstants.SystemReturnParameterBindingName)]
Expand Down
Loading