lucid 0.0.6 → 0.0.7

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.
@@ -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