lucid 0.3.3 → 0.4.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/HISTORY.md +13 -9
- data/README.md +2 -6
- data/lib/lucid.rb +22 -3
- data/lib/lucid/{term/ansicolor.rb → ansicolor.rb} +34 -41
- data/lib/lucid/ast.rb +2 -2
- data/lib/lucid/ast/outline_table.rb +2 -2
- data/lib/lucid/ast/{specs.rb → spec.rb} +10 -1
- data/lib/lucid/ast/step.rb +3 -3
- data/lib/lucid/ast/step_invocation.rb +16 -16
- data/lib/lucid/ast/table.rb +1 -1
- data/lib/lucid/ast/{tdl_walker.rb → walker.rb} +15 -16
- data/lib/lucid/cli/app.rb +23 -21
- data/lib/lucid/cli/{configuration.rb → context.rb} +66 -38
- data/lib/lucid/cli/options.rb +59 -40
- data/lib/lucid/{configuration.rb → context.rb} +2 -3
- data/lib/lucid/{runtime.rb → context_loader.rb} +58 -61
- data/lib/lucid/{runtime/facade.rb → facade.rb} +5 -6
- data/lib/lucid/formatter/ansicolor.rb +15 -14
- data/lib/lucid/formatter/debug.rb +1 -1
- data/lib/lucid/formatter/usage.rb +2 -2
- data/lib/lucid/interface.rb +121 -0
- data/lib/lucid/{runtime/interface_io.rb → interface_io.rb} +2 -2
- data/lib/lucid/interface_rb/rb_language.rb +6 -23
- data/lib/lucid/interface_rb/rb_step_definition.rb +1 -2
- data/lib/lucid/{core_ext/instance_exec.rb → lang_extend.rb} +112 -69
- data/lib/lucid/{runtime/orchestrator.rb → orchestrator.rb} +36 -24
- data/lib/lucid/platform.rb +1 -1
- data/lib/lucid/{runtime/results.rb → results.rb} +10 -10
- data/lib/lucid/{tdl_builder.rb → spec_builder.rb} +26 -22
- data/lib/lucid/spec_file.rb +33 -13
- data/lib/lucid/{runtime/specs_loader.rb → spec_loader.rb} +13 -22
- data/lib/lucid/{step_definition_light.rb → step_definition_usage.rb} +2 -4
- data/lib/lucid/step_definitions.rb +4 -4
- data/spec/lucid/app_spec.rb +6 -18
- data/spec/lucid/ast/background_spec.rb +4 -4
- data/spec/lucid/ast/feature_spec.rb +7 -7
- data/spec/lucid/ast/scenario_outline_spec.rb +9 -9
- data/spec/lucid/ast/specs_spec.rb +8 -8
- data/spec/lucid/ast/step_spec.rb +5 -5
- data/spec/lucid/ast/tdl_walker_spec.rb +5 -5
- data/spec/lucid/{configuration_spec.rb → context_spec.rb} +78 -78
- data/spec/lucid/facade_spec.rb +7 -7
- data/spec/lucid/orchestrator_spec.rb +7 -7
- data/spec/lucid/pending_spec.rb +3 -3
- data/spec/lucid/progress_spec.rb +3 -3
- data/spec/lucid/rb_step_definition_spec.rb +4 -4
- data/spec/lucid/results_spec.rb +2 -2
- data/spec/lucid/runtime_spec.rb +7 -7
- metadata +20 -32
- data/bin/lucid-gen +0 -4
- data/lib/lucid/core_ext/proc.rb +0 -36
- data/lib/lucid/core_ext/string.rb +0 -9
- data/lib/lucid/generator.rb +0 -21
- data/lib/lucid/generators/project.rb +0 -64
- data/lib/lucid/generators/project/Gemfile.tt +0 -6
- data/lib/lucid/generators/project/browser-fluent.rb +0 -37
- data/lib/lucid/generators/project/driver-fluent.rb +0 -1
- data/lib/lucid/generators/project/errors.rb +0 -26
- data/lib/lucid/generators/project/events-fluent.rb +0 -33
- data/lib/lucid/interface_methods.rb +0 -125
data/lib/lucid/ast/table.rb
CHANGED
@@ -451,7 +451,7 @@ module Lucid
|
|
451
451
|
Lucid::Term::ANSIColor.coloring = options[:color]
|
452
452
|
formatter = Formatter::Standard.new(nil, io, options)
|
453
453
|
formatter.instance_variable_set('@indent', options[:indent])
|
454
|
-
|
454
|
+
Walker.new(nil, [formatter]).visit_multiline_arg(self)
|
455
455
|
|
456
456
|
Lucid::Term::ANSIColor.coloring = c
|
457
457
|
io.rewind
|
@@ -1,21 +1,20 @@
|
|
1
1
|
module Lucid
|
2
2
|
module AST
|
3
|
-
class
|
4
|
-
attr_accessor :
|
5
|
-
attr_reader :runtime
|
3
|
+
class Walker
|
4
|
+
attr_accessor :context
|
5
|
+
attr_reader :runtime
|
6
6
|
|
7
|
-
def initialize(runtime, listeners = [],
|
8
|
-
@runtime, @listeners, @
|
7
|
+
def initialize(runtime, listeners = [], context = Lucid::Context.default)
|
8
|
+
@runtime, @listeners, @context = runtime, listeners, context
|
9
9
|
end
|
10
10
|
|
11
11
|
# This is being used to forward on messages from the AST to
|
12
|
-
# the formatters.
|
13
|
-
# forwarding that was previously done.
|
12
|
+
# the formatters.
|
14
13
|
def method_missing(message, *args, &block)
|
15
|
-
|
14
|
+
send_message(message, *args, &block)
|
16
15
|
end
|
17
16
|
|
18
|
-
def visit_multiline_arg(multiline_arg)
|
17
|
+
def visit_multiline_arg(multiline_arg)
|
19
18
|
broadcast(multiline_arg) do
|
20
19
|
multiline_arg.accept(self)
|
21
20
|
end
|
@@ -25,32 +24,32 @@ module Lucid
|
|
25
24
|
|
26
25
|
def broadcast(*args, &block)
|
27
26
|
message = extract_method_name_from(caller[0])
|
28
|
-
|
27
|
+
send_message message, *args, &block
|
29
28
|
self
|
30
29
|
end
|
31
30
|
|
32
|
-
def
|
31
|
+
def send_message(message, *args, &block)
|
33
32
|
return self if Lucid.wants_to_quit
|
34
33
|
message = message.to_s.gsub('visit_', '')
|
35
34
|
if block_given?
|
36
|
-
|
35
|
+
send_to_listeners("before_#{message}", *args)
|
37
36
|
yield if block_given?
|
38
|
-
|
37
|
+
send_to_listeners("after_#{message}", *args)
|
39
38
|
else
|
40
|
-
|
39
|
+
send_to_listeners(message, *args)
|
41
40
|
end
|
42
41
|
self
|
43
42
|
end
|
44
43
|
|
45
|
-
def
|
44
|
+
def send_to_listeners(message, *args)
|
46
45
|
@listeners.each do |listener|
|
47
46
|
if listener.respond_to?(message)
|
48
47
|
listener.__send__(message, *args)
|
49
48
|
end
|
50
49
|
end
|
51
50
|
end
|
51
|
+
|
52
52
|
def extract_method_name_from(call_stack)
|
53
|
-
#call_stack[0].match(/in `(.*)'/).captures[0]
|
54
53
|
match = call_stack.match(/in `(.*)'/)
|
55
54
|
match.captures[0]
|
56
55
|
end
|
data/lib/lucid/cli/app.rb
CHANGED
@@ -3,7 +3,7 @@ require 'optparse'
|
|
3
3
|
require 'lucid'
|
4
4
|
require 'logger'
|
5
5
|
require 'lucid/spec_file'
|
6
|
-
require 'lucid/cli/
|
6
|
+
require 'lucid/cli/context'
|
7
7
|
|
8
8
|
module Lucid
|
9
9
|
module CLI
|
@@ -11,7 +11,7 @@ module Lucid
|
|
11
11
|
def self.start(args)
|
12
12
|
new(args).start!
|
13
13
|
end
|
14
|
-
|
14
|
+
|
15
15
|
def initialize(args, stdin=STDIN, out=STDOUT, err=STDERR, kernel=Kernel)
|
16
16
|
raise "args can't be nil" unless args
|
17
17
|
raise "out can't be nil" unless out
|
@@ -21,24 +21,25 @@ module Lucid
|
|
21
21
|
@out = out
|
22
22
|
@err = err
|
23
23
|
@kernel = kernel
|
24
|
-
@
|
24
|
+
@context = nil
|
25
25
|
end
|
26
|
-
|
27
|
-
def start!(
|
26
|
+
|
27
|
+
def start!(existing_context = nil)
|
28
28
|
trap_interrupt
|
29
29
|
|
30
|
-
|
31
|
-
|
32
|
-
|
30
|
+
context_loader = if existing_context
|
31
|
+
existing_context.configure(load_context)
|
32
|
+
existing_context
|
33
33
|
else
|
34
|
-
|
34
|
+
ContextLoader.new(load_context)
|
35
35
|
end
|
36
36
|
|
37
|
-
log.debug(
|
37
|
+
log.debug('Context Loader')
|
38
|
+
log.debug(context_loader)
|
38
39
|
|
39
|
-
|
40
|
-
|
41
|
-
failure =
|
40
|
+
context_loader.execute
|
41
|
+
context_loader.write_testdefs_json
|
42
|
+
failure = context_loader.results.failure? || Lucid.wants_to_quit
|
42
43
|
@kernel.exit(failure ? 1 : 0)
|
43
44
|
rescue ProfilesNotDefinedError, YmlLoadError, ProfileNotFound => e
|
44
45
|
@err.puts(e.message)
|
@@ -53,14 +54,15 @@ module Lucid
|
|
53
54
|
@kernel.exit(1)
|
54
55
|
end
|
55
56
|
|
56
|
-
def
|
57
|
-
return @
|
57
|
+
def load_context
|
58
|
+
return @context if @context
|
58
59
|
|
59
|
-
@
|
60
|
-
@
|
61
|
-
Lucid.logger = @
|
62
|
-
log.debug(
|
63
|
-
@
|
60
|
+
@context = Context.new(@out, @err)
|
61
|
+
@context.parse_options(@args)
|
62
|
+
Lucid.logger = @context.log
|
63
|
+
log.debug('Context:')
|
64
|
+
log.debug(@context)
|
65
|
+
@context
|
64
66
|
end
|
65
67
|
|
66
68
|
private
|
@@ -73,7 +75,7 @@ module Lucid
|
|
73
75
|
trap('INT') do
|
74
76
|
exit!(1) if Lucid.wants_to_quit
|
75
77
|
Lucid.wants_to_quit = true
|
76
|
-
STDERR.puts "\nExiting
|
78
|
+
STDERR.puts "\nExiting Lucid execution.\nInterrupt again to exit immediately."
|
77
79
|
end
|
78
80
|
end
|
79
81
|
end
|
@@ -8,23 +8,24 @@ module Lucid
|
|
8
8
|
class ProfilesNotDefinedError < YmlLoadError; end
|
9
9
|
class ProfileNotFound < StandardError; end
|
10
10
|
|
11
|
-
class
|
11
|
+
class Context
|
12
12
|
include Factory
|
13
13
|
|
14
14
|
attr_reader :out_stream
|
15
15
|
|
16
16
|
def initialize(out_stream = STDOUT, err_stream = STDERR)
|
17
|
-
@out_stream
|
17
|
+
@out_stream = out_stream
|
18
18
|
@err_stream = err_stream
|
19
19
|
@options = Options.new(@out_stream, @err_stream, :default_profile => 'default')
|
20
20
|
end
|
21
21
|
|
22
|
-
def
|
22
|
+
def parse_options(args)
|
23
23
|
@args = args
|
24
24
|
@options.parse(args)
|
25
|
-
log.debug(
|
25
|
+
log.debug('Options:')
|
26
|
+
log.debug(@options)
|
26
27
|
|
27
|
-
|
28
|
+
set_formatter
|
28
29
|
raise('You cannot use both --strict and --wip tags.') if strict? && wip?
|
29
30
|
|
30
31
|
@options[:tag_expression] = Gherkin::TagExpression.new(@options[:tag_expressions])
|
@@ -68,24 +69,26 @@ module Lucid
|
|
68
69
|
@options[:matcher_type] || :regexp
|
69
70
|
end
|
70
71
|
|
71
|
-
|
72
|
-
|
72
|
+
# @see Lucid::ContextLoader.execute
|
73
|
+
def establish_ast_walker(runtime)
|
74
|
+
Lucid::AST::Walker.new(runtime, formatters(runtime), self)
|
73
75
|
end
|
74
76
|
|
75
|
-
def
|
76
|
-
if
|
77
|
+
def formatter_instance(name)
|
78
|
+
if lucid_format = Options::LUCID_FORMATS[name]
|
77
79
|
create_object_of(lucid_format[0])
|
78
80
|
else
|
79
81
|
create_object_of(name)
|
80
82
|
end
|
81
83
|
end
|
82
84
|
|
85
|
+
# @return [Array] list of non-spec, executable files from all required locations
|
83
86
|
def spec_requires
|
84
87
|
requires = @options[:require].empty? ? require_dirs : @options[:require]
|
85
88
|
|
86
89
|
files = requires.map do |path|
|
87
|
-
path = path.gsub(/\\/, '/')
|
88
|
-
path = path.gsub(/\/$/, '')
|
90
|
+
path = path.gsub(/\\/, '/')
|
91
|
+
path = path.gsub(/\/$/, '')
|
89
92
|
File.directory?(path) ? Dir["#{path}/**/*"] : path
|
90
93
|
end.flatten.uniq
|
91
94
|
|
@@ -93,7 +96,7 @@ module Lucid
|
|
93
96
|
|
94
97
|
files.reject! {|f| !File.file?(f)}
|
95
98
|
|
96
|
-
|
99
|
+
spec_type.each do |type|
|
97
100
|
files.reject! {|f| File.extname(f) == ".#{type}" }
|
98
101
|
end
|
99
102
|
|
@@ -102,28 +105,49 @@ module Lucid
|
|
102
105
|
files.sort
|
103
106
|
end
|
104
107
|
|
105
|
-
#
|
108
|
+
# Returns all definition files that exist in the default or provided
|
109
|
+
# execution path.
|
110
|
+
#
|
111
|
+
# @return [Array] executable files outside of the library path
|
112
|
+
# @see Lucid::ContextLoader.load_execution_context
|
106
113
|
def definition_context
|
107
|
-
spec_requires.reject { |f| f=~ %r{#{library_path}} }
|
114
|
+
definition_files = spec_requires.reject { |f| f =~ %r{#{library_path}} }
|
115
|
+
log.info("Definition Files:\n#{definition_files}")
|
116
|
+
|
117
|
+
non_test_definitions = spec_requires.reject { |f| f =~ %r{#{steps_path}|#{library_path}} }
|
118
|
+
log.info("Non-Test Definition Files:\n#{non_test_definitions}")
|
119
|
+
|
120
|
+
@options[:dry_run] ? definition_files - non_test_definitions : definition_files
|
108
121
|
end
|
109
122
|
|
110
|
-
#
|
123
|
+
# Returns all library files that exist in the default or provided
|
124
|
+
# library path. During a dry run, the driver file will not be
|
125
|
+
# returned as part of the executing context.
|
126
|
+
#
|
127
|
+
# @return [Array] valid executable files in the library path
|
128
|
+
# @see Lucid::ContextLoader.load_execution_context
|
111
129
|
def library_context
|
112
130
|
library_files = spec_requires.select { |f| f =~ %r{#{library_path}} }
|
113
|
-
|
131
|
+
log.info("(Library Context) Library Files:\n#{library_files}")
|
114
132
|
|
115
|
-
|
133
|
+
driver = library_files.select {|f| f =~ %r{#{driver_file}} }
|
134
|
+
log.info("(Library Context) Driver File:\n#{driver}")
|
116
135
|
|
117
136
|
non_driver_files = library_files - driver
|
137
|
+
log.info("(Library Context) Non-Driver Files:\n#{non_driver_files}")
|
118
138
|
|
119
139
|
@options[:dry_run] ? non_driver_files : driver + non_driver_files
|
120
140
|
end
|
121
141
|
|
122
|
-
#
|
123
|
-
|
142
|
+
# Returns all spec files that exist in the default or provided spec
|
143
|
+
# repository.
|
144
|
+
#
|
145
|
+
# @return [Array] spec files from the repo
|
146
|
+
# @see Lucid::RepoRunner.load_spec_context
|
147
|
+
def spec_context
|
124
148
|
files = specs_path(spec_source).map do |path|
|
125
|
-
path = path.gsub(/\\/, '/')
|
126
|
-
path = path.chomp('/')
|
149
|
+
path = path.gsub(/\\/, '/')
|
150
|
+
path = path.chomp('/')
|
127
151
|
|
128
152
|
files_to_sort = []
|
129
153
|
|
@@ -134,7 +158,7 @@ module Lucid
|
|
134
158
|
|
135
159
|
files_to_sort
|
136
160
|
elsif path[0..0] == '@' and # @listfile.txt
|
137
|
-
|
161
|
+
File.file?(path[1..-1]) # listfile.txt is a file
|
138
162
|
IO.read(path[1..-1]).split
|
139
163
|
else
|
140
164
|
path
|
@@ -154,16 +178,23 @@ module Lucid
|
|
154
178
|
end
|
155
179
|
|
156
180
|
def spec_type
|
157
|
-
@options[:
|
158
|
-
|
181
|
+
@options[:spec_types]
|
159
182
|
end
|
160
183
|
|
161
184
|
def library_path
|
162
|
-
@options[:library_path]
|
185
|
+
@options[:library_path]
|
163
186
|
end
|
164
187
|
|
165
188
|
def driver_file
|
166
|
-
@options[:driver_file]
|
189
|
+
@options[:driver_file]
|
190
|
+
end
|
191
|
+
|
192
|
+
def steps_path
|
193
|
+
@options[:steps_path]
|
194
|
+
end
|
195
|
+
|
196
|
+
def definitions_path
|
197
|
+
@options[:definitions_path]
|
167
198
|
end
|
168
199
|
|
169
200
|
def log
|
@@ -191,7 +222,7 @@ module Lucid
|
|
191
222
|
@options[:spec_source]
|
192
223
|
end
|
193
224
|
|
194
|
-
|
225
|
+
private
|
195
226
|
|
196
227
|
def specs_path(paths)
|
197
228
|
return ['specs'] if paths.empty?
|
@@ -200,16 +231,13 @@ module Lucid
|
|
200
231
|
|
201
232
|
def formatters(runtime)
|
202
233
|
@options[:formats].map do |format|
|
203
|
-
# The name will be a name, like 'standard'. The route will be the
|
204
|
-
# location where output is sent to, such as 'STDOUT'.
|
205
|
-
name = format[0]
|
206
|
-
route = format[1]
|
207
234
|
begin
|
208
|
-
formatter =
|
209
|
-
formatter.new(runtime,
|
210
|
-
rescue
|
211
|
-
|
212
|
-
|
235
|
+
formatter = formatter_instance(format[0])
|
236
|
+
formatter.new(runtime, format[1], @options)
|
237
|
+
rescue LoadError
|
238
|
+
message = "\nLucid is unable to create the formatter: #{format[0]}"
|
239
|
+
log.error(message)
|
240
|
+
Kernel.exit(1)
|
213
241
|
end
|
214
242
|
end
|
215
243
|
end
|
@@ -220,7 +248,7 @@ module Lucid
|
|
220
248
|
end
|
221
249
|
end
|
222
250
|
|
223
|
-
def
|
251
|
+
def set_formatter
|
224
252
|
@options[:formats] << ['standard', @out_stream] if @options[:formats].empty?
|
225
253
|
@options[:formats] = @options[:formats].sort_by{|f| f[1] == @out_stream ? -1 : 1}
|
226
254
|
@options[:formats].uniq!
|
@@ -237,7 +265,7 @@ module Lucid
|
|
237
265
|
end
|
238
266
|
|
239
267
|
def require_dirs
|
240
|
-
spec_location + Dir["#{library_path}",
|
268
|
+
spec_location + Dir["#{library_path}", "#{definitions_path}", "#{steps_path}"]
|
241
269
|
end
|
242
270
|
|
243
271
|
end
|
data/lib/lucid/cli/options.rb
CHANGED
@@ -1,3 +1,4 @@
|
|
1
|
+
require 'English'
|
1
2
|
require 'lucid/cli/profile'
|
2
3
|
require 'lucid/formatter/ansicolor'
|
3
4
|
require 'lucid/interface_rb/rb_language'
|
@@ -83,7 +84,9 @@ module Lucid
|
|
83
84
|
@args.extend(::OptionParser::Arguable)
|
84
85
|
|
85
86
|
@args.options do |opts|
|
86
|
-
opts.banner = ['Lucid
|
87
|
+
opts.banner = ['Lucid Framework',
|
88
|
+
'Test Description Language Specification and Execution Engine',
|
89
|
+
'',
|
87
90
|
'Usage: lucid [options] [ [FILE|DIR|URL][:LINE[:LINE]*] ]+', '', ''
|
88
91
|
].join("\n")
|
89
92
|
|
@@ -91,9 +94,16 @@ module Lucid
|
|
91
94
|
@options[:library_path] = path
|
92
95
|
end
|
93
96
|
|
97
|
+
opts.on('--definition-path PATH', 'Location of spec project definition files.') do |path|
|
98
|
+
@options[:definitions_path] = path
|
99
|
+
end
|
100
|
+
|
101
|
+
opts.on('--steps-path PATH', 'Location of spec project test step files.') do |path|
|
102
|
+
@options[:steps_path] = path
|
103
|
+
end
|
104
|
+
|
94
105
|
opts.on('--spec-type TYPE', 'The file type (extension) for Lucid specifications.') do |type|
|
95
|
-
|
96
|
-
@options[:spec_type] << type
|
106
|
+
@options[:spec_types] << type
|
97
107
|
end
|
98
108
|
|
99
109
|
opts.on('--driver-file FILE', 'The file for Lucid to connect to an execution library.') do |file|
|
@@ -103,19 +113,17 @@ module Lucid
|
|
103
113
|
opts.separator ''
|
104
114
|
|
105
115
|
opts.on('-r LIBRARY|DIR', '--require LIBRARY|DIR',
|
106
|
-
'Require
|
107
|
-
'
|
108
|
-
'
|
109
|
-
'
|
110
|
-
'loading
|
111
|
-
'
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
@options[:require] << v
|
116
|
-
if(Lucid::JRUBY && File.directory?(v))
|
116
|
+
'Require resources (paths or individual files) prior to executing',
|
117
|
+
'the test specs. If no require options are passed, then Lucid will',
|
118
|
+
'use its default path and file settings via automatic loading. If',
|
119
|
+
'require options are passed, however, then automatic loading will',
|
120
|
+
'be disabled, which means loading any resources must be done via',
|
121
|
+
'explicit uses of this option. The require option can be specified',
|
122
|
+
'multiple times.') do |resource|
|
123
|
+
@options[:require] << resource
|
124
|
+
if(Lucid::JRUBY && File.directory?(resource))
|
117
125
|
require 'java'
|
118
|
-
$CLASSPATH <<
|
126
|
+
$CLASSPATH << resource
|
119
127
|
end
|
120
128
|
end
|
121
129
|
|
@@ -143,8 +151,9 @@ module Lucid
|
|
143
151
|
|
144
152
|
opts.separator ''
|
145
153
|
|
146
|
-
opts.on('-d', '--dry-run', '
|
147
|
-
'
|
154
|
+
opts.on('-d', '--dry-run', 'Performs spec parsing without test execution.',
|
155
|
+
'Performing a dry run omits loading of the driver file as well as',
|
156
|
+
'any page or activity definitions.') do
|
148
157
|
@options[:dry_run] = true
|
149
158
|
end
|
150
159
|
|
@@ -305,24 +314,13 @@ module Lucid
|
|
305
314
|
Kernel.exit(0)
|
306
315
|
end
|
307
316
|
end
|
308
|
-
#end.parse!
|
309
317
|
|
310
318
|
begin
|
311
319
|
@args.parse!
|
312
320
|
rescue OptionParser::InvalidOption
|
313
|
-
|
314
|
-
puts "You specified an invalid option: #{$1}"
|
315
|
-
puts 'Please run lucid --help to see the list of available options.'
|
316
|
-
end
|
317
|
-
|
321
|
+
invalid_option($ERROR_INFO)
|
318
322
|
rescue OptionParser::MissingArgument
|
319
|
-
|
320
|
-
puts "You specified an valid option (#{$1}), but with an invalid argument."
|
321
|
-
puts 'Make sure you are providing the expected argument for the option.'
|
322
|
-
puts 'Run lucid --help to see the list of available options.'
|
323
|
-
end
|
324
|
-
|
325
|
-
Kernel.exit(1)
|
323
|
+
missing_argument($ERROR_INFO)
|
326
324
|
end
|
327
325
|
|
328
326
|
if @quiet
|
@@ -335,9 +333,12 @@ module Lucid
|
|
335
333
|
|
336
334
|
extract_environment_variables
|
337
335
|
|
338
|
-
#
|
339
|
-
#
|
340
|
-
|
336
|
+
# The next statement is critical because it takes whatever is left
|
337
|
+
# from the command line when all the valid options are parsed. This
|
338
|
+
# would have to be the spec repository. The empty check is because
|
339
|
+
# even if no args are passed, an empty array will be passed to the
|
340
|
+
# spec_repos key, which overwrites the default option.
|
341
|
+
@options[:spec_source] = @args.dup #unless args.empty?
|
341
342
|
|
342
343
|
establish_profile
|
343
344
|
|
@@ -348,17 +349,33 @@ module Lucid
|
|
348
349
|
@profiles - [@default_profile]
|
349
350
|
end
|
350
351
|
|
351
|
-
# @see Lucid::CLI::
|
352
|
+
# @see Lucid::CLI::Context.filters
|
352
353
|
def filters
|
353
354
|
@options.values_at(:name_regexps, :tag_expressions).select{|v| !v.empty?}.first || []
|
354
355
|
end
|
355
356
|
|
356
|
-
|
357
|
+
protected
|
357
358
|
|
358
359
|
attr_reader :options, :profiles, :expanded_args
|
359
360
|
protected :options, :profiles, :expanded_args
|
360
361
|
|
361
|
-
|
362
|
+
private
|
363
|
+
|
364
|
+
def invalid_option(error)
|
365
|
+
if error.to_s =~ /invalid option:\s+((?:-)?-\S+)/
|
366
|
+
puts "You specified an #{$MATCH}\n\n"
|
367
|
+
puts 'Run lucid --help to see the list of available options.'
|
368
|
+
end
|
369
|
+
Kernel.exit(1)
|
370
|
+
end
|
371
|
+
|
372
|
+
def missing_argument(error)
|
373
|
+
if error.to_s =~ /(?:missing argument:\s+)((?:-)?-\S+)/
|
374
|
+
puts "Valid option with #{$MATCH}\n\n"
|
375
|
+
puts 'Run lucid --help to see the list of available options.'
|
376
|
+
end
|
377
|
+
Kernel.exit(1)
|
378
|
+
end
|
362
379
|
|
363
380
|
def non_stdout_formats
|
364
381
|
@options[:formats].select {|format, output| output != @out_stream }
|
@@ -435,7 +452,7 @@ module Lucid
|
|
435
452
|
@options[:dry_run] |= other_options[:dry_run]
|
436
453
|
|
437
454
|
@options[:library_path] += other_options[:library_path]
|
438
|
-
@options[:
|
455
|
+
@options[:spec_types] += other_options[:spec_types]
|
439
456
|
@options[:driver_file] += other_options[:driver_file]
|
440
457
|
|
441
458
|
@profiles += other_options.profiles
|
@@ -474,9 +491,11 @@ module Lucid
|
|
474
491
|
:name_regexps => [],
|
475
492
|
:env_vars => {},
|
476
493
|
:diff_enabled => true,
|
477
|
-
:
|
478
|
-
:library_path => '',
|
479
|
-
:
|
494
|
+
:spec_types => %w(feature spec story),
|
495
|
+
:library_path => 'common',
|
496
|
+
:definitions_path => 'pages',
|
497
|
+
:steps_path => 'steps',
|
498
|
+
:driver_file => 'driver'
|
480
499
|
}
|
481
500
|
end
|
482
501
|
end
|