jsondiff 0.0.3 → 0.0.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/.gitmodules +6 -0
- data/README.md +4 -6
- data/lib/jsondiff/array_diff.rb +6 -6
- data/lib/jsondiff/version.rb +1 -1
- data/spec/diff_spec.rb +54 -5
- data/spec/spec_helper.rb +2 -0
- metadata +4 -3
data/.gitmodules
ADDED
data/README.md
CHANGED
@@ -4,12 +4,6 @@ A JSON patch generator in Ruby that is compliant to the JSON Patch specification
|
|
4
4
|
|
5
5
|
To apply a patch, you should use [hana](https://github.com/tenderlove/hana).
|
6
6
|
|
7
|
-
## Status
|
8
|
-
|
9
|
-
This is proof of concept only. Only example of the specification works.
|
10
|
-
|
11
|
-
As for now, it generate only patch with *add*, *remove* and *replace* operations.
|
12
|
-
|
13
7
|
## Install
|
14
8
|
|
15
9
|
gem install jsondiff
|
@@ -33,6 +27,10 @@ JsonDiff.generate({foo: :bar}, {foo: :plop})
|
|
33
27
|
|
34
28
|
## Changelog
|
35
29
|
|
30
|
+
- 0.0.4:
|
31
|
+
- Don't modify input objects
|
32
|
+
- Fix the order when removing entry in an array
|
33
|
+
- Add round trip tests with Hana and IETF tests
|
36
34
|
- 0.0.3:
|
37
35
|
- Allow to compare root Hash and Array.
|
38
36
|
- Performance improvements
|
data/lib/jsondiff/array_diff.rb
CHANGED
@@ -4,23 +4,23 @@ module JsonDiff
|
|
4
4
|
|
5
5
|
def self.generate(result, prefix, array1, array2)
|
6
6
|
if array1.size < array2.size
|
7
|
-
array2.each_with_index do |value, index|
|
7
|
+
array2[(array1.size..array2.size)].each_with_index do |value, index|
|
8
|
+
index += array1.size
|
8
9
|
if array1[index] != value
|
9
10
|
result << add_op(prefix, index, value)
|
10
|
-
array1.insert(index, value)
|
11
11
|
end
|
12
12
|
end
|
13
13
|
elsif array1.size > array2.size
|
14
|
-
array1.each_with_index do |value, index|
|
14
|
+
array1[(array2.size..array1.size)].reverse.each_with_index do |value, index|
|
15
|
+
index = array1.size - 1 - index
|
15
16
|
if array2[index] != value
|
16
17
|
result << remove_op(prefix, index)
|
17
|
-
array1.delete_at(index)
|
18
18
|
end
|
19
19
|
end
|
20
20
|
end
|
21
21
|
array2.each_with_index do |value, index|
|
22
|
-
if array1[index] != value
|
23
|
-
JsonDiff.generate(array1
|
22
|
+
if array1.size > index && array1[index] != value
|
23
|
+
JsonDiff.generate(array1[index], value, result, "#{prefix}/#{index}")
|
24
24
|
end
|
25
25
|
end
|
26
26
|
end
|
data/lib/jsondiff/version.rb
CHANGED
data/spec/diff_spec.rb
CHANGED
@@ -2,8 +2,14 @@ require_relative 'spec_helper'
|
|
2
2
|
|
3
3
|
describe JsonDiff do
|
4
4
|
describe "#generate" do
|
5
|
-
|
6
|
-
|
5
|
+
context "empty patch" do
|
6
|
+
it "on hash" do
|
7
|
+
subject.generate({}, {}).should == []
|
8
|
+
end
|
9
|
+
|
10
|
+
it "on array" do
|
11
|
+
subject.generate([], []).should == []
|
12
|
+
end
|
7
13
|
end
|
8
14
|
|
9
15
|
context "add op" do
|
@@ -15,8 +21,15 @@ describe JsonDiff do
|
|
15
21
|
|
16
22
|
it "on array element" do
|
17
23
|
subject.generate({foo: [:bar, :baz]},
|
24
|
+
{foo: [:bar, :baz, :qux]})
|
25
|
+
.should == [{ op: :add, path: "/foo/2", value: :qux }]
|
26
|
+
end
|
27
|
+
|
28
|
+
it "on multiple add in array elements" do
|
29
|
+
subject.generate({foo: [:bar]},
|
18
30
|
{foo: [:bar, :qux, :baz]})
|
19
|
-
.should == [{ op: :add, path: "/foo/1", value: :qux }
|
31
|
+
.should == [{ op: :add, path: "/foo/1", value: :qux },
|
32
|
+
{ op: :add, path: "/foo/2", value: :baz }]
|
20
33
|
end
|
21
34
|
|
22
35
|
it "on nested member object" do
|
@@ -52,9 +65,16 @@ describe JsonDiff do
|
|
52
65
|
end
|
53
66
|
|
54
67
|
it "on array element" do
|
55
|
-
subject.generate({foo: [:bar, :
|
68
|
+
subject.generate({foo: [:bar, :baz, :qux]},
|
56
69
|
{foo: [:bar, :baz]})
|
57
|
-
.should == [{ op: :remove, path: "/foo/
|
70
|
+
.should == [{ op: :remove, path: "/foo/2" }]
|
71
|
+
end
|
72
|
+
|
73
|
+
it "on multiple remove in array elements" do
|
74
|
+
subject.generate({foo: [:bar, :qux, :baz]},
|
75
|
+
{foo: [:bar]})
|
76
|
+
.should == [{ op: :remove, path: "/foo/2" },
|
77
|
+
{ op: :remove, path: "/foo/1" }]
|
58
78
|
end
|
59
79
|
end
|
60
80
|
|
@@ -90,4 +110,33 @@ describe JsonDiff do
|
|
90
110
|
end
|
91
111
|
end
|
92
112
|
end
|
113
|
+
|
114
|
+
# Adapted from hana
|
115
|
+
# https://github.com/tenderlove/hana/blob/master/test/test_ietf.rb
|
116
|
+
# Copyright (c) 2012 Aaron Patterson
|
117
|
+
context "from ietf" do
|
118
|
+
TESTDIR = File.dirname File.expand_path __FILE__
|
119
|
+
json = File.read File.join TESTDIR, 'json-patch-tests', 'tests.json'
|
120
|
+
tests = JSON.parse json
|
121
|
+
tests.each_with_index do |test, i|
|
122
|
+
next unless test['doc']
|
123
|
+
|
124
|
+
it "#{test['comment'] || i }" do
|
125
|
+
pending "disabled" if test['disabled']
|
126
|
+
|
127
|
+
doc = test['doc']
|
128
|
+
expected = test['expected']
|
129
|
+
|
130
|
+
if test['error']
|
131
|
+
pending "cannot run error test case"
|
132
|
+
elsif !expected
|
133
|
+
pending "cannot run test case without expectation"
|
134
|
+
else
|
135
|
+
patch = JSON.parse(subject.generate(doc, expected).to_json)
|
136
|
+
hana = Hana::Patch.new patch
|
137
|
+
hana.apply(doc).should == expected
|
138
|
+
end
|
139
|
+
end
|
140
|
+
end
|
141
|
+
end
|
93
142
|
end
|
data/spec/spec_helper.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: jsondiff
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.4
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -13,7 +13,7 @@ date: 2013-04-16 00:00:00.000000000 Z
|
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: rspec
|
16
|
-
requirement: &
|
16
|
+
requirement: &13856960 !ruby/object:Gem::Requirement
|
17
17
|
none: false
|
18
18
|
requirements:
|
19
19
|
- - ~>
|
@@ -21,7 +21,7 @@ dependencies:
|
|
21
21
|
version: 2.13.0
|
22
22
|
type: :development
|
23
23
|
prerelease: false
|
24
|
-
version_requirements: *
|
24
|
+
version_requirements: *13856960
|
25
25
|
description: Generate a JSON Patch from 2 ruby hash
|
26
26
|
email:
|
27
27
|
- francois@2metz.fr
|
@@ -29,6 +29,7 @@ executables: []
|
|
29
29
|
extensions: []
|
30
30
|
extra_rdoc_files: []
|
31
31
|
files:
|
32
|
+
- .gitmodules
|
32
33
|
- .travis.yml
|
33
34
|
- Gemfile
|
34
35
|
- Gemfile.lock
|