collapsium 0.5.1 → 0.6.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: a5f69b509b0b797408a7a7b49f205cf1664d9931
4
- data.tar.gz: c8cddb20e60be62dcf7522ef8008e9d02a4c256b
3
+ metadata.gz: 3922ea4f400facdd0a8319d6ea4993a5cb64dc54
4
+ data.tar.gz: a94ad0feef4ca8399de6c9c65b8037238f26a752
5
5
  SHA512:
6
- metadata.gz: 5586fb4097ab338d3a2d2d4a55d3ae2bd91eebea7d2a02acbe49500c45da8b735922ea989b2f9fbaa4d0134d26308d4ead461a40b86fec99d1c901c81690bf95
7
- data.tar.gz: f57e9dd8df1ee2013db148d3acc86a462d10701dbaf72276997ef3e2a10724c51cd663696745d604cf66069684318d7507e3987235ddb48fe476eb5f762dcf81
6
+ metadata.gz: 2a6d221e5658ff884cbda2078d52eb39a2cf5d3d9167859e43556c4f138ec4b1cc4463b303008c113315325dbdeea0369615e0219be19c4a923e8838183e2f53
7
+ data.tar.gz: f6a5238d75f3a44572fa0e45339c31261e65560eb852edeb929698595720b1115f781192b13305a1c2cbcf2681505a4bd0cde91f52a33e0047289d71863aa7d3
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- collapsium (0.5.1)
4
+ collapsium (0.6.0)
5
5
 
6
6
  GEM
7
7
  remote: https://rubygems.org/
@@ -59,4 +59,4 @@ DEPENDENCIES
59
59
  yard (~> 0.9)
60
60
 
61
61
  BUNDLED WITH
62
- 1.12.5
62
+ 1.13.6
@@ -0,0 +1,97 @@
1
+ # coding: utf-8
2
+ #
3
+ # collapsium
4
+ # https://github.com/jfinkhaeuser/collapsium
5
+ #
6
+ # Copyright (c) 2016 Jens Finkhaeuser and other collapsium contributors.
7
+ # All rights reserved.
8
+ #
9
+
10
+ require 'collapsium/viral_capabilities'
11
+
12
+ module Collapsium
13
+ ##
14
+ # Provides recursive (deep) fetch function for hashes.
15
+ module RecursiveFetch
16
+ # Clone Hash extensions for nested Hashes
17
+ extend ViralCapabilities
18
+
19
+ ##
20
+ # Fetches the first matching key, or the default value if no match
21
+ # was found.
22
+ # If a block is given, it is passed the value containing the key
23
+ # (the parent), the value at the key, and the default value
24
+ # in that order.
25
+ # *Note:* Be careful when using blocks: it's return value becomes
26
+ # the match value. The typically correct behaviour is to return
27
+ # the match value passed to the block.
28
+ def recursive_fetch_one(key, default = nil, &block)
29
+ # Start simple at the top level.
30
+ result = fetch(key, default)
31
+ if result != default
32
+ if not block.nil?
33
+ result = yield self, result, default
34
+ end
35
+ return result
36
+ end
37
+
38
+ # We have to recurse for nested values
39
+ result = map do |_, v|
40
+ # If we have a Hash or Array, we need to recurse.
41
+ if not (v.is_a? Hash or v.is_a? Array)
42
+ next
43
+ end
44
+
45
+ enhanced = ViralCapabilities.enhance_value(self, v)
46
+ inner = enhanced.recursive_fetch_one(key, default, &block)
47
+ if inner != default
48
+ next inner
49
+ end
50
+ end
51
+
52
+ result.compact!
53
+ return result[0] || default
54
+ end
55
+
56
+ ##
57
+ # Fetches all matching keys as an array, or the default value if no match
58
+ # was found. Blocks work as in `#recursive_fetch`
59
+ def recursive_fetch_all(key, default = nil, &block)
60
+ result = []
61
+
62
+ # Start simple at the top level.
63
+ ret = fetch(key, default)
64
+ if ret != default
65
+ if not block.nil?
66
+ ret = yield self, ret, default
67
+ end
68
+ result << ret
69
+ end
70
+
71
+ # We have to recurse for nested values
72
+ result += map do |_, v|
73
+ # If we have a Hash or Array, we need to recurse.
74
+ if not (v.is_a? Hash or v.is_a? Array)
75
+ next
76
+ end
77
+
78
+ enhanced = ViralCapabilities.enhance_value(self, v)
79
+ inner = enhanced.recursive_fetch_all(key, default, &block)
80
+ if inner != default
81
+ next inner
82
+ end
83
+ end
84
+
85
+ # Flatten and compact results to weed out non-matches
86
+ result = result.flatten
87
+ result.compact!
88
+
89
+ if result.empty?
90
+ return default
91
+ end
92
+ return result
93
+ end
94
+
95
+ alias recursive_fetch recursive_fetch_all
96
+ end # module RecursiveFetch
97
+ end # module Collapsium
@@ -10,6 +10,7 @@
10
10
  require 'collapsium/recursive_merge'
11
11
  require 'collapsium/recursive_dup'
12
12
  require 'collapsium/recursive_sort'
13
+ require 'collapsium/recursive_fetch'
13
14
  require 'collapsium/indifferent_access'
14
15
  require 'collapsium/pathed_access'
15
16
  require 'collapsium/prototype_match'
@@ -25,6 +26,7 @@ module Collapsium
25
26
  include RecursiveMerge
26
27
  include RecursiveDup
27
28
  include RecursiveSort
29
+ include RecursiveFetch
28
30
  include PathedAccess
29
31
  include PrototypeMatch
30
32
 
@@ -8,5 +8,5 @@
8
8
  #
9
9
  module Collapsium
10
10
  # The current release version
11
- VERSION = "0.5.1".freeze
11
+ VERSION = "0.6.0".freeze
12
12
  end
@@ -0,0 +1,80 @@
1
+ require 'spec_helper'
2
+ require_relative '../lib/collapsium/recursive_fetch'
3
+
4
+ describe ::Collapsium::RecursiveFetch do
5
+ let(:tester) do
6
+ h = {
7
+ "foo" => 42,
8
+ "bar" => 123,
9
+ "baz" => {
10
+ "foo" => 321,
11
+ "unique" => "something"
12
+ }
13
+ }
14
+ h.extend(::Collapsium::RecursiveFetch)
15
+ end
16
+
17
+ context "fetching basics" do
18
+ it ":fetch_one fetches the first value found" do
19
+ expect(tester.recursive_fetch_one("foo")).to eql 42
20
+ expect(tester.recursive_fetch_one("unique")).to eql "something"
21
+ end
22
+
23
+ it ":fetch fetches all values" do
24
+ expect(tester.recursive_fetch("foo")).to eql [42, 321]
25
+ end
26
+ end
27
+
28
+ context "defaults" do
29
+ it "uses nil by default" do
30
+ expect(tester.recursive_fetch_one('does not exist')).to be_nil
31
+ expect(tester.recursive_fetch('does not exist')).to be_nil
32
+ end
33
+
34
+ it "uses a given value" do
35
+ expect(tester.recursive_fetch_one('does not exist', 42)).to eql 42
36
+ expect(tester.recursive_fetch('does not exist', 42)).to eql 42
37
+ end
38
+ end
39
+
40
+ context "blocks" do
41
+ it ":fetch_one invokes the block once" do
42
+ called = 0
43
+ tester.recursive_fetch_one('foo') do |parent, result, default|
44
+ expect(parent['foo']).to eql 42
45
+ expect(result).to eql 42
46
+ expect(default).to be_nil
47
+ called += 1
48
+ end
49
+
50
+ expect(called).to eql 1
51
+ end
52
+
53
+ it ":fetch invokes the block twice" do
54
+ called = 0
55
+ tester.recursive_fetch('foo') do |parent, result, default|
56
+ expect(parent['foo'].is_a?(Integer)).to be_truthy
57
+ expect(result.is_a?(Integer)).to be_truthy
58
+ expect(default).to be_nil
59
+ called += 1
60
+ end
61
+
62
+ expect(called).to eql 2
63
+ end
64
+
65
+ it "can alter the value" do
66
+ called = 0
67
+ ret = tester.recursive_fetch_one('foo') do |parent, result, default|
68
+ expect(parent['foo']).to eql 42
69
+ expect(result).to eql 42
70
+ expect(default).to be_nil
71
+ called += 1
72
+
73
+ next "new value"
74
+ end
75
+
76
+ expect(called).to eql 1
77
+ expect(ret).to eql "new value"
78
+ end
79
+ end
80
+ end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: collapsium
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.5.1
4
+ version: 0.6.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jens Finkhaeuser
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-11-02 00:00:00.000000000 Z
11
+ date: 2016-11-04 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -119,6 +119,7 @@ files:
119
119
  - lib/collapsium/pathed_access.rb
120
120
  - lib/collapsium/prototype_match.rb
121
121
  - lib/collapsium/recursive_dup.rb
122
+ - lib/collapsium/recursive_fetch.rb
122
123
  - lib/collapsium/recursive_merge.rb
123
124
  - lib/collapsium/recursive_sort.rb
124
125
  - lib/collapsium/support/array_methods.rb
@@ -133,6 +134,7 @@ files:
133
134
  - spec/pathed_access_spec.rb
134
135
  - spec/prototype_match_spec.rb
135
136
  - spec/recursive_dup_spec.rb
137
+ - spec/recursive_fetch_spec.rb
136
138
  - spec/recursive_merge_spec.rb
137
139
  - spec/recursive_sort_spec.rb
138
140
  - spec/spec_helper.rb
@@ -170,6 +172,7 @@ test_files:
170
172
  - spec/pathed_access_spec.rb
171
173
  - spec/prototype_match_spec.rb
172
174
  - spec/recursive_dup_spec.rb
175
+ - spec/recursive_fetch_spec.rb
173
176
  - spec/recursive_merge_spec.rb
174
177
  - spec/recursive_sort_spec.rb
175
178
  - spec/spec_helper.rb