| 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'], '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'] |
| argv | [RW] | |
| backtrace_tweaker | [RW] | |
| colour | [R] | |
| context_lines | [RW] | |
| diff_format | [RW] | |
| differ_class | [R] | |
| dry_run | [RW] | |
| error_stream | [RW] | |
| example_groups | [R] | |
| examples | [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 53
53: def initialize(error_stream, output_stream)
54: @error_stream = error_stream
55: @output_stream = output_stream
56: @backtrace_tweaker = QuietBacktraceTweaker.new
57: @examples = []
58: @colour = false
59: @profile = false
60: @dry_run = false
61: @reporter = Reporter.new(self)
62: @context_lines = 3
63: @diff_format = :unified
64: @files = []
65: @example_groups = []
66: @examples_run = false
67: @examples_should_be_run = nil
68: @user_input_for_runner = nil
69: end
# File lib/spec/runner/options.rb, line 71
71: def add_example_group(example_group)
72: @example_groups << example_group
73: end
# File lib/spec/runner/options.rb, line 102
102: def colour=(colour)
103: @colour = colour
104: begin; \
105: require 'Win32/Console/ANSI' if @colour && PLATFORM =~ /win32/; \
106: rescue LoadError ; \
107: raise "You must gem install win32console to use colour on Windows" ; \
108: end
109: end
# File lib/spec/runner/options.rb, line 98
98: def examples_should_not_be_run
99: @examples_should_be_run = false
100: end
# File lib/spec/runner/options.rb, line 144
144: def formatters
145: @format_options ||= [['progress', @output_stream]]
146: @formatters ||= load_formatters(@format_options, EXAMPLE_FORMATTERS)
147: end
# File lib/spec/runner/options.rb, line 154
154: def load_formatters(format_options, formatters)
155: format_options.map do |format, where|
156: formatter_type = if formatters[format]
157: require formatters[format][0]
158: eval(formatters[format][1], binding, __FILE__, __LINE__)
159: else
160: load_class(format, 'formatter', '--format')
161: end
162: formatter_type.new(self, where)
163: end
164: end
# File lib/spec/runner/options.rb, line 166
166: def load_heckle_runner(heckle)
167: suffix = [/mswin/, /java/].detect{|p| p =~ RUBY_PLATFORM} ? '_unsupported' : ''
168: require "spec/runner/heckle_runner#{suffix}"
169: @heckle_runner = HeckleRunner.new(heckle)
170: end
# File lib/spec/runner/options.rb, line 172
172: def number_of_examples
173: @example_groups.inject(0) do |sum, example_group|
174: sum + example_group.number_of_examples
175: end
176: end
# File lib/spec/runner/options.rb, line 111
111: def parse_diff(format)
112: case format
113: when :context, 'context', 'c'
114: @diff_format = :context
115: default_differ
116: when :unified, 'unified', 'u', '', nil
117: @diff_format = :unified
118: default_differ
119: else
120: @diff_format = :custom
121: self.differ_class = load_class(format, 'differ', '--diff')
122: end
123: end
# File lib/spec/runner/options.rb, line 125
125: def parse_example(example)
126: if(File.file?(example))
127: @examples = File.open(example).read.split("\n")
128: else
129: @examples = [example]
130: end
131: end
# File lib/spec/runner/options.rb, line 133
133: def parse_format(format_arg)
134: format, where = ClassAndArgumentsParser.parse(format_arg)
135: unless where
136: raise "When using several --format options only one of them can be without a file" if @out_used
137: where = @output_stream
138: @out_used = true
139: end
140: @format_options ||= []
141: @format_options << [format, where]
142: end
# File lib/spec/runner/options.rb, line 75
75: def remove_example_group(example_group)
76: @example_groups.delete(example_group)
77: end
# File lib/spec/runner/options.rb, line 79
79: def run_examples
80: return true unless examples_should_be_run?
81: runner = custom_runner || ExampleGroupRunner.new(self)
82:
83: runner.load_files(files_to_load)
84: if example_groups.empty?
85: true
86: else
87: success = runner.run
88: @examples_run = true
89: heckle if heckle_runner
90: success
91: end
92: end
# File lib/spec/runner/options.rb, line 149
149: def story_formatters
150: @format_options ||= [['plain', @output_stream]]
151: @formatters ||= load_formatters(@format_options, STORY_FORMATTERS)
152: end
# File lib/spec/runner/options.rb, line 222
222: def custom_runner
223: return nil unless custom_runner?
224: klass_name, arg = ClassAndArgumentsParser.parse(user_input_for_runner)
225: runner_type = load_class(klass_name, 'behaviour runner', '--runner')
226: return runner_type.new(self, arg)
227: end
# File lib/spec/runner/options.rb, line 229
229: def custom_runner?
230: return user_input_for_runner ? true : false
231: end
# File lib/spec/runner/options.rb, line 247
247: def default_differ
248: require 'spec/expectations/differs/default'
249: self.differ_class = Spec::Expectations::Differs::Default
250: end
# File lib/spec/runner/options.rb, line 184
184: def differ_class=(klass)
185: return unless klass
186: @differ_class = klass
187: Spec::Expectations.differ = self.differ_class.new(self)
188: end
# File lib/spec/runner/options.rb, line 179
179: def examples_should_be_run?
180: return @examples_should_be_run unless @examples_should_be_run.nil?
181: @examples_should_be_run = true
182: end
# File lib/spec/runner/options.rb, line 208
208: def files_to_load
209: result = []
210: sorted_files.each do |file|
211: if test ?d, file
212: result += Dir[File.expand_path("#{file}/**/*.rb")]
213: elsif test ?f, file
214: result << file
215: else
216: raise "File or directory not found: #{file}"
217: end
218: end
219: result
220: end
# File lib/spec/runner/options.rb, line 233
233: def heckle
234: returns = self.heckle_runner.heckle_with
235: self.heckle_runner = nil
236: returns
237: end
# File lib/spec/runner/options.rb, line 190
190: def load_class(name, kind, option)
191: if name =~ /\A(?:::)?([A-Z]\w*(?:::[A-Z]\w*)*)\z/
192: arg = $2 == "" ? nil : $2
193: [$1, arg]
194: else
195: m = "#{name.inspect} is not a valid class name"
196: @error_stream.puts m
197: raise m
198: end
199: begin
200: eval(name, binding, __FILE__, __LINE__)
201: rescue NameError => e
202: @error_stream.puts "Couldn't find #{kind} class #{name}"
203: @error_stream.puts "Make sure the --require option is specified *before* #{option}"
204: if $_spec_spec ; raise e ; else exit(1) ; end
205: end
206: end