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
Expand Up @@ -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
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
5 changes: 2 additions & 3 deletions src/WebJobs.Script/Utility.cs
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,6 @@
using System.IO;
using System.IO.Abstractions;
using System.Linq;
using System.Net;
using System.Net.Http.Headers;
using System.Reflection;
using System.Text;
Expand Down Expand Up @@ -57,7 +56,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();
Expand Down Expand Up @@ -591,7 +590,7 @@ public static void ValidateBinding(BindingMetadata bindingMetadata)
{
if (bindingMetadata.Name == null || !BindingNameValidationRegex.IsMatch(bindingMetadata.Name))
{
throw new ArgumentException($"The binding name {bindingMetadata.Name} is invalid. Please assign a valid name to the binding.");
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.");
satvu marked this conversation as resolved.
Show resolved Hide resolved
}

if (bindingMetadata.IsReturn && bindingMetadata.Direction != BindingDirection.Out)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,15 +4,13 @@
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Diagnostics.Metrics;
using System.IO;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.Azure.WebJobs.Script.Binding;
using Microsoft.Azure.WebJobs.Script.Description;
using Microsoft.Azure.WebJobs.Script.Extensibility;
using Microsoft.Azure.WebJobs.Script.Metrics;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.Options;
Expand Down Expand Up @@ -206,7 +204,6 @@ public async Task CreateTriggerParameter_WithNoBindingMatch_ThrowsExpectedExcept
[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)
Expand All @@ -221,10 +218,22 @@ public void ValidateBinding_InvalidName_Throws(string bindingName)
_provider.ValidateBinding(bindingMetadata);
});

Assert.Equal($"The binding name {bindingName} is invalid. Please assign a valid name to the binding.", ex.Message);
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);
}

[Theory]
[InlineData("__")]
[InlineData("__binding")]
[InlineData("binding__")]
[InlineData("bind__ing")]
[InlineData("__binding__")]
[InlineData("_binding")]
[InlineData("binding_")]
[InlineData("_binding_")]
[InlineData("_another_binding_test_")]
[InlineData("long_binding_name_that_is_valid")]
[InlineData("binding_name")]
[InlineData("_")]
[InlineData("bindingName")]
[InlineData("binding1")]
[InlineData(ScriptConstants.SystemReturnParameterBindingName)]
Expand Down
17 changes: 13 additions & 4 deletions test/WebJobs.Script.Tests/UtilityTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -14,15 +14,13 @@
using Microsoft.Azure.WebJobs.Script.Config;
using Microsoft.Azure.WebJobs.Script.Description;
using Microsoft.Azure.WebJobs.Script.Diagnostics;
using Microsoft.Azure.WebJobs.Script.ExtensionBundle;
using Microsoft.Azure.WebJobs.Script.Models;
using Microsoft.Azure.WebJobs.Script.Workers.Rpc;
using Microsoft.Extensions.Logging;
using Microsoft.Extensions.Options;
using Microsoft.WebJobs.Script.Tests;
using Moq;
using Newtonsoft.Json.Linq;
using NuGet.Versioning;
using Xunit;

namespace Microsoft.Azure.WebJobs.Script.Tests
Expand Down Expand Up @@ -531,7 +529,6 @@ public void ValidateFunctionName_DoesNotThrowOnValidName(string functionName)
[Theory]
[InlineData(null)]
[InlineData("")]
[InlineData("_binding")]
[InlineData("binding-test")]
[InlineData("binding name")]
public void ValidateBinding_InvalidName_Throws(string bindingName)
Expand All @@ -546,10 +543,22 @@ public void ValidateBinding_InvalidName_Throws(string bindingName)
Utility.ValidateBinding(bindingMetadata);
});

Assert.Equal($"The binding name {bindingName} is invalid. Please assign a valid name to the binding.", ex.Message);
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);
}

[Theory]
[InlineData("__")]
[InlineData("__binding")]
[InlineData("binding__")]
[InlineData("bind__ing")]
[InlineData("__binding__")]
[InlineData("_binding")]
mathewc marked this conversation as resolved.
Show resolved Hide resolved
[InlineData("binding_")]
[InlineData("_binding_")]
[InlineData("_another_binding_test_")]
[InlineData("long_binding_name_that_is_valid")]
[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 @@ -85,7 +85,6 @@ public void ValidateBindings_NoTriggerBinding_Throws()
[Theory]
[InlineData(null)]
[InlineData("")]
[InlineData("_binding")]
[InlineData("binding-test")]
[InlineData("binding name")]
public void ValidateBindings_InvalidName_Throws(string bindingName)
Expand All @@ -100,10 +99,22 @@ public void ValidateBindings_InvalidName_Throws(string bindingName)
_workerFunctionMetadataProvider.ValidateBindings(rawBindings, functionMetadata);
});

Assert.Equal($"The binding name {bindingName} is invalid. Please assign a valid name to the binding.", ex.Message);
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);
}

[Theory]
[InlineData("__")]
[InlineData("__binding")]
[InlineData("binding__")]
[InlineData("bind__ing")]
[InlineData("__binding__")]
[InlineData("_binding")]
[InlineData("binding_")]
[InlineData("_binding_")]
[InlineData("_another_binding_test_")]
[InlineData("long_binding_name_that_is_valid")]
[InlineData("binding_name")]
[InlineData("_")]
[InlineData("bindingName")]
[InlineData("binding1")]
[InlineData(ScriptConstants.SystemReturnParameterBindingName)]
Expand Down
Loading