Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -51,8 +51,6 @@ export function createModel(sdkContext: CSharpEmitterContext): CodeModel {
fixNamingConflicts(models, constants);

const clientModel: CodeModel = {
// To ensure deterministic library name, customers would need to set the package-name property as the ordering of the namespaces could change
// if the typespec is changed.
name: getClientNamespaceString(sdkContext)!,
apiVersions: rootApiVersions,
enums: enums,
Expand Down
15 changes: 12 additions & 3 deletions packages/http-client-csharp/emitter/src/lib/utils.ts
Original file line number Diff line number Diff line change
Expand Up @@ -144,22 +144,31 @@ export function getClientNamespaceString(context: CSharpEmitterContext): string
const packageName = context.emitContext.options["package-name"];
const serviceNamespaces = listAllServiceNamespaces(context);
const firstNamespace = serviceNamespaces.length > 0 ? serviceNamespaces[0] : undefined;
// namespace is not a public emitter option, but it is supported by TCGC
const namespaceOverride = (context.emitContext.options as any).namespace;

if (packageName) {
return getClientNamespaceStringHelper(packageName, firstNamespace);
return getClientNamespaceStringHelper(namespaceOverride, packageName, firstNamespace);
}

if (containsMultiServiceClient(context.sdkPackage.clients)) {
return getClientNamespaceStringHelper(context.sdkPackage.clients[0].namespace);
return getClientNamespaceStringHelper(
namespaceOverride,
context.sdkPackage.clients[0].namespace,
);
}

return getClientNamespaceStringHelper(undefined, firstNamespace);
return getClientNamespaceStringHelper(namespaceOverride, undefined, firstNamespace);
}

export function getClientNamespaceStringHelper(
namespaceOverride?: string,
packageName?: string,
namespace?: Namespace,
): string | undefined {
if (namespaceOverride) {
return namespaceOverride;
}
if (packageName) {
packageName = packageName
.replace(/-/g, ".")
Expand Down
42 changes: 41 additions & 1 deletion packages/http-client-csharp/emitter/test/Unit/utils.test.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,8 @@
import { listAllServiceNamespaces } from "@azure-tools/typespec-client-generator-core";
import * as childProcess from "child_process";
import { EventEmitter } from "events";
import { beforeEach, describe, expect, it, vi } from "vitest";
import { execCSharpGenerator } from "../../src/lib/utils.js";
import { execCSharpGenerator, getClientNamespaceStringHelper } from "../../src/lib/utils.js";
import { CSharpEmitterContext } from "../../src/sdk-context.js";
import {
createCSharpSdkContext,
Expand Down Expand Up @@ -84,3 +85,42 @@ describe("execCSharpGenerator tests", () => {
expect(result.exitCode).toBe(0);
});
});

describe("getClientNamespaceStringHelper", () => {
it("should return the formatted package name when namespace is undefined", () => {
expect(getClientNamespaceStringHelper(undefined, "client-plane-generated")).toBe(
"Client.Plane.Generated",
);
expect(getClientNamespaceStringHelper(undefined, "client-plane-Generated")).toBe(
"Client.Plane.Generated",
);
expect(getClientNamespaceStringHelper(undefined, "client-Plane-generated")).toBe(
"Client.Plane.Generated",
);
});

it("should handle dots in package name", () => {
expect(getClientNamespaceStringHelper(undefined, "client.plane.generated")).toBe(
"Client.Plane.Generated",
);
});

it("should return namespace override when provided", async () => {
expect(getClientNamespaceStringHelper("Namespace.Override", "Package.Name")).toBe(
"Namespace.Override",
);
});

it("should fallback to Namespace from spec when namespace and package are not provided", async () => {
const runner = await createEmitterTestHost();
const program = await typeSpecCompile(``, runner, { IsVersionNeeded: false });

const context = createEmitterContext(program);
const sdkContext = await createCSharpSdkContext(context);
const primaryNamespace = listAllServiceNamespaces(sdkContext)[0];

expect(getClientNamespaceStringHelper(undefined, undefined, primaryNamespace)).toBe(
"Azure.Csharp.Testing",
);
});
});
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ public class ModelReaderWriterContextDefinition : TypeProvider
private static readonly CSharpTypeNameComparer s_cSharpTypeNameComparer = new CSharpTypeNameComparer();
private static readonly TypeProviderTypeNameComparer s_typeProviderNameComparer = new TypeProviderTypeNameComparer();

internal static readonly string s_name = $"{ScmCodeModelGenerator.Instance.TypeFactory.ServiceName}Context";
internal static readonly string s_name = $"{RemovePeriods(ScmCodeModelGenerator.Instance.TypeFactory.PrimaryNamespace)}Context";

protected override string BuildName() => s_name;

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -435,7 +435,7 @@ public EnumCacheKey(InputEnumType enumType, TypeProvider? declaringType)
}

private string? _primaryNamespace;
internal string PrimaryNamespace => _primaryNamespace ??= GetCleanNameSpace(CodeModelGenerator.Instance.InputLibrary.InputNamespace.Name);
public string PrimaryNamespace => _primaryNamespace ??= GetCleanNameSpace(CodeModelGenerator.Instance.InputLibrary.InputNamespace.Name);

public string ServiceName => _serviceName ??= BuildServiceName();
private string? _serviceName;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ namespace Encode._Array
[ModelReaderWriterBuildable(typeof(NewlineDelimitedArrayProperty))]
[ModelReaderWriterBuildable(typeof(PipeDelimitedArrayProperty))]
[ModelReaderWriterBuildable(typeof(SpaceDelimitedArrayProperty))]
public partial class EncodeArrayContext : ModelReaderWriterContext
public partial class Encode_ArrayContext : ModelReaderWriterContext
{
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@
namespace _Type._Array
{
[ModelReaderWriterBuildable(typeof(InnerModel))]
public partial class TypeArrayContext : ModelReaderWriterContext
public partial class _Type_ArrayContext : ModelReaderWriterContext
{
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@
namespace _Type.Dictionary
{
[ModelReaderWriterBuildable(typeof(InnerModel))]
public partial class TypeDictionaryContext : ModelReaderWriterContext
public partial class _TypeDictionaryContext : ModelReaderWriterContext
{
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@

namespace _Type._Enum.Extensible
{
public partial class TypeEnumExtensibleContext : ModelReaderWriterContext
public partial class _Type_EnumExtensibleContext : ModelReaderWriterContext
{
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@

namespace _Type._Enum.Fixed
{
public partial class TypeEnumFixedContext : ModelReaderWriterContext
public partial class _Type_EnumFixedContext : ModelReaderWriterContext
{
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ namespace _Type.Model.Empty
[ModelReaderWriterBuildable(typeof(EmptyInput))]
[ModelReaderWriterBuildable(typeof(EmptyInputOutput))]
[ModelReaderWriterBuildable(typeof(EmptyOutput))]
public partial class TypeModelEmptyContext : ModelReaderWriterContext
public partial class _TypeModelEmptyContext : ModelReaderWriterContext
{
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ namespace _Type.Model.Inheritance.EnumDiscriminator
[ModelReaderWriterBuildable(typeof(Snake))]
[ModelReaderWriterBuildable(typeof(UnknownDog))]
[ModelReaderWriterBuildable(typeof(UnknownSnake))]
public partial class TypeModelInheritanceEnumDiscriminatorContext : ModelReaderWriterContext
public partial class _TypeModelInheritanceEnumDiscriminatorContext : ModelReaderWriterContext
{
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ namespace _Type.Model.Inheritance.NestedDiscriminator
[ModelReaderWriterBuildable(typeof(Shark))]
[ModelReaderWriterBuildable(typeof(UnknownFish))]
[ModelReaderWriterBuildable(typeof(UnknownShark))]
public partial class TypeModelInheritanceNestedDiscriminatorContext : ModelReaderWriterContext
public partial class _TypeModelInheritanceNestedDiscriminatorContext : ModelReaderWriterContext
{
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ namespace _Type.Model.Inheritance.NotDiscriminated
[ModelReaderWriterBuildable(typeof(Cat))]
[ModelReaderWriterBuildable(typeof(Pet))]
[ModelReaderWriterBuildable(typeof(Siamese))]
public partial class TypeModelInheritanceNotDiscriminatedContext : ModelReaderWriterContext
public partial class _TypeModelInheritanceNotDiscriminatedContext : ModelReaderWriterContext
{
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ namespace _Type.Model.Inheritance.Recursive
{
[ModelReaderWriterBuildable(typeof(Element))]
[ModelReaderWriterBuildable(typeof(Extension))]
public partial class TypeModelInheritanceRecursiveContext : ModelReaderWriterContext
public partial class _TypeModelInheritanceRecursiveContext : ModelReaderWriterContext
{
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ namespace _Type.Model.Inheritance.SingleDiscriminator
[ModelReaderWriterBuildable(typeof(TRex))]
[ModelReaderWriterBuildable(typeof(UnknownBird))]
[ModelReaderWriterBuildable(typeof(UnknownDinosaur))]
public partial class TypeModelInheritanceSingleDiscriminatorContext : ModelReaderWriterContext
public partial class _TypeModelInheritanceSingleDiscriminatorContext : ModelReaderWriterContext
{
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ namespace _Type.Model.Usage
[ModelReaderWriterBuildable(typeof(InputOutputRecord))]
[ModelReaderWriterBuildable(typeof(InputRecord))]
[ModelReaderWriterBuildable(typeof(OutputRecord))]
public partial class TypeModelUsageContext : ModelReaderWriterContext
public partial class _TypeModelUsageContext : ModelReaderWriterContext
{
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ namespace _Type.Model.Visibility
{
[ModelReaderWriterBuildable(typeof(ReadOnlyModel))]
[ModelReaderWriterBuildable(typeof(VisibilityModel))]
public partial class TypeModelVisibilityContext : ModelReaderWriterContext
public partial class _TypeModelVisibilityContext : ModelReaderWriterContext
{
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,7 @@ namespace _Type.Property.AdditionalProperties
[ModelReaderWriterBuildable(typeof(WidgetData0))]
[ModelReaderWriterBuildable(typeof(WidgetData1))]
[ModelReaderWriterBuildable(typeof(WidgetData2))]
public partial class TypePropertyAdditionalPropertiesContext : ModelReaderWriterContext
public partial class _TypePropertyAdditionalPropertiesContext : ModelReaderWriterContext
{
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ namespace _Type.Property.Nullable
[ModelReaderWriterBuildable(typeof(DurationProperty))]
[ModelReaderWriterBuildable(typeof(InnerModel))]
[ModelReaderWriterBuildable(typeof(StringProperty))]
public partial class TypePropertyNullableContext : ModelReaderWriterContext
public partial class _TypePropertyNullableContext : ModelReaderWriterContext
{
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ namespace _Type.Property.Optional
[ModelReaderWriterBuildable(typeof(UnionFloatLiteralProperty))]
[ModelReaderWriterBuildable(typeof(UnionIntLiteralProperty))]
[ModelReaderWriterBuildable(typeof(UnionStringLiteralProperty))]
public partial class TypePropertyOptionalContext : ModelReaderWriterContext
public partial class _TypePropertyOptionalContext : ModelReaderWriterContext
{
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@ namespace _Type.Property.ValueTypes
[ModelReaderWriterBuildable(typeof(UnknownDictProperty))]
[ModelReaderWriterBuildable(typeof(UnknownIntProperty))]
[ModelReaderWriterBuildable(typeof(UnknownStringProperty))]
public partial class TypePropertyValueTypesContext : ModelReaderWriterContext
public partial class _TypePropertyValueTypesContext : ModelReaderWriterContext
{
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@

namespace _Type.Scalar
{
public partial class TypeScalarContext : ModelReaderWriterContext
public partial class _TypeScalarContext : ModelReaderWriterContext
{
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ namespace _Type.Union.Discriminated
{
[ModelReaderWriterBuildable(typeof(Cat))]
[ModelReaderWriterBuildable(typeof(Dog))]
public partial class TypeUnionDiscriminatedContext : ModelReaderWriterContext
public partial class _TypeUnionDiscriminatedContext : ModelReaderWriterContext
{
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ namespace _Type.Union
[ModelReaderWriterBuildable(typeof(MixedLiteralsCases))]
[ModelReaderWriterBuildable(typeof(MixedTypesCases))]
[ModelReaderWriterBuildable(typeof(StringAndArrayCases))]
public partial class TypeUnionContext : ModelReaderWriterContext
public partial class _TypeUnionContext : ModelReaderWriterContext
{
}
}
Loading