lucid 0.0.6 → 0.0.7

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,34 @@
1
+ module Lucid
2
+ module AST
3
+ class StepResult
4
+ attr_reader :keyword, :step_match, :exception, :status, :background
5
+ attr_reader :step_multiline_class, :file_colon_line
6
+
7
+ def initialize(keyword, step_match, multiline_arg, status, exception, source_indent, background, file_colon_line)
8
+ @keyword, @step_match, @multiline_arg, @status, @exception, @source_indent, @background, @file_colon_line = keyword, step_match, multiline_arg, status, exception, source_indent, background, file_colon_line
9
+ end
10
+
11
+ def accept(visitor)
12
+ visitor.visit_step_name(@keyword, @step_match, @status, @source_indent, @background, @file_colon_line)
13
+ visitor.visit_multiline_arg(@multiline_arg) if @multiline_arg
14
+ visitor.visit_exception(@exception, @status) if @exception
15
+ end
16
+
17
+ def args
18
+ [@keyword, @step_match, @multiline_arg, @status, @exception, @source_indent, @background, @file_colon_line]
19
+ end
20
+
21
+ def step_name
22
+ @step_match.name
23
+ end
24
+
25
+ def step_definition
26
+ @step_match.step_definition
27
+ end
28
+
29
+ def step_arguments
30
+ @step_match.step_arguments
31
+ end
32
+ end
33
+ end
34
+ end
@@ -179,7 +179,7 @@ module Lucid
179
179
  def accept(visitor) #:nodoc:
180
180
  return if Lucid.wants_to_quit
181
181
  cells_rows.each do |row|
182
- visitor.visit_table_row(row)
182
+ row.accept(visitor)
183
183
  end
184
184
  nil
185
185
  end
@@ -631,8 +631,10 @@ module Lucid
631
631
 
632
632
  def accept(visitor)
633
633
  return if Lucid.wants_to_quit
634
- each do |cell|
635
- visitor.visit_table_cell(cell)
634
+ visitor.visit_table_row(self) do
635
+ each do |cell|
636
+ cell.accept(visitor)
637
+ end
636
638
  end
637
639
  nil
638
640
  end
@@ -687,7 +689,10 @@ module Lucid
687
689
 
688
690
  def accept(visitor)
689
691
  return if Lucid.wants_to_quit
690
- visitor.visit_table_cell_value(value, status)
692
+
693
+ visitor.visit_table_cell(self) do
694
+ visitor.visit_table_cell_value(value, status)
695
+ end
691
696
  end
692
697
 
693
698
  def inspect!
@@ -11,8 +11,10 @@ module Lucid
11
11
 
12
12
  def accept(visitor)
13
13
  return if Lucid.wants_to_quit
14
- @tags.each do |tag|
15
- visitor.visit_tag_name(tag.name)
14
+ visitor.visit_tags(self) do
15
+ @tags.each do |tag|
16
+ visitor.visit_tag_name(tag.name)
17
+ end
16
18
  end
17
19
  end
18
20
 
@@ -11,7 +11,7 @@ module Lucid
11
11
  def execute(scenario, skip_hooks)
12
12
  runtime.with_hooks(scenario, skip_hooks) do
13
13
  scenario.skip_invoke! if scenario.failed?
14
- visit_steps(scenario.steps)
14
+ scenario.steps.accept(self)
15
15
  end
16
16
  end
17
17
 
@@ -20,108 +20,100 @@ module Lucid
20
20
  # are initially the same concept. When the spec is visited, the high
21
21
  # level construct (feature, ability) is determined.
22
22
  # @see Lucid::Runtime.run
23
- def visit_features(features)
24
- broadcast(features) do
25
- features.accept(self)
26
- end
27
- end
23
+ #def visit_features(features, &block)
24
+ # broadcast(features, &block)
25
+ #end
28
26
 
29
- def visit_feature(feature)
30
- broadcast(feature) do
31
- feature.accept(self)
32
- end
33
- end
27
+ #def visit_feature(feature, &block)
28
+ # broadcast(feature, &block)
29
+ #end
34
30
 
35
- def visit_comment(comment)
36
- broadcast(comment) do
37
- comment.accept(self)
38
- end
39
- end
31
+ #def visit_comment(comment, &block)
32
+ # broadcast(comment, &block)
33
+ #end
40
34
 
41
- def visit_comment_line(comment_line)
42
- broadcast(comment_line)
43
- end
35
+ #def visit_comment_line(comment_line)
36
+ # broadcast(comment_line)
37
+ #end
44
38
 
45
- def visit_tags(tags)
46
- broadcast(tags) do
47
- tags.accept(self)
48
- end
49
- end
39
+ #def visit_tags(tags, &block)
40
+ # broadcast(tags, &block)
41
+ #end
50
42
 
51
- def visit_tag_name(tag_name)
52
- broadcast(tag_name)
53
- end
43
+ #def visit_tag_name(tag_name)
44
+ # broadcast(tag_name)
45
+ #end
54
46
 
55
- def visit_feature_name(keyword, name)
56
- broadcast(keyword, name)
57
- end
47
+ #def visit_feature_name(keyword, name)
48
+ # broadcast(keyword, name)
49
+ #end
58
50
 
59
- # +feature_element+ is either Scenario or ScenarioOutline
60
- def visit_feature_element(feature_element)
61
- broadcast(feature_element) do
62
- feature_element.accept(self)
63
- end
64
- end
51
+ # Note that a feature_element refers to either a Scenario or
52
+ # a ScenarioOutline.
53
+ #def visit_feature_element(feature_element, &block)
54
+ # broadcast(feature_element, &block)
55
+ #end
65
56
 
66
- def visit_background(background)
67
- broadcast(background) do
68
- background.accept(self)
69
- end
70
- end
57
+ #def visit_background(background, &block)
58
+ # broadcast(background, &block)
59
+ #end
71
60
 
72
- def visit_background_name(keyword, name, file_colon_line, source_indent)
73
- broadcast(keyword, name, file_colon_line, source_indent)
74
- end
61
+ #def visit_background_name(keyword, name, file_colon_line, source_indent)
62
+ # broadcast(keyword, name, file_colon_line, source_indent)
63
+ #end
75
64
 
76
- def visit_examples_array(examples_array)
77
- broadcast(examples_array) do
78
- examples_array.accept(self)
79
- end
80
- end
65
+ #def visit_examples_array(examples_array, &block)
66
+ # broadcast(examples_array, &block)
67
+ #end
81
68
 
82
- def visit_examples(examples)
83
- broadcast(examples) do
84
- examples.accept(self)
85
- end
86
- end
69
+ #def visit_examples(examples, &block)
70
+ # broadcast(examples, &block)
71
+ #end
87
72
 
88
- def visit_examples_name(keyword, name)
89
- broadcast(keyword, name)
90
- end
73
+ #def visit_examples_name(keyword, name)
74
+ # broadcast(keyword, name)
75
+ #end
91
76
 
92
- def visit_outline_table(outline_table)
93
- broadcast(outline_table) do
94
- outline_table.accept(self)
95
- end
96
- end
77
+ #def visit_outline_table(outline_table, &block)
78
+ # broadcast(outline_table, &block)
79
+ #end
97
80
 
98
- def visit_scenario_name(keyword, name, file_colon_line, source_indent)
99
- broadcast(keyword, name, file_colon_line, source_indent)
100
- end
81
+ #def visit_scenario_name(keyword, name, file_colon_line, source_indent)
82
+ # broadcast(keyword, name, file_colon_line, source_indent)
83
+ #end
101
84
 
102
- def visit_steps(steps)
103
- broadcast(steps) do
104
- steps.accept(self)
105
- end
106
- end
85
+ #def visit_steps(steps, &block)
86
+ # broadcast(steps, &block)
87
+ #end
107
88
 
108
- def visit_step(step)
109
- broadcast(step) do
110
- step.accept(self)
111
- end
89
+ #def visit_step(step, &block)
90
+ # broadcast(step, &block)
91
+ #end
92
+
93
+ # This is being used to forward on messages from the AST to
94
+ # the formatters. This is being done in lieu of the explicit
95
+ # forwarding that was previously done.
96
+ def method_missing(message, *args, &block)
97
+ broadcast_message(message, *args, &block)
112
98
  end
113
99
 
114
- def visit_step_result(keyword, step_match, multiline_arg, status, exception, source_indent, background, file_colon_line)
115
- broadcast(keyword, step_match, multiline_arg, status, exception, source_indent, background, file_colon_line) do
116
- visit_step_name(keyword, step_match, status, source_indent, background, file_colon_line)
117
- visit_multiline_arg(multiline_arg) if multiline_arg
118
- visit_exception(exception, status) if exception
100
+ #def visit_step_result(keyword, step_match, multiline_arg, status, exception, source_indent, background, file_colon_line)
101
+ # broadcast(keyword, step_match, multiline_arg, status, exception, source_indent, background, file_colon_line) do
102
+ # visit_step_name(keyword, step_match, status, source_indent, background, file_colon_line)
103
+ # visit_multiline_arg(multiline_arg) if multiline_arg
104
+ # visit_exception(exception, status) if exception
105
+ # end
106
+ #end
107
+
108
+ def visit_step_result(step_result)
109
+ broadcast(step_result) do
110
+ step_result.accept(self)
119
111
  end
120
112
  end
121
113
 
122
- def visit_step_name(keyword, step_match, status, source_indent, background, file_colon_line) #:nodoc:
123
- broadcast(keyword, step_match, status, source_indent, background, file_colon_line)
124
- end
114
+ #def visit_step_name(keyword, step_match, status, source_indent, background, file_colon_line) #:nodoc:
115
+ # broadcast(keyword, step_match, status, source_indent, background, file_colon_line)
116
+ #end
125
117
 
126
118
  def visit_multiline_arg(multiline_arg) #:nodoc:
127
119
  broadcast(multiline_arg) do
@@ -129,29 +121,25 @@ module Lucid
129
121
  end
130
122
  end
131
123
 
132
- def visit_exception(exception, status) #:nodoc:
133
- broadcast(exception, status)
134
- end
124
+ #def visit_exception(exception, status) #:nodoc:
125
+ # broadcast(exception, status)
126
+ #end
135
127
 
136
- def visit_doc_string(string)
137
- broadcast(string)
138
- end
128
+ #def visit_doc_string(string)
129
+ # broadcast(string)
130
+ #end
139
131
 
140
- def visit_table_row(table_row)
141
- broadcast(table_row) do
142
- table_row.accept(self)
143
- end
144
- end
132
+ #def visit_table_row(table_row, &block)
133
+ # broadcast(table_row, &block)
134
+ #end
145
135
 
146
- def visit_table_cell(table_cell)
147
- broadcast(table_cell) do
148
- table_cell.accept(self)
149
- end
150
- end
136
+ #def visit_table_cell(table_cell, &block)
137
+ # broadcast(table_cell, &block)
138
+ #end
151
139
 
152
- def visit_table_cell_value(value, status)
153
- broadcast(value, status)
154
- end
140
+ #def visit_table_cell_value(value, status)
141
+ # broadcast(value, status)
142
+ #end
155
143
 
156
144
  # Print +messages+. This method can be called from within StepDefinitions.
157
145
  def puts(*messages)
@@ -167,8 +155,13 @@ module Lucid
167
155
  private
168
156
 
169
157
  def broadcast(*args, &block)
170
- message = extract_method_name_from(caller)
171
- message.gsub!('visit_', '')
158
+ message = extract_method_name_from(caller[0])
159
+ broadcast_message message, *args, &block
160
+ self
161
+ end
162
+
163
+ def broadcast_message(message, *args, &block)
164
+ message = message.to_s.gsub('visit_', '')
172
165
  if block_given?
173
166
  send_to_all("before_#{message}", *args)
174
167
  yield if block_given?
@@ -187,7 +180,9 @@ module Lucid
187
180
  end
188
181
  end
189
182
  def extract_method_name_from(call_stack)
190
- call_stack[0].match(/in `(.*)'/).captures[0]
183
+ #call_stack[0].match(/in `(.*)'/).captures[0]
184
+ match = call_stack.match(/in `(.*)'/)
185
+ match.captures[0]
191
186
  end
192
187
 
193
188
  end
data/lib/lucid/cli/app.rb CHANGED
@@ -34,7 +34,7 @@ module Lucid
34
34
  log.debug("Runtime: #{runtime.inspect}")
35
35
 
36
36
  runtime.run
37
- runtime.write_stepdefs_json
37
+ runtime.write_testdefs_json
38
38
  failure = runtime.results.failure? || Lucid.wants_to_quit
39
39
  @kernel.exit(failure ? 1 : 0)
40
40
  rescue ProfilesNotDefinedError, YmlLoadError, ProfileNotFound => e
@@ -80,14 +80,7 @@ module Lucid
80
80
  end
81
81
  end
82
82
 
83
- # The spec_repo is used to get all of the files that are in the
84
- # "spec source" location. This location defaults to 'specs' but can
85
- # be changed via a command line option. The spec repo will remove
86
- # any directory names and, perhaps counter-intuitively, any spec
87
- # files. The reason for this is that, by default, the "spec repo"
88
- # contains everything that Lucid will need, whether that be
89
- # test spec files or code files to support them.
90
- def spec_repo
83
+ def spec_requires
91
84
  requires = @options[:require].empty? ? require_dirs : @options[:require]
92
85
 
93
86
  files = requires.map do |path|
@@ -101,35 +94,30 @@ module Lucid
101
94
  files.reject! {|f| !File.file?(f)}
102
95
  files.reject! {|f| File.extname(f) == ".#{spec_type}" }
103
96
  files.reject! {|f| f =~ /^http/}
97
+
104
98
  files.sort
105
99
  end
106
100
 
107
- # The definition context refers to any files that are found in the spec
108
- # repository that are not spec files and that are not contained in the
109
- # library path.
110
101
  # @see Lucid::Runtime.load_execution_context
111
102
  def definition_context
112
- spec_repo.reject { |f| f=~ %r{/#{library_path}/} }
103
+ spec_requires.reject { |f| f=~ %r{#{library_path}} }
113
104
  end
114
105
 
115
- # The library context will store an array of all files that are found
116
- # in the library_path. This path defaults to 'lucid' but can be changed
117
- # via a command line option.
118
106
  # @see Lucid::Runtime.load_execution_context
119
107
  def library_context
120
- library_files = spec_repo.select { |f| f =~ %r{/#{library_path}/} }
121
- driver_file = library_files.select {|f| f =~ %r{/#{library_path}/driver\..*} }
122
- non_driver_files = library_files - driver_file
108
+ library_files = spec_requires.select { |f| f =~ %r{#{library_path}} }
109
+ driver = library_files.select {|f| f =~ %r{#{driver_file}} }
110
+
111
+ log.info("Driver File Found: #{driver}")
112
+
113
+ non_driver_files = library_files - driver
123
114
 
124
- @options[:dry_run] ? non_driver_files : driver_file + non_driver_files
115
+ @options[:dry_run] ? non_driver_files : driver + non_driver_files
125
116
  end
126
117
 
127
- # The spec files refer to any files found within the spec repository
128
- # that match the specification file type. Note that this method is
129
- # called from the specs action in a Runtime instance.
130
118
  # @see Lucid::Runtime.specs
131
119
  def spec_files
132
- files = with_default_specs_path(spec_source).map do |path|
120
+ files = specs_path(spec_source).map do |path|
133
121
  path = path.gsub(/\\/, '/') # convert \ to /
134
122
  path = path.chomp('/') # removing trailing /
135
123
  if File.directory?(path)
@@ -142,33 +130,27 @@ module Lucid
142
130
  end
143
131
  end.flatten.uniq
144
132
 
145
- log.info("Spec Files: #{files}")
146
-
147
133
  extract_excluded_files(files)
148
134
  files
149
135
  end
150
136
 
151
- # A call to spec_location will return the location of a spec repository.
152
137
  def spec_location
153
138
  dirs = spec_source.map { |f| File.directory?(f) ? f : File.dirname(f) }.uniq
154
139
  dirs.delete('.') unless spec_source.include?('.')
155
140
 
156
- with_default_specs_path(dirs)
141
+ specs_path(dirs)
157
142
  end
158
143
 
159
- # The "spec_type" refers to the file type (or extension) of spec files.
160
- # This is how Lucid will recognize the files that should be treated as
161
- # specs within a spec repository.
162
144
  def spec_type
163
145
  @options[:spec_type].empty? ? 'spec' : @options[:spec_type]
164
146
  end
165
147
 
166
- # The "library_path" refers to the location within the spec repository
167
- # that holds the logic that supports the basic operations of the
168
- # execution. This value will default to 'lucid' but the value of
169
- # library_path can be changed via a command line option.
170
148
  def library_path
171
- @options[:library_path].empty? ? 'lucid' : @options[:library_path]
149
+ @options[:library_path].empty? ? 'common' : @options[:library_path]
150
+ end
151
+
152
+ def driver_file
153
+ @options[:driver_file].empty? ? 'driver' : @options[:driver_file]
172
154
  end
173
155
 
174
156
  def log
@@ -192,17 +174,13 @@ module Lucid
192
174
  @options[:formats]
193
175
  end
194
176
 
195
- # The "spec_source" refers to the location of the spec repository. This
196
- # value will default to 'specs' but the value of spec_source can be
197
- # changed if a repository location is specified on the command line when
198
- # calling Lucid.
199
177
  def spec_source
200
178
  @options[:spec_source]
201
179
  end
202
180
 
203
181
  private
204
182
 
205
- def with_default_specs_path(paths)
183
+ def specs_path(paths)
206
184
  return ['specs'] if paths.empty?
207
185
  paths
208
186
  end
@@ -252,7 +230,7 @@ module Lucid
252
230
  end
253
231
 
254
232
  def require_dirs
255
- spec_location + Dir['vendor/{gems,plugins}/*/lucid']
233
+ spec_location + Dir["#{library_path}", 'pages', 'steps']
256
234
  end
257
235
 
258
236
  end