dense 1.1.4 → 1.1.5

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: 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