trick_bag 0.50.0 → 0.51.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/RELEASE_NOTES.md +5 -0
- data/lib/trick_bag/collections/collection_access.rb +59 -0
- data/lib/trick_bag/enumerables/buffered_enumerable.rb +1 -1
- data/lib/trick_bag/version.rb +1 -1
- data/spec/trick_bag/collections/collection_access_spec.rb +71 -0
- data/spec/trick_bag/enumerables/buffered_enumerable_spec.rb +9 -3
- metadata +5 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 137cb6576cfd3498b7762313918781e053f12550
|
4
|
+
data.tar.gz: bf7a7e5a71cae9c08a7f8bde90801e422fe63d0a
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 137370f1acfd51c9378894c6328852013c22c3cb522cd1d93033350cd3145197d4b75c7288f7712af42d21411d92300459eb7a01675f9d4b2d5bb678a8bf9684
|
7
|
+
data.tar.gz: e097d5e75037f2219d8f76c8172afd31ae81a734bbf84dc9860c42b1884a671508c7b73d4b7d4688f7eb02698c5530b4f9a68f12cbbc805a787c5eed51d7f190
|
data/RELEASE_NOTES.md
CHANGED
@@ -0,0 +1,59 @@
|
|
1
|
+
# Supports access to nested hashes with a string instead of multiple []'s.
|
2
|
+
# Inspired by Josh Szmajda's dot_notation gem at https://github.com/joshsz/dot_notation,
|
3
|
+
|
4
|
+
module TrickBag
|
5
|
+
module CollectionAccess
|
6
|
+
|
7
|
+
module_function
|
8
|
+
|
9
|
+
# Accesses a collection with a single string that represents n levels of depth.
|
10
|
+
# See the spec file for examples, but here's one:
|
11
|
+
#
|
12
|
+
# h = { 'h' => ['a', 'b'] }
|
13
|
+
# CollectionAccess.access(h, 'h.1') => 'b'
|
14
|
+
#
|
15
|
+
# If an error is raised while trying to access the value with a given key,
|
16
|
+
# an error will be raised showing that error plus the context of which
|
17
|
+
# key failed, as in:
|
18
|
+
#
|
19
|
+
# Error occurred processing key [x.1] in [x.1.2]: undefined method `[]' for nil:NilClass
|
20
|
+
#
|
21
|
+
# @param the collection to access
|
22
|
+
# @param key_string the string representing the keys to use
|
23
|
+
# @separator the string to use to separate the
|
24
|
+
def access(collection, key_string, separator = '.')
|
25
|
+
|
26
|
+
keys = key_string.split(separator)
|
27
|
+
return_object = collection
|
28
|
+
|
29
|
+
keys.each_with_index do |key, index|
|
30
|
+
key = key.to_i if return_object.kind_of?(Array)
|
31
|
+
begin
|
32
|
+
return_object = return_object[key]
|
33
|
+
rescue => e
|
34
|
+
this_key = keys[0..index].join(separator)
|
35
|
+
raise "Error occurred processing key [#{this_key}] in [#{key_string}]: #{e}"
|
36
|
+
end
|
37
|
+
end
|
38
|
+
return_object
|
39
|
+
end
|
40
|
+
|
41
|
+
|
42
|
+
# Like access, but returns a lambda that can be used to access a given collection.
|
43
|
+
# Since lambdas can be called with the subscript operator,
|
44
|
+
# using it can resemble regular hash or array access.
|
45
|
+
# If you don't like this you can use '.call' or '.()' instead.
|
46
|
+
#
|
47
|
+
# An example:
|
48
|
+
#
|
49
|
+
# h = { 'h' => ['a', 'b'] }
|
50
|
+
# accessor = CollectionAccess.accessor(h)
|
51
|
+
# accessor['h.1'] # => 'b'
|
52
|
+
# or
|
53
|
+
# accessor.('h.1') # => 'b'
|
54
|
+
def accessor(collection, separator = '.')
|
55
|
+
->(key_string) { access(collection, key_string, separator) }
|
56
|
+
end
|
57
|
+
|
58
|
+
end
|
59
|
+
end
|
@@ -41,7 +41,7 @@ class BufferedEnumerable
|
|
41
41
|
# @param chunk_size the maximum number of objects to be buffered
|
42
42
|
# @param fetcher lambda to be called to fetch to fill the buffer
|
43
43
|
# @param fetch_notifier lambda to be called to when a fetch is done
|
44
|
-
def self.create_with_lambdas(chunk_size, fetcher, fetch_notifier)
|
44
|
+
def self.create_with_lambdas(chunk_size, fetcher, fetch_notifier = nil)
|
45
45
|
instance = self.new(chunk_size)
|
46
46
|
instance.fetcher = fetcher
|
47
47
|
instance.fetch_notifier = fetch_notifier
|
data/lib/trick_bag/version.rb
CHANGED
@@ -0,0 +1,71 @@
|
|
1
|
+
require_relative '../../spec_helper'
|
2
|
+
require 'trick_bag/collections/collection_access'
|
3
|
+
|
4
|
+
|
5
|
+
module TrickBag
|
6
|
+
module CollectionAccess
|
7
|
+
|
8
|
+
|
9
|
+
describe CollectionAccess do
|
10
|
+
|
11
|
+
context '#access' do
|
12
|
+
|
13
|
+
it 'works with a single key' do
|
14
|
+
h = { 'a' => 123 }
|
15
|
+
expect(CollectionAccess.access(h, 'a')).to eq(123)
|
16
|
+
end
|
17
|
+
|
18
|
+
it 'works with 2 keys' do
|
19
|
+
h = { 'a' => { 'b' => 234 }}
|
20
|
+
expect(CollectionAccess.access(h, 'a.b')).to eq(234)
|
21
|
+
end
|
22
|
+
|
23
|
+
it 'works with 3 keys' do
|
24
|
+
h = { 'a' => { 'bb' => { 'ccc' => 345 }}}
|
25
|
+
expect(CollectionAccess.access(h, 'a.bb.ccc')).to eq(345)
|
26
|
+
end
|
27
|
+
|
28
|
+
it 'works with spaces as separators' do
|
29
|
+
h = { 'a' => { 'bb' => { 'ccc' => 345 }}}
|
30
|
+
expect(CollectionAccess.access(h, 'a bb ccc', ' ')).to eq(345)
|
31
|
+
|
32
|
+
end
|
33
|
+
|
34
|
+
it 'works with spaces as separators with multiple spaces' do
|
35
|
+
h = { 'a' => { 'bb' => { 'ccc' => 345 }}}
|
36
|
+
expect(CollectionAccess.access(h, 'a bb ccc', ' ')).to eq(345)
|
37
|
+
end
|
38
|
+
|
39
|
+
it 'works with numeric array subscripts 1 deep' do
|
40
|
+
a = ['a', 'b']
|
41
|
+
expect(CollectionAccess.access(a, '1')).to eq('b')
|
42
|
+
end
|
43
|
+
|
44
|
+
it 'works with a hash containing an array' do
|
45
|
+
h = { 'h' => ['a', 'b'] }
|
46
|
+
expect(CollectionAccess.access(h, 'h.1')).to eq('b')
|
47
|
+
end
|
48
|
+
|
49
|
+
it 'raises an error when accessing an invalid key' do
|
50
|
+
h = { 'h' => ['a', 'b'] }
|
51
|
+
expect(-> { CollectionAccess.access(h, 'x.1.2') }).to raise_error
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
|
56
|
+
context '#accessor' do
|
57
|
+
|
58
|
+
it 'works with a hash containing an array' do
|
59
|
+
h = { 'h' => ['a', 'b'] }
|
60
|
+
accessor = CollectionAccess.accessor(h)
|
61
|
+
expect(accessor['h.1']).to eq('b')
|
62
|
+
end
|
63
|
+
|
64
|
+
end
|
65
|
+
|
66
|
+
|
67
|
+
end
|
68
|
+
|
69
|
+
|
70
|
+
end
|
71
|
+
end
|
@@ -28,12 +28,18 @@ module Enumerables
|
|
28
28
|
end
|
29
29
|
|
30
30
|
e = BufferedEnumerable.create_with_lambdas(4, fetcher, fetch_notifier).to_enum
|
31
|
-
(1..10).each
|
32
|
-
expect(e.next).to eq(n)
|
33
|
-
end
|
31
|
+
(1..10).each { |n| expect(e.next).to eq(n) }
|
34
32
|
expect(chunk_fetch_calls).to eq(3)
|
35
33
|
expect(object_count).to eq(12)
|
36
34
|
end
|
35
|
+
|
36
|
+
specify 'create_with_lambdas can be called without specifying a fetch_notifier' do
|
37
|
+
be = nil
|
38
|
+
f1 = -> { be = BufferedEnumerable.create_with_lambdas(4, fetcher).to_enum }
|
39
|
+
expect(f1).not_to raise_error
|
40
|
+
f2 = -> { (1..10).each { be.next } }
|
41
|
+
expect(f2).not_to raise_error
|
42
|
+
end
|
37
43
|
end
|
38
44
|
|
39
45
|
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: trick_bag
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.51.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Keith Bennett
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-
|
11
|
+
date: 2014-08-21 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: os
|
@@ -95,6 +95,7 @@ files:
|
|
95
95
|
- RELEASE_NOTES.md
|
96
96
|
- Rakefile
|
97
97
|
- lib/trick_bag.rb
|
98
|
+
- lib/trick_bag/collections/collection_access.rb
|
98
99
|
- lib/trick_bag/collections/linked_list.rb
|
99
100
|
- lib/trick_bag/core_types.rb
|
100
101
|
- lib/trick_bag/enumerables/buffered_enumerable.rb
|
@@ -120,6 +121,7 @@ files:
|
|
120
121
|
- lib/trick_bag/validations/other_validations.rb
|
121
122
|
- lib/trick_bag/version.rb
|
122
123
|
- spec/spec_helper.rb
|
124
|
+
- spec/trick_bag/collections/collection_access_spec.rb
|
123
125
|
- spec/trick_bag/collections/linked_list_spec.rb
|
124
126
|
- spec/trick_bag/core_types_spec.rb
|
125
127
|
- spec/trick_bag/enumerables/buffered_enumerable_spec.rb
|
@@ -169,6 +171,7 @@ specification_version: 4
|
|
169
171
|
summary: Miscellaneous general useful tools.
|
170
172
|
test_files:
|
171
173
|
- spec/spec_helper.rb
|
174
|
+
- spec/trick_bag/collections/collection_access_spec.rb
|
172
175
|
- spec/trick_bag/collections/linked_list_spec.rb
|
173
176
|
- spec/trick_bag/core_types_spec.rb
|
174
177
|
- spec/trick_bag/enumerables/buffered_enumerable_spec.rb
|