public object GetSnapshot(SnapshotId snapshotId) { if (!File.Exists(snapshotId.FilePath)) { return(null); } var fullSnapshot = JObjectHelper.ParseFromString(File.ReadAllText(snapshotId.FilePath)); if (snapshotId.PrimaryId == null && snapshotId.SecondaryId == null) { return(fullSnapshot); } if (snapshotId.PrimaryId != null && fullSnapshot.TryGetValue(snapshotId.PrimaryId, out var partialSnapshot)) { if (snapshotId.SecondaryId != null && partialSnapshot is JObject partialSnapshotJObject && partialSnapshotJObject.TryGetValue(snapshotId.SecondaryId, out partialSnapshot)) { return(partialSnapshot); } return(partialSnapshot); } return(null); }
public object SanitiseSnapshot(object snapshot) { try { if (snapshot is string stringSnapshot) { if (StringIsJsonObject(stringSnapshot)) { try { return(JObjectHelper.ParseFromString(stringSnapshot)); } catch (Exception e) { throw new MalformedJsonSnapshotException(e); } } } JObjectHelper.FromObject(snapshot); return(snapshot); } catch (ArgumentException) { return(new { AutoGenerated = snapshot }); } }
public bool CompareSnapshots(object oldSnap, object newSnap) { var old = JObjectHelper.FromObject(oldSnap); var @new = JObjectHelper.FromObject(newSnap); @new = JObjectHelper.ParseFromString(@new.ToString()); return(JToken.DeepEquals(old, @new)); }
public static string GetDiffMessage(object currentSnapshot, object newSnapshot) { var currentSnapshotJObject = JObjectHelper.FromObject(currentSnapshot); var newSnapshotJObject = JObjectHelper.FromObject(newSnapshot); var dmp = new diff_match_patch(); var a = dmp.diff_linesToChars(currentSnapshotJObject.ToString(), newSnapshotJObject.ToString()); var lineText1 = (string)a[0]; var lineText2 = (string)a[1]; var lineArray = (List <string>)a[2]; var diffs = dmp.diff_main(lineText1, lineText2, false); dmp.diff_charsToLines(diffs, lineArray); dmp.diff_cleanupEfficiency(diffs); var builder = new StringBuilder(Environment.NewLine); builder.AppendLine("Snapshots do not match"); builder.AppendLine(RemovedLegendString); builder.AppendLine(AddedLegendString); builder.AppendLine(Environment.NewLine); for (var i = 0; i < diffs.Count; i++) { var diff = diffs[i]; var lines = GetLines(diff.text); switch (diff.operation) { case Operation.DELETE: lines.ForEach(l => builder.AppendLine($"- {l}")); break; case Operation.INSERT: lines.ForEach(l => builder.AppendLine($"+ {l}")); break; case Operation.EQUAL: GetEqualLines(lines, i == 0, i == diffs.Count - 1).ForEach(l => builder.AppendLine(l)); break; } } return(builder.ToString()); }
public void StoreSnapshot(SnapshotId snapshotId, object value) { Directory.CreateDirectory(Path.GetDirectoryName(snapshotId.FilePath)); var newSnapshot = JObjectHelper.FromObject(value); JToken newSnapshotToWrite; if (snapshotId.PrimaryId == null && snapshotId.SecondaryId == null) { newSnapshotToWrite = newSnapshot; } else { var rawSnapshotContent = GetRawSnapshotContent(snapshotId.FilePath); newSnapshotToWrite = rawSnapshotContent == null ? new JObject() : JObject.Parse(rawSnapshotContent); if (snapshotId.PrimaryId != null && snapshotId.SecondaryId == null) { newSnapshotToWrite[snapshotId.PrimaryId] = newSnapshot; } else if (snapshotId.PrimaryId != null && snapshotId.SecondaryId != null) { var firstLevel = newSnapshotToWrite[snapshotId.PrimaryId]; if (firstLevel == null) { newSnapshotToWrite[snapshotId.PrimaryId] = new JObject(); } newSnapshotToWrite[snapshotId.PrimaryId][snapshotId.SecondaryId] = newSnapshot; } } File.WriteAllText(snapshotId.FilePath, newSnapshotToWrite.ToString()); }