hana 1.3.6 → 1.3.7

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
  SHA256:
3
- metadata.gz: 5c03b78248bd570dcbfafd16008862ef61e649362caba2718e14379cdb91a0fb
4
- data.tar.gz: b06a607921faf55826ab2f975707eb7d109cbcf9199358bda1d995b4f284bf40
3
+ metadata.gz: 8f7c301531d8d60e3267883dc0cd34f1366151fd5b876a2439fb296a971248ee
4
+ data.tar.gz: 8aaa875ad968a75b54bfc5526137430c69cbbd1090dc47eb3997ec2557c645aa
5
5
  SHA512:
6
- metadata.gz: 9af7c351c9328b51235961633b65e06ddba40c90d758774b26cf2430295a4260f61ca9b36094759d8e0a77c25a498cf0b92ba5e5323472104331b6c08a8d8729
7
- data.tar.gz: 30785df502dd77244272c26d3709772d8c6ab8fc57d3e693bbe576befae60db6b3c82285d51d5e002453a176fb7c7a18a92fa1829887c484bf9007a29fc34151
6
+ metadata.gz: 934c2ddf91379c64cd7b748f940df6fb120fdf79b8667522c7a20e305ed92a92a1ecc01148029c3ddd50b759671aa890a2ecac40bfe1c02b8980dbda7e9086f4
7
+ data.tar.gz: 8d15b436be7dc1c61e6ff6364dfbdc1a5fe09c0962e15efd858bab4143f8725212a6166480be170950eb4908bb38d26075ae64b49e638600c06649cb8ff9f5ca
data/README.md CHANGED
@@ -35,7 +35,7 @@ patch.apply('foo' => 'bar') # => {'baz' => 'qux', 'foo' => 'bar'}
35
35
 
36
36
  (The MIT License)
37
37
 
38
- Copyright (c) 2012-2016 Aaron Patterson
38
+ Copyright (c) 2012-2020 Aaron Patterson
39
39
 
40
40
  Permission is hereby granted, free of charge, to any person obtaining
41
41
  a copy of this software and associated documentation files (the
data/Rakefile CHANGED
@@ -1,7 +1,12 @@
1
1
  # -*- ruby -*-
2
2
 
3
3
  require 'rubygems'
4
- require 'hoe'
4
+ begin
5
+ require 'hoe'
6
+ rescue LoadError
7
+ Gem.install 'hoe'
8
+ retry
9
+ end
5
10
 
6
11
  Hoe.plugins.delete :rubyforge
7
12
  Hoe.plugin :minitest
@@ -1,7 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Hana
4
- VERSION = '1.3.6'
4
+ VERSION = '1.3.7'
5
5
 
6
6
  class Pointer
7
7
  include Enumerable
@@ -73,6 +73,9 @@ module Hana
73
73
  class ObjectOperationOnArrayException < Exception
74
74
  end
75
75
 
76
+ class InvalidObjectOperationException < Exception
77
+ end
78
+
76
79
  class IndexError < Exception
77
80
  end
78
81
 
@@ -90,7 +93,7 @@ module Hana
90
93
 
91
94
  def apply doc
92
95
  @is.inject(doc) { |d, ins|
93
- send VALID.fetch(ins[OP].strip) { |k|
96
+ send VALID.fetch(ins['op'].strip) { |k|
94
97
  raise Exception, "bad method `#{k}`"
95
98
  }, ins, d
96
99
  }
@@ -98,28 +101,17 @@ module Hana
98
101
 
99
102
  private
100
103
 
101
- PATH = 'path' # :nodoc:
102
104
  FROM = 'from' # :nodoc:
103
105
  VALUE = 'value' # :nodoc:
104
- OP = 'op' # :nodoc:
105
106
 
106
107
  def add ins, doc
107
- unless ins.key?('path')
108
- raise Hana::Patch::InvalidPath, "missing 'path' parameter"
109
- end
110
-
111
- path = ins['path']
112
-
113
- unless path
114
- raise Hana::Patch::InvalidPath, "null is not valid value for 'path'"
115
- end
116
-
108
+ path = get_path ins
117
109
  list = Pointer.parse path
118
110
  key = list.pop
119
111
  dest = Pointer.eval list, doc
120
112
  obj = ins.fetch VALUE
121
113
 
122
- raise(MissingTargetException, ins['path']) unless dest
114
+ raise(MissingTargetException, "target location '#{ins['path']}' does not exist") unless dest
123
115
 
124
116
  if key
125
117
  add_op dest, key, obj
@@ -134,18 +126,15 @@ module Hana
134
126
  end
135
127
 
136
128
  def move ins, doc
129
+ path = get_path ins
137
130
  from = Pointer.parse ins.fetch FROM
138
- to = Pointer.parse ins[PATH]
131
+ to = Pointer.parse path
139
132
  from_key = from.pop
140
133
  key = to.pop
141
134
  src = Pointer.eval from, doc
142
135
  dest = Pointer.eval to, doc
143
136
 
144
- unless Array === src
145
- unless src.key? from_key
146
- raise Hana::Patch::MissingTargetException
147
- end
148
- end
137
+ raise(MissingTargetException, "target location '#{ins['path']}' does not exist") unless dest
149
138
 
150
139
  obj = rm_op src, from_key
151
140
  add_op dest, key, obj
@@ -153,68 +142,81 @@ module Hana
153
142
  end
154
143
 
155
144
  def copy ins, doc
145
+ path = get_path ins
156
146
  from = Pointer.parse ins.fetch FROM
157
- to = Pointer.parse ins[PATH]
147
+ to = Pointer.parse path
158
148
  from_key = from.pop
159
149
  key = to.pop
160
150
  src = Pointer.eval from, doc
161
151
  dest = Pointer.eval to, doc
162
152
 
163
153
  if Array === src
164
- raise Patch::IndexError unless from_key =~ /\A\d+\Z/
154
+ raise Patch::ObjectOperationOnArrayException, "cannot apply non-numeric key '#{key}' to array" unless from_key =~ /\A\d+\Z/
165
155
  obj = src.fetch from_key.to_i
166
156
  else
167
157
  begin
168
158
  obj = src.fetch from_key
169
- rescue KeyError => e
170
- raise Hana::Patch::MissingTargetException, e.message
159
+ rescue KeyError, NoMethodError
160
+ raise Hana::Patch::MissingTargetException, "'from' location '#{ins.fetch FROM}' does not exist"
171
161
  end
172
162
  end
173
163
 
164
+ raise(MissingTargetException, "target location '#{ins['path']}' does not exist") unless dest
165
+
174
166
  add_op dest, key, obj
175
167
  doc
176
168
  end
177
169
 
178
170
  def test ins, doc
179
- expected = Pointer.new(ins[PATH]).eval doc
171
+ path = get_path ins
172
+ expected = Pointer.new(path).eval doc
180
173
 
181
174
  unless expected == ins.fetch(VALUE)
182
- raise FailedTestException.new(ins[VALUE], ins[PATH])
175
+ raise FailedTestException.new(ins['path'], ins[VALUE])
183
176
  end
184
177
  doc
185
178
  end
186
179
 
187
180
  def replace ins, doc
188
- list = Pointer.parse ins[PATH]
181
+ path = get_path ins
182
+ list = Pointer.parse path
189
183
  key = list.pop
190
184
  obj = Pointer.eval list, doc
191
185
 
192
186
  return ins.fetch VALUE unless key
193
187
 
194
- if Array === obj
195
- raise Patch::IndexError unless key =~ /\A\d+\Z/
196
- obj[key.to_i] = ins.fetch VALUE
197
- else
198
- raise Patch::MissingTargetException unless obj
199
- obj[key] = ins.fetch VALUE
200
- end
188
+ rm_op obj, key
189
+ add_op obj, key, ins.fetch(VALUE)
201
190
  doc
202
191
  end
203
192
 
204
193
  def remove ins, doc
205
- list = Pointer.parse ins[PATH]
194
+ path = get_path ins
195
+ list = Pointer.parse path
206
196
  key = list.pop
207
197
  obj = Pointer.eval list, doc
208
198
  rm_op obj, key
209
199
  doc
210
200
  end
211
201
 
202
+ def get_path ins
203
+ unless ins.key?('path')
204
+ raise Hana::Patch::InvalidPath, "missing 'path' parameter"
205
+ end
206
+
207
+ unless ins['path']
208
+ raise Hana::Patch::InvalidPath, "null is not valid value for 'path'"
209
+ end
210
+
211
+ ins['path']
212
+ end
213
+
212
214
  def check_index obj, key
213
215
  return -1 if key == '-'
214
216
 
215
- raise ObjectOperationOnArrayException unless key =~ /\A-?\d+\Z/
217
+ raise ObjectOperationOnArrayException, "cannot apply non-numeric key '#{key}' to array" unless key =~ /\A-?\d+\Z/
216
218
  idx = key.to_i
217
- raise OutOfBoundsException if idx > obj.length || idx < 0
219
+ raise OutOfBoundsException, "key '#{key}' is out of bounds for array" if idx > obj.length || idx < 0
218
220
  idx
219
221
  end
220
222
 
@@ -222,19 +224,24 @@ module Hana
222
224
  if Array === dest
223
225
  dest.insert check_index(dest, key), obj
224
226
  else
227
+ raise Patch::InvalidObjectOperationException, "cannot add key '#{key}' to non-object" unless Hash === dest
225
228
  dest[key] = obj
226
229
  end
227
230
  end
228
231
 
229
232
  def rm_op obj, key
230
233
  if Array === obj
231
- raise Patch::IndexError unless key =~ /\A\d+\Z/
234
+ raise Patch::ObjectOperationOnArrayException, "cannot apply non-numeric key '#{key}' to array" unless key =~ /\A\d+\Z/
232
235
  key = key.to_i
233
- raise Patch::OutOfBoundsException if key >= obj.length
236
+ raise Patch::OutOfBoundsException, "key '#{key}' is out of bounds for array" if key >= obj.length
234
237
  obj.delete_at key
235
238
  else
236
- raise Patch::IndexError unless obj&.key? key
237
- obj.delete key
239
+ begin
240
+ raise Patch::MissingTargetException, "key '#{key}' not found" unless obj&.key? key
241
+ obj.delete key
242
+ rescue ::NoMethodError
243
+ raise Patch::InvalidObjectOperationException, "cannot remove key '#{key}' from non-object"
244
+ end
238
245
  end
239
246
  end
240
247
  end
@@ -60,7 +60,7 @@ module Hana
60
60
  when /bad number$/ then
61
61
  [Hana::Patch::IndexError, Hana::Patch::ObjectOperationOnArrayException]
62
62
  when /removing a nonexistent (field|index)/ then
63
- [Hana::Patch::IndexError, Hana::Patch::OutOfBoundsException]
63
+ [Hana::Patch::MissingTargetException, Hana::Patch::OutOfBoundsException]
64
64
  when /test op should reject the array value, it has leading zeros/ then
65
65
  [Hana::Patch::IndexError]
66
66
  when /missing '(from|value)' parameter/ then
@@ -74,7 +74,7 @@ class TestHana < Hana::TestCase
74
74
  patch = Hana::Patch.new [
75
75
  { 'op' => 'remove', 'path' => '/missing_key' }
76
76
  ]
77
- assert_raises(Hana::Patch::IndexError) do
77
+ assert_raises(Hana::Patch::MissingTargetException) do
78
78
  patch.apply('foo' => 'bar')
79
79
  end
80
80
  end
@@ -83,7 +83,7 @@ class TestHana < Hana::TestCase
83
83
  patch = Hana::Patch.new [
84
84
  { 'op' => 'remove', 'path' => '/missing_key1/missing_key2' }
85
85
  ]
86
- assert_raises(Hana::Patch::IndexError) do
86
+ assert_raises(Hana::Patch::MissingTargetException) do
87
87
  patch.apply('foo' => 'bar')
88
88
  end
89
89
  end
@@ -101,7 +101,7 @@ class TestHana < Hana::TestCase
101
101
  patch = Hana::Patch.new [
102
102
  { 'op' => 'remove', 'path' => '/1/baz' }
103
103
  ]
104
- assert_raises(Hana::Patch::IndexError) do
104
+ assert_raises(Hana::Patch::MissingTargetException) do
105
105
  patch.apply([
106
106
  { 'foo' => 'bar' },
107
107
  { 'foo' => 'bar' }
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: hana
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.3.6
4
+ version: 1.3.7
5
5
  platform: ruby
6
6
  authors:
7
7
  - Aaron Patterson
8
- autorequire:
8
+ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2020-05-04 00:00:00.000000000 Z
11
+ date: 2020-12-03 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: minitest
@@ -86,7 +86,7 @@ licenses:
86
86
  - MIT
87
87
  metadata:
88
88
  homepage_uri: http://github.com/tenderlove/hana
89
- post_install_message:
89
+ post_install_message:
90
90
  rdoc_options:
91
91
  - "--main"
92
92
  - README.md
@@ -103,8 +103,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
103
103
  - !ruby/object:Gem::Version
104
104
  version: '0'
105
105
  requirements: []
106
- rubygems_version: 3.2.0.pre1
107
- signing_key:
106
+ rubygems_version: 3.2.0.rc.2
107
+ signing_key:
108
108
  specification_version: 4
109
109
  summary: Implementation of [JSON Patch][1] and [JSON Pointer][2] RFC.
110
110
  test_files: []