first_of 0.0.1 → 0.0.2
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 +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
|