docile 1.0.1 → 1.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.
- data/.rvmrc +48 -0
- data/HISTORY.md +14 -0
- data/LICENSE +1 -1
- data/README.md +60 -2
- data/lib/docile.rb +3 -2
- data/lib/docile/fallback_context_proxy.rb +2 -2
- data/lib/docile/version.rb +1 -1
- data/spec/docile_spec.rb +94 -1
- data/spec/spec_helper.rb +2 -1
- metadata +7 -5
data/.rvmrc
ADDED
@@ -0,0 +1,48 @@
|
|
1
|
+
#!/usr/bin/env bash
|
2
|
+
|
3
|
+
# This is an RVM Project .rvmrc file, used to automatically load the ruby
|
4
|
+
# development environment upon cd'ing into the directory
|
5
|
+
|
6
|
+
# First we specify our desired <ruby>[@<gemset>], the @gemset name is optional,
|
7
|
+
# Only full ruby name is supported here, for short names use:
|
8
|
+
# echo "rvm use 1.9.3" > .rvmrc
|
9
|
+
environment_id="ruby-1.9.3-p385@docile"
|
10
|
+
|
11
|
+
# Uncomment the following lines if you want to verify rvm version per project
|
12
|
+
# rvmrc_rvm_version="1.18.8 (stable)" # 1.10.1 seams as a safe start
|
13
|
+
# eval "$(echo ${rvm_version}.${rvmrc_rvm_version} | awk -F. '{print "[[ "$1*65536+$2*256+$3" -ge "$4*65536+$5*256+$6" ]]"}' )" || {
|
14
|
+
# echo "This .rvmrc file requires at least RVM ${rvmrc_rvm_version}, aborting loading."
|
15
|
+
# return 1
|
16
|
+
# }
|
17
|
+
|
18
|
+
# First we attempt to load the desired environment directly from the environment
|
19
|
+
# file. This is very fast and efficient compared to running through the entire
|
20
|
+
# CLI and selector. If you want feedback on which environment was used then
|
21
|
+
# insert the word 'use' after --create as this triggers verbose mode.
|
22
|
+
if [[ -d "${rvm_path:-$HOME/.rvm}/environments"
|
23
|
+
&& -s "${rvm_path:-$HOME/.rvm}/environments/$environment_id" ]]
|
24
|
+
then
|
25
|
+
\. "${rvm_path:-$HOME/.rvm}/environments/$environment_id"
|
26
|
+
[[ -s "${rvm_path:-$HOME/.rvm}/hooks/after_use" ]] &&
|
27
|
+
\. "${rvm_path:-$HOME/.rvm}/hooks/after_use" || true
|
28
|
+
else
|
29
|
+
# If the environment file has not yet been created, use the RVM CLI to select.
|
30
|
+
rvm --create "$environment_id" || {
|
31
|
+
echo "Failed to create RVM environment '${environment_id}'."
|
32
|
+
return 1
|
33
|
+
}
|
34
|
+
fi
|
35
|
+
|
36
|
+
# If you use bundler, this might be useful to you:
|
37
|
+
# if [[ -s Gemfile ]] && {
|
38
|
+
# ! builtin command -v bundle >/dev/null ||
|
39
|
+
# builtin command -v bundle | GREP_OPTIONS= \grep $rvm_path/bin/bundle >/dev/null
|
40
|
+
# }
|
41
|
+
# then
|
42
|
+
# printf "%b" "The rubygem 'bundler' is not installed. Installing it now.\n"
|
43
|
+
# gem install bundler
|
44
|
+
# fi
|
45
|
+
# if [[ -s Gemfile ]] && builtin command -v bundle >/dev/null
|
46
|
+
# then
|
47
|
+
# bundle install | GREP_OPTIONS= \grep -vE '^Using|Your bundle is complete'
|
48
|
+
# fi
|
data/HISTORY.md
ADDED
@@ -0,0 +1,14 @@
|
|
1
|
+
# HISTORY
|
2
|
+
|
3
|
+
## [v1.0.2 (Apr 1, 2013)](http://github.com/ms-ati/docile/compare/v1.0.1...v1.0.2)
|
4
|
+
|
5
|
+
- allow passing parameters to DSL blocks (thanks @dslh!)
|
6
|
+
|
7
|
+
## [v1.0.1 (Nov 29, 2012)](http://github.com/ms-ati/docile/compare/v1.0.0...v1.0.1)
|
8
|
+
|
9
|
+
- relaxed rspec and rake dependencies to allow newer versions
|
10
|
+
- fixes to documentation
|
11
|
+
|
12
|
+
## [v1.0.0 (Oct 29, 2012)](http://github.com/ms-ati/docile/compare/1b225c8a27...v1.0.0)
|
13
|
+
|
14
|
+
- Initial Feature Set
|
data/LICENSE
CHANGED
data/README.md
CHANGED
@@ -81,6 +81,64 @@ It's just that easy!
|
|
81
81
|
|
82
82
|
[2]: http://stackoverflow.com/questions/328496/when-would-you-use-the-builder-pattern "Builder Pattern"
|
83
83
|
|
84
|
+
## Block parameters
|
85
|
+
|
86
|
+
Parameters can be passed to the DSL block.
|
87
|
+
|
88
|
+
Supposing you want to make some sort of cheap [Sinatra][3] knockoff:
|
89
|
+
```ruby
|
90
|
+
@last_request = nil
|
91
|
+
respond '/path' do |request|
|
92
|
+
puts "Request received: #{request}"
|
93
|
+
@last_request = request
|
94
|
+
end
|
95
|
+
|
96
|
+
def ride bike
|
97
|
+
# Play with your new bike
|
98
|
+
end
|
99
|
+
|
100
|
+
respond '/new_bike' do |bike|
|
101
|
+
ride(bike)
|
102
|
+
end
|
103
|
+
```
|
104
|
+
|
105
|
+
You'd put together a dispatcher something like this:
|
106
|
+
```ruby
|
107
|
+
require 'singleton'
|
108
|
+
|
109
|
+
class DispatchScope
|
110
|
+
def a_method_you_can_call_from_inside_the_block
|
111
|
+
:useful_huh?
|
112
|
+
end
|
113
|
+
end
|
114
|
+
|
115
|
+
class MessageDispatch
|
116
|
+
include Singleton
|
117
|
+
|
118
|
+
def initialize
|
119
|
+
@responders = {}
|
120
|
+
end
|
121
|
+
|
122
|
+
def add_responder path, &block
|
123
|
+
@responders[path] = block
|
124
|
+
end
|
125
|
+
|
126
|
+
def dispatch path, request
|
127
|
+
Docile.dsl_eval(DispatchScope.new, request, &@responders[path])
|
128
|
+
end
|
129
|
+
end
|
130
|
+
|
131
|
+
def respond path, &handler
|
132
|
+
MessageDispatch.instance.add_responder path, handler
|
133
|
+
end
|
134
|
+
|
135
|
+
def send_request path, request
|
136
|
+
MessageDispatch.instance.dispatch path, request
|
137
|
+
end
|
138
|
+
```
|
139
|
+
|
140
|
+
[3]: http://www.sinatrarb.com "Sinatra"
|
141
|
+
|
84
142
|
## Features
|
85
143
|
|
86
144
|
1. method lookup falls back from the DSL object to the block's context
|
@@ -102,7 +160,7 @@ Or, read the code hosted on *github.com*: [Docile Code](https://github.com/ms-at
|
|
102
160
|
|
103
161
|
## Status
|
104
162
|
|
105
|
-
Version 1.0 works on [all ruby versions](https://github.com/ms-ati/docile/blob/master/.travis.yml).
|
163
|
+
Version 1.0.x works on [all ruby versions since 1.8.7](https://github.com/ms-ati/docile/blob/master/.travis.yml).
|
106
164
|
|
107
165
|
## Note on Patches/Pull Requests
|
108
166
|
|
@@ -117,4 +175,4 @@ Version 1.0 works on [all ruby versions](https://github.com/ms-ati/docile/blob/m
|
|
117
175
|
|
118
176
|
## Copyright
|
119
177
|
|
120
|
-
Copyright (c) 2012 Marc Siegel. See LICENSE for details.
|
178
|
+
Copyright (c) 2012-2013 Marc Siegel. See LICENSE for details.
|
data/lib/docile.rb
CHANGED
@@ -15,14 +15,15 @@ module Docile
|
|
15
15
|
# #=> [1, 3]
|
16
16
|
#
|
17
17
|
# @param dsl [Object] an object whose methods represent a DSL
|
18
|
+
# @param args [Array] arguments to be passed to the block
|
18
19
|
# @param block [Proc] a block to execute in the DSL context
|
19
20
|
# @return [Object] the dsl object, after execution of the block
|
20
|
-
def dsl_eval(dsl, &block)
|
21
|
+
def dsl_eval(dsl, *args, &block)
|
21
22
|
block_context = eval("self", block.binding)
|
22
23
|
proxy_context = FallbackContextProxy.new(dsl, block_context)
|
23
24
|
begin
|
24
25
|
block_context.instance_variables.each { |ivar| proxy_context.instance_variable_set(ivar, block_context.instance_variable_get(ivar)) }
|
25
|
-
proxy_context.
|
26
|
+
proxy_context.instance_exec(*args,&block)
|
26
27
|
ensure
|
27
28
|
block_context.instance_variables.each { |ivar| block_context.instance_variable_set(ivar, proxy_context.instance_variable_get(ivar)) }
|
28
29
|
end
|
@@ -2,7 +2,7 @@ require 'set'
|
|
2
2
|
|
3
3
|
module Docile
|
4
4
|
class FallbackContextProxy
|
5
|
-
NON_PROXIED_METHODS = Set[:object_id, :__send__, :__id__, :==, :equal?, :"!", :"!=", :
|
5
|
+
NON_PROXIED_METHODS = Set[:object_id, :__send__, :__id__, :==, :equal?, :"!", :"!=", :instance_exec,
|
6
6
|
:instance_variables, :instance_variable_get, :instance_variable_set,
|
7
7
|
:remove_instance_variable]
|
8
8
|
|
@@ -50,4 +50,4 @@ module Docile
|
|
50
50
|
end
|
51
51
|
end
|
52
52
|
end
|
53
|
-
end
|
53
|
+
end
|
data/lib/docile/version.rb
CHANGED
data/spec/docile_spec.rb
CHANGED
@@ -45,12 +45,46 @@ describe Docile do
|
|
45
45
|
def inner(&block)
|
46
46
|
Docile.dsl_eval(InnerDSL.new, &block)
|
47
47
|
end
|
48
|
+
|
49
|
+
def inner_with_params(param,&block)
|
50
|
+
Docile.dsl_eval(InnerDSL.new, param, :foo, &block)
|
51
|
+
end
|
48
52
|
end
|
49
53
|
|
50
54
|
def outer(&block)
|
51
55
|
Docile.dsl_eval(OuterDSL.new, &block)
|
52
56
|
end
|
53
57
|
|
58
|
+
def parameterized(*args,&block)
|
59
|
+
Docile.dsl_eval(OuterDSL.new, *args, &block)
|
60
|
+
end
|
61
|
+
|
62
|
+
context "parameters" do
|
63
|
+
it "should pass parameters to the block" do
|
64
|
+
parameterized(1,2,3) do |x,y,z|
|
65
|
+
x.should == 1
|
66
|
+
y.should == 2
|
67
|
+
z.should == 3
|
68
|
+
end
|
69
|
+
end
|
70
|
+
|
71
|
+
it "should find parameters before methods" do
|
72
|
+
parameterized(1) { |a| a.should == 1 }
|
73
|
+
end
|
74
|
+
|
75
|
+
it "should find outer parameters in inner dsl scope" do
|
76
|
+
parameterized(1,2,3) do |a,b,c|
|
77
|
+
inner_with_params(c) do |d,e|
|
78
|
+
a.should == 1
|
79
|
+
b.should == 2
|
80
|
+
c.should == 3
|
81
|
+
d.should == c
|
82
|
+
e.should == :foo
|
83
|
+
end
|
84
|
+
end
|
85
|
+
end
|
86
|
+
end
|
87
|
+
|
54
88
|
context "methods" do
|
55
89
|
it "should find method of outer dsl in outer dsl scope" do
|
56
90
|
outer { a.should == 'a' }
|
@@ -111,6 +145,65 @@ describe Docile do
|
|
111
145
|
end
|
112
146
|
end
|
113
147
|
|
148
|
+
class DispatchScope
|
149
|
+
def params
|
150
|
+
{ :a => 1, :b => 2, :c => 3 }
|
151
|
+
end
|
152
|
+
end
|
153
|
+
|
154
|
+
class MessageDispatch
|
155
|
+
include Singleton
|
156
|
+
|
157
|
+
def initialize
|
158
|
+
@responders = {}
|
159
|
+
end
|
160
|
+
|
161
|
+
def add_responder path, &block
|
162
|
+
@responders[path] = block
|
163
|
+
end
|
164
|
+
|
165
|
+
def dispatch path, request
|
166
|
+
Docile.dsl_eval(DispatchScope.new, request, &@responders[path])
|
167
|
+
end
|
168
|
+
end
|
169
|
+
|
170
|
+
def respond path, &block
|
171
|
+
MessageDispatch.instance.add_responder path, &block
|
172
|
+
end
|
173
|
+
|
174
|
+
def send_request path, request
|
175
|
+
MessageDispatch.instance.dispatch path, request
|
176
|
+
end
|
177
|
+
|
178
|
+
it "should handle the dispatch pattern" do
|
179
|
+
@first = @second = nil
|
180
|
+
respond '/path' do |request|
|
181
|
+
@first = request
|
182
|
+
end
|
183
|
+
|
184
|
+
respond '/new_bike' do |bike|
|
185
|
+
@second = "Got a new #{bike}"
|
186
|
+
end
|
187
|
+
|
188
|
+
def x(y) ; "Got a #{y}"; end
|
189
|
+
respond '/third' do |third|
|
190
|
+
x(third).should == 'Got a third thing'
|
191
|
+
end
|
192
|
+
|
193
|
+
fourth = nil
|
194
|
+
respond '/params' do |arg|
|
195
|
+
fourth = params[arg]
|
196
|
+
end
|
197
|
+
|
198
|
+
send_request '/path', 1
|
199
|
+
send_request '/new_bike', 'ten speed'
|
200
|
+
send_request '/third', 'third thing'
|
201
|
+
send_request '/params', :b
|
202
|
+
|
203
|
+
@first.should == 1
|
204
|
+
@second.should == 'Got a new ten speed'
|
205
|
+
fourth.should == 2
|
206
|
+
end
|
114
207
|
end
|
115
208
|
|
116
|
-
end
|
209
|
+
end
|
data/spec/spec_helper.rb
CHANGED
@@ -1,5 +1,6 @@
|
|
1
1
|
require 'rubygems'
|
2
2
|
require 'rspec'
|
3
|
+
require 'singleton'
|
3
4
|
|
4
5
|
test_dir = File.dirname(__FILE__)
|
5
6
|
$LOAD_PATH.unshift test_dir unless $LOAD_PATH.include?(test_dir)
|
@@ -7,4 +8,4 @@ $LOAD_PATH.unshift test_dir unless $LOAD_PATH.include?(test_dir)
|
|
7
8
|
lib_dir = File.join(File.dirname(test_dir), 'lib')
|
8
9
|
$LOAD_PATH.unshift lib_dir unless $LOAD_PATH.include?(lib_dir)
|
9
10
|
|
10
|
-
require 'docile'
|
11
|
+
require 'docile'
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: docile
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.0.
|
4
|
+
version: 1.0.2
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date:
|
12
|
+
date: 2013-04-01 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: rake
|
@@ -100,9 +100,11 @@ extensions: []
|
|
100
100
|
extra_rdoc_files: []
|
101
101
|
files:
|
102
102
|
- .gitignore
|
103
|
+
- .rvmrc
|
103
104
|
- .travis.yml
|
104
105
|
- .yardopts
|
105
106
|
- Gemfile
|
107
|
+
- HISTORY.md
|
106
108
|
- LICENSE
|
107
109
|
- README.md
|
108
110
|
- Rakefile
|
@@ -126,7 +128,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
126
128
|
version: '0'
|
127
129
|
segments:
|
128
130
|
- 0
|
129
|
-
hash: -
|
131
|
+
hash: -106941105642538059
|
130
132
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
131
133
|
none: false
|
132
134
|
requirements:
|
@@ -135,10 +137,10 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
135
137
|
version: '0'
|
136
138
|
segments:
|
137
139
|
- 0
|
138
|
-
hash: -
|
140
|
+
hash: -106941105642538059
|
139
141
|
requirements: []
|
140
142
|
rubyforge_project: docile
|
141
|
-
rubygems_version: 1.8.
|
143
|
+
rubygems_version: 1.8.25
|
142
144
|
signing_key:
|
143
145
|
specification_version: 3
|
144
146
|
summary: Docile keeps your Ruby DSL's tame and well-behaved
|