cucumber-rails 1.0.6 → 1.1.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,9 +1,9 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- cucumber-rails (1.0.6)
4
+ cucumber-rails (1.1.0)
5
5
  capybara (>= 1.1.1)
6
- cucumber (>= 1.0.6)
6
+ cucumber (>= 1.1.0)
7
7
  nokogiri (>= 1.5.0)
8
8
 
9
9
  GEM
@@ -97,7 +97,7 @@ GEM
97
97
  bson (>= 1.3.1)
98
98
  mongoid (2.2.1)
99
99
  activemodel (~> 3.0)
100
- mongo (< 1.4, >= 1.3)
100
+ mongo (>= 1.3, < 1.4)
101
101
  tzinfo (~> 0.3.22)
102
102
  multi_json (1.0.3)
103
103
  nokogiri (1.5.0)
@@ -152,7 +152,7 @@ GEM
152
152
  sprockets (2.0.0)
153
153
  hike (~> 1.2)
154
154
  rack (~> 1.0)
155
- tilt (!= 1.3.0, ~> 1.1)
155
+ tilt (~> 1.1, != 1.3.0)
156
156
  sqlite3 (1.3.4)
157
157
  term-ansicolor (1.0.6)
158
158
  thor (0.14.6)
data/History.md CHANGED
@@ -1,3 +1,45 @@
1
+ ## [v1.1.0](https://github.com/cucumber/cucumber-rails/compare/v1.0.6...v1.1.0)
2
+
3
+ ### Removed features
4
+
5
+ The following files will no longer be generated if you are running `rails generate cucumber:install`:
6
+
7
+ * features/step_definitions/web_steps.rb
8
+ * features/support/paths.rb
9
+ * features/support/selectors.rb
10
+
11
+ The reason behind this is that the steps defined in `web_steps.rb` leads people to write scenarios of a
12
+ very imperative nature that are hard to read and hard to maintain. Cucumber scenarios should not be a series
13
+ of steps that describe what a user clicks. Instead, they should express what a user *does*. Example:
14
+
15
+ Given I have signed up as "user@host.com"
16
+
17
+ with a Step Definition that perhaps looks like this:
18
+
19
+ Given /^I have signed up as "([^"]*)"$/ do |email|
20
+ visit(signup_path)
21
+ fill_in('Email', :with => email)
22
+ fill_in('Email', :with => email)
23
+ fill_in('Password', :with => 's3cr3t')
24
+ fill_in('Password Confirmation', :with => 's3cr3t')
25
+ click_button('Sign up')
26
+ end
27
+
28
+ Moving user interface details from the scenarios and down to the step definitions makes scenarios
29
+ much easier to read. If you change the user interface you only have to change a step definition or two
30
+ instead of a lot of scenarios that explicitly describe how to sign up.
31
+
32
+ You can learn more about the reasoning behind this change at the following links:
33
+
34
+ * [Cucumber mailing list: Removing web_steps.rb in Cucumber 1.1.0](http://groups.google.com/group/cukes/browse_thread/thread/26f80b93c94f2952)
35
+ * [Cucumber-Rails issue #174: Remove web_steps.rb since it encourages people to write poor tests.](https://github.com/cucumber/cucumber-rails/issues/174)
36
+ * [Refuctoring your Cukes by Matt Wynne](http://skillsmatter.com/podcast/home/refuctoring-your-cukes)
37
+ * [Imperative vs Declarative Scenarios in User Stories by Ben Mabey](http://benmabey.com/2008/05/19/imperative-vs-declarative-scenarios-in-user-stories.html)
38
+ * [Whose domain is it anyway? by Dan North](http://dannorth.net/2011/01/31/whose-domain-is-it-anyway/)
39
+ * [You're Cuking it Wrong by Jonas Nicklas](http://elabs.se/blog/15-you-re-cuking-it-wrong)
40
+
41
+ You can learn more about what Capybara has to offer in Capybara's [README](https://github.com/jnicklas/capybara).
42
+
1
43
  ## [v1.0.6](https://github.com/cucumber/cucumber-rails/compare/v1.0.5...v1.0.6)
2
44
 
3
45
  ### Bugfixes
@@ -3,14 +3,14 @@ $LOAD_PATH.unshift File.expand_path("../lib", __FILE__)
3
3
 
4
4
  Gem::Specification.new do |s|
5
5
  s.name = 'cucumber-rails'
6
- s.version = '1.0.6'
6
+ s.version = '1.1.0'
7
7
  s.authors = ["Aslak Hellesøy", "Dennis Blöte", "Rob Holland"]
8
8
  s.description = "Cucumber Generators and Runtime for Rails"
9
9
  s.summary = "#{s.name}-#{s.version}"
10
10
  s.email = 'cukes@googlegroups.com'
11
11
  s.homepage = "http://cukes.info"
12
12
 
13
- s.add_runtime_dependency('cucumber', '>= 1.0.6')
13
+ s.add_runtime_dependency('cucumber', '>= 1.1.0')
14
14
  s.add_runtime_dependency('nokogiri', '>= 1.5.0')
15
15
  s.add_runtime_dependency('capybara', '>= 1.1.1')
16
16
  s.add_development_dependency('rails', '>= 3.1.0')
@@ -1,8 +1,7 @@
1
1
  Feature: Allow Cucumber to rescue exceptions
2
2
 
3
- Background: A controller that raises an exception in a Rails app without web_steps.rb
3
+ Background: A controller that raises an exception
4
4
  Given I have created a new Rails 3 app "rails-3-app" with cucumber-rails support
5
- And I remove the file "features/step_definitions/web_steps.rb"
6
5
  And I write to "app/controllers/posts_controller.rb" with:
7
6
  """
8
7
  class PostsController < ApplicationController
@@ -3,6 +3,20 @@ Feature: Capybara Javascript Drivers
3
3
  Background: A simple calendar app
4
4
  Given I have created a new Rails 3 app "rails-3-app" with cucumber-rails support
5
5
  And I successfully run `bundle exec rails g scaffold appointment name:string when:datetime`
6
+ And I write to "features/step_definitions/date_time_steps.rb" with:
7
+ """
8
+ When /^(?:|I )select "([^"]+)" as the "([^"]+)" time$/ do |time, selector|
9
+ select_time(selector, :with => time)
10
+ end
11
+
12
+ When /^(?:|I )select "([^"]+)" as the "([^"]+)" date$/ do |date, selector|
13
+ select_date(selector, :with => date)
14
+ end
15
+
16
+ When /^(?:|I )select "([^"]+)" as the "([^"]+)" date and time$/ do |datetime, selector|
17
+ select_datetime(selector, :with => datetime)
18
+ end
19
+ """
6
20
 
7
21
  Scenario Outline: Use a particular driver
8
22
  Given I write to "features/create_appointment.feature" with:
@@ -8,9 +8,6 @@ Feature: Rails 3
8
8
  Then the following files should exist:
9
9
  | config/cucumber.yml |
10
10
  | script/cucumber |
11
- | features/step_definitions/web_steps.rb |
12
11
  | features/support/env.rb |
13
- | features/support/paths.rb |
14
- | features/support/selectors.rb |
15
12
  | lib/tasks/cucumber.rake |
16
13
  And the file "features/support/env.rb" should contain "require 'cucumber/rails'"
@@ -20,6 +20,12 @@ Feature: Mongoid
20
20
  Scenario: Tests
21
21
  When I go to the home page
22
22
  """
23
+ And I write to "features/step_definitions/web_steps.rb" with:
24
+ """
25
+ When /^I go to the home page$/ do
26
+ visit '/'
27
+ end
28
+ """
23
29
  And I overwrite "features/support/env.rb" with:
24
30
  """
25
31
  require 'cucumber/rails'
@@ -5,7 +5,6 @@ Feature: Multiple Databases
5
5
 
6
6
  Background: A Rails 3 app utilizing multiple database repositories exists
7
7
  Given I have created a new Rails 3 app "rails-3-app" with cucumber-rails support
8
- And I remove the file "features/step_definitions/web_steps.rb"
9
8
  And I append to "config/database.yml" with:
10
9
  """
11
10
 
@@ -1,3 +1,293 @@
1
+ module WebSteps
2
+ def create_web_steps
3
+ write_file('features/step_definitions/web_steps.rb', <<-EOF)
4
+ # web_steps.rb used to be in Cucumber-Rails, but was removed in 1.1.0. We're still using them in the tests because
5
+ # the tests were written while we still thought web_steps.rb was a good idea. We don't think so anymore:
6
+ #
7
+ # http://groups.google.com/group/cukes/browse_thread/thread/26f80b93c94f2952
8
+ # https://github.com/cucumber/cucumber-rails/issues/174
9
+ # http://benmabey.com/2008/05/19/imperative-vs-declarative-scenarios-in-user-stories.html
10
+ # http://dannorth.net/2011/01/31/whose-domain-is-it-anyway/
11
+ # http://elabs.se/blog/15-you-re-cuking-it-wrong
12
+ #
13
+ # I'm sure someone will find this and paste it into their own projects. Go ahead. It's a bad idea.
14
+ # You have been warned.
15
+ #
16
+ # Aslak
17
+
18
+ require 'uri'
19
+ require 'cgi'
20
+ require File.expand_path(File.join(File.dirname(__FILE__), "..", "support", "paths"))
21
+
22
+ module WithinHelpers
23
+ def with_scope(locator)
24
+ locator ? within(*selector_for(locator)) { yield } : yield
25
+ end
26
+ end
27
+ World(WithinHelpers)
28
+
29
+ # Single-line step scoper
30
+ When /^(.*) within (.*[^:])$/ do |step, parent|
31
+ with_scope(parent) { When step }
32
+ end
33
+
34
+ # Multi-line step scoper
35
+ When /^(.*) within (.*[^:]):$/ do |step, parent, table_or_string|
36
+ with_scope(parent) { When "\#{step}:", table_or_string }
37
+ end
38
+
39
+ Given /^(?:|I )am on (.+)$/ do |page_name|
40
+ visit path_to(page_name)
41
+ end
42
+
43
+ When /^(?:|I )go to (.+)$/ do |page_name|
44
+ visit path_to(page_name)
45
+ end
46
+
47
+ When /^(?:|I )press "([^"]*)"$/ do |button|
48
+ click_button(button)
49
+ end
50
+
51
+ When /^(?:|I )follow "([^"]*)"$/ do |link|
52
+ click_link(link)
53
+ end
54
+
55
+ When /^(?:|I )fill in "([^"]*)" with "([^"]*)"$/ do |field, value|
56
+ fill_in(field, :with => value)
57
+ end
58
+
59
+ When /^(?:|I )fill in "([^"]*)" for "([^"]*)"$/ do |value, field|
60
+ fill_in(field, :with => value)
61
+ end
62
+
63
+ # Use this to fill in an entire form with data from a table. Example:
64
+ #
65
+ # When I fill in the following:
66
+ # | Account Number | 5002 |
67
+ # | Expiry date | 2009-11-01 |
68
+ # | Note | Nice guy |
69
+ # | Wants Email? | |
70
+ #
71
+ # TODO: Add support for checkbox, select or option
72
+ # based on naming conventions.
73
+ #
74
+ When /^(?:|I )fill in the following:$/ do |fields|
75
+ fields.rows_hash.each do |name, value|
76
+ When %{I fill in "\#{name}" with "\#{value}"}
77
+ end
78
+ end
79
+
80
+ When /^(?:|I )select "([^"]*)" from "([^"]*)"$/ do |value, field|
81
+ select(value, :from => field)
82
+ end
83
+
84
+ When /^(?:|I )check "([^"]*)"$/ do |field|
85
+ check(field)
86
+ end
87
+
88
+ When /^(?:|I )uncheck "([^"]*)"$/ do |field|
89
+ uncheck(field)
90
+ end
91
+
92
+ When /^(?:|I )choose "([^"]*)"$/ do |field|
93
+ choose(field)
94
+ end
95
+
96
+ When /^(?:|I )attach the file "([^"]*)" to "([^"]*)"$/ do |path, field|
97
+ attach_file(field, File.expand_path(path))
98
+ end
99
+
100
+ Then /^(?:|I )should see "([^"]*)"$/ do |text|
101
+ if page.respond_to? :should
102
+ page.should have_content(text)
103
+ else
104
+ assert page.has_content?(text)
105
+ end
106
+ end
107
+
108
+ Then /^(?:|I )should see \\/([^\\/]*)\\/$/ do |regexp|
109
+ regexp = Regexp.new(regexp)
110
+
111
+ if page.respond_to? :should
112
+ page.should have_xpath('//*', :text => regexp)
113
+ else
114
+ assert page.has_xpath?('//*', :text => regexp)
115
+ end
116
+ end
117
+
118
+ Then /^(?:|I )should not see "([^"]*)"$/ do |text|
119
+ if page.respond_to? :should
120
+ page.should have_no_content(text)
121
+ else
122
+ assert page.has_no_content?(text)
123
+ end
124
+ end
125
+
126
+ Then /^(?:|I )should not see \\/([^\\/]*)\\/$/ do |regexp|
127
+ regexp = Regexp.new(regexp)
128
+
129
+ if page.respond_to? :should
130
+ page.should have_no_xpath('//*', :text => regexp)
131
+ else
132
+ assert page.has_no_xpath?('//*', :text => regexp)
133
+ end
134
+ end
135
+
136
+ Then /^the "([^"]*)" field(?: within (.*))? should contain "([^"]*)"$/ do |field, parent, value|
137
+ with_scope(parent) do
138
+ field = find_field(field)
139
+ field_value = (field.tag_name == 'textarea') ? field.text : field.value
140
+ if field_value.respond_to? :should
141
+ field_value.should =~ /\#{value}/
142
+ else
143
+ assert_match(/\#{value}/, field_value)
144
+ end
145
+ end
146
+ end
147
+
148
+ Then /^the "([^"]*)" field(?: within (.*))? should not contain "([^"]*)"$/ do |field, parent, value|
149
+ with_scope(parent) do
150
+ field = find_field(field)
151
+ field_value = (field.tag_name == 'textarea') ? field.text : field.value
152
+ if field_value.respond_to? :should_not
153
+ field_value.should_not =~ /\#{value}/
154
+ else
155
+ assert_no_match(/\#{value}/, field_value)
156
+ end
157
+ end
158
+ end
159
+
160
+ Then /^the "([^"]*)" field should have the error "([^"]*)"$/ do |field, error_message|
161
+ element = find_field(field)
162
+ classes = element.find(:xpath, '..')[:class].split(' ')
163
+
164
+ form_for_input = element.find(:xpath, 'ancestor::form[1]')
165
+ using_formtastic = form_for_input[:class].include?('formtastic')
166
+ error_class = using_formtastic ? 'error' : 'field_with_errors'
167
+
168
+ if classes.respond_to? :should
169
+ classes.should include(error_class)
170
+ else
171
+ assert classes.include?(error_class)
172
+ end
173
+
174
+ if page.respond_to?(:should)
175
+ if using_formtastic
176
+ error_paragraph = element.find(:xpath, '../*[@class="inline-errors"][1]')
177
+ error_paragraph.should have_content(error_message)
178
+ else
179
+ page.should have_content("\#{field.titlecase} \#{error_message}")
180
+ end
181
+ else
182
+ if using_formtastic
183
+ error_paragraph = element.find(:xpath, '../*[@class="inline-errors"][1]')
184
+ assert error_paragraph.has_content?(error_message)
185
+ else
186
+ assert page.has_content?("\#{field.titlecase} \#{error_message}")
187
+ end
188
+ end
189
+ end
190
+
191
+ Then /^the "([^"]*)" field should have no error$/ do |field|
192
+ element = find_field(field)
193
+ classes = element.find(:xpath, '..')[:class].split(' ')
194
+ if classes.respond_to? :should
195
+ classes.should_not include('field_with_errors')
196
+ classes.should_not include('error')
197
+ else
198
+ assert !classes.include?('field_with_errors')
199
+ assert !classes.include?('error')
200
+ end
201
+ end
202
+
203
+ Then /^the "([^"]*)" checkbox(?: within (.*))? should be checked$/ do |label, parent|
204
+ with_scope(parent) do
205
+ field_checked = find_field(label)['checked']
206
+ if field_checked.respond_to? :should
207
+ field_checked.should be_true
208
+ else
209
+ assert field_checked
210
+ end
211
+ end
212
+ end
213
+
214
+ Then /^the "([^"]*)" checkbox(?: within (.*))? should not be checked$/ do |label, parent|
215
+ with_scope(parent) do
216
+ field_checked = find_field(label)['checked']
217
+ if field_checked.respond_to? :should
218
+ field_checked.should be_false
219
+ else
220
+ assert !field_checked
221
+ end
222
+ end
223
+ end
224
+
225
+ Then /^(?:|I )should be on (.+)$/ do |page_name|
226
+ current_path = URI.parse(current_url).path
227
+ if current_path.respond_to? :should
228
+ current_path.should == path_to(page_name)
229
+ else
230
+ assert_equal path_to(page_name), current_path
231
+ end
232
+ end
233
+
234
+ Then /^(?:|I )should have the following query string:$/ do |expected_pairs|
235
+ query = URI.parse(current_url).query
236
+ actual_params = query ? CGI.parse(query) : {}
237
+ expected_params = {}
238
+ expected_pairs.rows_hash.each_pair{|k,v| expected_params[k] = v.split(',')}
239
+
240
+ if actual_params.respond_to? :should
241
+ actual_params.should == expected_params
242
+ else
243
+ assert_equal expected_params, actual_params
244
+ end
245
+ end
246
+
247
+ Then /^show me the page$/ do
248
+ save_and_open_page
249
+ end
250
+ EOF
251
+
252
+ write_file('features/support/paths.rb', <<-EOF)
253
+ module NavigationHelpers
254
+ # Maps a name to a path. Used by the
255
+ #
256
+ # When /^I go to (.+)$/ do |page_name|
257
+ #
258
+ # step definition in web_steps.rb
259
+ #
260
+ def path_to(page_name)
261
+ case page_name
262
+
263
+ when /^the home\s?page$/
264
+ '/'
265
+
266
+ # Add more mappings here.
267
+ # Here is an example that pulls values out of the Regexp:
268
+ #
269
+ # when /^(.*)'s profile page$/i
270
+ # user_profile_path(User.find_by_login($1))
271
+
272
+ else
273
+ begin
274
+ page_name =~ /^the (.*) page$/
275
+ path_components = $1.split(/\s+/)
276
+ self.send(path_components.push('path').join('_').to_sym)
277
+ rescue NoMethodError, ArgumentError
278
+ raise "Can't find mapping from \"\#{page_name}\" to a path.\\n" +
279
+ "Now, go and add a mapping in \#{__FILE__}"
280
+ end
281
+ end
282
+ end
283
+ end
284
+
285
+ World(NavigationHelpers)
286
+ EOF
287
+ end
288
+ end
289
+ World(WebSteps)
290
+
1
291
  Given /^I have created a new Rails 3 app "([^"]*)" with cucumber\-rails support and cucumber-rails is outside of test group$/ do |app_name|
2
292
  steps %Q{
3
293
  When I successfully run `rails new #{app_name}`
@@ -17,6 +307,7 @@ Given /^I have created a new Rails 3 app "([^"]*)" with cucumber\-rails support
17
307
  """
18
308
  And I successfully run `bundle exec rails generate cucumber:install`
19
309
  }
310
+ create_web_steps
20
311
  if(ENV['ARUBA_REPORT_DIR'])
21
312
  @aruba_report_start = Time.new
22
313
  sleep(1)
@@ -42,6 +333,7 @@ Given /^I have created a new Rails 3 app "([^"]*)" with cucumber\-rails support$
42
333
  """
43
334
  And I successfully run `bundle exec rails generate cucumber:install`
44
335
  }
336
+ create_web_steps
45
337
  if(ENV['ARUBA_REPORT_DIR'])
46
338
  @aruba_report_start = Time.new
47
339
  sleep(1)
@@ -87,6 +379,7 @@ Given /^a project without ActiveRecord$/ do
87
379
  """
88
380
  And I remove the file "config/database.yml"
89
381
  }
382
+ create_web_steps
90
383
  if(ENV['ARUBA_REPORT_DIR'])
91
384
  @aruba_report_start = Time.new
92
385
  sleep(1)
@@ -1,8 +1,11 @@
1
1
  module Cucumber
2
2
  module Rails
3
3
  module Capybara
4
+ # This module defines methods for selecting dates and times
4
5
  module SelectDatesAndTimes
5
- def select_date(field, options = {})
6
+ # Select a Rails date with label +field+
7
+ # The +options+ hash should contain a Date parseable date (as a string)
8
+ def select_date(field, options)
6
9
  date = Date.parse(options[:with])
7
10
  base_dom_id = get_base_dom_id_from_label_tag(field)
8
11
 
@@ -11,7 +14,9 @@ module Cucumber
11
14
  find(:xpath, ".//select[@id='#{base_dom_id}_3i']").select(date.day.to_s)
12
15
  end
13
16
 
14
- def select_time(field, options = {})
17
+ # Select a Rails time with label +field+
18
+ # The +options+ hash should contain a Time parseable time (as a string)
19
+ def select_time(field, options)
15
20
  time = Time.zone.parse(options[:with])
16
21
  base_dom_id = get_base_dom_id_from_label_tag(field)
17
22
 
@@ -19,7 +24,9 @@ module Cucumber
19
24
  find(:xpath, ".//select[@id='#{base_dom_id}_5i']").select(time.min.to_s.rjust(2, '0'))
20
25
  end
21
26
 
22
- def select_datetime(field, options = {})
27
+ # Select a Rails date and time with label +field+
28
+ # The +options+ hash should contain a Date/Time parseable time (as a string)
29
+ def select_datetime(field, options)
23
30
  select_date(field, options)
24
31
  select_time(field, options)
25
32
  end
@@ -36,15 +43,3 @@ module Cucumber
36
43
  end
37
44
 
38
45
  World(::Cucumber::Rails::Capybara::SelectDatesAndTimes)
39
-
40
- When /^(?:|I )select "([^"]+)" as the "([^"]+)" time$/ do |time, selector|
41
- select_time(selector, :with => time)
42
- end
43
-
44
- When /^(?:|I )select "([^"]+)" as the "([^"]+)" date$/ do |date, selector|
45
- select_date(selector, :with => date)
46
- end
47
-
48
- When /^(?:|I )select "([^"]+)" as the "([^"]+)" date and time$/ do |datetime, selector|
49
- select_datetime(selector, :with => datetime)
50
- end
@@ -6,15 +6,9 @@ module Cucumber
6
6
 
7
7
  DEFAULT_SHEBANG = File.join(RbConfig::CONFIG['bindir'], RbConfig::CONFIG['ruby_install_name'])
8
8
 
9
- argument :language, :type => :string, :banner => "LANG", :optional => true
10
-
11
- class_option :rspec, :type => :boolean, :desc => "Use RSpec"
12
- class_option :testunit, :type => :boolean, :desc => "Use Test::Unit"
13
9
  class_option :spork, :type => :boolean, :desc => "Use Spork"
14
10
  class_option :skip_database, :type => :boolean, :desc => "Skip modification of database.yml", :aliases => '-D', :default => false
15
11
 
16
- attr_reader :framework
17
-
18
12
  def create_templates
19
13
  template 'config/cucumber.yml.erb', 'config/cucumber.yml'
20
14
  end
@@ -26,18 +20,10 @@ module Cucumber
26
20
 
27
21
  def create_step_definitions
28
22
  empty_directory 'features/step_definitions'
29
-
30
- template "step_definitions/web_steps.rb.erb", 'features/step_definitions/web_steps.rb'
31
- if language
32
- template "step_definitions/web_steps_#{language}.rb.erb", "features/step_definitions/web_steps_#{language}.rb"
33
- end
34
23
  end
35
24
 
36
25
  def create_feature_support
37
26
  empty_directory 'features/support'
38
- copy_file 'support/paths.rb', 'features/support/paths.rb'
39
- copy_file 'support/selectors.rb', 'features/support/selectors.rb'
40
-
41
27
  if spork?
42
28
  template 'support/rails_spork.rb.erb', 'features/support/env.rb'
43
29
  else
@@ -76,13 +62,5 @@ module Cucumber
76
62
  ERB.new(IO.read(template), nil, '-').result(binding).gsub(/^/, indent)
77
63
  end
78
64
 
79
- private
80
-
81
- def framework_from_options
82
- return 'rspec-rails' if options[:rspec]
83
- return 'testunit' if options[:testunit]
84
- return 'rspec-rails'
85
- end
86
-
87
65
  end
88
66
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: cucumber-rails
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.6
4
+ version: 1.1.0
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -11,22 +11,22 @@ authors:
11
11
  autorequire:
12
12
  bindir: bin
13
13
  cert_chain: []
14
- date: 2011-09-25 00:00:00.000000000Z
14
+ date: 2011-09-28 00:00:00.000000000 Z
15
15
  dependencies:
16
16
  - !ruby/object:Gem::Dependency
17
17
  name: cucumber
18
- requirement: &2152420840 !ruby/object:Gem::Requirement
18
+ requirement: &2169121020 !ruby/object:Gem::Requirement
19
19
  none: false
20
20
  requirements:
21
21
  - - ! '>='
22
22
  - !ruby/object:Gem::Version
23
- version: 1.0.6
23
+ version: 1.1.0
24
24
  type: :runtime
25
25
  prerelease: false
26
- version_requirements: *2152420840
26
+ version_requirements: *2169121020
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: nokogiri
29
- requirement: &2152420180 !ruby/object:Gem::Requirement
29
+ requirement: &2169120280 !ruby/object:Gem::Requirement
30
30
  none: false
31
31
  requirements:
32
32
  - - ! '>='
@@ -34,10 +34,10 @@ dependencies:
34
34
  version: 1.5.0
35
35
  type: :runtime
36
36
  prerelease: false
37
- version_requirements: *2152420180
37
+ version_requirements: *2169120280
38
38
  - !ruby/object:Gem::Dependency
39
39
  name: capybara
40
- requirement: &2152419480 !ruby/object:Gem::Requirement
40
+ requirement: &2169119720 !ruby/object:Gem::Requirement
41
41
  none: false
42
42
  requirements:
43
43
  - - ! '>='
@@ -45,10 +45,10 @@ dependencies:
45
45
  version: 1.1.1
46
46
  type: :runtime
47
47
  prerelease: false
48
- version_requirements: *2152419480
48
+ version_requirements: *2169119720
49
49
  - !ruby/object:Gem::Dependency
50
50
  name: rails
51
- requirement: &2152418740 !ruby/object:Gem::Requirement
51
+ requirement: &2169135520 !ruby/object:Gem::Requirement
52
52
  none: false
53
53
  requirements:
54
54
  - - ! '>='
@@ -56,10 +56,10 @@ dependencies:
56
56
  version: 3.1.0
57
57
  type: :development
58
58
  prerelease: false
59
- version_requirements: *2152418740
59
+ version_requirements: *2169135520
60
60
  - !ruby/object:Gem::Dependency
61
61
  name: rake
62
- requirement: &2152418000 !ruby/object:Gem::Requirement
62
+ requirement: &2169134700 !ruby/object:Gem::Requirement
63
63
  none: false
64
64
  requirements:
65
65
  - - ! '>='
@@ -67,10 +67,10 @@ dependencies:
67
67
  version: 0.9.2
68
68
  type: :development
69
69
  prerelease: false
70
- version_requirements: *2152418000
70
+ version_requirements: *2169134700
71
71
  - !ruby/object:Gem::Dependency
72
72
  name: bundler
73
- requirement: &2152417200 !ruby/object:Gem::Requirement
73
+ requirement: &2169134100 !ruby/object:Gem::Requirement
74
74
  none: false
75
75
  requirements:
76
76
  - - ! '>='
@@ -78,10 +78,10 @@ dependencies:
78
78
  version: 1.0.18
79
79
  type: :development
80
80
  prerelease: false
81
- version_requirements: *2152417200
81
+ version_requirements: *2169134100
82
82
  - !ruby/object:Gem::Dependency
83
83
  name: aruba
84
- requirement: &2152416320 !ruby/object:Gem::Requirement
84
+ requirement: &2169133480 !ruby/object:Gem::Requirement
85
85
  none: false
86
86
  requirements:
87
87
  - - ! '>='
@@ -89,10 +89,10 @@ dependencies:
89
89
  version: 0.4.6
90
90
  type: :development
91
91
  prerelease: false
92
- version_requirements: *2152416320
92
+ version_requirements: *2169133480
93
93
  - !ruby/object:Gem::Dependency
94
94
  name: sqlite3
95
- requirement: &2152415520 !ruby/object:Gem::Requirement
95
+ requirement: &2169132480 !ruby/object:Gem::Requirement
96
96
  none: false
97
97
  requirements:
98
98
  - - ! '>='
@@ -100,10 +100,10 @@ dependencies:
100
100
  version: 1.3.4
101
101
  type: :development
102
102
  prerelease: false
103
- version_requirements: *2152415520
103
+ version_requirements: *2169132480
104
104
  - !ruby/object:Gem::Dependency
105
105
  name: rspec
106
- requirement: &2152414820 !ruby/object:Gem::Requirement
106
+ requirement: &2169131800 !ruby/object:Gem::Requirement
107
107
  none: false
108
108
  requirements:
109
109
  - - ! '>='
@@ -111,10 +111,10 @@ dependencies:
111
111
  version: 2.6.0
112
112
  type: :development
113
113
  prerelease: false
114
- version_requirements: *2152414820
114
+ version_requirements: *2169131800
115
115
  - !ruby/object:Gem::Dependency
116
116
  name: rspec-rails
117
- requirement: &2152414180 !ruby/object:Gem::Requirement
117
+ requirement: &2169131260 !ruby/object:Gem::Requirement
118
118
  none: false
119
119
  requirements:
120
120
  - - ! '>='
@@ -122,10 +122,10 @@ dependencies:
122
122
  version: 2.6.1
123
123
  type: :development
124
124
  prerelease: false
125
- version_requirements: *2152414180
125
+ version_requirements: *2169131260
126
126
  - !ruby/object:Gem::Dependency
127
127
  name: factory_girl
128
- requirement: &2152413560 !ruby/object:Gem::Requirement
128
+ requirement: &2169130460 !ruby/object:Gem::Requirement
129
129
  none: false
130
130
  requirements:
131
131
  - - ! '>='
@@ -133,10 +133,10 @@ dependencies:
133
133
  version: 2.1.0
134
134
  type: :development
135
135
  prerelease: false
136
- version_requirements: *2152413560
136
+ version_requirements: *2169130460
137
137
  - !ruby/object:Gem::Dependency
138
138
  name: database_cleaner
139
- requirement: &2152412960 !ruby/object:Gem::Requirement
139
+ requirement: &2169129860 !ruby/object:Gem::Requirement
140
140
  none: false
141
141
  requirements:
142
142
  - - ! '>='
@@ -144,10 +144,10 @@ dependencies:
144
144
  version: 0.6.7
145
145
  type: :development
146
146
  prerelease: false
147
- version_requirements: *2152412960
147
+ version_requirements: *2169129860
148
148
  - !ruby/object:Gem::Dependency
149
149
  name: mongoid
150
- requirement: &2152412120 !ruby/object:Gem::Requirement
150
+ requirement: &2169129140 !ruby/object:Gem::Requirement
151
151
  none: false
152
152
  requirements:
153
153
  - - ! '>='
@@ -155,10 +155,10 @@ dependencies:
155
155
  version: 2.2.0
156
156
  type: :development
157
157
  prerelease: false
158
- version_requirements: *2152412120
158
+ version_requirements: *2169129140
159
159
  - !ruby/object:Gem::Dependency
160
160
  name: bson_ext
161
- requirement: &2152411440 !ruby/object:Gem::Requirement
161
+ requirement: &2169128140 !ruby/object:Gem::Requirement
162
162
  none: false
163
163
  requirements:
164
164
  - - ! '>='
@@ -166,10 +166,10 @@ dependencies:
166
166
  version: 1.3.1
167
167
  type: :development
168
168
  prerelease: false
169
- version_requirements: *2152411440
169
+ version_requirements: *2169128140
170
170
  - !ruby/object:Gem::Dependency
171
171
  name: turn
172
- requirement: &2152410840 !ruby/object:Gem::Requirement
172
+ requirement: &2169142900 !ruby/object:Gem::Requirement
173
173
  none: false
174
174
  requirements:
175
175
  - - ! '>='
@@ -177,10 +177,10 @@ dependencies:
177
177
  version: 0.8.2
178
178
  type: :development
179
179
  prerelease: false
180
- version_requirements: *2152410840
180
+ version_requirements: *2169142900
181
181
  - !ruby/object:Gem::Dependency
182
182
  name: sass
183
- requirement: &2152410040 !ruby/object:Gem::Requirement
183
+ requirement: &2169140500 !ruby/object:Gem::Requirement
184
184
  none: false
185
185
  requirements:
186
186
  - - ! '>='
@@ -188,10 +188,10 @@ dependencies:
188
188
  version: 3.1.7
189
189
  type: :development
190
190
  prerelease: false
191
- version_requirements: *2152410040
191
+ version_requirements: *2169140500
192
192
  - !ruby/object:Gem::Dependency
193
193
  name: coffee-script
194
- requirement: &2152409380 !ruby/object:Gem::Requirement
194
+ requirement: &2169139420 !ruby/object:Gem::Requirement
195
195
  none: false
196
196
  requirements:
197
197
  - - ! '>='
@@ -199,10 +199,10 @@ dependencies:
199
199
  version: 2.2.0
200
200
  type: :development
201
201
  prerelease: false
202
- version_requirements: *2152409380
202
+ version_requirements: *2169139420
203
203
  - !ruby/object:Gem::Dependency
204
204
  name: uglifier
205
- requirement: &2152408640 !ruby/object:Gem::Requirement
205
+ requirement: &2169138580 !ruby/object:Gem::Requirement
206
206
  none: false
207
207
  requirements:
208
208
  - - ! '>='
@@ -210,10 +210,10 @@ dependencies:
210
210
  version: 1.0.3
211
211
  type: :development
212
212
  prerelease: false
213
- version_requirements: *2152408640
213
+ version_requirements: *2169138580
214
214
  - !ruby/object:Gem::Dependency
215
215
  name: jquery-rails
216
- requirement: &2152408060 !ruby/object:Gem::Requirement
216
+ requirement: &2169137860 !ruby/object:Gem::Requirement
217
217
  none: false
218
218
  requirements:
219
219
  - - ! '>='
@@ -221,10 +221,10 @@ dependencies:
221
221
  version: 1.0.14
222
222
  type: :development
223
223
  prerelease: false
224
- version_requirements: *2152408060
224
+ version_requirements: *2169137860
225
225
  - !ruby/object:Gem::Dependency
226
226
  name: yard
227
- requirement: &2152407480 !ruby/object:Gem::Requirement
227
+ requirement: &2169136400 !ruby/object:Gem::Requirement
228
228
  none: false
229
229
  requirements:
230
230
  - - ~>
@@ -232,10 +232,10 @@ dependencies:
232
232
  version: 0.7.2
233
233
  type: :development
234
234
  prerelease: false
235
- version_requirements: *2152407480
235
+ version_requirements: *2169136400
236
236
  - !ruby/object:Gem::Dependency
237
237
  name: rdiscount
238
- requirement: &2152406760 !ruby/object:Gem::Requirement
238
+ requirement: &2169196680 !ruby/object:Gem::Requirement
239
239
  none: false
240
240
  requirements:
241
241
  - - ~>
@@ -243,10 +243,10 @@ dependencies:
243
243
  version: 1.6.8
244
244
  type: :development
245
245
  prerelease: false
246
- version_requirements: *2152406760
246
+ version_requirements: *2169196680
247
247
  - !ruby/object:Gem::Dependency
248
248
  name: bcat
249
- requirement: &2152405980 !ruby/object:Gem::Requirement
249
+ requirement: &2169195980 !ruby/object:Gem::Requirement
250
250
  none: false
251
251
  requirements:
252
252
  - - ~>
@@ -254,7 +254,7 @@ dependencies:
254
254
  version: 0.6.2
255
255
  type: :development
256
256
  prerelease: false
257
- version_requirements: *2152405980
257
+ version_requirements: *2169195980
258
258
  description: Cucumber Generators and Runtime for Rails
259
259
  email: cukes@googlegroups.com
260
260
  executables: []
@@ -292,13 +292,10 @@ files:
292
292
  - features/install_cucumber_rails.feature
293
293
  - features/mongoid.feature
294
294
  - features/multiple_databases.feature
295
- - features/named_selectors.feature
296
295
  - features/no_database.feature
297
- - features/pseudo_class_selectors.feature
298
296
  - features/rerun_profile.feature
299
297
  - features/rest_api.feature
300
298
  - features/routing.feature
301
- - features/select_dates.feature
302
299
  - features/step_definitions/cucumber_rails_steps.rb
303
300
  - features/support/env.rb
304
301
  - features/test_unit.feature
@@ -338,11 +335,8 @@ files:
338
335
  - lib/generators/cucumber/install/templates/support/_rails_prefork.rb.erb
339
336
  - lib/generators/cucumber/install/templates/support/capybara.rb
340
337
  - lib/generators/cucumber/install/templates/support/edit_warning.txt
341
- - lib/generators/cucumber/install/templates/support/paths.rb
342
338
  - lib/generators/cucumber/install/templates/support/rails.rb.erb
343
339
  - lib/generators/cucumber/install/templates/support/rails_spork.rb.erb
344
- - lib/generators/cucumber/install/templates/support/selectors.rb
345
- - lib/generators/cucumber/install/templates/support/web_steps_warning.txt
346
340
  - lib/generators/cucumber/install/templates/tasks/cucumber.rake.erb
347
341
  - spec/cucumber/web/tableish_spec.rb
348
342
  - spec/spec_helper.rb
@@ -360,7 +354,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
360
354
  version: '0'
361
355
  segments:
362
356
  - 0
363
- hash: 2171874432944950096
357
+ hash: -3221260629709489818
364
358
  required_rubygems_version: !ruby/object:Gem::Requirement
365
359
  none: false
366
360
  requirements:
@@ -369,13 +363,13 @@ required_rubygems_version: !ruby/object:Gem::Requirement
369
363
  version: '0'
370
364
  segments:
371
365
  - 0
372
- hash: 2171874432944950096
366
+ hash: -3221260629709489818
373
367
  requirements: []
374
368
  rubyforge_project:
375
369
  rubygems_version: 1.8.10
376
370
  signing_key:
377
371
  specification_version: 3
378
- summary: cucumber-rails-1.0.6
372
+ summary: cucumber-rails-1.1.0
379
373
  test_files:
380
374
  - features/allow_rescue.feature
381
375
  - features/capybara_javascript_drivers.feature
@@ -387,13 +381,10 @@ test_files:
387
381
  - features/install_cucumber_rails.feature
388
382
  - features/mongoid.feature
389
383
  - features/multiple_databases.feature
390
- - features/named_selectors.feature
391
384
  - features/no_database.feature
392
- - features/pseudo_class_selectors.feature
393
385
  - features/rerun_profile.feature
394
386
  - features/rest_api.feature
395
387
  - features/routing.feature
396
- - features/select_dates.feature
397
388
  - features/step_definitions/cucumber_rails_steps.rb
398
389
  - features/support/env.rb
399
390
  - features/test_unit.feature
@@ -1,33 +0,0 @@
1
- Feature: Named Selectors
2
-
3
- Scenario: Look within named selector
4
- Given a project without ActiveRecord
5
- And a cukes resource
6
- And I write to "app/views/cukes/index.html.erb" with:
7
- """
8
- <div class="foo">foo</div>
9
- <div class="bar">bar</div>
10
- """
11
- And I write to "features/tests.feature" with:
12
- """
13
- Feature: Tests
14
- Scenario: Tests
15
- When I go to the cukes page
16
- Then I should see "foo" within the foo div
17
- And I should not see "bar" within the foo div
18
- """
19
- And I overwrite "features/support/selectors.rb" with:
20
- """
21
- module HtmlSelectorsHelpers
22
- def selector_for(locator)
23
- return '.foo' if locator == 'the foo div'
24
- end
25
- end
26
- World(HtmlSelectorsHelpers)
27
- """
28
- And I run `rake cucumber`
29
- Then it should pass with:
30
- """
31
- 1 scenario (1 passed)
32
- 3 steps (3 passed)
33
- """
@@ -1,24 +0,0 @@
1
- Feature: Pseudo-class Selectors
2
-
3
- Scenario: Look within css pseudo-class selectors
4
- Given a project without ActiveRecord
5
- And a cukes resource
6
- And I write to "app/views/cukes/index.html.erb" with:
7
- """
8
- <div>foo</div>
9
- <div>bar</div>
10
- """
11
- And I write to "features/tests.feature" with:
12
- """
13
- Feature: Tests
14
- Scenario: Tests
15
- When I go to the cukes page
16
- Then I should see "bar" within "div:nth-child(2)"
17
- And I should not see "foo" within "div:nth-child(2)"
18
- """
19
- And I run `rake cucumber`
20
- Then it should pass with:
21
- """
22
- 1 scenario (1 passed)
23
- 3 steps (3 passed)
24
- """
@@ -1,141 +0,0 @@
1
- Feature: Select dates
2
-
3
- Background: A simple calendar app
4
- Given I have created a new Rails 3 app "rails-3-app" with cucumber-rails support
5
-
6
- Scenario: Select date and time
7
- Given I successfully run `bundle exec rails g scaffold appointment name:string when:datetime`
8
- And I write to "features/create_appointment.feature" with:
9
- """
10
- Feature: Create appointments
11
- Scenario: Constitution on May 17
12
- Given I am on the new appointment page
13
- And I fill in "Norway's constitution" for "Name"
14
- And I select "2009-02-20 15:10:00 UTC" as the "When" date and time
15
- And I press "Create Appointment"
16
- Then I should see "Norway's constitution"
17
- And I should see "2009-02-20 15:10:00 UTC"
18
- """
19
- When I run `bundle exec rake db:migrate`
20
- And I run `bundle exec rake cucumber`
21
- Then it should pass with:
22
- """
23
- 1 scenario (1 passed)
24
- 6 steps (6 passed)
25
- """
26
-
27
- Scenario: Select date with label pointing to first select
28
- Given I successfully run `bundle exec rails g scaffold appointment name:string when:date`
29
- And I write to "features/create_appointment.feature" with:
30
- """
31
- Feature: Create appointments
32
- Scenario: Constitution on May 17
33
- Given I am on the new appointment page
34
- And I fill in "Norway's constitution" for "Name"
35
- And I select "2009-02-20" as the "When" date
36
- And I press "Create Appointment"
37
- Then I should see "Norway's constitution"
38
- And I should see "2009-02-20"
39
- """
40
- And I write to "app/views/appointments/_form.html.erb" with:
41
- """
42
- <%= form_for(@appointment) do |f| %>
43
- <div class="field">
44
- <%= f.label :name %><br />
45
- <%= f.text_field :name %>
46
- </div>
47
- <div class="field">
48
- <%= f.label :when, :for => "appointment_when_1i" %><br />
49
- <%= f.date_select :when %>
50
- </div>
51
- <div class="actions">
52
- <%= f.submit %>
53
- </div>
54
- <% end %>
55
- """
56
- When I run `bundle exec rake db:migrate`
57
- And I run `bundle exec rake cucumber`
58
- Then it should pass with:
59
- """
60
- 1 scenario (1 passed)
61
- 6 steps (6 passed)
62
- """
63
-
64
- Scenario: Select date when the order of fields is changed and label is set to the first select
65
- Given I successfully run `bundle exec rails g scaffold appointment name:string when:date`
66
- And I write to "features/create_appointment.feature" with:
67
- """
68
- Feature: Create appointments
69
- Scenario: Constitution on May 17
70
- Given I am on the new appointment page
71
- And I fill in "Norway's constitution" for "Name"
72
- And I select "2009-02-20" as the "When" date
73
- And I press "Create Appointment"
74
- Then I should see "Norway's constitution"
75
- And I should see "2009-02-20"
76
- """
77
- And I write to "app/views/appointments/_form.html.erb" with:
78
- """
79
- <%= form_for(@appointment) do |f| %>
80
- <div class="field">
81
- <%= f.label :name %><br />
82
- <%= f.text_field :name %>
83
- </div>
84
- <div class="field">
85
- <%= f.label :when, :for => "appointment_when_2i" %><br />
86
- <%= f.date_select :when, :order=>[:month, :day, :year] %>
87
- </div>
88
- <div class="actions">
89
- <%= f.submit %>
90
- </div>
91
- <% end %>
92
- """
93
- When I run `bundle exec rake db:migrate`
94
- And I run `bundle exec rake cucumber`
95
- Then it should pass with:
96
- """
97
- 1 scenario (1 passed)
98
- 6 steps (6 passed)
99
- """
100
-
101
- Scenario: Select correct date when scoped
102
- Given I successfully run `bundle exec rails g scaffold appointment name:string when:date`
103
- And I write to "features/create_appointment.feature" with:
104
- """
105
- Feature: Create appointments
106
- Scenario: Constitution on May 17
107
- Given I am on the new appointment page
108
- And I fill in "Norway's constitution" for "Name"
109
- And I select "2009-02-20" as the "When" date
110
- And I select "2009-03-20" as the "When" date within "#extra"
111
- And I press "Create Appointment"
112
- Then I should see "Norway's constitution"
113
- And I should see "2009-02-20"
114
- """
115
- And I write to "app/views/appointments/_form.html.erb" with:
116
- """
117
- <%= form_for(@appointment) do |f| %>
118
- <div class="field">
119
- <%= f.label :name %><br />
120
- <%= f.text_field :name %>
121
- </div>
122
- <div class="field">
123
- <%= f.label :when, :for => "appointment_when_1i" %><br />
124
- <%= f.date_select :when %>
125
- </div>
126
- <div class="actions">
127
- <%= f.submit %>
128
- </div>
129
- <% end %>
130
- <div id="extra">
131
- <%= label_tag 'extra_when_1i', 'When' %>
132
- <%= date_select "extra", "when" %>
133
- </div>
134
- """
135
- When I run `bundle exec rake db:migrate`
136
- And I run `bundle exec rake cucumber`
137
- Then it should pass with:
138
- """
139
- 1 scenario (1 passed)
140
- 7 steps (7 passed)
141
- """
@@ -1,33 +0,0 @@
1
- module NavigationHelpers
2
- # Maps a name to a path. Used by the
3
- #
4
- # When /^I go to (.+)$/ do |page_name|
5
- #
6
- # step definition in web_steps.rb
7
- #
8
- def path_to(page_name)
9
- case page_name
10
-
11
- when /^the home\s?page$/
12
- '/'
13
-
14
- # Add more mappings here.
15
- # Here is an example that pulls values out of the Regexp:
16
- #
17
- # when /^(.*)'s profile page$/i
18
- # user_profile_path(User.find_by_login($1))
19
-
20
- else
21
- begin
22
- page_name =~ /^the (.*) page$/
23
- path_components = $1.split(/\s+/)
24
- self.send(path_components.push('path').join('_').to_sym)
25
- rescue NoMethodError, ArgumentError
26
- raise "Can't find mapping from \"#{page_name}\" to a path.\n" +
27
- "Now, go and add a mapping in #{__FILE__}"
28
- end
29
- end
30
- end
31
- end
32
-
33
- World(NavigationHelpers)
@@ -1,39 +0,0 @@
1
- module HtmlSelectorsHelpers
2
- # Maps a name to a selector. Used primarily by the
3
- #
4
- # When /^(.+) within (.+)$/ do |step, scope|
5
- #
6
- # step definitions in web_steps.rb
7
- #
8
- def selector_for(locator)
9
- case locator
10
-
11
- when "the page"
12
- "html > body"
13
-
14
- # Add more mappings here.
15
- # Here is an example that pulls values out of the Regexp:
16
- #
17
- # when /^the (notice|error|info) flash$/
18
- # ".flash.#{$1}"
19
-
20
- # You can also return an array to use a different selector
21
- # type, like:
22
- #
23
- # when /the header/
24
- # [:xpath, "//header"]
25
-
26
- # This allows you to provide a quoted selector as the scope
27
- # for "within" steps as was previously the default for the
28
- # web steps:
29
- when /^"(.+)"$/
30
- $1
31
-
32
- else
33
- raise "Can't find mapping from \"#{locator}\" to a selector.\n" +
34
- "Now, go and add a mapping in #{__FILE__}"
35
- end
36
- end
37
- end
38
-
39
- World(HtmlSelectorsHelpers)
@@ -1,19 +0,0 @@
1
- # TL;DR: YOU SHOULD DELETE THIS FILE
2
- #
3
- # This file was generated by Cucumber-Rails and is only here to get you a head start
4
- # These step definitions are thin wrappers around the Capybara/Webrat API that lets you
5
- # visit pages, interact with widgets and make assertions about page content.
6
- #
7
- # If you use these step definitions as basis for your features you will quickly end up
8
- # with features that are:
9
- #
10
- # * Hard to maintain
11
- # * Verbose to read
12
- #
13
- # A much better approach is to write your own higher level step definitions, following
14
- # the advice in the following blog posts:
15
- #
16
- # * http://benmabey.com/2008/05/19/imperative-vs-declarative-scenarios-in-user-stories.html
17
- # * http://dannorth.net/2011/01/31/whose-domain-is-it-anyway/
18
- # * http://elabs.se/blog/15-you-re-cuking-it-wrong
19
- #