respond_to_dig 1.0.1 → 1.1.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 +4 -4
- data/README.md +10 -11
- data/lib/respond_to_dig/version.rb +1 -1
- data/lib/respond_to_dig.rb +25 -2
- data/test/respond_to_dig_test.rb +6 -0
- metadata +15 -15
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 7093fc0a72916735cfa5a2e911152ad6564b8029
|
4
|
+
data.tar.gz: d8d5fa0f6cc82c881caca196a30df4bcfb915090
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 3b9e60265b8f80a7066be6acc05e8194ba9cdbba5b935bc35366e1e452310d9d4a15b4ce38e033aee7a842aee0271bc73caa39c260f4856e939f7784b7a1adbf
|
7
|
+
data.tar.gz: 77f95396978f600b84f0f3ed38432651d9942ee0c991ad0fb412f122514edae8a802a907714d647350089871c9b018543e08475bf3c55b8e0cfadf00ab2ab34e
|
data/README.md
CHANGED
@@ -7,7 +7,7 @@ This gem backports Array#dig and Hash#dig methods from Ruby 2.3+ to earlier vers
|
|
7
7
|
|
8
8
|
## vs [RubyDig](https://github.com/Invoca/ruby_dig)
|
9
9
|
* RubyDig has side-effects, but RespondToDig doesn't.
|
10
|
-
* RespondToDig only supports `Array` and `Hash`, but RespondToDig supports any `Enumerable`
|
10
|
+
* RespondToDig only supports `Array` and `Hash`, but RespondToDig supports any `Enumerable` objects which have `[]` method such as `Struct`.
|
11
11
|
|
12
12
|
## Installation
|
13
13
|
|
@@ -27,17 +27,16 @@ Or install it yourself as:
|
|
27
27
|
|
28
28
|
## Usage
|
29
29
|
|
30
|
-
```
|
30
|
+
```rb
|
31
31
|
require 'respond_to_dig'
|
32
32
|
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
{first: "Bart", last: "Simpson"},
|
38
|
-
{first: "Lisa", last: "Simpson"}
|
39
|
-
]})
|
33
|
+
h = RespondToDig::respond_to_dig({ foo: {bar: {baz: 1 }}})
|
34
|
+
h.dig(:foo, :bar, :baz) #=> 1
|
35
|
+
h.dig(:foo, :zot, :xyz) #=> nil
|
36
|
+
h.dig(:foo, :bar, :baz, :xyz) #=> TypeError
|
40
37
|
|
41
|
-
|
42
|
-
|
38
|
+
g = RespondToDig::respond_to_dig({ foo: [10, 11, 12] })
|
39
|
+
g.dig(:foo, 1) #=> 11
|
43
40
|
```
|
41
|
+
|
42
|
+
For the details, refer [Module: RespondToDig — Documentation](http://www.rubydoc.info/gems/respond_to_dig/RespondToDig).
|
data/lib/respond_to_dig.rb
CHANGED
@@ -1,21 +1,44 @@
|
|
1
|
+
# Extracts the nested value specified by the sequence of index by calling dig at each step,
|
2
|
+
# returning nil if any intermediate step is nil.
|
3
|
+
# @example
|
4
|
+
# h = RespondToDig::invoke_dig({ foo: {bar: {baz: 1 }}})
|
5
|
+
# h.dig(:foo, :bar, :baz) #=> 1
|
6
|
+
# h.dig(:foo, :zot, :xyz) #=> nil
|
7
|
+
# h.dig(:foo, :bar, :baz, :xyz) #=> TypeError
|
8
|
+
#
|
9
|
+
# g = RespondToDig::invoke_dig({ foo: [10, 11, 12] })
|
10
|
+
# g.dig(:foo, 1) #=> 11
|
1
11
|
module RespondToDig
|
2
12
|
|
3
13
|
class << self
|
14
|
+
# Invokes `RespondToDig` module if the `receiver` object is digabble
|
15
|
+
# @see RespondToDig#digabble
|
16
|
+
# @param receiver [Object]
|
17
|
+
# @return [Object, RespondToDig]
|
4
18
|
def respond_to_dig(receiver)
|
5
19
|
receiver.tap do |r|
|
6
20
|
r.singleton_class.send(:include, RespondToDig) if RespondToDig.diggable? r
|
7
21
|
end
|
8
22
|
end
|
9
23
|
|
10
|
-
#
|
11
|
-
#
|
24
|
+
# Returns whether the `target` object is able to be invoked by `RespondToDig`
|
25
|
+
# @note The reason why not purely duck typed by `[]` method is to avoid unexpected behavior,
|
26
|
+
# for example we won't get `'o'` by `'foo'.dig(1)` by String#[].
|
27
|
+
# @param target [Object]
|
28
|
+
# @return [Bool]
|
12
29
|
def diggable?(target)
|
13
30
|
target.is_a? Enumerable and
|
14
31
|
target.respond_to? :[] and
|
15
32
|
not target.respond_to? :dig
|
16
33
|
end
|
34
|
+
|
35
|
+
alias_method :invoke_dig, :respond_to_dig
|
17
36
|
end
|
18
37
|
|
38
|
+
# Retrieves the value object corresponding to the each `key` objects recursively with nil-safe
|
39
|
+
# @param key [Object, ...]
|
40
|
+
# @raise [TypeError] Throws if trying to access the value which doesn't respond to `#dig` such as `String` object
|
41
|
+
# @return [Object, RespondToDig, NilClass]
|
19
42
|
def dig(key, *rest)
|
20
43
|
value = RespondToDig::respond_to_dig(self[key])
|
21
44
|
if value.nil? || rest.empty?
|
data/test/respond_to_dig_test.rb
CHANGED
metadata
CHANGED
@@ -1,55 +1,55 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: respond_to_dig
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.0
|
4
|
+
version: 1.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- ymkjp
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-08-
|
11
|
+
date: 2016-08-04 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
16
16
|
requirements:
|
17
|
-
- -
|
17
|
+
- - ~>
|
18
18
|
- !ruby/object:Gem::Version
|
19
19
|
version: '1.7'
|
20
20
|
type: :development
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
|
-
- -
|
24
|
+
- - ~>
|
25
25
|
- !ruby/object:Gem::Version
|
26
26
|
version: '1.7'
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: rake
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
30
30
|
requirements:
|
31
|
-
- -
|
31
|
+
- - ~>
|
32
32
|
- !ruby/object:Gem::Version
|
33
33
|
version: '10.0'
|
34
34
|
type: :development
|
35
35
|
prerelease: false
|
36
36
|
version_requirements: !ruby/object:Gem::Requirement
|
37
37
|
requirements:
|
38
|
-
- -
|
38
|
+
- - ~>
|
39
39
|
- !ruby/object:Gem::Version
|
40
40
|
version: '10.0'
|
41
41
|
- !ruby/object:Gem::Dependency
|
42
42
|
name: minitest
|
43
43
|
requirement: !ruby/object:Gem::Requirement
|
44
44
|
requirements:
|
45
|
-
- -
|
45
|
+
- - '>='
|
46
46
|
- !ruby/object:Gem::Version
|
47
47
|
version: '0'
|
48
48
|
type: :development
|
49
49
|
prerelease: false
|
50
50
|
version_requirements: !ruby/object:Gem::Requirement
|
51
51
|
requirements:
|
52
|
-
- -
|
52
|
+
- - '>='
|
53
53
|
- !ruby/object:Gem::Version
|
54
54
|
version: '0'
|
55
55
|
description:
|
@@ -59,10 +59,10 @@ executables: []
|
|
59
59
|
extensions: []
|
60
60
|
extra_rdoc_files: []
|
61
61
|
files:
|
62
|
-
-
|
63
|
-
-
|
64
|
-
-
|
65
|
-
-
|
62
|
+
- .editorconfig
|
63
|
+
- .github/PULL_REQUEST_TEMPLATE.md
|
64
|
+
- .gitignore
|
65
|
+
- .travis.yml
|
66
66
|
- CONTRIBUTING.md
|
67
67
|
- Gemfile
|
68
68
|
- LICENSE.txt
|
@@ -82,17 +82,17 @@ require_paths:
|
|
82
82
|
- lib
|
83
83
|
required_ruby_version: !ruby/object:Gem::Requirement
|
84
84
|
requirements:
|
85
|
-
- -
|
85
|
+
- - '>='
|
86
86
|
- !ruby/object:Gem::Version
|
87
87
|
version: '0'
|
88
88
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
89
89
|
requirements:
|
90
|
-
- -
|
90
|
+
- - '>='
|
91
91
|
- !ruby/object:Gem::Version
|
92
92
|
version: '0'
|
93
93
|
requirements: []
|
94
94
|
rubyforge_project:
|
95
|
-
rubygems_version: 2.
|
95
|
+
rubygems_version: 2.6.4
|
96
96
|
signing_key:
|
97
97
|
specification_version: 4
|
98
98
|
summary: Explicit backporting of Array#dig and Hash#dig for Ruby < 2.3.
|