Skip to content

Commit ef9f28f

Browse files
authored
Merge pull request #15 from Research-Institute/v0.1.3
dasherize names over camel case
2 parents 31d2414 + d3d939a commit ef9f28f

File tree

6 files changed

+49
-12
lines changed

6 files changed

+49
-12
lines changed

JsonApiDotNetCore/Abstractions/JsonApiContext.cs

+1-1
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ public Type GetJsonApiResourceType()
3030
public string GetEntityName()
3131
{
3232
return (!(Route is RelationalRoute) ? Route.BaseRouteDefinition.ContextPropertyName
33-
: Configuration.Routes.Single(r => r.ModelType == ((RelationalRoute)Route).RelationalType).ContextPropertyName).ToCamelCase();
33+
: Configuration.Routes.Single(r => r.ModelType == ((RelationalRoute)Route).RelationalType).ContextPropertyName).Dasherize();
3434
}
3535

3636
public Type GetEntityType()

JsonApiDotNetCore/Abstractions/ModelAccessor.cs

+1-1
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ public static Type GetTypeFromModelRelationshipName(Type modelType, string relat
1414
{
1515
var properties = modelType.GetProperties().Where(propertyInfo => propertyInfo.GetMethod.IsVirtual).ToList();
1616
var relationshipType = properties.FirstOrDefault(
17-
virtualProperty => virtualProperty.Name.ToCamelCase() == relationshipName.ToCamelCase())?.PropertyType;
17+
virtualProperty => virtualProperty.Name.Dasherize() == relationshipName.Dasherize())?.PropertyType;
1818
if(relationshipType.GetTypeInfo().IsGenericType)
1919
{
2020
return relationshipType.GetGenericArguments().Single();

JsonApiDotNetCore/Data/ResourceRepository.cs

+1-1
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ public object Get(string id)
4141
private object GetRelated(string id, RelationalRoute relationalRoute)
4242
{
4343
var entity = GetEntityById(relationalRoute.BaseModelType, id, relationalRoute.RelationshipName);
44-
return relationalRoute.BaseModelType.GetProperties().FirstOrDefault(pi => pi.Name.ToCamelCase() == relationalRoute.RelationshipName.ToCamelCase())?.GetValue(entity);
44+
return relationalRoute.BaseModelType.GetProperties().FirstOrDefault(pi => pi.Name.Dasherize() == relationalRoute.RelationshipName.Dasherize())?.GetValue(entity);
4545
}
4646

4747
private IQueryable GetDbSet(Type modelType, string includedRelationship)

JsonApiDotNetCore/Extensions/StringExtensions.cs

+31-8
Original file line numberDiff line numberDiff line change
@@ -1,26 +1,49 @@
11
using System;
2+
using System.Text;
23

34
namespace JsonApiDotNetCore.Extensions
45
{
56
public static class StringExtensions
67
{
78
public static string ToCamelCase(this string str)
89
{
9-
var splittedPhraseChars = str.ToCharArray();
10-
if (splittedPhraseChars.Length > 0)
10+
var chars = str.ToCharArray();
11+
if (chars.Length > 0)
1112
{
12-
splittedPhraseChars[0] = new string(splittedPhraseChars[0], 1).ToLower().ToCharArray()[0];
13-
return new String(splittedPhraseChars);
13+
chars[0] = new string(chars[0], 1).ToLower().ToCharArray()[0];
14+
return new String(chars);
1415
}
1516
return str;
1617
}
18+
1719
public static string ToProperCase(this string str)
1820
{
19-
var splittedPhraseChars = str.ToCharArray();
20-
if (splittedPhraseChars.Length > 0)
21+
var chars = str.ToCharArray();
22+
if (chars.Length > 0)
23+
{
24+
chars[0] = new string(chars[0], 1).ToUpper().ToCharArray()[0];
25+
return new String(chars);
26+
}
27+
return str;
28+
}
29+
30+
public static string Dasherize(this string str)
31+
{
32+
var chars = str.ToCharArray();
33+
if (chars.Length > 0)
2134
{
22-
splittedPhraseChars[0] = new string(splittedPhraseChars[0], 1).ToUpper().ToCharArray()[0];
23-
return new String(splittedPhraseChars);
35+
var builder = new StringBuilder();
36+
for(var i = 0; i < chars.Length; i++)
37+
{
38+
if(char.IsUpper(chars[i])) {
39+
var hashedString = (i > 0) ? $"-{char.ToLower(chars[i])}" : $"{char.ToLower(chars[i])}";
40+
builder.Append(hashedString);
41+
}
42+
else {
43+
builder.Append(chars[i]);
44+
}
45+
}
46+
return builder.ToString();
2447
}
2548
return str;
2649
}

JsonApiDotNetCore/JsonApi/DocumentBuilder.cs

+1-1
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,7 @@ private Dictionary<string, object> BuildRelationshipsObject(IJsonApiResource res
7373
_context.GetEntityType().GetProperties().Where(propertyInfo => propertyInfo.GetMethod.IsVirtual).ToList().ForEach(
7474
virtualProperty =>
7575
{
76-
relationships.Add(virtualProperty.Name, GetRelationshipLinks(resource, virtualProperty.Name.ToCamelCase()));
76+
relationships.Add(virtualProperty.Name.Dasherize(), GetRelationshipLinks(resource, virtualProperty.Name.Dasherize().Dasherize()));
7777
});
7878
return relationships;
7979
}

JsonApiDotNetCoreTests/Extensions/UnitTests/StringExtensionsTests.cs

+14
Original file line numberDiff line numberDiff line change
@@ -28,5 +28,19 @@ public void ToProperCase_ConvertsString_ToProperCase(string input, string expect
2828
// assert
2929
Assert.Equal(expectedOutput, result);
3030
}
31+
32+
[Theory]
33+
[InlineData("todoItem", "todo-item")]
34+
[InlineData("TodoItem", "todo-item")]
35+
[InlineData("TodoItemS", "todo-item-s")]
36+
public void Dasherize_Converts_StringToDashed(string input, string expectedOutput)
37+
{
38+
// arrange
39+
// act
40+
var result = input.Dasherize();
41+
42+
// assert
43+
Assert.Equal(expectedOutput, result);
44+
}
3145
}
3246
}

0 commit comments

Comments
 (0)