hana 1.3.0 → 1.3.1
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.
- checksums.yaml +4 -4
- data/lib/hana.rb +9 -7
- data/test/helper.rb +5 -1
- data/test/json-patch-tests/README.md +30 -5
- data/test/json-patch-tests/spec_tests.json +4 -3
- data/test/json-patch-tests/tests.json +87 -3
- metadata +1 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: ccb71fa0fbe43f9887bd8a7f3a1b5ad9273acbcb
|
4
|
+
data.tar.gz: 807c25b1c8b8dcc67ce9f109799224f91bff37ad
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 44ebd19bc18f9aac58a3e22d97ef0af22249bd2d559d5b25e876d0054fd12c5d4ed4bc8def868da96c71d1655809006578d6ca3bfe0931c3abf42b00549154b0
|
7
|
+
data.tar.gz: f8882b84a664e16bb252138a101af07640c3dbcd33c037ed777d33838815a1b7c458c710b3877ca1abd39c484cea61981b4e63ace77c6d495a1ca02a808c4f61
|
data/lib/hana.rb
CHANGED
@@ -1,5 +1,5 @@
|
|
1
1
|
module Hana
|
2
|
-
VERSION = '1.3.
|
2
|
+
VERSION = '1.3.1'
|
3
3
|
|
4
4
|
class Pointer
|
5
5
|
include Enumerable
|
@@ -88,7 +88,7 @@ module Hana
|
|
88
88
|
list = Pointer.parse ins[PATH]
|
89
89
|
key = list.pop
|
90
90
|
dest = Pointer.eval list, doc
|
91
|
-
obj = ins
|
91
|
+
obj = ins.fetch VALUE
|
92
92
|
|
93
93
|
raise(MissingTargetException, ins[PATH]) unless dest
|
94
94
|
|
@@ -101,7 +101,7 @@ module Hana
|
|
101
101
|
end
|
102
102
|
|
103
103
|
def move ins, doc
|
104
|
-
from = Pointer.parse ins
|
104
|
+
from = Pointer.parse ins.fetch FROM
|
105
105
|
to = Pointer.parse ins[PATH]
|
106
106
|
from_key = from.pop
|
107
107
|
key = to.pop
|
@@ -114,7 +114,7 @@ module Hana
|
|
114
114
|
end
|
115
115
|
|
116
116
|
def copy ins, doc
|
117
|
-
from = Pointer.parse ins
|
117
|
+
from = Pointer.parse ins.fetch FROM
|
118
118
|
to = Pointer.parse ins[PATH]
|
119
119
|
from_key = from.pop
|
120
120
|
key = to.pop
|
@@ -135,7 +135,7 @@ module Hana
|
|
135
135
|
def test ins, doc
|
136
136
|
expected = Pointer.new(ins[PATH]).eval doc
|
137
137
|
|
138
|
-
unless expected == ins
|
138
|
+
unless expected == ins.fetch(VALUE)
|
139
139
|
raise FailedTestException.new(ins[VALUE], ins[PATH])
|
140
140
|
end
|
141
141
|
doc
|
@@ -146,11 +146,13 @@ module Hana
|
|
146
146
|
key = list.pop
|
147
147
|
obj = Pointer.eval list, doc
|
148
148
|
|
149
|
+
return ins.fetch VALUE unless key
|
150
|
+
|
149
151
|
if Array === obj
|
150
152
|
raise Patch::IndexError unless key =~ /\A\d+\Z/
|
151
|
-
obj[key.to_i] = ins
|
153
|
+
obj[key.to_i] = ins.fetch VALUE
|
152
154
|
else
|
153
|
-
obj[key] = ins
|
155
|
+
obj[key] = ins.fetch VALUE
|
154
156
|
end
|
155
157
|
doc
|
156
158
|
end
|
data/test/helper.rb
CHANGED
@@ -49,7 +49,11 @@ module Hana
|
|
49
49
|
[Hana::Patch::IndexError, Hana::Patch::ObjectOperationOnArrayException]
|
50
50
|
when /bad number$/ then
|
51
51
|
[Hana::Patch::IndexError, Hana::Patch::ObjectOperationOnArrayException]
|
52
|
-
when /missing|
|
52
|
+
when /missing '(from|value)' parameter/ then
|
53
|
+
[KeyError]
|
54
|
+
when /Unrecognized op 'spam'/ then
|
55
|
+
[Hana::Patch::Exception]
|
56
|
+
when /missing|non-existent/ then
|
53
57
|
[Hana::Patch::MissingTargetException]
|
54
58
|
else
|
55
59
|
[Hana::Patch::FailedTestException]
|
@@ -1,8 +1,9 @@
|
|
1
1
|
JSON Patch Tests
|
2
2
|
================
|
3
3
|
|
4
|
-
These are test cases for implementations of
|
5
|
-
|
4
|
+
These are test cases for implementations of [IETF JSON Patch (RFC6902)](http://tools.ietf.org/html/rfc6902).
|
5
|
+
|
6
|
+
Some implementations can be found at [jsonpatch.com](http://jsonpatch.com).
|
6
7
|
|
7
8
|
|
8
9
|
Test Format
|
@@ -21,7 +22,30 @@ test record is an object with the following members:
|
|
21
22
|
All fields except 'doc' and 'patch' are optional. Test records consisting only
|
22
23
|
of a comment are also OK.
|
23
24
|
|
24
|
-
|
25
|
+
|
26
|
+
Files
|
27
|
+
-----
|
28
|
+
|
29
|
+
- tests.json: the main test file
|
30
|
+
- spec_tests.json: tests from the RFC6902 spec
|
31
|
+
|
32
|
+
|
33
|
+
Writing Tests
|
34
|
+
-------------
|
35
|
+
|
36
|
+
All tests should have a descriptive comment. Tests should be as
|
37
|
+
simple as possible - just what's required to test a specific piece of
|
38
|
+
behavior. If you want to test interacting behaviors, create tests for
|
39
|
+
each behavior as well as the interaction.
|
40
|
+
|
41
|
+
If an 'error' member is specified, the error text should describe the
|
42
|
+
error the implementation should raise - *not* what's being tested.
|
43
|
+
Implementation error strings will vary, but the suggested error should
|
44
|
+
be easily matched to the implementation error string. Try to avoid
|
45
|
+
creating error tests that might pass because an incorrect error was
|
46
|
+
reported.
|
47
|
+
|
48
|
+
Please feel free to contribute!
|
25
49
|
|
26
50
|
|
27
51
|
Credits
|
@@ -35,7 +59,7 @@ extended by [Mike McCabe](https://github.com/mikemccabe).
|
|
35
59
|
License
|
36
60
|
-------
|
37
61
|
|
38
|
-
Copyright
|
62
|
+
Copyright 2014 The Authors
|
39
63
|
|
40
64
|
Licensed under the Apache License, Version 2.0 (the "License");
|
41
65
|
you may not use this file except in compliance with the License.
|
@@ -47,4 +71,5 @@ License
|
|
47
71
|
distributed under the License is distributed on an "AS IS" BASIS,
|
48
72
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
49
73
|
See the License for the specific language governing permissions and
|
50
|
-
limitations under the License.
|
74
|
+
limitations under the License.
|
75
|
+
|
@@ -174,14 +174,14 @@
|
|
174
174
|
},
|
175
175
|
|
176
176
|
{
|
177
|
-
"comment": "A.12. Adding to a Non-
|
177
|
+
"comment": "A.12. Adding to a Non-existent Target",
|
178
178
|
"doc": {
|
179
179
|
"foo": "bar"
|
180
180
|
},
|
181
181
|
"patch": [
|
182
182
|
{ "op": "add", "path": "/baz/bat", "value": "qux" }
|
183
183
|
],
|
184
|
-
"error": "add to a non-
|
184
|
+
"error": "add to a non-existent target"
|
185
185
|
},
|
186
186
|
|
187
187
|
{
|
@@ -192,7 +192,8 @@
|
|
192
192
|
"patch": [
|
193
193
|
{ "op": "add", "path": "/baz", "value": "qux", "op": "remove" }
|
194
194
|
],
|
195
|
-
"error": "operation has two 'op' members"
|
195
|
+
"error": "operation has two 'op' members",
|
196
|
+
"disabled": true
|
196
197
|
},
|
197
198
|
|
198
199
|
{
|
@@ -171,6 +171,11 @@
|
|
171
171
|
"expected": ["foo", ["bar", "baz"]],
|
172
172
|
"comment": "value in array replace not flattened" },
|
173
173
|
|
174
|
+
{ "comment": "replace whole document",
|
175
|
+
"doc": {"foo": "bar"},
|
176
|
+
"patch": [{"op": "replace", "path": "", "value": {"baz": "qux"}}],
|
177
|
+
"expected": {"baz": "qux"} },
|
178
|
+
|
174
179
|
{ "comment": "spurious patch properties",
|
175
180
|
"doc": {"foo": 1},
|
176
181
|
"patch": [{"op": "test", "path": "/foo", "value": 1, "spurious": 1}],
|
@@ -196,8 +201,6 @@
|
|
196
201
|
"patch": [{"op": "test", "path": "/foo", "value": [1, 2]}],
|
197
202
|
"error": "test op should fail" },
|
198
203
|
|
199
|
-
{ "comment": "json-pointer tests" },
|
200
|
-
|
201
204
|
{ "comment": "Whole document",
|
202
205
|
"doc": { "foo": 1 },
|
203
206
|
"patch": [{"op": "test", "path": "", "value": {"foo": 1}}],
|
@@ -263,5 +266,86 @@
|
|
263
266
|
"patch": [ { "op": "add", "path": "/2/1/-", "value": { "foo": [ "bar", "baz" ] } } ],
|
264
267
|
"expected": [ 1, 2, [ 3, [ 4, 5, { "foo": [ "bar", "baz" ] } ] ] ]},
|
265
268
|
|
266
|
-
{ "comment": "
|
269
|
+
{ "comment": "test remove with bad number should fail",
|
270
|
+
"doc": {"foo": 1, "baz": [{"qux": "hello"}]},
|
271
|
+
"patch": [{"op": "remove", "path": "/baz/1e0/qux"}],
|
272
|
+
"error": "remove op shouldn't remove from array with bad number" },
|
273
|
+
|
274
|
+
{ "comment": "test remove on array",
|
275
|
+
"doc": [1, 2, 3, 4],
|
276
|
+
"patch": [{"op": "remove", "path": "/0"}],
|
277
|
+
"expected": [2, 3, 4] },
|
278
|
+
|
279
|
+
{ "comment": "test repeated removes",
|
280
|
+
"doc": [1, 2, 3, 4],
|
281
|
+
"patch": [{ "op": "remove", "path": "/1" },
|
282
|
+
{ "op": "remove", "path": "/2" }],
|
283
|
+
"expected": [1, 3] },
|
284
|
+
|
285
|
+
{ "comment": "test remove with bad index should fail",
|
286
|
+
"doc": [1, 2, 3, 4],
|
287
|
+
"patch": [{"op": "remove", "path": "/1e0"}],
|
288
|
+
"error": "remove op shouldn't remove from array with bad number" },
|
289
|
+
|
290
|
+
{ "comment": "test replace with bad number should fail",
|
291
|
+
"doc": [""],
|
292
|
+
"patch": [{"op": "replace", "path": "/1e0", "value": false}],
|
293
|
+
"error": "replace op shouldn't replace in array with bad number" },
|
294
|
+
|
295
|
+
{ "comment": "test copy with bad number should fail",
|
296
|
+
"doc": {"baz": [1,2,3], "bar": 1},
|
297
|
+
"patch": [{"op": "copy", "from": "/baz/1e0", "path": "/boo"}],
|
298
|
+
"error": "copy op shouldn't work with bad number" },
|
299
|
+
|
300
|
+
{ "comment": "test move with bad number should fail",
|
301
|
+
"doc": {"foo": 1, "baz": [1,2,3,4]},
|
302
|
+
"patch": [{"op": "move", "from": "/baz/1e0", "path": "/foo"}],
|
303
|
+
"error": "move op shouldn't work with bad number" },
|
304
|
+
|
305
|
+
{ "comment": "test add with bad number should fail",
|
306
|
+
"doc": ["foo", "sil"],
|
307
|
+
"patch": [{"op": "add", "path": "/1e0", "value": "bar"}],
|
308
|
+
"error": "add op shouldn't add to array with bad number" },
|
309
|
+
|
310
|
+
{ "comment": "missing 'value' parameter to add",
|
311
|
+
"doc": [ 1 ],
|
312
|
+
"patch": [ { "op": "add", "path": "/-" } ],
|
313
|
+
"error": "missing 'value' parameter" },
|
314
|
+
|
315
|
+
{ "comment": "missing 'value' parameter to replace",
|
316
|
+
"doc": [ 1 ],
|
317
|
+
"patch": [ { "op": "replace", "path": "/0" } ],
|
318
|
+
"error": "missing 'value' parameter" },
|
319
|
+
|
320
|
+
{ "comment": "missing 'value' parameter to test",
|
321
|
+
"doc": [ null ],
|
322
|
+
"patch": [ { "op": "test", "path": "/0" } ],
|
323
|
+
"error": "missing 'value' parameter" },
|
324
|
+
|
325
|
+
{ "comment": "missing value parameter to test - where undef is falsy",
|
326
|
+
"doc": [ false ],
|
327
|
+
"patch": [ { "op": "test", "path": "/0" } ],
|
328
|
+
"error": "missing 'value' parameter" },
|
329
|
+
|
330
|
+
{ "comment": "missing from parameter to copy",
|
331
|
+
"doc": [ 1 ],
|
332
|
+
"patch": [ { "op": "copy", "path": "/-" } ],
|
333
|
+
"error": "missing 'from' parameter" },
|
334
|
+
|
335
|
+
{ "comment": "missing from parameter to move",
|
336
|
+
"doc": { "foo": 1 },
|
337
|
+
"patch": [ { "op": "move", "path": "" } ],
|
338
|
+
"error": "missing 'from' parameter" },
|
339
|
+
|
340
|
+
{ "comment": "duplicate ops",
|
341
|
+
"doc": { "foo": "bar" },
|
342
|
+
"patch": [ { "op": "add", "path": "/baz", "value": "qux",
|
343
|
+
"op": "move", "from":"/foo" } ],
|
344
|
+
"error": "patch has two 'op' members",
|
345
|
+
"disabled": true },
|
346
|
+
|
347
|
+
{ "comment": "unrecognized op should fail",
|
348
|
+
"doc": {"foo": 1},
|
349
|
+
"patch": [{"op": "spam", "path": "/foo", "value": 1}],
|
350
|
+
"error": "Unrecognized op 'spam'" }
|
267
351
|
]
|