first_of 0.0.1 → 0.0.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +37 -2
- data/lib/first_of.rb +17 -31
- data/lib/first_of/version.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 0a26712d5e174fa9c5c61029edd9abc2e65059b5
|
4
|
+
data.tar.gz: 4e3159d3fc6d1a3ff7c71cb769e49f34719158db
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: d742cc1e16c2811b4f091d1e45b0a34472ad28cb8e41c24dcd3c62228786f02c689f37d67316e0a69cd339e6c8d77e626fb67eef28a6c25acb1abb56a8707c0e
|
7
|
+
data.tar.gz: 00e45ca8b4d912bde4a646521cf6a3422c1f5a2760952bda06daeb80aa62b82649709a57e55807c543aabe0905845a2aaa5c9062ea1d9451876bacea06ca0a9f
|
data/README.md
CHANGED
@@ -1,6 +1,11 @@
|
|
1
1
|
# FirstOf
|
2
2
|
|
3
|
-
|
3
|
+
FirstOf can be used when multiple values can be reduced into a single return value.
|
4
|
+
This is common in things like XML/JSON where the "intended" value is available in
|
5
|
+
2 fields and is determined by the presence of a value in the document and is often
|
6
|
+
prioritized (first check field 1, then field 2, then field x)
|
7
|
+
|
8
|
+
FirstOf handles calling methods/lambdas and prioritizing them.
|
4
9
|
|
5
10
|
## Installation
|
6
11
|
|
@@ -18,7 +23,37 @@ Or install it yourself as:
|
|
18
23
|
|
19
24
|
## Usage
|
20
25
|
|
21
|
-
|
26
|
+
```ruby
|
27
|
+
require 'first_of'
|
28
|
+
|
29
|
+
class Widget
|
30
|
+
include ::FirstOf
|
31
|
+
|
32
|
+
def nothing; nil; end
|
33
|
+
def selfie; self; end
|
34
|
+
def something; "something"; end
|
35
|
+
end
|
36
|
+
|
37
|
+
widget = Widget.new
|
38
|
+
|
39
|
+
# Use it to get to something usable on self
|
40
|
+
widget.first_of(:nothing, :something, :self) # => "something"
|
41
|
+
widget.first_of(:nothing, :self, :something) # => self
|
42
|
+
widget.first_of(:nothing, :nothing, :something) # => "something"
|
43
|
+
|
44
|
+
# Wrap calls in an Array to `try_chain` them
|
45
|
+
widget.first_of([:self, :nothing], :something) # => "something"
|
46
|
+
|
47
|
+
# Wrap a call in a lambda (or any callable) to delay execution
|
48
|
+
widget.first_of(:something, lambda { "derp" }) # => "something"
|
49
|
+
widget.first_of(lambda { "derp" }, :something) # => "derp"
|
50
|
+
widget.first_of(lambda { nothing }, :something) # => "something"
|
51
|
+
|
52
|
+
# Prioritize the calls/call chains if desired
|
53
|
+
widget.first_of(2 => :something, 1 => lambda { "derp" }) # => "derp"
|
54
|
+
widget.first_of(2 => lambda { "derp" }, 1 => :something) # => "something"
|
55
|
+
widget.first_of(2 => lambda { nothing }, 1 => :something) # => "something"
|
56
|
+
```
|
22
57
|
|
23
58
|
## Contributing
|
24
59
|
|
data/lib/first_of.rb
CHANGED
@@ -16,28 +16,29 @@ module FirstOf
|
|
16
16
|
# first_of(1 => :symbol1, 2 => 4) # will prioritize and return value (4) if first not present
|
17
17
|
# first_of(lambda { _call }, 1 => :symbol1, 2 => :symbol2)
|
18
18
|
def first_of(*args)
|
19
|
-
|
19
|
+
return _first_of(*args, :try_chain, :proxy_try_chain)
|
20
|
+
end
|
20
21
|
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
args << extract_hash[key]
|
25
|
-
end
|
22
|
+
def first_of!(*args)
|
23
|
+
return _first_of(*args, :try_chain!, :proxy_try_chain!)
|
24
|
+
end
|
26
25
|
|
27
|
-
|
28
|
-
|
29
|
-
|
26
|
+
private
|
27
|
+
|
28
|
+
def _extract_from_message_chain(methods_or_value, try_method = :try_chain, proxy_try_method = :proxy_try_chain)
|
29
|
+
case methods_or_value
|
30
|
+
when Symbol, Array then
|
31
|
+
if self.respond_to?(:try_chain)
|
32
|
+
self.__send__(try_method, *methods_or_value)
|
30
33
|
else
|
31
|
-
|
34
|
+
::TryChain.__send__(proxy_try_method, self, *methods_or_value)
|
32
35
|
end
|
33
|
-
|
34
|
-
|
36
|
+
else
|
37
|
+
methods_or_value
|
35
38
|
end
|
36
|
-
|
37
|
-
return nil
|
38
39
|
end
|
39
40
|
|
40
|
-
def
|
41
|
+
def _first_of(*args, try_method, proxy_try_method)
|
41
42
|
extract_hash = args.extract_options!
|
42
43
|
|
43
44
|
# Don't care if the hash is empty or not because of #each call
|
@@ -50,7 +51,7 @@ module FirstOf
|
|
50
51
|
if argument.respond_to?(:call)
|
51
52
|
value = argument.call
|
52
53
|
else
|
53
|
-
value = _extract_from_message_chain(argument,
|
54
|
+
value = _extract_from_message_chain(argument, try_method, proxy_try_method)
|
54
55
|
end
|
55
56
|
|
56
57
|
return value if _valid_value?(value) # return value if found
|
@@ -59,21 +60,6 @@ module FirstOf
|
|
59
60
|
return nil
|
60
61
|
end
|
61
62
|
|
62
|
-
private
|
63
|
-
|
64
|
-
def _extract_from_message_chain(methods_or_value, try_method = :try_chain, proxy_try_method = :proxy_try_chain)
|
65
|
-
case methods_or_value
|
66
|
-
when Symbol, Array then
|
67
|
-
if self.respond_to?(:try_chain)
|
68
|
-
self.__send__(try_method, *methods_or_value)
|
69
|
-
else
|
70
|
-
::TryChain.__send__(proxy_try_method, self, *methods_or_value)
|
71
|
-
end
|
72
|
-
else
|
73
|
-
methods_or_value
|
74
|
-
end
|
75
|
-
end
|
76
|
-
|
77
63
|
def _valid_value?(value)
|
78
64
|
value.present? || [true, false].include?(value)
|
79
65
|
end
|
data/lib/first_of/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: first_of
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Brandon Dewitt
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2013-11-
|
11
|
+
date: 2013-11-22 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activesupport
|