uber 0.0.6 → 0.0.7
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGES.md +4 -0
- data/README.md +24 -1
- data/lib/uber/callable.rb +7 -0
- data/lib/uber/options.rb +23 -7
- data/lib/uber/uber_version.rb +1 -1
- data/test/inheritance_test.rb +3 -0
- data/test/options_test.rb +16 -3
- metadata +11 -11
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 8b1c72fd6f3f99e2d92ee6bba306785d88b64963
|
4
|
+
data.tar.gz: 01443d5ec98cee53824c305ffa5203030849b33a
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 39ccf2b0c211ae18559d825ae4613c450e2c38b63a692d5ad86b5da51f33f32bc05100869f0ecdcadce2888d01be5af3017bee1db16bbc2eef9b31d1b455e2fa
|
7
|
+
data.tar.gz: 11e6460fafc4153976248595236e08bc543c11ba32252bfe0708b454c32b8ba335a01f5c7c149742869ff0c89b2bf1f313cb188746cb0d17d07056c141ddae37
|
data/CHANGES.md
CHANGED
data/README.md
CHANGED
@@ -108,9 +108,32 @@ The default behaviour is to treat `Proc`s, lambdas and symbolized `:method` name
|
|
108
108
|
|
109
109
|
This is a pattern well-known from Rails and other frameworks.
|
110
110
|
|
111
|
+
## Uber::Callable
|
112
|
+
|
113
|
+
A third way of providing a dynamic option is using a "callable" object. This saves you the unreadable lambda syntax and gives you more flexibility.
|
114
|
+
|
115
|
+
```ruby
|
116
|
+
require 'uber/callable'
|
117
|
+
class Tags
|
118
|
+
include Uber::Callable
|
119
|
+
|
120
|
+
def call(context, *args)
|
121
|
+
[:comment]
|
122
|
+
end
|
123
|
+
end
|
124
|
+
```
|
125
|
+
|
126
|
+
By including `Uber::Callable`, uber will invoke the `#call` method on the specified object.
|
127
|
+
|
128
|
+
Note how you simply pass an instance of the callable object into the hash instead of a lambda.
|
129
|
+
|
130
|
+
```ruby
|
131
|
+
options = Uber::Options.new(tags: Tags.new)
|
132
|
+
```
|
133
|
+
|
111
134
|
## Evaluating Elements
|
112
135
|
|
113
|
-
If you
|
136
|
+
If you want to evaluate a single option element, use `#eval`.
|
114
137
|
|
115
138
|
```ruby
|
116
139
|
options.eval(:ttl, user) #=> "n/a"
|
data/lib/uber/options.rb
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
require 'uber/callable'
|
2
|
+
|
1
3
|
module Uber
|
2
4
|
class Options < Hash
|
3
5
|
def initialize(options)
|
@@ -43,13 +45,13 @@ module Uber
|
|
43
45
|
def initialize(value, options={})
|
44
46
|
@value, @dynamic = value, options[:dynamic]
|
45
47
|
|
46
|
-
@
|
48
|
+
@proc = proc?
|
49
|
+
@callable = callable?
|
50
|
+
@method = method?
|
47
51
|
|
48
52
|
return if options.has_key?(:dynamic)
|
49
53
|
|
50
|
-
|
51
|
-
@dynamic = true if @callable
|
52
|
-
@dynamic = true if @value.is_a?(Symbol)
|
54
|
+
@dynamic = @proc || @callable || @method
|
53
55
|
end
|
54
56
|
|
55
57
|
def evaluate(context, *args)
|
@@ -64,9 +66,10 @@ module Uber
|
|
64
66
|
|
65
67
|
private
|
66
68
|
def evaluate_for(*args)
|
67
|
-
return
|
69
|
+
return proc!(*args) if @proc
|
70
|
+
return callable!(*args) if @callable
|
71
|
+
method!(*args)
|
68
72
|
# TODO: change to context.instance_exec and deprecate first argument.
|
69
|
-
proc!(*args)
|
70
73
|
end
|
71
74
|
|
72
75
|
def method!(context, *args)
|
@@ -77,8 +80,21 @@ module Uber
|
|
77
80
|
context.instance_exec(*args, &@value)
|
78
81
|
end
|
79
82
|
|
83
|
+
# Callable object is executed in its original context.
|
84
|
+
def callable!(context, *args)
|
85
|
+
@value.call(context, *args)
|
86
|
+
end
|
87
|
+
|
88
|
+
def proc?
|
89
|
+
@value.kind_of?(Proc)
|
90
|
+
end
|
91
|
+
|
80
92
|
def callable?
|
81
|
-
@
|
93
|
+
@value.is_a?(Uber::Callable)
|
94
|
+
end
|
95
|
+
|
96
|
+
def method?
|
97
|
+
@value.is_a?(Symbol)
|
82
98
|
end
|
83
99
|
end
|
84
100
|
end
|
data/lib/uber/uber_version.rb
CHANGED
data/test/inheritance_test.rb
CHANGED
@@ -21,6 +21,9 @@ class InheritanceTest < MiniTest::Spec
|
|
21
21
|
|
22
22
|
CODE_BLOCK = lambda { |base| base.class_eval { extend ClassMethods } } # i want that to be executed at every include
|
23
23
|
|
24
|
+
instance_exec do
|
25
|
+
@block = CODE_BLOCK # this would happen in inherited_included do .. end
|
26
|
+
end
|
24
27
|
|
25
28
|
def self.included(includer) #
|
26
29
|
# CODE_BLOCK.call(base)
|
data/test/options_test.rb
CHANGED
@@ -5,16 +5,24 @@ class UberOptionTest < MiniTest::Spec
|
|
5
5
|
Value = Uber::Options::Value
|
6
6
|
let (:object) { Object.new }
|
7
7
|
|
8
|
+
class Callable
|
9
|
+
include Uber::Callable
|
10
|
+
def call(*); 999 end
|
11
|
+
end
|
12
|
+
|
8
13
|
describe "#dynamic?" do
|
9
|
-
it { Value.new(1).dynamic?.must_equal
|
10
|
-
it { Value.new(true).dynamic?.must_equal
|
11
|
-
it { Value.new("loud").dynamic?.must_equal
|
14
|
+
it { Value.new(1).dynamic?.must_equal false }
|
15
|
+
it { Value.new(true).dynamic?.must_equal false }
|
16
|
+
it { Value.new("loud").dynamic?.must_equal false }
|
12
17
|
it { Value.new(:loud, :dynamic => false).dynamic?.must_equal false }
|
13
18
|
it { Value.new("loud", :dynamic => true).dynamic?.must_equal true }
|
14
19
|
|
15
20
|
it { Value.new(lambda {}).dynamic?.must_equal true }
|
16
21
|
it { Value.new(Proc.new{}).dynamic?.must_equal true }
|
17
22
|
it { Value.new(:method).dynamic?.must_equal true }
|
23
|
+
|
24
|
+
# Uber::Callable
|
25
|
+
it { Value.new(Callable.new).dynamic?.must_equal true }
|
18
26
|
end
|
19
27
|
|
20
28
|
describe "#evaluate" do
|
@@ -30,14 +38,19 @@ class UberOptionTest < MiniTest::Spec
|
|
30
38
|
it { Value.new(:version, :dynamic => false).evaluate(object.extend(version)).must_equal :version }
|
31
39
|
|
32
40
|
it { Value.new(lambda { :loud }, :dynamic => true).evaluate(object).must_equal :loud }
|
41
|
+
|
42
|
+
# Uber::Callable
|
43
|
+
it { Value.new(Callable.new).evaluate(nil).must_equal 999 }
|
33
44
|
end
|
34
45
|
|
35
46
|
describe "passing options" do
|
36
47
|
let (:version) { Module.new { def version(*args); args.inspect end } }
|
37
48
|
let (:block) { Proc.new { |*args| args.inspect } }
|
49
|
+
let (:callable) { (Class.new { include Uber::Callable; def call(*args); args.inspect; end }).new }
|
38
50
|
|
39
51
|
it { Value.new(:version).evaluate(object.extend(version), 1, 2, 3).must_equal "[1, 2, 3]" }
|
40
52
|
it { Value.new(block).evaluate(object, 1, 2, 3).must_equal "[1, 2, 3]" }
|
53
|
+
it { Value.new(callable).evaluate(Object, 1, 2, 3).must_equal "[Object, 1, 2, 3]" }
|
41
54
|
end
|
42
55
|
|
43
56
|
# it "speed" do
|
metadata
CHANGED
@@ -1,41 +1,41 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: uber
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.7
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Nick Sutterer
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-
|
11
|
+
date: 2014-07-01 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rake
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
16
16
|
requirements:
|
17
|
-
- -
|
17
|
+
- - '>='
|
18
18
|
- !ruby/object:Gem::Version
|
19
19
|
version: 0.10.1
|
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: 0.10.1
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: minitest
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
30
30
|
requirements:
|
31
|
-
- -
|
31
|
+
- - '>='
|
32
32
|
- !ruby/object:Gem::Version
|
33
33
|
version: 5.0.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: 5.0.0
|
41
41
|
description: A gem-authoring framework.
|
@@ -45,13 +45,14 @@ executables: []
|
|
45
45
|
extensions: []
|
46
46
|
extra_rdoc_files: []
|
47
47
|
files:
|
48
|
-
-
|
48
|
+
- .gitignore
|
49
49
|
- CHANGES.md
|
50
50
|
- Gemfile
|
51
51
|
- LICENSE
|
52
52
|
- README.md
|
53
53
|
- Rakefile
|
54
54
|
- lib/uber.rb
|
55
|
+
- lib/uber/callable.rb
|
55
56
|
- lib/uber/inheritable_attr.rb
|
56
57
|
- lib/uber/options.rb
|
57
58
|
- lib/uber/uber_version.rb
|
@@ -73,17 +74,17 @@ require_paths:
|
|
73
74
|
- lib
|
74
75
|
required_ruby_version: !ruby/object:Gem::Requirement
|
75
76
|
requirements:
|
76
|
-
- -
|
77
|
+
- - '>='
|
77
78
|
- !ruby/object:Gem::Version
|
78
79
|
version: '0'
|
79
80
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
80
81
|
requirements:
|
81
|
-
- -
|
82
|
+
- - '>='
|
82
83
|
- !ruby/object:Gem::Version
|
83
84
|
version: '0'
|
84
85
|
requirements: []
|
85
86
|
rubyforge_project:
|
86
|
-
rubygems_version: 2.2.
|
87
|
+
rubygems_version: 2.2.2
|
87
88
|
signing_key:
|
88
89
|
specification_version: 4
|
89
90
|
summary: Gem-authoring tools like class method inheritance in modules, dynamic options
|
@@ -95,4 +96,3 @@ test_files:
|
|
95
96
|
- test/test_helper.rb
|
96
97
|
- test/version_test.rb
|
97
98
|
- test/zeugs.rb
|
98
|
-
has_rdoc:
|