dense 1.1.4 → 1.1.5

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 6ed96330107ec5b3b678ea1d9c9d2fdcb74cf4a2
4
- data.tar.gz: d24c69b183a0dd1ce40f727c009d627f732e77ca
3
+ metadata.gz: cfc698913c3d5e9fcc87f8af83dea003df39e71d
4
+ data.tar.gz: a81ecccdad7be0875a560025022b00c28b97558a
5
5
  SHA512:
6
- metadata.gz: befe48f094c27f9afdde046065958629ab654cc3a289cc113b1b1aa0a904256a3303f22cde16f7551f38099d631859d387577fb600f12b2e3bc820bab5bceb4d
7
- data.tar.gz: b825d845e36ee28d6f8b9b58c67a4df06809c49bd64238c36f3ae6bfa60bd028550866dc001bec4bfb18ba923f56c10d1d795ab8173e14ab59fed584630514b9
6
+ metadata.gz: 332efedf4c5fe21336898ff830f90dda169a3fce2da5984b553e9ca61c8d5bd855e3e62bf40e403286f66ed922212928ee46209a9dedbc187079b4af97608270
7
+ data.tar.gz: 5b4806c891b739b277c2c7447b232d3c9a0d974c1aea8ea5749541f5bbd77a85ec0f3aa70d27217161ff7ddde1b637969721a57a099400792509373cd20e9eaf
data/CHANGELOG.md CHANGED
@@ -2,6 +2,11 @@
2
2
  # dense
3
3
 
4
4
 
5
+ ## dense 1.1.5 released 2018-12-04
6
+
7
+ * Differentiate KeyError and IndexError upon miss
8
+
9
+
5
10
  ## dense 1.1.4 released 2018-11-08
6
11
 
7
12
  * Fix `Dense.fetch({ 'a' => nil }, 'a')`
data/lib/dense.rb CHANGED
@@ -1,7 +1,7 @@
1
1
 
2
2
  module Dense
3
3
 
4
- VERSION = '1.1.4'
4
+ VERSION = '1.1.5'
5
5
  end
6
6
 
7
7
  require 'raabro'
data/lib/dense/methods.rb CHANGED
@@ -12,22 +12,22 @@ module Dense; class << self
12
12
  def fetch(o, path, default=::KeyError, &block)
13
13
 
14
14
  pa = Dense::Path.make(path)
15
- r = pa.gather(o).partition(&:first)
15
+ hits, misses = pa.gather(o).partition(&:first)
16
16
 
17
- if r[0].empty?
17
+ if hits.empty?
18
18
 
19
19
  return pa.narrow(
20
- r[1].collect { |m| call_default_block(o, path, block, m) }
20
+ misses.collect { |m| call_default_block(o, path, block, m) }
21
21
  ) if block
22
22
 
23
23
  return pa.narrow(
24
- r[1].collect { |m| default }
24
+ misses.collect { |m| default }
25
25
  ) if default != KeyError
26
26
 
27
- fail miss_error(path, r[1].first)
27
+ fail miss_error(path, misses.first)
28
28
  end
29
29
 
30
- pa.narrow(r[0].collect { |e| e[2][e[3]] })
30
+ pa.narrow(hits.collect { |e| e[2][e[3]] })
31
31
  end
32
32
 
33
33
  def set(o, path, value)
@@ -35,7 +35,7 @@ module Dense; class << self
35
35
  Dense::Path.make(path)
36
36
  .gather(o)
37
37
  .each { |hit|
38
- fail_miss_error(path, hit) if hit[0] == false
38
+ validate(path, hit) if hit[0] == false
39
39
  hit[2][hit[3]] = value }
40
40
 
41
41
  value
@@ -67,7 +67,7 @@ module Dense; class << self
67
67
  .each { |hit|
68
68
  if hit[0] == false
69
69
  n = hit[4].first
70
- fail_miss_error(path, hit) \
70
+ validate(path, hit) \
71
71
  if n.nil? && ! key_matches_collection?(hit[3], hit[2])
72
72
  hit[2][hit[3]] =
73
73
  if n.is_a?(String)
@@ -87,7 +87,7 @@ module Dense; class << self
87
87
  Dense::Path.make(path)
88
88
  .gather(o)
89
89
  .each { |hit|
90
- fail_miss_error(path, hit) if hit[0] == false
90
+ validate(path, hit) if hit[0] == false
91
91
  if hit[2].is_a?(Array)
92
92
  hit[2].insert(hit[3], value)
93
93
  else
@@ -149,15 +149,33 @@ module Dense; class << self
149
149
  err
150
150
  end
151
151
 
152
- def key_error(path, miss)
152
+ # IndexError:
153
+ # Raised when the given index is invalid.
154
+ # KeyError:
155
+ # Raised when the specified key is not found. It is a subclass of IndexError.
153
156
 
154
- path1 = Dense::Path.make(miss[1] + [ miss[3] ]).to_s.inspect
155
- path2 = Dense::Path.make(miss[4]).to_s.inspect
157
+ def index_error(path, miss)
156
158
 
157
- msg = "found nothing at #{path1}"
158
- msg = "#{msg} (#{path2} remains)" if path2 != '""'
159
+ if miss[2].is_a?(Array) || miss[2].is_a?(Hash)
159
160
 
160
- make_error(KeyError, msg, path, miss)
161
+ path1 = Dense::Path.make(miss[1] + [ miss[3] ]).to_s.inspect
162
+ path2 = Dense::Path.make(miss[4]).to_s.inspect
163
+
164
+ msg = "found nothing at #{path1}"
165
+ msg = "#{msg} (#{path2} remains)" if path2 != '""'
166
+
167
+ make_error(KeyError, msg, path, miss)
168
+
169
+ else
170
+
171
+ path1 = Dense::Path.make(miss[1]).to_s.inspect
172
+ path2 = Dense::Path.make(miss[4]).to_s.inspect
173
+
174
+ msg = "found no collection at #{path1} for key #{miss[3].inspect}"
175
+ msg = "#{msg} (#{path2} remains)" if path2 != '""'
176
+
177
+ make_error(IndexError, msg, path, miss)
178
+ end
161
179
  end
162
180
 
163
181
  def type_error(path, miss)
@@ -174,16 +192,18 @@ module Dense; class << self
174
192
  if miss[2].is_a?(Array) && ! miss[3].is_a?(Integer)
175
193
  type_error(path, miss)
176
194
  else
177
- key_error(path, miss)
195
+ index_error(path, miss)
178
196
  end
179
197
  end
180
198
 
181
- def fail_miss_error(path, miss)
199
+ def validate(path, miss)
182
200
 
183
201
  fail miss_error(path, miss) \
184
202
  if miss[4].any?
185
203
  fail type_error(path, miss) \
186
204
  if miss[2].is_a?(Array) && ! miss[2].is_a?(Integer)
205
+
206
+ # else, no failure, carry on!
187
207
  end
188
208
 
189
209
  def call_default_block(o, path, block, miss)
data/lib/dense/path.rb CHANGED
@@ -295,7 +295,7 @@ class Dense::Path
295
295
  if k.nil?
296
296
 
297
297
  #puts RD + ind + "| 2-> " + [ false, path0[0..-2], data0, path0.last, path ].inspect unless data.is_a?(Array) || data.is_a?(Hash)
298
- return acc.push([ false, path0[0..-2], data0, path0.last, path ]) \
298
+ return acc.push([ false, path0, data, path.first, path[1..-1] ]) \
299
299
  unless data.is_a?(Array) || data.is_a?(Hash)
300
300
 
301
301
  return _dot_gather(depth, path0, data0, data, path[1..-1], acc) \
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: dense
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.1.4
4
+ version: 1.1.5
5
5
  platform: ruby
6
6
  authors:
7
7
  - John Mettraux
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2018-11-07 00:00:00.000000000 Z
11
+ date: 2018-12-04 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: raabro
@@ -80,7 +80,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
80
80
  version: '0'
81
81
  requirements: []
82
82
  rubyforge_project:
83
- rubygems_version: 2.5.2.3
83
+ rubygems_version: 2.6.14.3
84
84
  signing_key:
85
85
  specification_version: 4
86
86
  summary: fetching deep in a dense structure