Skip to content

Commit

Permalink
Solves issue #24
Browse files Browse the repository at this point in the history
  • Loading branch information
mfidemraizer committed Dec 9, 2016
1 parent c9502ed commit 9369f53
Show file tree
Hide file tree
Showing 21 changed files with 83 additions and 49 deletions.
2 changes: 1 addition & 1 deletion TrackerDog.NuGet.Signed/TrackerDog.NuGet.Signed.nuproj
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@
<Import Project="$(NuProjPath)\NuProj.props" Condition="Exists('$(NuProjPath)\NuProj.props')" />
<PropertyGroup Label="Configuration">
<Id>TrackerDog.Signed</Id>
<Version>2.1.3</Version>
<Version>2.1.4</Version>
<Title>TrackerDog: A generic .NET object change tracker (SIGNED)</Title>
<Authors>Matías Fidemraizer</Authors>
<Owners>Matías Fidemraizer</Owners>
Expand Down
4 changes: 2 additions & 2 deletions TrackerDog.NuGet/TrackerDog.NuGet.nuproj
Original file line number Diff line number Diff line change
Expand Up @@ -20,13 +20,13 @@
<Import Project="$(NuProjPath)\NuProj.props" Condition="Exists('$(NuProjPath)\NuProj.props')" />
<PropertyGroup Label="Configuration">
<Id>TrackerDog</Id>
<Version>2.1.3</Version>
<Version>2.1.4</Version>
<Title>TrackerDog: A generic .NET object change tracker</Title>
<Authors>Matías Fidemraizer</Authors>
<Owners>Matías Fidemraizer</Owners>
<Summary>Track changes of any .NET object and full object graphs</Summary>
<Description>TrackerDog turns any .NET object or full object graph into a change-trackable object</Description>
<ReleaseNotes>See release notes here: https://github.com/mfidemraizer/trackerdog/releases/tag/v2.1.3</ReleaseNotes>
<ReleaseNotes>See release notes here: https://github.com/mfidemraizer/trackerdog/releases/tag/v2.1.4</ReleaseNotes>
<ProjectUrl>http://matiasfidemrazer.com/trackerdog/</ProjectUrl>
<LicenseUrl>https://github.com/mfidemraizer/trackerdog/blob/master/LICENSE</LicenseUrl>
<Copyright>Copyright © Matías Fidemraizer</Copyright>
Expand Down
4 changes: 2 additions & 2 deletions TrackerDog.Signed/Properties/AssemblyInfo.cs
Original file line number Diff line number Diff line change
Expand Up @@ -33,8 +33,8 @@
// You can specify all the values or you can default the Build and Revision Numbers
// by using the '*' as shown below:
// [assembly: AssemblyVersion("1.0.*")]
[assembly: AssemblyVersion("2.0.1.0")]
[assembly: AssemblyFileVersion("2.0.1.0")]
[assembly: AssemblyVersion("2.1.4.0")]
[assembly: AssemblyFileVersion("2.1.4.0")]

[assembly: InternalsVisibleTo(InternalsVisible.ToDynamicProxyGenAssembly2)]
[assembly: InternalsVisibleTo("TrackerDog.Test.Signed, PublicKey=00240000048000009400000006020000002400005253413100040000010001001ffcf2febdbe56c43afff66e091d7220aa0e53b1638c84e8ae732b444410137f0cc754459f5691f74313921820a490e8761982edac1f051ba141be96bb9f82b4ea4a80b6b87e8c99831fdb69473821dbda3622a8cd3c439ddf3b76cba5ff89809423b7e02ea2b55a12f2b2f5ce0ce377bb2bb4831ce02f7a71cce368e346ecba")]
7 changes: 3 additions & 4 deletions TrackerDog.Signed/TrackerDog.Signed.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -43,10 +43,6 @@
<HintPath>..\packages\Castle.Core.3.3.3\lib\net45\Castle.Core.dll</HintPath>
<Private>True</Private>
</Reference>
<Reference Include="FastMember, Version=1.0.0.9, Culture=neutral, processorArchitecture=MSIL">
<HintPath>..\packages\FastMember.1.1.0\lib\net40\FastMember.dll</HintPath>
<Private>True</Private>
</Reference>
<Reference Include="FastMember.Signed, Version=1.0.0.9, Culture=neutral, PublicKeyToken=9e8f22703bef9a29, processorArchitecture=MSIL">
<HintPath>..\packages\FastMember.Signed.1.1.0\lib\net40\FastMember.Signed.dll</HintPath>
<Private>True</Private>
Expand All @@ -72,6 +68,9 @@
<Compile Include="..\TrackerDog\ChangeTrackableObjectState.cs">
<Link>ChangeTrackableObjectState.cs</Link>
</Compile>
<Compile Include="..\TrackerDog\CollectionChangeTrackingContext.cs">
<Link>CollectionChangeTrackingContext.cs</Link>
</Compile>
<Compile Include="..\TrackerDog\CollectionHandling\CollectionChange.cs">
<Link>CollectionHandling\CollectionChange.cs</Link>
</Compile>
Expand Down
1 change: 0 additions & 1 deletion TrackerDog.Signed/packages.config
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<packages>
<package id="Castle.Core" version="3.3.3" targetFramework="net452" />
<package id="FastMember" version="1.1.0" targetFramework="net45" />
<package id="FastMember.Signed" version="1.1.0" targetFramework="net45" />
<package id="Newtonsoft.Json" version="9.0.1" targetFramework="net452" />
<package id="NuProj" version="0.11.14-beta" targetFramework="net45" developmentDependency="true" />
Expand Down
4 changes: 4 additions & 0 deletions TrackerDog.Test.Signed/TrackerDog.Test.Signed.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,10 @@
<AssemblyOriginatorKeyFile>TrackerDog.Test.snk</AssemblyOriginatorKeyFile>
</PropertyGroup>
<ItemGroup>
<Reference Include="AutoMapper, Version=5.2.0.0, Culture=neutral, PublicKeyToken=be96cd2c38ef1005, processorArchitecture=MSIL">
<HintPath>..\packages\AutoMapper.5.2.0\lib\net45\AutoMapper.dll</HintPath>
<Private>True</Private>
</Reference>
<Reference Include="Castle.Core, Version=3.3.0.0, Culture=neutral, PublicKeyToken=407dd0808d44fbdc, processorArchitecture=MSIL">
<HintPath>..\packages\Castle.Core.3.3.3\lib\net45\Castle.Core.dll</HintPath>
<Private>True</Private>
Expand Down
6 changes: 6 additions & 0 deletions TrackerDog.Test/ObjectContainer.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
namespace TrackerDog.Test
{
public class ObjectContainer<PayLoad>
{
}
}
9 changes: 7 additions & 2 deletions TrackerDog.Test/TrackerDog.Test.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -81,12 +81,16 @@
<WarningLevel>4</WarningLevel>
</PropertyGroup>
<ItemGroup>
<Reference Include="AutoMapper, Version=5.2.0.0, Culture=neutral, PublicKeyToken=be96cd2c38ef1005, processorArchitecture=MSIL">
<HintPath>..\packages\AutoMapper.5.2.0\lib\net45\AutoMapper.dll</HintPath>
<Private>True</Private>
</Reference>
<Reference Include="Castle.Core, Version=3.3.0.0, Culture=neutral, PublicKeyToken=407dd0808d44fbdc, processorArchitecture=MSIL">
<HintPath>..\packages\Castle.Core.3.3.3\lib\net45\Castle.Core.dll</HintPath>
<Private>True</Private>
</Reference>
<Reference Include="FastMember.Signed, Version=1.0.0.9, Culture=neutral, PublicKeyToken=9e8f22703bef9a29, processorArchitecture=MSIL">
<HintPath>..\packages\FastMember.Signed.1.1.0\lib\net40\FastMember.Signed.dll</HintPath>
<Reference Include="FastMember, Version=1.0.0.9, Culture=neutral, processorArchitecture=MSIL">
<HintPath>..\packages\FastMember.1.1.0\lib\net40\FastMember.dll</HintPath>
<Private>True</Private>
</Reference>
<Reference Include="Microsoft.CSharp" />
Expand Down Expand Up @@ -118,6 +122,7 @@
<Compile Include="InterfaceTrackingTest.cs" />
<Compile Include="CollectionTest.cs" />
<Compile Include="DynamicObjectTest.cs" />
<Compile Include="ObjectContainer.cs" />
<Compile Include="ProxyCreationTest.cs" />
<Compile Include="SimplePropertyTest.cs" />
<Compile Include="Properties\AssemblyInfo.cs" />
Expand Down
2 changes: 1 addition & 1 deletion TrackerDog.Test/packages.config
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<packages>
<package id="Castle.Core" version="3.3.3" targetFramework="net452" />
<package id="FastMember.Signed" version="1.1.0" targetFramework="net452" />
<package id="FastMember" version="1.1.0" targetFramework="net452" />
<package id="Newtonsoft.Json" version="9.0.1" targetFramework="net452" />
<package id="NuProj.Common" version="0.11.14-beta" targetFramework="net452" developmentDependency="true" />
<package id="System.Collections.Immutable" version="1.3.0" targetFramework="net452" />
Expand Down
12 changes: 12 additions & 0 deletions TrackerDog/CollectionChangeTrackingContext.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
using TrackerDog.Configuration;

namespace TrackerDog
{
internal sealed class CollectionChangeTrackingContext
{
/// <summary>
/// Gets associated change-tracking configuration
/// </summary>
public IObjectChangeTrackingConfiguration Configuration { get; set; }
}
}
2 changes: 2 additions & 0 deletions TrackerDog/IChangeTrackableCollection.cs
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,8 @@ internal interface IChangeTrackableCollection : INotifyCollectionChanged, IHasPa
/// </summary>
HashSet<object> RemovedItems { get; }

CollectionChangeTrackingContext GetChangeTrackingContext();

/// <summary>
/// Raises the collection changed event to let a change tracker be aware that the collection has changed.
/// </summary>
Expand Down
10 changes: 9 additions & 1 deletion TrackerDog/IChangeTrackableCollectionContract.cs
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
using System.Collections.Generic;
using System;
using System.Collections.Generic;
using System.Collections.Specialized;
using System.Diagnostics.Contracts;
using System.Linq;
Expand All @@ -19,6 +20,13 @@ internal abstract class IChangeTrackableCollectionContract : IChangeTrackableCol

public event NotifyCollectionChangedEventHandler CollectionChanged;

public CollectionChangeTrackingContext GetChangeTrackingContext()
{
Contract.Ensures(Contract.Result<CollectionChangeTrackingContext>() != null);

throw new NotImplementedException();
}

public void RaiseCollectionChanged(NotifyCollectionChangedAction action, IEnumerable<object> changedItems)
{
Contract.Requires(changedItems != null && changedItems.Count() > 0, "A collection change must change some item");
Expand Down
15 changes: 9 additions & 6 deletions TrackerDog/Mixins/ChangeTrackableCollectionMixin.cs
Original file line number Diff line number Diff line change
Expand Up @@ -8,28 +8,31 @@ namespace TrackerDog.Mixins
{
internal class ChangeTrackableCollectionMixin : IChangeTrackableCollection, IReadOnlyChangeTrackableCollection
{

private readonly static Guid _id = Guid.NewGuid();
private readonly HashSet<object> _addedItems = new HashSet<object>();
private readonly HashSet<object> _removedItems = new HashSet<object>();

public event NotifyCollectionChangedEventHandler CollectionChanged;

internal Guid Id => _id;
private CollectionChangeTrackingContext ChangeTrackingContext { get; } = new CollectionChangeTrackingContext();
public IChangeTrackableObject ParentObject { get; set; }
public PropertyInfo ParentObjectProperty { get; set; }
public IImmutableSet<object> AddedItems => _addedItems.ToImmutableHashSet();
public IImmutableSet<object> RemovedItems => _removedItems.ToImmutableHashSet();
HashSet<object> IChangeTrackableCollection.AddedItems => _addedItems;
HashSet<object> IChangeTrackableCollection.RemovedItems => _removedItems;

public CollectionChangeTrackingContext GetChangeTrackingContext() => ChangeTrackingContext;

public void RaiseCollectionChanged(NotifyCollectionChangedAction action, IEnumerable<object> changedItems)
{
if (CollectionChanged != null)
CollectionChanged
(
this,
new NotifyCollectionChangedEventArgs(action, changedItems.ToImmutableList())
);
CollectionChanged?.Invoke
(
this,
new NotifyCollectionChangedEventArgs(action, changedItems.ToImmutableList())
);
}

public override bool Equals(object obj)
Expand Down
9 changes: 1 addition & 8 deletions TrackerDog/ObjectChangeTrackingExtensions.cs
Original file line number Diff line number Diff line change
Expand Up @@ -253,10 +253,8 @@ public static IEnumerable ToUntrackedEnumerable(this IEnumerable enumerable, Typ
else
collectionTypeArguments.Add(enumerable.GetCollectionItemType());

IEnumerator collectionEnumerator = enumerable.GetEnumerator();
collectionEnumerator.MoveNext();
IObjectChangeTrackingConfiguration configuration = ((IChangeTrackableCollection)enumerable).GetChangeTrackingContext().Configuration;

IObjectChangeTrackingConfiguration configuration = ((IChangeTrackableObject)collectionEnumerator.Current).GetChangeTrackingContext().Configuration;
IEnumerable enumerableCopy =
(IEnumerable)configuration.Collections.GetImplementation(targetCollectionType)
.Value.Type.CreateInstanceWithGenericArgs(null, collectionTypeArguments.ToArray());
Expand Down Expand Up @@ -298,11 +296,6 @@ internal static object ToUntypedUntracked(this object some)
IProxyTargetAccessor proxyTargetAccessor = (IProxyTargetAccessor)trackable;
object target = proxyTargetAccessor.DynProxyGetTarget();

JsonSerializerSettings serializerSettings = new JsonSerializerSettings
{
ReferenceLoopHandling = ReferenceLoopHandling.Serialize
};

object unwrapped = target.CloneIt(some.GetType().GetActualTypeIfTrackable());

ObjectChangeTracker changeTracker = (ObjectChangeTracker)trackable.GetChangeTracker();
Expand Down
17 changes: 5 additions & 12 deletions TrackerDog/ObjectExtensions.cs
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using System;
using System.Dynamic;
using TrackerDog.Serialization.Json;

namespace TrackerDog
Expand All @@ -9,18 +9,11 @@ internal static class ObjectExtensions
{
public static object CloneIt(this object some, Type type)
{
JsonSerializerSettings serializerSettings = new JsonSerializerSettings
{
ReferenceLoopHandling = ReferenceLoopHandling.Ignore,
ContractResolver = new DynamicObjectContractResolver()
};
JsonSerializer serializer = new JsonSerializer();
serializer.ReferenceLoopHandling = ReferenceLoopHandling.Ignore;
serializer.ContractResolver = new DynamicObjectContractResolver();

if (some is IDynamicMetaObjectProvider)
serializerSettings.Converters.Add(new DynamicObjectWithDeclaredPropertiesConverter());

string json = JsonConvert.SerializeObject(some, serializerSettings);

return JsonConvert.DeserializeObject(json, type, serializerSettings);
return JObject.FromObject(some, serializer).ToObject(type, serializer);
}
}
}
4 changes: 2 additions & 2 deletions TrackerDog/Properties/AssemblyInfo.cs
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@
// You can specify all the values or you can default the Build and Revision Numbers
// by using the '*' as shown below:
// [assembly: AssemblyVersion("1.0.*")]
[assembly: AssemblyVersion("2.0.1.0")]
[assembly: AssemblyFileVersion("2.0.1.0")]
[assembly: AssemblyVersion("2.1.4.0")]
[assembly: AssemblyFileVersion("2.1.4.0")]
[assembly: InternalsVisibleTo("DynamicProxyGenAssembly2")]
[assembly: InternalsVisibleTo("TrackerDog.Test")]
Original file line number Diff line number Diff line change
@@ -1,6 +1,10 @@
using Newtonsoft.Json.Serialization;
using Newtonsoft.Json;
using Newtonsoft.Json.Serialization;
using System;
using System.Collections.Generic;
using System.Dynamic;
using System.Linq;
using System.Reflection;

namespace TrackerDog.Serialization.Json
{
Expand All @@ -15,6 +19,5 @@ protected override JsonContract CreateContract(Type objectType)

return base.CreateContract(objectType);
}

}
}
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,7 @@ public override void WriteJson(JsonWriter writer, object value, JsonSerializer s
&& !Attribute.IsDefined(p, typeof(JsonIgnoreAttribute))
).ToList();

JObject o = (JObject)JToken.FromObject(value);
JObject o = (JObject)JToken.FromObject(value, serializer);

foreach (PropertyInfo property in properties)
if (o[property.Name] == null)
Expand Down
4 changes: 3 additions & 1 deletion TrackerDog/TrackableObjectFactoryInternal.cs
Original file line number Diff line number Diff line change
Expand Up @@ -161,7 +161,9 @@ public object CreateForCollection(object some, IChangeTrackableObject parentObje
bool canTrackCollectionType = Configuration.CanTrackType(genericCollectionType);

ProxyGenerationOptions options = new ProxyGenerationOptions(new CollectionterceptionHook());
options.AddMixinInstance(new ChangeTrackableCollectionMixin());
ChangeTrackableCollectionMixin changeTrackingMixin = new ChangeTrackableCollectionMixin();
changeTrackingMixin.GetChangeTrackingContext().Configuration = Configuration;
options.AddMixinInstance(changeTrackingMixin);

KeyValuePair<Type, CollectionImplementation> collectionImplementationDetail
= Configuration.Collections.GetImplementation(parentObjectProperty.PropertyType);
Expand Down
9 changes: 7 additions & 2 deletions TrackerDog/TrackerDog.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -81,12 +81,16 @@
<Prefer32Bit>false</Prefer32Bit>
</PropertyGroup>
<ItemGroup>
<Reference Include="AutoMapper, Version=5.2.0.0, Culture=neutral, PublicKeyToken=be96cd2c38ef1005, processorArchitecture=MSIL">
<HintPath>..\packages\AutoMapper.5.2.0\lib\net45\AutoMapper.dll</HintPath>
<Private>True</Private>
</Reference>
<Reference Include="Castle.Core, Version=3.3.0.0, Culture=neutral, PublicKeyToken=407dd0808d44fbdc, processorArchitecture=MSIL">
<HintPath>..\packages\Castle.Core.3.3.3\lib\net45\Castle.Core.dll</HintPath>
<Private>True</Private>
</Reference>
<Reference Include="FastMember.Signed, Version=1.0.0.9, Culture=neutral, PublicKeyToken=9e8f22703bef9a29, processorArchitecture=MSIL">
<HintPath>..\packages\FastMember.Signed.1.1.0\lib\net40\FastMember.Signed.dll</HintPath>
<Reference Include="FastMember, Version=1.0.0.9, Culture=neutral, processorArchitecture=MSIL">
<HintPath>..\packages\FastMember.1.1.0\lib\net40\FastMember.dll</HintPath>
<Private>True</Private>
</Reference>
<Reference Include="Newtonsoft.Json, Version=9.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed, processorArchitecture=MSIL">
Expand All @@ -108,6 +112,7 @@
</ItemGroup>
<ItemGroup>
<Compile Include="ChangeTrackableObjectState.cs" />
<Compile Include="CollectionChangeTrackingContext.cs" />
<Compile Include="CollectionHandling\CollectionChange.cs" />
<Compile Include="CollectionHandling\CollectionChangeContext.cs" />
<Compile Include="Configuration\AttributeConfigurationBuilder.cs" />
Expand Down
2 changes: 1 addition & 1 deletion TrackerDog/packages.config
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<packages>
<package id="Castle.Core" version="3.3.3" targetFramework="net452" />
<package id="FastMember.Signed" version="1.1.0" targetFramework="net45" />
<package id="FastMember" version="1.1.0" targetFramework="net45" />
<package id="Newtonsoft.Json" version="9.0.1" targetFramework="net45" />
<package id="NuProj.Common" version="0.11.14-beta" targetFramework="net45" developmentDependency="true" />
<package id="System.Collections.Immutable" version="1.3.0" targetFramework="net45" />
Expand Down

0 comments on commit 9369f53

Please sign in to comment.