rube 0.1.1 → 0.1.2

Sign up to get free protection for your applications and to get access to all the features.
@@ -6,6 +6,7 @@ Rakefile
6
6
  VERSION
7
7
  bin/rube
8
8
  lib/rube.rb
9
+ lib/rube/cli.rb
9
10
  script/console
10
11
  script/destroy
11
12
  script/generate
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.1.1
1
+ 0.1.2
data/bin/rube CHANGED
@@ -1,2 +1,10 @@
1
- #!/bin/bash
2
- `dirname $0`/../lib/rube.rb "$@"
1
+ #!/usr/bin/env ruby
2
+ #
3
+ # Created on 2009-7-20.
4
+ # Copyright (c) 2009. All rights reserved.
5
+
6
+ require File.expand_path(File.dirname(__FILE__) + "/../lib/rube")
7
+
8
+ require "rube/cli"
9
+
10
+ Rube::CLI.execute(STDOUT, ARGV)
@@ -30,8 +30,7 @@
30
30
  # The equivalent code for the above, when invoked from within a Ruby script, would be:
31
31
  #
32
32
  # require 'rube'
33
- # rube = Rube.new
34
- # rube.trim_level = 2
33
+ # rube = Rube.new($stdout, :trim_level=>2)
35
34
  # rube.add_task(:require, 'active_support')
36
35
  # rube.add_task(:require, 'yaml')
37
36
  # rube.add_task(:eval, "document=YAML.load(IO.read('document.yml))" )
@@ -47,16 +46,14 @@
47
46
  # rube --help
48
47
  #
49
48
  # at the command line for more information.
50
- #
51
- # For convenience, the Ruby API allows two additional methods which override the default setting for output,
52
- # which is to $stdout:
53
- # rube.to_string = true Causes rube.generate to output results to a string
54
- # rube.to_file "name" Causes rube.generate to output results to the named file
49
+
50
+ $:.unshift(File.dirname(__FILE__)) unless
51
+ $:.include?(File.dirname(__FILE__)) || $:.include?(File.expand_path(File.dirname(__FILE__)))
55
52
 
56
53
  require 'optparse'
57
54
  require 'erb'
58
55
 
59
- class Rube
56
+ module Rube
60
57
  VERSION = %x{cat #{File.dirname(__FILE__)+'/../VERSION'}}.chomp
61
58
 
62
59
  # Class and procedure to provide context for evaluation of tasks: ruby inline code, requires, and erb templates
@@ -67,212 +64,127 @@ class Rube
67
64
  end
68
65
  end
69
66
 
70
- class HelpRequested < ArgumentError
71
- def self.exit_code
72
- 1
73
- end
67
+ class RubeError < RuntimeError
74
68
  end
75
69
 
76
- class BadArgumentError < ArgumentError
77
- def self.exit_code
78
- 2
79
- end
70
+ class BadArgumentError < RubeError
80
71
  end
81
72
 
82
- class MissingRequireError < IOError
83
- def self.exit_code
84
- 3
85
- end
73
+ class MissingRequireError < RubeError
86
74
  end
87
75
 
88
- class MissingTemplateError < IOError
89
- def self.exit_code
90
- 4
91
- end
76
+ class MissingTemplateError < RubeError
92
77
  end
93
78
 
94
- class ScriptError < IOError
95
- def self.exit_code
96
- 5
97
- end
79
+ class ScriptError < RubeError
98
80
  end
99
81
 
100
- attr_accessor :tasks, :safety, :from_command_line, :to_string, :to_file
101
- attr_reader :trim_level, :trim_mode, :disable_percent
102
-
103
- def initialize
104
- @tasks = []
105
- @trim_level = nil
106
- self.disable_percent = false
107
- self.trim_level = nil
108
- @from_command_line = nil
109
- @to_string = false
110
- @to_file = nil
111
- @safety = nil
112
- @explicit = false
113
- end
82
+ class Generator
83
+ attr_accessor :tasks, :safety, :from_command_line
84
+ attr_reader :trim_level, :trim_mode, :disable_percent
114
85
 
115
- # Process command line options
116
- def process_options(*args)
117
- @tasks = []
118
- template_count = 0
119
- tr_level = nil
120
- @op = OptionParser.new
121
- @op.banner = "Process erb templates along with other ruby tasks"
122
- @op.separator "Usage: #{File.basename($0)} [options] task ..."
123
- @op.separator ''
124
- @op.separator "Each task may be a template, require or eval (see below). These are processed in the order given,"
125
- @op.separator "so results from prior tasks are available to subsequent ones. All variables and constants, including"
126
- @op.separator "local variables, are preserved, so their values are available to subsequent tasks."
127
- @op.separator ''
128
- @op.separator "Tasks:"
129
- @op.separator " path/to/template/file Process the specified erb template file"
130
- @op.on('-i', '--stdin', "Process the template provided in stdin") do |val|
131
- template_count += 1
132
- @tasks << [:template, '/dev/stdin']
86
+ def initialize(stdout=$stdout, options={})
87
+ @stdout = stdout
88
+ @tasks = options[:tasks] || []
89
+ @trim_level = nil
90
+ self.disable_percent = options[:disable_percent]
91
+ self.trim_level = options[:trim_level]
92
+ @from_command_line = options[:from_command_line]
93
+ @safety = options[:safety]
94
+ @explicit = options[:explicit]
133
95
  end
134
- @op.on('-r', '--require path/to/ruby/file', "Load a ruby library or source code file") {|val| @tasks << [:require, val] }
135
- @op.on('-e', '--eval "ruby code"', "Evaluate some inline ruby code"){|src| @tasks << [:eval, src] }
136
- @op.separator ''
137
- @op.separator "Options:"
138
- @op.on('-E', '--[no-]explicit', "All templates must be explicitly provided. Default is false -- rube assumes it should read",
139
- "a template from stdin if no templates are specified among the tasks") {|val| @explicit = val }
140
- @op.on('-S', '--safe SAFE_LEVEL', Integer, "Set $SAFE (0..4). Default off") do |val|
141
- error BadArgumentError, "Invalid --safe level #{val}. Should be 0..4" unless (0..4).include?(val)
142
- @safety = val
143
- end
144
- @op.on('-T', '--trim TRIM_LEVEL', "Set trim level (0..2, or '-'). Default 0") {|trim| tr_level = trim }
145
- @op.on('-P', '--[no-]disable-percent', "Disable '%' prefix for erb code. Default false") {|val| self.disable_percent = val }
146
- @op.on_tail('-h', '--help', "Produce this help list") {|val| help }
147
- @op.on_tail('-v', '--version', "Show version") {|val| puts VERSION; exit 0 }
148
- begin
149
- @templates = @op.order!(args) do |template|
150
- template_count += 1
151
- @tasks << [:template, template]
152
- end
153
- rescue OptionParser::InvalidOption, OptionParser::InvalidArgument => e
154
- $stderr.puts e.to_s
155
- help BadArgumentError
96
+
97
+ def disable_percent=(disable_percent)
98
+ @disable_percent = disable_percent
99
+ @trim_mode = trim_mode_opt(@trim_level)
156
100
  end
157
- @tasks << [:template, '/dev/stdin'] if !@explicit && template_count == 0
158
- self.trim_level = tr_level
159
- end
160
-
161
- def disable_percent=(disable_percent)
162
- @disable_percent = disable_percent
163
- @trim_mode = trim_mode_opt(@trim_level)
164
- end
165
-
166
- def trim_level=(trim_level)
167
- @trim_level = (trim_level || '0').to_s
168
- @trim_mode = trim_mode_opt(@trim_level)
169
- end
170
101
 
171
- # Convert command line trim_mode to a form erb will understand
172
- def trim_mode_opt(trim_mode)
173
- mode = disable_percent ? '' : '%'
174
- mode += case trim_mode.to_s
175
- when '0','' then ''
176
- when '1' then '>'
177
- when '2' then '<>'
178
- when '-' then '-'
179
- else error BadArgumentError, "Invalid trim mode #{trim_mode}. Should be 0, 1, 2, or -"
102
+ def trim_level=(trim_level)
103
+ @trim_level = (trim_level || '0').to_s
104
+ @trim_mode = trim_mode_opt(@trim_level)
180
105
  end
181
- end
182
106
 
183
- # Display command line help
184
- def help(exception=HelpRequested)
185
- error exception, @op.to_s
186
- end
187
-
188
- # Add a task
189
- def add_task(type, task)
190
- case type
191
- when :require, :eval, :template then @tasks << [type, task]
192
- else raise "Invalid task type #{type.inspect}"
107
+ # Convert command line trim_mode to a form erb will understand
108
+ def trim_mode_opt(trim_mode)
109
+ mode = disable_percent ? '' : '%'
110
+ mode += case trim_mode.to_s
111
+ when '0','' then ''
112
+ when '1' then '>'
113
+ when '2' then '<>'
114
+ when '-' then '-'
115
+ else error BadArgumentError, "Invalid trim mode #{trim_mode}. Should be 0, 1, 2, or -"
116
+ end
193
117
  end
194
- self # Allow chaining
195
- end
196
118
 
197
- # Run all the tasks
198
- def generate
199
- @eval_context = EvalContext.new
200
- @binding = @eval_context.sandbox
201
- saved_stdout = $stdout
202
- if @to_string
203
- $stdout = StringIO.new
204
- elsif @to_file
205
- $stdout = File.new @to_file, 'w'
119
+ # Add a task
120
+ def add_task(type, task)
121
+ case type
122
+ when :require, :eval, :template then @tasks << [type, task]
123
+ else raise "Invalid task type #{type.inspect}"
124
+ end
125
+ self # Allow chaining
206
126
  end
207
- @tasks.each {|p| execute p }
208
- res = nil
209
- if @to_string
210
- res = $stdout.string
211
- elsif @to_file
212
- $stdout.close
127
+
128
+ # Run all the tasks
129
+ def generate
130
+ @eval_context = EvalContext.new
131
+ @binding = @eval_context.sandbox
132
+ saved_stdout, $stdout = $stdout, @stdout
133
+ @tasks.each {|p| execute p }
134
+ nil
135
+ ensure
136
+ $stdout = saved_stdout
213
137
  end
214
- res
215
- ensure
216
- $stdout = saved_stdout
217
- end
218
138
 
219
- # Execute a single task
220
- def execute(p)
221
- case p.first
222
- when :require
223
- protected_require(p.last)
224
- when :eval
225
- protected_eval(p.last)
226
- when :template
227
- protected_erb(p.last)
228
- else
229
- raise "Unexpected task #{p.inspect}"
139
+ # Execute a single task
140
+ def execute(p)
141
+ case p.first
142
+ when :require
143
+ protected_require(p.last)
144
+ when :eval
145
+ protected_eval(p.last)
146
+ when :template
147
+ protected_erb(p.last)
148
+ else
149
+ raise "Unexpected task #{p.inspect}"
150
+ end
230
151
  end
231
- end
232
152
 
233
- # Load a ruby file or library
234
- def protected_require(r)
235
- @eval_context.instance_eval {require r}
236
- rescue LoadError
237
- error MissingRequireError, "Can't find require file #{r}"
238
- end
153
+ # Load a ruby file or library
154
+ def protected_require(r)
155
+ @eval_context.instance_eval {require r}
156
+ rescue LoadError
157
+ error MissingRequireError, "Can't find require file #{r}"
158
+ end
239
159
 
240
- # Evaluate inline ruby code
241
- def protected_eval(src)
242
- bind_at = @binding
243
- @eval_context.instance_eval{eval src, bind_at}
244
- rescue => e
245
- error ScriptError, "Error executing source:\n#{src}\n\n#{e.to_s}"
246
- end
160
+ # Evaluate inline ruby code
161
+ def protected_eval(src)
162
+ bind_at = @binding
163
+ @eval_context.instance_eval{eval src, bind_at}
164
+ rescue => e
165
+ error ScriptError, "Error executing source:\n#{src}\n\n#{e.to_s}"
166
+ end
247
167
 
248
- # Process an erb template
249
- def protected_erb(template)
250
- error MissingTemplateError, "Can't find template file #{template}" unless File.exists?(template)
251
- source = File.read(template)
252
- puts ERB.new(source, @safety, @trim_mode).result(@binding)
253
- end
168
+ # Process an erb template
169
+ def protected_erb(template)
170
+ error MissingTemplateError, "Can't find template file #{template}" unless File.exists?(template)
171
+ source = File.read(template)
172
+ @stdout.puts ERB.new(source, @safety, @trim_mode).result(@binding)
173
+ end
254
174
 
255
- # Issue an error message or exception
256
- def error(exception, msg)
257
- raise exception, msg unless @from_command_line || exception.nil?
258
- $stderr.puts msg
259
- exit_code = exception.exit_code rescue 0
260
- exit exit_code if @from_command_line
175
+ # Issue an error message or exception
176
+ def self.error(exception, msg)
177
+ raise exception, msg
178
+ end
179
+
180
+ def error(exception, msg)
181
+ self.class.error exception, msg
182
+ end
261
183
  end
262
184
 
263
185
  # Convenience method: create a Rube object and use it to execute command line-style arguments
264
- def self.generate(*args)
265
- rube = new
266
- options = {}
267
- if args.last.is_a?(Hash)
268
- options = args.pop
269
- end
270
- rube.from_command_line = options[:from_command_line]
271
- rube.process_options(*args)
186
+ def self.generate(stdout, options)
187
+ rube = Generator.new(stdout, options)
272
188
  rube.generate
273
189
  end
274
190
  end
275
-
276
- if $0 == __FILE__
277
- Rube.generate(*(ARGV << {:from_command_line=>true}))
278
- end
@@ -0,0 +1,105 @@
1
+ require 'optparse'
2
+
3
+ module Rube
4
+ class ExitStatus
5
+ HELP_REQUESTED = 1
6
+ BAD_ARGUMENT = 2
7
+ MISSING_REQUIRE = 3
8
+ MISSING_TEMPLATE = 4
9
+ SCRIPT_ERROR = 5
10
+ end
11
+
12
+ class CLI
13
+ def self.execute(stdout, arguments=[])
14
+
15
+ # NOTE: the option -p/--path= is given as an example, and should be replaced in your application.
16
+
17
+ options = {
18
+ :tasks => [],
19
+ :explicit => false,
20
+ :trim_level => '0',
21
+ :disable_percent => false,
22
+ :safe => nil,
23
+ :from_command_line => true
24
+ }
25
+
26
+ mandatory_options = %w( )
27
+ template_count = 0
28
+ tr_level = nil
29
+ parser = OptionParser.new do |opts|
30
+ opts = OptionParser.new
31
+
32
+ opts.banner = <<-BANNER.gsub(/^ /,'')
33
+ Process erb templates along with other ruby tasks
34
+
35
+ Usage: #{File.basename($0)} [options] tasks
36
+
37
+ Each task may be a template, require or eval (see below). These are processed in the order given,
38
+ so results from prior tasks are available to subsequent ones. All variables and constants, including
39
+ local variables, are preserved, so their values are available to subsequent tasks.
40
+ BANNER
41
+
42
+ opts.separator ''
43
+ opts.separator "Tasks:"
44
+ opts.separator " path/to/template/file Process the specified erb template file"
45
+ opts.on('-i', '--stdin', "Process the template provided in stdin") do |val|
46
+ template_count += 1
47
+ options[:tasks] << [:template, '/dev/stdin']
48
+ end
49
+ opts.on('-r', '--require path/to/ruby/file', "Load a ruby library or source code file") {|val| options[:tasks] << [:require, val] }
50
+ opts.on('-e', '--eval "ruby code"', "Evaluate some inline ruby code"){|src| options[:tasks] << [:eval, src] }
51
+ opts.separator ''
52
+ opts.separator "Options:"
53
+ opts.on('-E', '--[no-]explicit', "All templates must be explicitly provided. Default is false -- rube assumes it should read",
54
+ "a template from stdin if no templates are specified among the tasks") {|val| options[:explicit] = val }
55
+ opts.on('-S', '--safe SAFE_LEVEL', Integer, "Set $SAFE (0..4). Default off") do |val|
56
+ help stdout, opts, "Invalid --safe level #{val}. Should be 0..4", ExitStatus::BAD_ARGUMENT unless (0..4).include?(val)
57
+ options[:safety] = val
58
+ end
59
+ opts.on('-T', '--trim TRIM_LEVEL', "Set trim level (0..2, or '-'). Default 0") {|trim| tr_level = trim }
60
+ opts.on('-P', '--[no-]disable-percent', "Disable '%' prefix for erb code. Default false") {|val| options[:disable_percent] = val }
61
+ opts.on_tail('-h', '--help', "Produce this help list") {|val| help stdout, opts }
62
+ opts.on_tail('-v', '--version', "Show version") {|val| puts VERSION; exit 0 }
63
+ begin
64
+ @templates = opts.order!(arguments) do |template|
65
+ template_count += 1
66
+ options[:tasks] << [:template, template]
67
+ end
68
+ rescue OptionParser::InvalidOption, OptionParser::InvalidArgument => e
69
+ help stdout, opts, e.to_s, ExitStatus::BAD_ARGUMENT
70
+ end
71
+ options[:tasks] << [:template, '/dev/stdin'] if !options[:explicit] && template_count == 0
72
+ options[:trim_level] = tr_level
73
+
74
+ if mandatory_options && mandatory_options.find { |option| options[option.to_sym].nil? }
75
+ help stdout, opts
76
+ end
77
+ end
78
+
79
+ begin
80
+ Rube.generate(stdout, options)
81
+ rescue BadArgumentError => e
82
+ quit stdout, e.to_s, ExitStatus::BAD_ARGUMENT
83
+ rescue MissingRequireError => e
84
+ quit stdout, e.to_s, ExitStatus::MISSING_REQUIRE
85
+ rescue MissingTemplateError => e
86
+ quit stdout, e.to_s, ExitStatus::MISSING_TEMPLATE
87
+ rescue ScriptError => e
88
+ quit stdout, e.to_s, ExitStatus::SCRIPT_ERROR
89
+ end
90
+ end
91
+
92
+ def self.help(stdout, opt_parser, msg = nil, exit_code = ExitStatus::HELP_REQUESTED)
93
+ m = msg.to_s
94
+ m += "\n" unless m == ''
95
+ m += opt_parser.to_s
96
+ quit stdout, m, exit_code
97
+ end
98
+
99
+ def self.quit(stdout, msg=nil,exit_code = 0)
100
+ stdout.puts msg
101
+ exit exit_code
102
+ end
103
+
104
+ end
105
+ end
@@ -2,3 +2,4 @@ require 'stringio'
2
2
  require 'tempfile'
3
3
  require 'test/unit'
4
4
  require File.dirname(__FILE__) + '/../lib/rube'
5
+ require 'rube/cli'
@@ -3,7 +3,7 @@ require File.dirname(__FILE__) + '/test_helper.rb'
3
3
  class TestRubeBasic < Test::Unit::TestCase
4
4
 
5
5
  def setup
6
- @new_rube = Rube.new
6
+ @new_rube = Rube::Generator.new
7
7
  end
8
8
 
9
9
  def test_truth
@@ -11,7 +11,7 @@ class TestRubeBasic < Test::Unit::TestCase
11
11
  end
12
12
 
13
13
  def test_creates_rube_object
14
- assert_instance_of Rube, @new_rube, "Rube.new does not create Rube object"
14
+ assert_instance_of Rube::Generator, @new_rube, "Rube:Generator.new does not create Rube::Generator object"
15
15
  end
16
16
 
17
17
  def test_rube_object_has_tasks
@@ -65,14 +65,6 @@ class TestRubeBasic < Test::Unit::TestCase
65
65
  def test_rube_object_trim_mode
66
66
  assert_respond_to @new_rube, :trim_mode
67
67
  end
68
-
69
- def test_rube_object_to_string
70
- assert_respond_to @new_rube, :to_string
71
- end
72
-
73
- def test_rube_object_to_file
74
- assert_respond_to @new_rube, :to_file
75
- end
76
68
 
77
69
  def test_rube_object_go
78
70
  assert_respond_to @new_rube, :generate
@@ -86,7 +78,7 @@ end
86
78
  class TestRubeTaskManipulation < Test::Unit::TestCase
87
79
 
88
80
  def setup
89
- @empty_rube = Rube.new
81
+ @empty_rube = Rube::Generator.new
90
82
  end
91
83
 
92
84
  def test_empty_rube_object_has_no_tasks
@@ -143,7 +135,7 @@ end
143
135
  class TestRubeSettings < Test::Unit::TestCase
144
136
 
145
137
  def setup
146
- @empty_rube = Rube.new
138
+ @empty_rube = Rube::Generator.new
147
139
  end
148
140
 
149
141
  def test_rube_default_disable_percent
@@ -172,31 +164,13 @@ class TestRubeSettings < Test::Unit::TestCase
172
164
  @empty_rube.from_command_line = 'foo'
173
165
  assert_equal 'foo', @empty_rube.from_command_line
174
166
  end
175
-
176
- def test_rube_default_to_string
177
- assert_equal false, !!@empty_rube.to_string
178
- end
179
-
180
- def test_rube_object_preserves_to_string
181
- @empty_rube.to_string = 'foo'
182
- assert_equal 'foo', @empty_rube.to_string
183
- end
184
-
185
- def test_rube_default_to_file
186
- assert_equal nil, @empty_rube.to_file
187
- end
188
-
189
- def test_rube_object_preserves_to_file
190
- @empty_rube.to_file = 'foo'
191
- assert_equal 'foo', @empty_rube.to_file
192
- end
193
167
  end
194
168
 
195
169
  class TestRubeTrimLevel < Test::Unit::TestCase
196
170
 
197
171
  def setup
198
- @empty_rube = Rube.new
199
- @disabled_rube = Rube.new
172
+ @empty_rube = Rube::Generator.new
173
+ @disabled_rube = Rube::Generator.new
200
174
  @disabled_rube.disable_percent = true
201
175
  end
202
176
 
@@ -274,113 +248,78 @@ end
274
248
  class TestRubeProcessing < Test::Unit::TestCase
275
249
 
276
250
  def setup
277
- @rube = Rube.new
278
- @save_stdout = $stdout
279
- end
280
-
281
- def teardown
282
- $stdout = @save_stdout
283
- end
284
-
285
- def test_simple_eval_to_stdout
286
- StringIO.open do |out|
287
- $stdout = out
288
- @rube.add_task :eval, 'puts "foo"'
289
- res = @rube.generate
290
- assert_equal "foo\n", out.string, "Failed to produce expected output on $stdout"
291
- assert_equal nil, res, "Without redirection, rube.generate should return nil"
292
- end
251
+ @out = StringIO.new
252
+ @rube = Rube::Generator.new(@out)
293
253
  end
294
254
 
295
- def test_simple_eval_to_string
296
- @rube.to_string = true
297
- @rube.add_task :eval, 'puts "foo"'
298
- out = @rube.generate
299
- assert_equal "foo\n", out, "Failed to output to string"
300
- end
301
-
302
- def test_simple_eval_to_file
303
- out = Tempfile.new('testout')
304
- @rube.to_file = out.path
255
+ def test_simple_eval
305
256
  @rube.add_task :eval, 'puts "foo"'
306
257
  res = @rube.generate
307
- out.close
308
- output = File.read(out.path)
309
- assert_equal "foo\n", output, "Failed to produce expected output on file #{out.path}"
258
+ assert_equal "foo\n", @out.string, "Failed to produce expected output on $stdout"
310
259
  assert_equal nil, res, "Without redirection, rube.generate should return nil"
311
260
  end
312
261
 
313
262
  def test_process_require_task
314
- StringIO.open do |out|
315
- $stdout = out
316
- @rube.add_task :require, 'English'
317
- @rube.add_task :eval, 'puts $PID'
318
- @rube.generate
319
- # If English doesn't load properly, then $PID is nil; if it does, then it's a numeric process id
320
- assert_match(/^\d+$/, out.string.chomp, "Failed to load require file")
321
- end
263
+ @rube.add_task :require, 'English'
264
+ @rube.add_task :eval, 'puts $PID'
265
+ @rube.generate
266
+ # If English doesn't load properly, then $PID is nil; if it does, then it's a numeric process id
267
+ assert_match(/^\d+$/, @out.string.chomp, "Failed to load require file")
322
268
  end
323
269
 
324
270
  def test_process_template_task
325
- @rube.to_string = true
326
271
  @rube.add_task :template, 'templates/test1'
327
- out = @rube.generate
328
- assert_equal "foo\nblurg\nblurble\n\nfarb\n\n", out, "Failed to produce expected result from test1 template"
272
+ @rube.generate
273
+ assert_equal "foo\nblurg\nblurble\n\nfarb\n\n", @out.string, "Failed to produce expected result from test1 template"
329
274
  end
330
275
 
331
276
  def test_process_template_task_with_disabled_percent
332
- @rube.to_string = true
333
277
  @rube.disable_percent = true
334
278
  @rube.add_task :template, 'templates/test1'
335
- out = @rube.generate
279
+ @rube.generate
336
280
  # Note: test1 template produces different results with % lines disabled
337
- assert_equal "foo\nblurg\nblurble\n\n% z = 'farb'\nbarf\n\n", out, "Failed to produce expected result from test1 template with percentage lines disabled"
281
+ assert_equal "foo\nblurg\nblurble\n\n% z = 'farb'\nbarf\n\n", @out.string, "Failed to produce expected result from test1 template with percentage lines disabled"
338
282
  end
339
283
 
340
284
  def test_process_template_task_with_trim_level_1
341
- @rube.to_string = true
342
285
  @rube.trim_level = 1
343
286
  @rube.add_task :template, 'templates/test1'
344
- out = @rube.generate
345
- assert_equal "foo\nblurgblurblefarb\n", out, "Failed to produce expected result from test1 template"
287
+ @rube.generate
288
+ assert_equal "foo\nblurgblurblefarb\n", @out.string, "Failed to produce expected result from test1 template"
346
289
  end
347
290
 
348
291
  def test_process_template_task_with_trim_level_2
349
- @rube.to_string = true
350
292
  @rube.trim_level = 2
351
293
  @rube.add_task :template, 'templates/test1'
352
294
  out = @rube.generate
353
- assert_equal "foo\nblurgblurble\nfarb\n", out, "Failed to produce expected result from test1 template"
295
+ assert_equal "foo\nblurgblurble\nfarb\n", @out.string, "Failed to produce expected result from test1 template"
354
296
  end
355
297
 
356
298
  def test_process_template_with_persistent_variable
357
- @rube.to_string = true
358
299
  @rube.add_task :eval, 'b="foo"'
359
300
  @rube.add_task :template, 'templates/test2'
360
- out = @rube.generate
361
- assert_equal "bar\nfoo*2\n", out, "Failed to produce expected result from test2 template with passed variable value"
301
+ @rube.generate
302
+ assert_equal "bar\nfoo*2\n", @out.string, "Failed to produce expected result from test2 template with passed variable value"
362
303
  end
363
304
  end
364
305
 
365
306
  class TestRubeErrors < Test::Unit::TestCase
366
307
  def setup
367
- @rube = Rube.new
308
+ @out = StringIO.new
309
+ @rube = Rube::Generator.new(@out)
368
310
  end
369
311
 
370
312
  def test_bad_eval
371
- @rube.to_string = true
372
313
  @rube.add_task :eval, 'foo'
373
314
  assert_raises(Rube::ScriptError) { @rube.generate }
374
315
  end
375
316
 
376
317
  def test_bad_require
377
- @rube.to_string = true
378
318
  @rube.add_task :require, 'foo'
379
319
  assert_raises(Rube::MissingRequireError) { @rube.generate }
380
320
  end
381
321
 
382
322
  def test_bad_template
383
- @rube.to_string = true
384
323
  @rube.add_task :template, 'foo'
385
324
  assert_raises(Rube::MissingTemplateError) { @rube.generate }
386
325
  end
@@ -427,30 +366,17 @@ class TestRubeCommandLineIndirectly < Test::Unit::TestCase
427
366
  #
428
367
  # Not really an exhaustive test, but if this works, things should be okay
429
368
  #
430
-
431
- def setup
432
- @rube = Rube.new
433
- @save_stdout = $stdout
434
- end
435
-
436
- def teardown
437
- $stdout = @save_stdout
438
- end
439
369
 
440
370
  def test_eval
441
371
  StringIO.open do |out|
442
- $stdout = out
443
- @rube.process_options('-E', '-e', 'puts "foo"')
444
- res = @rube.generate
372
+ res = Rube::CLI.execute(out, ['-E', '-e', 'puts "foo"'])
445
373
  assert_equal "foo\n", out.string, "Failed to produce expected output on $stdout"
446
374
  end
447
375
  end
448
376
 
449
377
  def test_process_require_task
450
378
  StringIO.open do |out|
451
- $stdout = out
452
- @rube.process_options('-E', '-r', 'English', '-e', 'puts $PID')
453
- @rube.generate
379
+ res = Rube::CLI.execute(out, ['-E', '-r', 'English', '-e', 'puts $PID'])
454
380
  # If English doesn't load properly, then $PID is nil; if it does, then it's a numeric process id
455
381
  assert_match(/^\d+$/, out.string.chomp, "Failed to load require file")
456
382
  end
@@ -458,9 +384,7 @@ class TestRubeCommandLineIndirectly < Test::Unit::TestCase
458
384
 
459
385
  def test_process_require_task_long_form
460
386
  StringIO.open do |out|
461
- $stdout = out
462
- @rube.process_options('--explicit', '--require', 'English', '--eval', 'puts $PID')
463
- @rube.generate
387
+ res = Rube::CLI.execute(out, ['--explicit', '--require', 'English', '--eval', 'puts $PID'])
464
388
  # If English doesn't load properly, then $PID is nil; if it does, then it's a numeric process id
465
389
  assert_match(/^\d+$/, out.string.chomp, "Failed to load require file")
466
390
  end
@@ -468,18 +392,14 @@ class TestRubeCommandLineIndirectly < Test::Unit::TestCase
468
392
 
469
393
  def test_process_template_task
470
394
  StringIO.open do |out|
471
- $stdout = out
472
- @rube.process_options('templates/test1')
473
- @rube.generate
395
+ res = Rube::CLI.execute(out, ['templates/test1'])
474
396
  assert_equal "foo\nblurg\nblurble\n\nfarb\n\n", out.string, "Failed to produce expected result from test1 template"
475
397
  end
476
398
  end
477
399
 
478
400
  def test_process_template_task_with_disabled_percent
479
401
  StringIO.open do |out|
480
- $stdout = out
481
- @rube.process_options('-P', 'templates/test1')
482
- @rube.generate
402
+ res = Rube::CLI.execute(out, ['-P', 'templates/test1'])
483
403
  # Note: test1 template produces different results with % lines disabled
484
404
  assert_equal "foo\nblurg\nblurble\n\n% z = 'farb'\nbarf\n\n", out.string, "Failed to produce expected result from test1 template with percentage lines disabled"
485
405
  end
@@ -487,27 +407,21 @@ class TestRubeCommandLineIndirectly < Test::Unit::TestCase
487
407
 
488
408
  def test_process_template_task_with_trim_level_1
489
409
  StringIO.open do |out|
490
- $stdout = out
491
- @rube.process_options('--trim', '1', 'templates/test1')
492
- @rube.generate
410
+ res = Rube::CLI.execute(out, ['--trim', '1', 'templates/test1'])
493
411
  assert_equal "foo\nblurgblurblefarb\n", out.string, "Failed to produce expected result from test1 template"
494
412
  end
495
413
  end
496
414
 
497
415
  def test_process_template_task_with_trim_level_2
498
416
  StringIO.open do |out|
499
- $stdout = out
500
- @rube.process_options('--trim', '2', 'templates/test1')
501
- @rube.generate
417
+ res = Rube::CLI.execute(out, ['--trim', '2', 'templates/test1'])
502
418
  assert_equal "foo\nblurgblurble\nfarb\n", out.string, "Failed to produce expected result from test1 template"
503
419
  end
504
420
  end
505
421
 
506
422
  def test_process_template_with_persistent_variable
507
423
  StringIO.open do |out|
508
- $stdout = out
509
- @rube.process_options('--eval', 'b="foo"', 'templates/test2')
510
- @rube.generate
424
+ res = Rube::CLI.execute(out, ['--eval', 'b="foo"', 'templates/test2'])
511
425
  assert_equal "bar\nfoo*2\n", out.string, "Failed to produce expected result from test2 template with passed variable value"
512
426
  end
513
427
  end
@@ -529,7 +443,7 @@ class TestRubeCommandLineDirectly < Test::Unit::TestCase
529
443
  end
530
444
 
531
445
  def test_process_template_task
532
- res = `rube.rb templates/test1` # Not sure why it insists on the '.rb' here, but it does...
446
+ res = `rube templates/test1` # Not sure why it insists on the '.rb' here, but it does...
533
447
  assert_equal "foo\nblurg\nblurble\n\nfarb\n\n", res, "Failed to produce expected result from test1 template"
534
448
  end
535
449
 
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rube
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.1
4
+ version: 0.1.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Richard LeBer
@@ -9,7 +9,7 @@ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
11
 
12
- date: 2009-07-20 00:00:00 -04:00
12
+ date: 2009-07-23 00:00:00 -04:00
13
13
  default_executable:
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
@@ -59,6 +59,7 @@ files:
59
59
  - VERSION
60
60
  - bin/rube
61
61
  - lib/rube.rb
62
+ - lib/rube/cli.rb
62
63
  - script/console
63
64
  - script/destroy
64
65
  - script/generate