hana 1.1.0 → 1.2.0

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 5593991a2078ce9a518e6815df0eae13a5a6b016
4
- data.tar.gz: b03db1e4ec9245bde4757190b51ec19b5084a932
3
+ metadata.gz: b259b5422ec5303610246f9c0359dddab090f41d
4
+ data.tar.gz: 0e05b0271035942c551969550f2d6fc549d6d9c1
5
5
  SHA512:
6
- metadata.gz: 9a71e96247335c047ba05d71beb6eab4f65813e667c021b9e6a36769b0564d93a099326a1a06ac474dbf7a645978255ca4d193ada800e32837bcd7bf601edb0c
7
- data.tar.gz: 86379cd00f01187cd5e504ba301c1041170b36f05b6d1ef53c8025cea539577375edc3b4d6f69d94a6fefa60df1d61417ceccfa4792a882b4fcd6ad5f62718f8
6
+ metadata.gz: 4236a94452c5aa0672009813ab7082248fcd7a0be36bb23c372321da44134ff193f5beb6864a48383739e28eb430c8dd46d6533cbdbb89a0b10d8d5e65f78690
7
+ data.tar.gz: 330794b059b22dc3d2a088ff95eba30445f36fa8c08f13f2f959b92c4b74fab7c037385160b0b67b9b2c7f4413f83e3b487596525f03e09e8739be0ba211e77c
@@ -1,3 +1,7 @@
1
+ Wed May 22 19:28:10 2013 Aaron Patterson <aaron@tenderlovemaking.com>
2
+
3
+ * All IETF compliant
4
+
1
5
  Fri Sep 7 18:54:17 2012 Aaron Patterson <aaron@tenderlovemaking.com>
2
6
 
3
7
  * Bumping the version.
@@ -1,5 +1,5 @@
1
1
  module Hana
2
- VERSION = '1.1.0'
2
+ VERSION = '1.2.0'
3
3
 
4
4
  class Pointer
5
5
  include Enumerable
@@ -18,7 +18,13 @@ module Hana
18
18
  ESC = {'^/' => '/', '^^' => '^', '~0' => '~', '~1' => '/'} # :nodoc:
19
19
 
20
20
  def self.eval list, object
21
- list.inject(object) { |o, part| o[(Array === o ? part.to_i : part)] }
21
+ list.inject(object) { |o, part|
22
+ if Array === o
23
+ raise Patch::IndexException unless part =~ /\A\d+\Z/
24
+ part = part.to_i
25
+ end
26
+ o[part]
27
+ }
22
28
  end
23
29
 
24
30
  def self.parse path
@@ -50,6 +56,9 @@ module Hana
50
56
  class ObjectOperationOnArrayException < Exception
51
57
  end
52
58
 
59
+ class IndexException < Exception
60
+ end
61
+
53
62
  def initialize is
54
63
  @is = is
55
64
  end
@@ -72,7 +81,11 @@ module Hana
72
81
  dest = Pointer.eval list, doc
73
82
  obj = ins['value']
74
83
 
75
- add_op dest, key, obj
84
+ if key
85
+ add_op dest, key, obj
86
+ else
87
+ dest.replace obj
88
+ end
76
89
  end
77
90
 
78
91
  def move ins, doc
@@ -105,7 +118,11 @@ module Hana
105
118
  end
106
119
 
107
120
  def test ins, doc
108
- expected = Pointer.new(ins['path']).eval doc
121
+ begin
122
+ expected = Pointer.new(ins['path']).eval doc
123
+ rescue Patch::IndexException
124
+ raise FailedTestException.new(ins['value'], ins['path'])
125
+ end
109
126
 
110
127
  unless expected == ins['value']
111
128
  raise FailedTestException.new(ins['value'], ins['path'])
@@ -132,6 +149,8 @@ module Hana
132
149
  end
133
150
 
134
151
  def check_index obj, key
152
+ return -1 if key == '-'
153
+
135
154
  raise ObjectOperationOnArrayException unless key =~ /\A-?\d+\Z/
136
155
  idx = key.to_i
137
156
  raise OutOfBoundsException if idx > obj.length || idx < 0
@@ -1,4 +1,12 @@
1
1
  [
2
+ {
3
+ "comment": "4.1. add with missing object",
4
+ "doc": { "q": { "bar": 2 } },
5
+ "patch": [ {"op": "add", "path": "/a/b", "value": 1} ],
6
+ "error":
7
+ "path /a does not exist -- missing objects are not created recursively"
8
+ },
9
+
2
10
  {
3
11
  "comment": "A.1. Adding an Object Member",
4
12
  "doc": {
@@ -14,7 +22,7 @@
14
22
  },
15
23
 
16
24
  {
17
- "comment": "A.2. Adding an Array Element",
25
+ "comment": "A.2. Adding an Array Element",
18
26
  "doc": {
19
27
  "foo": [ "bar", "baz" ]
20
28
  },
@@ -58,7 +66,7 @@
58
66
  "doc": {
59
67
  "baz": "qux",
60
68
  "foo": "bar"
61
- },
69
+ },
62
70
  "patch": [
63
71
  { "op": "replace", "path": "/baz", "value": "boo" }
64
72
  ],
@@ -78,10 +86,10 @@
78
86
  "qux": {
79
87
  "corge": "grault"
80
88
  }
81
- },
89
+ },
82
90
  "patch": [
83
91
  { "op": "move", "from": "/foo/waldo", "path": "/qux/thud" }
84
- ],
92
+ ],
85
93
  "expected": {
86
94
  "foo": {
87
95
  "bar": "baz"
@@ -97,10 +105,10 @@
97
105
  "comment": "A.7. Moving an Array Element",
98
106
  "doc": {
99
107
  "foo": [ "all", "grass", "cows", "eat" ]
100
- },
108
+ },
101
109
  "patch": [
102
110
  { "op": "move", "from": "/foo/1", "path": "/foo/3" }
103
- ],
111
+ ],
104
112
  "expected": {
105
113
  "foo": [ "all", "cows", "eat", "grass" ]
106
114
  }
@@ -131,7 +139,7 @@
131
139
  "patch": [
132
140
  { "op": "test", "path": "/baz", "value": "bar" }
133
141
  ],
134
- "error": "string not equivalent"
142
+ "error": "string not equivalent"
135
143
  },
136
144
 
137
145
  {
@@ -150,21 +158,21 @@
150
158
  }
151
159
  }
152
160
  },
153
-
161
+
154
162
  {
155
163
  "comment": "A.11. Ignoring Unrecognized Elements",
156
164
  "doc": {
157
165
  "foo":"bar"
158
- },
166
+ },
159
167
  "patch": [
160
168
  { "op": "add", "path": "/baz", "value": "qux", "xyz": 123 }
161
169
  ],
162
170
  "expected": {
163
- "foo":"bar",
171
+ "foo":"bar",
164
172
  "baz":"qux"
165
173
  }
166
174
  },
167
-
175
+
168
176
  {
169
177
  "comment": "A.12. Adding to a Non-existant Target",
170
178
  "doc": {
@@ -175,9 +183,9 @@
175
183
  ],
176
184
  "error": "add to a non-existant target"
177
185
  },
178
-
186
+
179
187
  {
180
- "comment": "Invalid JSON Patch Document",
188
+ "comment": "A.13 Invalid JSON Patch Document",
181
189
  "doc": {
182
190
  "foo": "bar"
183
191
  },
@@ -186,18 +194,39 @@
186
194
  ],
187
195
  "error": "operation has two 'op' members"
188
196
  },
189
-
190
- {
191
- "comment": "~ Escape Ordering",
197
+
198
+ {
199
+ "comment": "A.14. ~ Escape Ordering",
192
200
  "doc": {
193
201
  "/": 9,
194
- "~1": 10
202
+ "~1": 10
195
203
  },
196
- "patch": [{"op": "test", "path": "/~01", "value":"10"}],
204
+ "patch": [{"op": "test", "path": "/~01", "value": 10}],
197
205
  "expected": {
198
206
  "/": 9,
199
- "~1": 10
207
+ "~1": 10
208
+ }
209
+ },
210
+
211
+ {
212
+ "comment": "A.15. Comparing Strings and Numbers",
213
+ "doc": {
214
+ "/": 9,
215
+ "~1": 10
216
+ },
217
+ "patch": [{"op": "test", "path": "/~01", "value": "10"}],
218
+ "error": "number is not equal to string"
219
+ },
220
+
221
+ {
222
+ "comment": "A.16. Adding an Array Value",
223
+ "doc": {
224
+ "foo": ["bar"]
225
+ },
226
+ "patch": [{ "op": "add", "path": "/foo/-", "value": ["abc", "def"] }],
227
+ "expected": {
228
+ "foo": ["bar", ["abc", "def"]]
200
229
  }
201
230
  }
202
-
203
- ]
231
+
232
+ ]
@@ -108,9 +108,19 @@
108
108
  "expected": ["bar", "foo", "sil"] },
109
109
 
110
110
  { "doc": ["foo", "sil"],
111
- "patch": [{"op":" add", "path": "/2", "value": "bar"}],
111
+ "patch": [{"op":"add", "path": "/2", "value": "bar"}],
112
112
  "expected": ["foo", "sil", "bar"] },
113
113
 
114
+ { "comment": "test against implementation-specific numeric parsing",
115
+ "doc": {"1e0": "foo"},
116
+ "patch": [{"op": "test", "path": "/1e0", "value": "foo"}],
117
+ "expected": {"1e0": "foo"} },
118
+
119
+ { "comment": "test with bad number should fail",
120
+ "doc": ["foo", "bar"],
121
+ "patch": [{"op": "test", "path": "/1e0", "value": "bar"}],
122
+ "error": "test op shouldn't get array element 1" },
123
+
114
124
  { "doc": ["foo", "sil"],
115
125
  "patch": [{"op": "add", "path": "/bar", "value": 42}],
116
126
  "error": "Object operation on array target" },
@@ -238,5 +248,20 @@
238
248
  "patch": [{"op": "copy", "from": "/baz/0", "path": "/boo"}],
239
249
  "expected": {"baz":[{"qux":"hello"}],"bar":1,"boo":{"qux":"hello"}} },
240
250
 
251
+ { "comment": "replacing the root of the document is possible with add",
252
+ "doc": {"foo": "bar"},
253
+ "patch": [{"op": "add", "path": "", "value": {"baz": "qux"}}],
254
+ "expected": {"baz":"qux"}},
255
+
256
+ { "comment": "Adding to \"/-\" adds to the end of the array",
257
+ "doc": [ 1, 2 ],
258
+ "patch": [ { "op": "add", "path": "/-", "value": { "foo": [ "bar", "baz" ] } } ],
259
+ "expected": [ 1, 2, { "foo": [ "bar", "baz" ] } ]},
260
+
261
+ { "comment": "Adding to \"/-\" adds to the end of the array, even n levels down",
262
+ "doc": [ 1, 2, [ 3, [ 4, 5 ] ] ],
263
+ "patch": [ { "op": "add", "path": "/2/1/-", "value": { "foo": [ "bar", "baz" ] } } ],
264
+ "expected": [ 1, 2, [ 3, [ 4, 5, { "foo": [ "bar", "baz" ] } ] ] ]},
265
+
241
266
  { "comment": "tests complete" }
242
267
  ]
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: hana
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.1.0
4
+ version: 1.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Aaron Patterson