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
1 change: 1 addition & 0 deletions release_notes.md
Original file line number Diff line number Diff line change
@@ -14,3 +14,4 @@
- Fix modification of ISO strings during the parsing of function metadata bindings.
- This fixes the listener errors related to the CosmosDB trigger's `StartFromTime` parameter. (#10735)
- Updated `WebJobs.Script` to target .NET 8 (instead of .NET Standard 2.1)
- Allow for binding names to use snake case (#10764). Examples include `_`, `binding_name`, and `_binding`.
8 changes: 0 additions & 8 deletions src/WebJobs.Script/Host/HostFunctionMetadataProvider.cs
Original file line number Diff line number Diff line change
@@ -116,14 +116,6 @@ private FunctionMetadata ReadFunctionMetadata(string functionDirectory, IFileSys
}
}

internal void ValidateName(string name, bool isProxy = false)
{
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)
{
2 changes: 1 addition & 1 deletion src/WebJobs.Script/Utility.cs
Original file line number Diff line number Diff line change
@@ -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)));

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

[Theory]
[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)
5 changes: 4 additions & 1 deletion test/WebJobs.Script.Tests/UtilityTests.cs
Original file line number Diff line number Diff line change
@@ -531,7 +531,7 @@ public void ValidateFunctionName_DoesNotThrowOnValidName(string functionName)
[Theory]
[InlineData(null)]
[InlineData("")]
[InlineData("_binding")]
[InlineData("__binding__")]
[InlineData("binding-test")]
[InlineData("binding name")]
public void ValidateBinding_InvalidName_Throws(string bindingName)
@@ -550,6 +550,9 @@ public void ValidateBinding_InvalidName_Throws(string bindingName)
}

[Theory]
[InlineData("_binding")]
[InlineData("binding_name")]
[InlineData("_")]
[InlineData("bindingName")]
[InlineData("binding1")]
[InlineData(ScriptConstants.SystemReturnParameterBindingName)]
Original file line number Diff line number Diff line change
@@ -85,7 +85,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)
@@ -104,6 +104,9 @@ public void ValidateBindings_InvalidName_Throws(string bindingName)
}

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