rube 0.1.1 → 0.1.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.
@@ -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