Skip to content

Commit

Permalink
Allow snake case for binding names (#10764)
Browse files Browse the repository at this point in the history
  • Loading branch information
satvu authored Feb 6, 2025
1 parent fda8e41 commit 52bd774
Show file tree
Hide file tree
Showing 6 changed files with 42 additions and 21 deletions.
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)
{
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.");
}

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]
[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")]
[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
15 changes: 13 additions & 2 deletions test/WebJobs.Script.Tests/WorkerFunctionMetadataProviderTests.cs
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

0 comments on commit 52bd774

Please sign in to comment.