Skip to content

Commit

Permalink
Add id convention (#433)
Browse files Browse the repository at this point in the history
  • Loading branch information
SimonCropp authored Nov 3, 2021
1 parent 4c3d771 commit c46fc43
Show file tree
Hide file tree
Showing 11 changed files with 183 additions and 59 deletions.
16 changes: 16 additions & 0 deletions docs/mdsource/serializer-settings.source.md
Original file line number Diff line number Diff line change
Expand Up @@ -140,6 +140,22 @@ Results in the following:

snippet: SerializationTests.NumericIdScrubbing.verified.txt


### Convention

A custom "is member a numeric Id" convention is supported.

To define a convention use:

snippet: TreatAsNumericId

To define a convention globally use:

snippet: TreatAsNumericIdGlobal


### Disable

To disable this globally use:

snippet: DisableNumericId
Expand Down
4 changes: 2 additions & 2 deletions docs/named-tuples.md
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ static (bool Member1, string Member2, string Member3) MethodWithNamedTuple()
return (true, "A", "B");
}
```
<sup><a href='/src/Verify.Tests/Serialization/SerializationTests.cs#L925-L932' title='Snippet source file'>snippet source</a> | <a href='#snippet-methodwithnamedtuple' title='Start of snippet'>anchor</a></sup>
<sup><a href='/src/Verify.Tests/Serialization/SerializationTests.cs#L963-L970' title='Snippet source file'>snippet source</a> | <a href='#snippet-methodwithnamedtuple' title='Start of snippet'>anchor</a></sup>
<!-- endSnippet -->

Can be verified:
Expand All @@ -31,7 +31,7 @@ Can be verified:
```cs
await Verifier.VerifyTuple(() => MethodWithNamedTuple());
```
<sup><a href='/src/Verify.Tests/Serialization/SerializationTests.cs#L918-L922' title='Snippet source file'>snippet source</a> | <a href='#snippet-verifytuple' title='Start of snippet'>anchor</a></sup>
<sup><a href='/src/Verify.Tests/Serialization/SerializationTests.cs#L956-L960' title='Snippet source file'>snippet source</a> | <a href='#snippet-verifytuple' title='Start of snippet'>anchor</a></sup>
<!-- endSnippet -->

Resulting in:
Expand Down
10 changes: 5 additions & 5 deletions docs/scrubbers.md
Original file line number Diff line number Diff line change
Expand Up @@ -56,7 +56,7 @@ For example remove lines containing `text`:
```cs
verifySettings.ScrubLines(line => line.Contains("text"));
```
<sup><a href='/src/Verify.Tests/Serialization/SerializationTests.cs#L808-L812' title='Snippet source file'>snippet source</a> | <a href='#snippet-scrublines' title='Start of snippet'>anchor</a></sup>
<sup><a href='/src/Verify.Tests/Serialization/SerializationTests.cs#L846-L850' title='Snippet source file'>snippet source</a> | <a href='#snippet-scrublines' title='Start of snippet'>anchor</a></sup>
<!-- endSnippet -->


Expand All @@ -71,7 +71,7 @@ For example remove lines containing `text1` or `text2`
```cs
verifySettings.ScrubLinesContaining("text1", "text2");
```
<sup><a href='/src/Verify.Tests/Serialization/SerializationTests.cs#L814-L818' title='Snippet source file'>snippet source</a> | <a href='#snippet-scrublinescontaining' title='Start of snippet'>anchor</a></sup>
<sup><a href='/src/Verify.Tests/Serialization/SerializationTests.cs#L852-L856' title='Snippet source file'>snippet source</a> | <a href='#snippet-scrublinescontaining' title='Start of snippet'>anchor</a></sup>
<!-- endSnippet -->

Case insensitive by default (StringComparison.OrdinalIgnoreCase).
Expand All @@ -83,7 +83,7 @@ Case insensitive by default (StringComparison.OrdinalIgnoreCase).
```cs
verifySettings.ScrubLinesContaining(StringComparison.Ordinal, "text1", "text2");
```
<sup><a href='/src/Verify.Tests/Serialization/SerializationTests.cs#L820-L824' title='Snippet source file'>snippet source</a> | <a href='#snippet-scrublinescontainingordinal' title='Start of snippet'>anchor</a></sup>
<sup><a href='/src/Verify.Tests/Serialization/SerializationTests.cs#L858-L862' title='Snippet source file'>snippet source</a> | <a href='#snippet-scrublinescontainingordinal' title='Start of snippet'>anchor</a></sup>
<!-- endSnippet -->


Expand All @@ -98,7 +98,7 @@ For example converts lines to upper case:
```cs
verifySettings.ScrubLinesWithReplace(line => line.ToUpper());
```
<sup><a href='/src/Verify.Tests/Serialization/SerializationTests.cs#L826-L830' title='Snippet source file'>snippet source</a> | <a href='#snippet-scrublineswithreplace' title='Start of snippet'>anchor</a></sup>
<sup><a href='/src/Verify.Tests/Serialization/SerializationTests.cs#L864-L868' title='Snippet source file'>snippet source</a> | <a href='#snippet-scrublineswithreplace' title='Start of snippet'>anchor</a></sup>
<!-- endSnippet -->


Expand All @@ -111,7 +111,7 @@ Replaces `Environment.MachineName` with `TheMachineName`.
```cs
verifySettings.ScrubMachineName();
```
<sup><a href='/src/Verify.Tests/Serialization/SerializationTests.cs#L832-L836' title='Snippet source file'>snippet source</a> | <a href='#snippet-scrubmachinename' title='Start of snippet'>anchor</a></sup>
<sup><a href='/src/Verify.Tests/Serialization/SerializationTests.cs#L870-L874' title='Snippet source file'>snippet source</a> | <a href='#snippet-scrubmachinename' title='Start of snippet'>anchor</a></sup>
<!-- endSnippet -->


Expand Down
116 changes: 83 additions & 33 deletions docs/serializer-settings.md

Large diffs are not rendered by default.

2 changes: 1 addition & 1 deletion readme.md
Original file line number Diff line number Diff line change
Expand Up @@ -335,7 +335,7 @@ public Task VerifyJsonJToken()
return Verifier.VerifyJson(target);
}
```
<sup><a href='/src/Verify.Tests/Serialization/SerializationTests.cs#L1677-L1702' title='Snippet source file'>snippet source</a> | <a href='#snippet-verifyjson' title='Start of snippet'>anchor</a></sup>
<sup><a href='/src/Verify.Tests/Serialization/SerializationTests.cs#L1715-L1740' title='Snippet source file'>snippet source</a> | <a href='#snippet-verifyjson' title='Start of snippet'>anchor</a></sup>
<!-- endSnippet -->

Results in:
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
{
TheProperty: 5
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
{
TheProperty: 5
}
56 changes: 47 additions & 9 deletions src/Verify.Tests/Serialization/SerializationTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -262,25 +262,45 @@ void AddExtraSettingsGlobal()
#endregion
}

#region DisableNumericId
#region TreatAsNumericId

[Fact]
public Task NumericIdScrubbingDisabled()
public Task TreatAsNumericId()
{
var target = new
var target = new IdConventionTarget
{
Id = 5,
OtherId = 5,
YetAnotherId = 4,
PossibleNullId = (int?)5,
ActualNullId = (int?)null
TheProperty = 5
};
return Verifier.Verify(target)
.ModifySerialization(settings => settings.DontScrubNumericIds());
.ModifySerialization(
settings => settings.TreatAsNumericId(
member => member.Name == "TheProperty"));
}

#endregion

#region TreatAsNumericIdGlobal

[Fact]
public Task TreatAsNumericIdGlobal()
{
VerifierSettings.ModifySerialization(
settings => settings.TreatAsNumericId(
member => member.Name == "TheProperty"));
var target = new IdConventionTarget
{
TheProperty = 5
};
return Verifier.Verify(target);
}

#endregion

public class IdConventionTarget
{
public int TheProperty { get; set; }
}

#region DisableNumericIdGlobal

[Fact]
Expand All @@ -298,6 +318,24 @@ public Task NumericIdScrubbingDisabledGlobal()
});
}

#endregion
#region DisableNumericId

[Fact]
public Task NumericIdScrubbingDisabled()
{
var target = new
{
Id = 5,
OtherId = 5,
YetAnotherId = 4,
PossibleNullId = (int?)5,
ActualNullId = (int?)null
};
return Verifier.Verify(target)
.ModifySerialization(settings => settings.DontScrubNumericIds());
}

#endregion

#region NumericId
Expand Down
19 changes: 11 additions & 8 deletions src/Verify/Serialization/CustomContractResolver.cs
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ class CustomContractResolver :
bool ignoreFalse;
bool includeObsoletes;
bool scrubNumericIds;
IsNumericId isNumericId;
IReadOnlyDictionary<Type, List<string>> ignoredMembers;
IReadOnlyList<string> ignoredByNameMembers;
IReadOnlyList<Type> ignoredTypes;
Expand All @@ -23,6 +24,7 @@ public CustomContractResolver(
bool ignoreFalse,
bool includeObsoletes,
bool scrubNumericIds,
IsNumericId isNumericId,
IReadOnlyDictionary<Type, List<string>> ignoredMembers,
IReadOnlyList<string> ignoredByNameMembers,
IReadOnlyList<Type> ignoredTypes,
Expand All @@ -35,6 +37,7 @@ public CustomContractResolver(
this.ignoreFalse = ignoreFalse;
this.includeObsoletes = includeObsoletes;
this.scrubNumericIds = scrubNumericIds;
this.isNumericId = isNumericId;
this.ignoredMembers = ignoredMembers;
this.ignoredByNameMembers = ignoredByNameMembers;
this.ignoredTypes = ignoredTypes;
Expand Down Expand Up @@ -163,15 +166,15 @@ protected override JsonProperty CreateProperty(MemberInfo member, MemberSerializ
return property;
}

if (scrubNumericIds && member.Name.EndsWith("Id"))
var underlyingType = Nullable.GetUnderlyingType(propertyType) ?? propertyType;
if (
underlyingType == typeof(int) ||
underlyingType == typeof(long) ||
underlyingType == typeof(uint) ||
underlyingType == typeof(ulong)
)
{
var underlyingType = Nullable.GetUnderlyingType(propertyType) ?? propertyType;
if (
underlyingType == typeof(int) ||
underlyingType == typeof(long) ||
underlyingType == typeof(uint) ||
underlyingType == typeof(ulong)
)
if (scrubNumericIds && isNumericId(member))
{
property.Converter = new IdConverter();
return property;
Expand Down
3 changes: 3 additions & 0 deletions src/Verify/Serialization/IsNumericId.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
namespace VerifyTests;

public delegate bool IsNumericId(MemberInfo member);
10 changes: 9 additions & 1 deletion src/Verify/Serialization/SerializationSettings.cs
Original file line number Diff line number Diff line change
Expand Up @@ -109,7 +109,14 @@ public void DontScrubDateTimes()
scrubDateTimes = false;
}

bool scrubNumericIds= true;
bool scrubNumericIds = true;

private IsNumericId isNumericId = member => member.Name.EndsWith("Id");

public void TreatAsNumericId(IsNumericId isNumericId)
{
this.isNumericId = isNumericId;
}

public void DontScrubNumericIds()
{
Expand Down Expand Up @@ -137,6 +144,7 @@ JsonSerializerSettings BuildSettings()
ignoreFalse,
includeObsoletes,
scrubNumericIds,
isNumericId,
ignoredMembers,
ignoredByNameMembers,
ignoreMembersWithType,
Expand Down

0 comments on commit c46fc43

Please sign in to comment.