ripl 0.2.3 → 0.2.4

Sign up to get free protection for your applications and to get access to all the features.
data/CHANGELOG.rdoc CHANGED
@@ -1,3 +1,8 @@
1
+ == 0.2.4
2
+ * Add modular console commands with Ripl::Commands
3
+ * Add Shell#result_prompt for plugins
4
+ * Re-enable Shell#eval_input and #loop_once for plugins
5
+
1
6
  == 0.2.3
2
7
  * Add Shell docs
3
8
  * Sync shell binding with completion binding
data/README.rdoc CHANGED
@@ -67,6 +67,7 @@ modifying ~/.irbrc, wrap your irb-specific configuration in a block as follow:
67
67
  * Customizable completion and completion of method arguments (from bond)
68
68
  * Easy to create custom shells for gems and apps i.e. Ripl.start
69
69
  * Easy to create and invoke ripl commands
70
+ * Create console commands in a simple, modular way
70
71
  * ~/.irbrc errors caught
71
72
  * Different from irb
72
73
  * No multi-line evaluation by default (there is a plugin. See Available Plugins below).
data/lib/ripl.rb CHANGED
@@ -8,6 +8,7 @@ module Ripl
8
8
  def self.shell(options={})
9
9
  @shell ||= Shell.create(config.merge(options))
10
10
  end
11
+ module Commands; end
11
12
  end
12
13
 
13
14
  require 'ripl/shell'
@@ -3,8 +3,8 @@ require 'bond'
3
3
  module Ripl::Completion
4
4
  def before_loop
5
5
  super
6
- options = {:eval_binding=>lambda { Ripl.shell.binding }}
7
- Bond.restart((config[:completion] || {}).merge(options))
6
+ Bond.restart config[:completion]
8
7
  end
9
8
  end
10
9
  Ripl::Shell.send :include, Ripl::Completion
10
+ (Ripl.config[:completion] ||= {})[:eval_binding] = lambda { Ripl.shell.binding }
data/lib/ripl/history.rb CHANGED
@@ -10,7 +10,7 @@ module Ripl::History
10
10
  end
11
11
 
12
12
  def before_loop
13
- config[:history], @history = '~/.irb_history', []
13
+ @history = []
14
14
  super
15
15
  at_exit { write_history }
16
16
  File.exists?(history_file) &&
@@ -22,3 +22,4 @@ module Ripl::History
22
22
  end
23
23
  end
24
24
  Ripl::Shell.send :include, Ripl::History
25
+ Ripl.config[:history] = '~/.irb_history'
data/lib/ripl/shell.rb CHANGED
@@ -10,7 +10,7 @@ class Ripl::Shell
10
10
  new(options)
11
11
  end
12
12
 
13
- attr_accessor :line, :binding, :result_prompt, :result, :name
13
+ attr_accessor :line, :binding, :result, :name
14
14
  def initialize(options={})
15
15
  options = OPTIONS.merge options
16
16
  @name, @binding = options.values_at(:name, :binding)
@@ -27,31 +27,38 @@ class Ripl::Shell
27
27
 
28
28
  def config; Ripl.config; end
29
29
 
30
- # Runs through one loop iteration: gets input, evals and prints result
31
- def loop_once
32
- @error_raised = nil
33
- @input = get_input
34
- throw(:ripl_exit) if !@input || @input == 'exit'
35
- eval_input(@input)
36
- print_result(@result)
37
- end
38
-
39
- # Sets @result to result of evaling input and print unexpected errors
40
- def eval_input(input)
41
- @result = loop_eval(input)
42
- eval("_ = Ripl.shell.result", @binding)
43
- rescue Exception => e
44
- @error_raised = true
45
- print_eval_error(e)
46
- ensure
47
- @line += 1
48
- end
49
-
50
30
  module API
31
+ attr_accessor :prompt, :result_prompt
51
32
  # Sets up shell before looping by loading ~/.irbrc. Can be extended to
52
33
  # initialize plugins and their instance variables.
53
34
  def before_loop
54
35
  Ripl::Runner.load_rc(@irbrc) if @irbrc
36
+ add_commands(loop_eval("self"))
37
+ end
38
+
39
+ def add_commands(obj)
40
+ ![Symbol, Fixnum].include?(obj.class) ? obj.extend(Ripl::Commands) :
41
+ obj.class.send(:include, Ripl::Commands)
42
+ end
43
+
44
+ # Runs through one loop iteration: gets input, evals and prints result
45
+ def loop_once
46
+ @error_raised = nil
47
+ @input = get_input
48
+ throw(:ripl_exit) if !@input || @input == 'exit'
49
+ eval_input(@input)
50
+ print_result(@result)
51
+ end
52
+
53
+ # Sets @result to result of evaling input and print unexpected errors
54
+ def eval_input(input)
55
+ @result = loop_eval(input)
56
+ eval("_ = Ripl.shell.result", @binding)
57
+ rescue Exception => e
58
+ @error_raised = true
59
+ print_eval_error(e)
60
+ ensure
61
+ @line += 1
55
62
  end
56
63
 
57
64
  # @return [String, nil] Prints #prompt and returns input given by user
@@ -89,7 +96,7 @@ class Ripl::Shell
89
96
 
90
97
  # @return [String] Formats result using result_prompt
91
98
  def format_result(result)
92
- @result_prompt + result.inspect
99
+ result_prompt + result.inspect
93
100
  end
94
101
 
95
102
  # Called after shell finishes looping.
data/lib/ripl/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Ripl
2
- VERSION = '0.2.3'
2
+ VERSION = '0.2.4'
3
3
  end
data/man/ripl.1 CHANGED
@@ -171,6 +171,37 @@ end
171
171
  To add configuration for a plugin, add a key to Ripl\.config that matches the underscored version of the plugin name i\.e\. Ripl::RedError \-> Ripl\.config[:red_error]\. To set a default config value, just set it after including the plugin into Ripl::Shell\.
172
172
  .
173
173
  .IP "\(bu" 4
174
+ To add console commands for a plugin, make them methods in a module and include the module into Ripl::Commands\. For example:
175
+ .
176
+ .IP
177
+ module Ripl::SuperHistory
178
+ .
179
+ .IP "" 4
180
+ .
181
+ .nf
182
+
183
+ # plugin hooks into history
184
+ # then defines command
185
+ module Commands
186
+ def history
187
+ # \.\.\.
188
+ end
189
+ end
190
+ .
191
+ .fi
192
+ .
193
+ .IP "" 0
194
+ .
195
+ .IP
196
+ end
197
+ .
198
+ .IP
199
+ Ripl::Commands\.send :include, Ripl::SuperHistory::Commands
200
+ .
201
+ .IP
202
+ >> history # use command in ripl
203
+ .
204
+ .IP "\(bu" 4
174
205
  For more examples of plugins, see gems I\'ve made that start with \'ripl\-\'\.
175
206
  .
176
207
  .IP "" 0
data/man/ripl.1.html ADDED
@@ -0,0 +1,278 @@
1
+ <!DOCTYPE html>
2
+ <html>
3
+ <head>
4
+ <meta http-equiv='content-type' value='text/html;charset=utf8'>
5
+ <meta name='generator' value='Ronn/v0.7.3 (http://github.com/rtomayko/ronn/tree/0.7.3)'>
6
+ <title>ripl(1) - Ruby Interactive Print Loop - A light, modular alternative to irb</title>
7
+ <style type='text/css' media='all'>
8
+ /* style: man */
9
+ body#manpage {margin:0}
10
+ .mp {max-width:100ex;padding:0 9ex 1ex 4ex}
11
+ .mp p,.mp pre,.mp ul,.mp ol,.mp dl {margin:0 0 20px 0}
12
+ .mp h2 {margin:10px 0 0 0}
13
+ .mp > p,.mp > pre,.mp > ul,.mp > ol,.mp > dl {margin-left:8ex}
14
+ .mp h3 {margin:0 0 0 4ex}
15
+ .mp dt {margin:0;clear:left}
16
+ .mp dt.flush {float:left;width:8ex}
17
+ .mp dd {margin:0 0 0 9ex}
18
+ .mp h1,.mp h2,.mp h3,.mp h4 {clear:left}
19
+ .mp pre {margin-bottom:20px}
20
+ .mp pre+h2,.mp pre+h3 {margin-top:22px}
21
+ .mp h2+pre,.mp h3+pre {margin-top:5px}
22
+ .mp img {display:block;margin:auto}
23
+ .mp h1.man-title {display:none}
24
+ .mp,.mp code,.mp pre,.mp tt,.mp kbd,.mp samp,.mp h3,.mp h4 {font-family:monospace;font-size:14px;line-height:1.42857142857143}
25
+ .mp h2 {font-size:16px;line-height:1.25}
26
+ .mp h1 {font-size:20px;line-height:2}
27
+ .mp {text-align:justify;background:#fff}
28
+ .mp,.mp code,.mp pre,.mp pre code,.mp tt,.mp kbd,.mp samp {color:#131211}
29
+ .mp h1,.mp h2,.mp h3,.mp h4 {color:#030201}
30
+ .mp u {text-decoration:underline}
31
+ .mp code,.mp strong,.mp b {font-weight:bold;color:#131211}
32
+ .mp em,.mp var {font-style:italic;color:#232221;text-decoration:none}
33
+ .mp a,.mp a:link,.mp a:hover,.mp a code,.mp a pre,.mp a tt,.mp a kbd,.mp a samp {color:#0000ff}
34
+ .mp b.man-ref {font-weight:normal;color:#434241}
35
+ .mp pre {padding:0 4ex}
36
+ .mp pre code {font-weight:normal;color:#434241}
37
+ .mp h2+pre,h3+pre {padding-left:0}
38
+ ol.man-decor,ol.man-decor li {margin:3px 0 10px 0;padding:0;float:left;width:33%;list-style-type:none;text-transform:uppercase;color:#999;letter-spacing:1px}
39
+ ol.man-decor {width:100%}
40
+ ol.man-decor li.tl {text-align:left}
41
+ ol.man-decor li.tc {text-align:center;letter-spacing:4px}
42
+ ol.man-decor li.tr {text-align:right;float:right}
43
+ </style>
44
+ </head>
45
+ <!--
46
+ The following styles are deprecated and will be removed at some point:
47
+ div#man, div#man ol.man, div#man ol.head, div#man ol.man.
48
+
49
+ The .man-page, .man-decor, .man-head, .man-foot, .man-title, and
50
+ .man-navigation should be used instead.
51
+ -->
52
+ <body id='manpage'>
53
+ <div class='mp' id='man'>
54
+
55
+ <div class='man-navigation' style='display:none'>
56
+ <a href="#NAME">NAME</a>
57
+ <a href="#SYNOPSIS">SYNOPSIS</a>
58
+ <a href="#DESCRIPTION">DESCRIPTION</a>
59
+ <a href="#COMING-FROM-IRB">COMING FROM IRB</a>
60
+ <a href="#CONFIGURATION">CONFIGURATION</a>
61
+ <a href="#PLUGINS">PLUGINS</a>
62
+ <a href="#CREATE-PLUGINS">CREATE PLUGINS</a>
63
+ <a href="#CREATE-CUSTOM-SHELLS">CREATE CUSTOM SHELLS</a>
64
+ <a href="#COMMANDS">COMMANDS</a>
65
+ <a href="#BUGS">BUGS</a>
66
+ <a href="#COPYRIGHT">COPYRIGHT</a>
67
+ <a href="#SEE-ALSO">SEE ALSO</a>
68
+ </div>
69
+
70
+ <ol class='man-decor man-head man head'>
71
+ <li class='tl'>ripl(1)</li>
72
+ <li class='tc'>Ripl Manual</li>
73
+ <li class='tr'>ripl(1)</li>
74
+ </ol>
75
+
76
+ <h2 id="NAME">NAME</h2>
77
+ <p class="man-name">
78
+ <code>ripl</code> - <span class="man-whatis">Ruby Interactive Print Loop - A light, modular alternative to irb</span>
79
+ </p>
80
+
81
+ <h2 id="SYNOPSIS">SYNOPSIS</h2>
82
+
83
+ <pre><code>ripl [-r|--require] [-I] [-f] [-d] [-h|--help] [-v|--version] COMMAND [ARGS]
84
+ </code></pre>
85
+
86
+ <h2 id="DESCRIPTION">DESCRIPTION</h2>
87
+
88
+ <p>ripl is a light, modular alternative to irb. Like irb, it loads ~/.irbrc, has autocompletion and
89
+ keeps history in ~/.irb_history. Unlike irb, it is highly customizable via plugins and supports
90
+ commands. This customizability makes it easy to build custom shells (i.e. for a gem or application)
91
+ and complex shells (i.e. for the web).</p>
92
+
93
+ <h2 id="COMING-FROM-IRB">COMING FROM IRB</h2>
94
+
95
+ <p>When first trying ripl, you may experience errors in your ~/.irbrc due to an irb-specific
96
+ configuration. In order to have ripl and irb coexist peacefully, you should silence these errors.
97
+ To silence them without touching your ~/.irbrc, install the ripl-irb gem. This ripl plugin fakes
98
+ irb's existence, effectively ignoring irb-specific configuration. Otherwise, if you don't mind
99
+ modifying ~/.irbrc, wrap your irb-specific configuration in a block as follow:</p>
100
+
101
+ <pre><code>if defined? IRB
102
+ IRB.conf[:BLAH] = 'blah'
103
+ # ...
104
+ end
105
+ </code></pre>
106
+
107
+ <h2 id="CONFIGURATION">CONFIGURATION</h2>
108
+
109
+ <p>All ripl shells load the ruby file ~/.riplrc if it exists. In this file, plugins are required and
110
+ configuration options are set. To configure ripl and its plugins, use Ripl.config. By default,
111
+ Ripl.config is a hash with the following keys:</p>
112
+
113
+ <dl>
114
+ <dt><code>:binding</code></dt><dd><p>Binding to use for eval(). Default is TOPLEVEL_BINDING.</p></dd>
115
+ <dt><code>:completion</code></dt><dd><p>A hash that configures completion via Bond.start. See bond for more details.</p></dd>
116
+ <dt><code>:history</code></dt><dd><p>A file used to store input history. Default is '~/.irb_history'.</p></dd>
117
+ <dt class="flush"><code>:irbrc</code></dt><dd><p>A ruby file to load at startup or false to not load anything. Default is '~/.irbrc'.</p></dd>
118
+ <dt class="flush"><code>:name</code></dt><dd><p>Name of the shell. Default is 'ripl'.</p></dd>
119
+ <dt class="flush"><code>:prompt</code></dt><dd><p>A string or lambda to generate string that prompts user for input. Default is '>> '.</p></dd>
120
+ <dt><code>:readline</code></dt><dd><p>A boolean to enable Readline. Default is true.</p></dd>
121
+ <dt><code>:result_prompt</code></dt><dd><p>A string that prefixes the result of an eval. Default is '=> '.</p></dd>
122
+ </dl>
123
+
124
+
125
+ <p>Plugins can optionally provide their own config key(s) for use here. It is strongly recommended that
126
+ a plugin start with an underscored version of its name i.e. Ripl::ColorError -> Ripl.config[:color_error].</p>
127
+
128
+ <p>An example ~/.riplrc:</p>
129
+
130
+ <pre><code> require 'ripl/multi_line'
131
+ require 'ripl/color_error'
132
+ Ripl.config[:color_error] = :blue
133
+ </code></pre>
134
+
135
+ <h2 id="PLUGINS">PLUGINS</h2>
136
+
137
+ <p>A ripl plugin is a module that is included into Ripl::Shell or Ripl::Runner. Being simply modules,
138
+ they can be packaged as gems and reused across shells as needed. ripl highly encourages plugins by
139
+ loading them as early as possible and allowing them to extend most of ripl's functionality. As
140
+ mentioned in the <code>CONFIGURATION</code> section, a plugin can be configured via Ripl.config.</p>
141
+
142
+ <p>To always use a plugin, require it in ~/.riplrc. To sometimes use it, require it from
143
+ the commandline:</p>
144
+
145
+ <pre><code>$ ripl -rripl/multi_line
146
+ </code></pre>
147
+
148
+ <p>Plugins can also be required in the console but it is not recommended since plugins can depend on
149
+ initialization that occurs before the console is started. For this same reason, plugins should not
150
+ be required in ~/.irbrc.</p>
151
+
152
+ <h2 id="CREATE-PLUGINS">CREATE PLUGINS</h2>
153
+
154
+ <p>For an example shell plugin, let's color error messages red:</p>
155
+
156
+ <pre><code>require 'ripl'
157
+
158
+ # To try place in ~/.riplrc
159
+ module Ripl
160
+ module RedError
161
+ def format_error(error)
162
+ "\e[31m#{super}\e[m"
163
+ end
164
+ end
165
+ end
166
+ Ripl::Shell.send :include, Ripl::RedError
167
+ </code></pre>
168
+
169
+ <p>Note this plugin extends format_error() by invoking the original format_error() with super. To see
170
+ what methods are available for extension, see Ripl::Shell::API and Ripl::Runner::API.</p>
171
+
172
+ <p>Points to consider when creating plugins:</p>
173
+
174
+ <ul>
175
+ <li><p>When adding functionality to a method, make sure to call <code>super</code> to preserve existing functionality.</p></li>
176
+ <li><p>When replacing functionality for a method, make sure the method's expectations are met i.e.
177
+ setting a specific instance variable or calling certain methods. Failure to do so can <code>break</code> ripl
178
+ for you and anyone else who uses your plugin!</p></li>
179
+ <li><p>Plugins can setup and teardown anything around a shell by extending Shell#before_loop and Shell#after_loop:</p>
180
+
181
+ <p> module Ripl::MyPlugin</p>
182
+
183
+ <pre><code>def before_loop
184
+ super
185
+ # Open file, open connection ...
186
+ end
187
+
188
+ def after_loop
189
+ super
190
+ # Write to file, close a connection ...
191
+ end
192
+ </code></pre>
193
+
194
+ <p> end</p></li>
195
+ <li><p>To add configuration for a plugin, add a key to Ripl.config that matches the underscored version
196
+ of the plugin name i.e. Ripl::RedError -> Ripl.config[:red_error]. To set a default config value, just set it
197
+ after including the plugin into Ripl::Shell.</p></li>
198
+ <li><p>To add console commands for a plugin, make them methods in a module and include the module into Ripl::Commands. For example:</p>
199
+
200
+ <p> module Ripl::SuperHistory</p>
201
+
202
+ <pre><code># plugin hooks into history
203
+ # then defines command
204
+ module Commands
205
+ def history
206
+ # ...
207
+ end
208
+ end
209
+ </code></pre>
210
+
211
+ <p> end</p>
212
+
213
+ <p> Ripl::Commands.send :include, Ripl::SuperHistory::Commands</p>
214
+
215
+ <p> >> history # use command in ripl</p></li>
216
+ <li><p>For more examples of plugins, see gems I've made that start with 'ripl-'.</p></li>
217
+ </ul>
218
+
219
+
220
+ <h2 id="CREATE-CUSTOM-SHELLS">CREATE CUSTOM SHELLS</h2>
221
+
222
+ <p>Creating and starting a custom shell is as simple as:</p>
223
+
224
+ <pre><code>require 'ripl'
225
+ # Define plugins, load files, etc...
226
+ Ripl.start
227
+ </code></pre>
228
+
229
+ <p>Ripl.start takes the same config keys mentioned in the <code>CONFIGURATION</code> section. For example if you wanted to
230
+ start on a specific binding:</p>
231
+
232
+ <pre><code>Ripl.start :binding =&gt; MyClass.send(:binding)
233
+ </code></pre>
234
+
235
+ <p>Also, since all shells load ~/.riplrc, Ripl.start can be used to override undesirable global
236
+ configuration for a custom shell.</p>
237
+
238
+ <h2 id="COMMANDS">COMMANDS</h2>
239
+
240
+ <p>A ripl command is a command passed to ripl that loads a custom shell. It's a convenient way to
241
+ package and invoke custom shells. A ripl command can take standard ripl options as long as they are
242
+ before the command:</p>
243
+
244
+ <pre><code># Load rails console without ~/.irbrc
245
+ $ ripl -f rails
246
+
247
+ # Load rails console with debugger
248
+ $ ripl -rrdebug rails
249
+ </code></pre>
250
+
251
+ <p>To create a ripl command, create an executable in the format ripl-command and make sure it's in your
252
+ shell's $PATH. For example, the file 'ripl-my_gem' would be invoked with 'ripl my_gem'. Any
253
+ arguments to a ripl command can be parsed as the ripl command pleases i.e. into options and
254
+ arguments. For an example command, see <a href="http://github.com/cldwalker/ripl-rails">ripl-rails</a>.</p>
255
+
256
+ <h2 id="BUGS">BUGS</h2>
257
+
258
+ <p>Please report bugs at <a href="http://github.com/cldwalker/ripl/issues" data-bare-link="true">http://github.com/cldwalker/ripl/issues</a>.</p>
259
+
260
+ <h2 id="COPYRIGHT">COPYRIGHT</h2>
261
+
262
+ <p><code>ripl</code> is Copyright (C) 2010 Gabriel Horner</p>
263
+
264
+ <h2 id="SEE-ALSO">SEE ALSO</h2>
265
+
266
+ <p><a href="http://github.com/cldwalker/ripl" data-bare-link="true">http://github.com/cldwalker/ripl</a>, <a href="http://github.com/cldwalker/bond" data-bare-link="true">http://github.com/cldwalker/bond</a>, <a href="http://github.com/cldwalker/nirvana" data-bare-link="true">http://github.com/cldwalker/nirvana</a>,
267
+ <a href="http://github.com/cldwalker/ripl-irb" data-bare-link="true">http://github.com/cldwalker/ripl-irb</a>, <a href="http://github.com/cldwalker/ripl-rails" data-bare-link="true">http://github.com/cldwalker/ripl-rails</a>, <a href="http://github.com/janlelis/multi_line" data-bare-link="true">http://github.com/janlelis/multi_line</a></p>
268
+
269
+
270
+ <ol class='man-decor man-foot man foot'>
271
+ <li class='tl'>CLDWALKER</li>
272
+ <li class='tc'>November 2010</li>
273
+ <li class='tr'>ripl(1)</li>
274
+ </ol>
275
+
276
+ </div>
277
+ </body>
278
+ </html>
data/man/ripl.1.ronn CHANGED
@@ -104,8 +104,8 @@ Points to consider when creating plugins:
104
104
  * When adding functionality to a method, make sure to call `super` to preserve existing functionality.
105
105
 
106
106
  * When replacing functionality for a method, make sure the method's expectations are met i.e.
107
- setting a specific instance variable or calling certain methods. Failure to do so can `break` ripl
108
- for you and anyone else who uses your plugin!
107
+ setting a specific instance variable or calling certain methods. Failure to do so can `break` ripl
108
+ for you and anyone else who uses your plugin!
109
109
 
110
110
  * Plugins can setup and teardown anything around a shell by extending Shell#before_loop and Shell#after_loop:
111
111
 
@@ -122,8 +122,24 @@ for you and anyone else who uses your plugin!
122
122
  end
123
123
 
124
124
  * To add configuration for a plugin, add a key to Ripl.config that matches the underscored version
125
- of the plugin name i.e. Ripl::RedError -> Ripl.config[:red_error]. To set a default config value, just set it
126
- after including the plugin into Ripl::Shell.
125
+ of the plugin name i.e. Ripl::RedError -> Ripl.config[:red_error]. To set a default config value, just set it
126
+ after including the plugin into Ripl::Shell.
127
+
128
+ * To add console commands for a plugin, make them methods in a module and include the module into Ripl::Commands. For example:
129
+
130
+ module Ripl::SuperHistory
131
+ # plugin hooks into history
132
+ # then defines command
133
+ module Commands
134
+ def history
135
+ # ...
136
+ end
137
+ end
138
+ end
139
+
140
+ Ripl::Commands.send :include, Ripl::SuperHistory::Commands
141
+
142
+ \>\> history # use command in ripl
127
143
 
128
144
  * For more examples of plugins, see gems I've made that start with 'ripl-'.
129
145
 
@@ -162,7 +178,7 @@ arguments. For an example command, see [ripl-rails](http://github.com/cldwalker/
162
178
 
163
179
  ## BUGS
164
180
 
165
- Please report bugs at _http://github.com/cldwalker/ripl/issues_.
181
+ Please report bugs at <http://github.com/cldwalker/ripl/issues>.
166
182
 
167
183
  ## COPYRIGHT
168
184
 
data/test/runner_test.rb CHANGED
@@ -134,6 +134,7 @@ describe "Runner" do
134
134
  shell
135
135
  }
136
136
  ripl("-f")
137
+ Ripl.config[:irbrc] = '~/.irbrc'
137
138
  end
138
139
 
139
140
  it "with -d option sets $DEBUG" do
data/test/shell_test.rb CHANGED
@@ -32,6 +32,22 @@ describe "Shell" do
32
32
  end
33
33
  end
34
34
 
35
+ describe "#before_loop" do
36
+ before_all { Ripl::Commands.send(:define_method, :ping) { 'pong' } }
37
+ it "adds commands to main from Commands" do
38
+ stub(Ripl::Runner).load_rc
39
+ Ripl.shell.before_loop
40
+ Ripl.shell.loop_eval("ping").should == 'pong'
41
+ end
42
+
43
+ it "adds commands to fixnum from Commands" do
44
+ stub(Ripl::Runner).load_rc
45
+ Ripl.shell.binding = 1.send(:binding)
46
+ Ripl.shell.before_loop
47
+ Ripl.shell.loop_eval("ping").should == 'pong'
48
+ end
49
+ end
50
+
35
51
  describe "#eval_input" do
36
52
  before { @line = shell.line; shell.eval_input("10 ** 2") }
37
53
 
@@ -69,4 +85,15 @@ describe "Shell" do
69
85
  end
70
86
  end
71
87
  end
88
+
89
+ describe "API#" do
90
+ Shell::API.instance_methods.delete_if {|e| e[/=$/]}.each do |meth|
91
+ it "#{meth} is accessible to plugins" do
92
+ mod = Object.const_set "Ping_#{meth}", Module.new
93
+ mod.send(:define_method, meth) { "pong_#{meth}" }
94
+ Shell.send :include, mod
95
+ shell.send(meth).should == "pong_#{meth}"
96
+ end
97
+ end
98
+ end
72
99
  end
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ripl
3
3
  version: !ruby/object:Gem::Version
4
- hash: 17
4
+ hash: 31
5
5
  prerelease: false
6
6
  segments:
7
7
  - 0
8
8
  - 2
9
- - 3
10
- version: 0.2.3
9
+ - 4
10
+ version: 0.2.4
11
11
  platform: ruby
12
12
  authors:
13
13
  - Gabriel Horner
@@ -15,7 +15,7 @@ autorequire:
15
15
  bindir: bin
16
16
  cert_chain: []
17
17
 
18
- date: 2010-11-15 00:00:00 -05:00
18
+ date: 2010-11-18 00:00:00 -05:00
19
19
  default_executable:
20
20
  dependencies:
21
21
  - !ruby/object:Gem::Dependency
@@ -109,6 +109,7 @@ files:
109
109
  - Rakefile
110
110
  - .gemspec
111
111
  - man/ripl.1
112
+ - man/ripl.1.html
112
113
  - man/ripl.1.ronn
113
114
  has_rdoc: true
114
115
  homepage: http://github.com/cldwlaker/ripl