| Class | Spec::Runner::Options |
| In: |
lib/spec/runner/options.rb
|
| Parent: | Object |
| FILE_SORTERS | = | { 'mtime' => lambda {|file_a, file_b| File.mtime(file_b) <=> File.mtime(file_a)} |
| EXAMPLE_FORMATTERS | = | { # Load these lazily for better speed 'specdoc' => ['spec/runner/formatter/specdoc_formatter', 'Formatter::SpecdocFormatter'], 's' => ['spec/runner/formatter/specdoc_formatter', 'Formatter::SpecdocFormatter'], 'nested' => ['spec/runner/formatter/nested_text_formatter', 'Formatter::NestedTextFormatter'], 'n' => ['spec/runner/formatter/nested_text_formatter', 'Formatter::NestedTextFormatter'], 'html' => ['spec/runner/formatter/html_formatter', 'Formatter::HtmlFormatter'], 'h' => ['spec/runner/formatter/html_formatter', 'Formatter::HtmlFormatter'], 'progress' => ['spec/runner/formatter/progress_bar_formatter', 'Formatter::ProgressBarFormatter'], 'p' => ['spec/runner/formatter/progress_bar_formatter', 'Formatter::ProgressBarFormatter'], 'failing_examples' => ['spec/runner/formatter/failing_examples_formatter', 'Formatter::FailingExamplesFormatter'], 'e' => ['spec/runner/formatter/failing_examples_formatter', 'Formatter::FailingExamplesFormatter'], 'failing_example_groups' => ['spec/runner/formatter/failing_example_groups_formatter', 'Formatter::FailingExampleGroupsFormatter'], 'g' => ['spec/runner/formatter/failing_example_groups_formatter', 'Formatter::FailingExampleGroupsFormatter'], 'profile' => ['spec/runner/formatter/profile_formatter', 'Formatter::ProfileFormatter'], 'o' => ['spec/runner/formatter/profile_formatter', 'Formatter::ProfileFormatter'], 'textmate' => ['spec/runner/formatter/text_mate_formatter', 'Formatter::TextMateFormatter'] |
| STORY_FORMATTERS | = | { 'plain' => ['spec/runner/formatter/story/plain_text_formatter', 'Formatter::Story::PlainTextFormatter'], 'p' => ['spec/runner/formatter/story/plain_text_formatter', 'Formatter::Story::PlainTextFormatter'], 'html' => ['spec/runner/formatter/story/html_formatter', 'Formatter::Story::HtmlFormatter'], 'h' => ['spec/runner/formatter/story/html_formatter', 'Formatter::Story::HtmlFormatter'] |
| after_suite_parts | [RW] | |
| argv | [RW] | |
| backtrace_tweaker | [RW] | |
| before_suite_parts | [RW] | |
| colour | [R] | |
| context_lines | [RW] | |
| diff_format | [RW] | |
| differ_class | [R] | |
| dry_run | [RW] | |
| error_stream | [RW] | |
| example_groups | [R] | |
| examples | [RW] | |
| filename_pattern | [RW] | |
| files | [R] | |
| heckle_runner | [RW] | |
| line_number | [RW] | |
| loadby | [RW] | |
| output_stream | [RW] | |
| profile | [RW] | |
| reporter | [RW] | |
| reverse | [RW] | |
| timeout | [RW] | |
| user_input_for_runner | [RW] | |
| verbose | [RW] |
# File lib/spec/runner/options.rb, line 58
58: def initialize(error_stream, output_stream)
59: @error_stream = error_stream
60: @output_stream = output_stream
61: @filename_pattern = "**/*_spec.rb"
62: @backtrace_tweaker = QuietBacktraceTweaker.new
63: @examples = []
64: @colour = false
65: @profile = false
66: @dry_run = false
67: @reporter = Reporter.new(self)
68: @context_lines = 3
69: @diff_format = :unified
70: @files = []
71: @example_groups = []
72: @result = nil
73: @examples_run = false
74: @examples_should_be_run = nil
75: @user_input_for_runner = nil
76: @before_suite_parts = []
77: @after_suite_parts = []
78: end
# File lib/spec/runner/options.rb, line 80
80: def add_example_group(example_group)
81: @example_groups << example_group
82: end
# File lib/spec/runner/options.rb, line 126
126: def colour=(colour)
127: @colour = colour
128: if @colour && RUBY_PLATFORM =~ /win32/ ;\
129: begin ;\
130: require 'rubygems' ;\
131: require 'Win32/Console/ANSI' ;\
132: rescue LoadError ;\
133: warn "You must 'gem install win32console' to use colour on Windows" ;\
134: @colour = false ;\
135: end
136: end
137: end
# File lib/spec/runner/options.rb, line 122
122: def examples_should_not_be_run
123: @examples_should_be_run = false
124: end
# File lib/spec/runner/options.rb, line 208
208: def files_to_load
209: result = []
210: sorted_files.each do |file|
211: if File.directory?(file)
212: filename_pattern.split(",").each do |pattern|
213: result += Dir[File.expand_path("#{file}/#{pattern.strip}")]
214: end
215: elsif File.file?(file)
216: result << file
217: else
218: raise "File or directory not found: #{file}"
219: end
220: end
221: result
222: end
# File lib/spec/runner/options.rb, line 172
172: def formatters
173: @format_options ||= [['progress', @output_stream]]
174: @formatters ||= load_formatters(@format_options, EXAMPLE_FORMATTERS)
175: end
# File lib/spec/runner/options.rb, line 182
182: def load_formatters(format_options, formatters)
183: format_options.map do |format, where|
184: formatter_type = if formatters[format]
185: require formatters[format][0]
186: eval(formatters[format][1], binding, __FILE__, __LINE__)
187: else
188: load_class(format, 'formatter', '--format')
189: end
190: formatter_type.new(self, where)
191: end
192: end
# File lib/spec/runner/options.rb, line 194
194: def load_heckle_runner(heckle)
195: suffix = [/mswin/, /java/].detect{|p| p =~ RUBY_PLATFORM} ? '_unsupported' : ''
196: require "spec/runner/heckle_runner#{suffix}"
197: @heckle_runner = HeckleRunner.new(heckle)
198: end
# File lib/spec/runner/options.rb, line 200
200: def number_of_examples
201: total = 0
202: @example_groups.each do |example_group|
203: total += example_group.number_of_examples
204: end
205: total
206: end
# File lib/spec/runner/options.rb, line 139
139: def parse_diff(format)
140: case format
141: when :context, 'context', 'c'
142: @diff_format = :context
143: default_differ
144: when :unified, 'unified', 'u', '', nil
145: @diff_format = :unified
146: default_differ
147: else
148: @diff_format = :custom
149: self.differ_class = load_class(format, 'differ', '--diff')
150: end
151: end
# File lib/spec/runner/options.rb, line 153
153: def parse_example(example)
154: if(File.file?(example))
155: @examples = File.open(example).read.split("\n")
156: else
157: @examples = [example]
158: end
159: end
# File lib/spec/runner/options.rb, line 161
161: def parse_format(format_arg)
162: format, where = ClassAndArgumentsParser.parse(format_arg)
163: unless where
164: raise "When using several --format options only one of them can be without a file" if @out_used
165: where = @output_stream
166: @out_used = true
167: end
168: @format_options ||= []
169: @format_options << [format, where]
170: end
# File lib/spec/runner/options.rb, line 84
84: def remove_example_group(example_group)
85: @example_groups.delete(example_group)
86: end
# File lib/spec/runner/options.rb, line 88
88: def run_examples
89: return true unless examples_should_be_run?
90: success = true
91: begin
92: before_suite_parts.each do |part|
93: part.call
94: end
95: runner = custom_runner || ExampleGroupRunner.new(self)
96:
97: unless @files_loaded
98: runner.load_files(files_to_load)
99: @files_loaded = true
100: end
101:
102: if example_groups.empty?
103: true
104: else
105: set_spec_from_line_number if line_number
106: success = runner.run
107: @examples_run = true
108: heckle if heckle_runner
109: success
110: end
111: ensure
112: after_suite_parts.each do |part|
113: part.call(success)
114: end
115: end
116: end
# File lib/spec/runner/options.rb, line 177
177: def story_formatters
178: @format_options ||= [['plain', @output_stream]]
179: @formatters ||= load_formatters(@format_options, STORY_FORMATTERS)
180: end
# File lib/spec/runner/options.rb, line 254
254: def custom_runner
255: return nil unless custom_runner?
256: klass_name, arg = ClassAndArgumentsParser.parse(user_input_for_runner)
257: runner_type = load_class(klass_name, 'behaviour runner', '--runner')
258: return runner_type.new(self, arg)
259: end
# File lib/spec/runner/options.rb, line 261
261: def custom_runner?
262: return user_input_for_runner ? true : false
263: end
# File lib/spec/runner/options.rb, line 279
279: def default_differ
280: require 'spec/expectations/differs/default'
281: self.differ_class = Spec::Expectations::Differs::Default
282: end
# File lib/spec/runner/options.rb, line 230
230: def differ_class=(klass)
231: return unless klass
232: @differ_class = klass
233: Spec::Expectations.differ = self.differ_class.new(self)
234: end
# File lib/spec/runner/options.rb, line 225
225: def examples_should_be_run?
226: return @examples_should_be_run unless @examples_should_be_run.nil?
227: @examples_should_be_run = true
228: end
# File lib/spec/runner/options.rb, line 265
265: def heckle
266: heckle_runner = self.heckle_runner
267: self.heckle_runner = nil
268: heckle_runner.heckle_with
269: end
# File lib/spec/runner/options.rb, line 236
236: def load_class(name, kind, option)
237: if name =~ /\A(?:::)?([A-Z]\w*(?:::[A-Z]\w*)*)\z/
238: arg = $2 == "" ? nil : $2
239: [$1, arg]
240: else
241: m = "#{name.inspect} is not a valid class name"
242: @error_stream.puts m
243: raise m
244: end
245: begin
246: eval(name, binding, __FILE__, __LINE__)
247: rescue NameError => e
248: @error_stream.puts "Couldn't find #{kind} class #{name}"
249: @error_stream.puts "Make sure the --require option is specified *before* #{option}"
250: if $_spec_spec ; raise e ; else exit(1) ; end
251: end
252: end
# File lib/spec/runner/options.rb, line 284
284: def set_spec_from_line_number
285: if examples.empty?
286: if files.length == 1
287: if File.directory?(files[0])
288: error_stream.puts "You must specify one file, not a directory when using the --line option"
289: exit(1) if stderr?
290: else
291: example = SpecParser.new.spec_name_for(files[0], line_number)
292: @examples = [example]
293: end
294: else
295: error_stream.puts "Only one file can be specified when using the --line option: #{files.inspect}"
296: exit(3) if stderr?
297: end
298: else
299: error_stream.puts "You cannot use both --line and --example"
300: exit(4) if stderr?
301: end
302: end
# File lib/spec/runner/options.rb, line 271
271: def sorted_files
272: return sorter ? files.sort(&sorter) : files
273: end