katapult 0.4.1 → 0.5.0

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.
Files changed (48) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +1 -0
  3. data/CHANGELOG.md +34 -12
  4. data/README.md +154 -114
  5. data/Rakefile +3 -3
  6. data/bin/katapult +34 -8
  7. data/features/application_model.feature +8 -44
  8. data/features/authenticate.feature +21 -4
  9. data/features/basics.feature +16 -89
  10. data/features/binary.feature +37 -4
  11. data/features/model.feature +40 -24
  12. data/features/navigation.feature +2 -0
  13. data/features/step_definitions/katapult_steps.rb +48 -16
  14. data/features/step_definitions/test_steps.rb +2 -0
  15. data/features/templates.feature +74 -0
  16. data/lib/generators/katapult/app_model/templates/lib/katapult/application_model.rb +2 -2
  17. data/lib/generators/katapult/basics/basics_generator.rb +12 -1
  18. data/lib/generators/katapult/basics/templates/Capfile +5 -0
  19. data/lib/generators/katapult/basics/templates/Gemfile +3 -1
  20. data/lib/generators/katapult/basics/templates/Gemfile.lock +376 -0
  21. data/lib/generators/katapult/basics/templates/app/models/application_record.rb +28 -0
  22. data/lib/generators/katapult/basics/templates/app/webpack/assets/javascripts/bootstrap.js +2 -2
  23. data/lib/generators/katapult/basics/templates/config/deploy.rb +2 -3
  24. data/lib/generators/katapult/basics/templates/config/deploy/production.rb +2 -2
  25. data/lib/generators/katapult/basics/templates/config/deploy/staging.rb +1 -1
  26. data/lib/generators/katapult/basics/templates/lib/capistrano/tasks/deploy.rake +1 -4
  27. data/lib/generators/katapult/clearance/clearance_generator.rb +13 -4
  28. data/lib/generators/katapult/clearance/templates/features/authentication.feature +3 -3
  29. data/lib/generators/katapult/model/model_generator.rb +14 -4
  30. data/lib/generators/katapult/templates/templates_generator.rb +35 -0
  31. data/lib/generators/katapult/transform/transform_generator.rb +3 -3
  32. data/lib/generators/katapult/views/views_generator.rb +1 -1
  33. data/lib/generators/katapult/web_ui/web_ui_generator.rb +1 -1
  34. data/lib/katapult/application_model.rb +7 -7
  35. data/lib/katapult/elements/attribute.rb +16 -0
  36. data/lib/katapult/elements/authentication.rb +9 -6
  37. data/lib/katapult/elements/model.rb +8 -4
  38. data/lib/katapult/elements/navigation.rb +2 -2
  39. data/lib/katapult/elements/web_ui.rb +2 -2
  40. data/lib/katapult/generator.rb +12 -2
  41. data/lib/katapult/support/generator_goodies.rb +14 -0
  42. data/lib/katapult/version.rb +1 -1
  43. data/script/update +5 -1
  44. metadata +8 -8
  45. data/features/configuration.feature +0 -24
  46. data/lib/generators/katapult/basics/templates/lib/capistrano/tasks/passenger.rake +0 -8
  47. data/lib/generators/katapult/basics/templates/lib/ext/active_record/find_by_anything.rb +0 -20
  48. data/lib/generators/katapult/basics/templates/lib/ext/active_record/these.rb +0 -7
@@ -65,3 +65,5 @@ Feature: Navigation
65
65
  """
66
66
  root 'customers#index'
67
67
  """
68
+ But a file "app/views/layouts/_navigation.html.haml" should not exist
69
+ And the file "app/views/layouts/_menu_bar.html.haml" should not contain "render 'layouts/navigation"
@@ -27,22 +27,32 @@ When /^I generate katapult basics$/ do
27
27
  end
28
28
 
29
29
  # By default, transforming the application model will not recreate and migrate
30
- # the test app database (massive test suite speedup).
31
- # If a scenario relies on the database being set up (e.g. running Cucumber), be
32
- # sure to use this step with trailing "including migrations".
33
- When /^I( successfully)? transform the application model( including migrations)?$/ do |require_success, run_migrations|
30
+ # the test app database (massive test suite speedup). If a scenario relies on
31
+ # the database being set up (e.g. running Cucumber), be sure to use this step
32
+ # with trailing "including migrations".
33
+ When /^I( successfully)? transform the application model( including migrations)?(, ignoring conflicts)?$/ do |require_success, run_migrations, ignore_conflicts|
34
34
  next if @no_clobber
35
35
 
36
36
  ENV['SKIP_MIGRATIONS'] = 'true' unless run_migrations # Speedup
37
+ command = 'rails generate katapult:transform lib/katapult/application_model.rb'
38
+ command << ' --force' if ignore_conflicts
37
39
 
38
40
  with_aruba_timeout 60 do
39
41
  # The second argument of #run_simple defaults to `true`
40
- run_simple 'rails generate katapult:transform lib/katapult/application_model.rb', !!require_success
42
+ run_simple command, !!require_success
41
43
  end
42
44
  end
43
45
  After { ENV.delete 'SKIP_MIGRATIONS' }
44
46
 
45
47
  Then 'Capistrano should be configured' do
48
+ steps %(
49
+ And the file "Gemfile" should contain "capistrano-rails"
50
+ And the file "Gemfile" should contain "capistrano-bundler"
51
+ And the file "Gemfile" should contain "capistrano-maintenance"
52
+ And the file "Gemfile" should contain "capistrano-opscomplete"
53
+ And the file "Gemfile" should contain "capistrano-passenger"
54
+ )
55
+
46
56
  step 'the file "Capfile" should contain:', <<-CONTENT
47
57
  # Load DSL and set up stages
48
58
  require 'capistrano/setup'
@@ -50,6 +60,10 @@ require 'capistrano/setup'
50
60
  # Include default deployment tasks
51
61
  require 'capistrano/deploy'
52
62
 
63
+ # Configure Opscomplete deployment
64
+ require 'capistrano/opscomplete'
65
+ require 'capistrano/passenger'
66
+
53
67
  # Use Git
54
68
  require 'capistrano/scm/git'
55
69
  install_plugin Capistrano::SCM::Git
@@ -69,13 +83,14 @@ Dir.glob('lib/capistrano/tasks/*.rake').sort.each do |r|
69
83
  end
70
84
 
71
85
  before 'deploy:updating', 'db:dump'
86
+ after 'deploy:updating', 'opscomplete:ruby:ensure'
72
87
  after 'deploy:published', 'deploy:restart'
73
88
  after 'deploy:published', 'db:warn_if_pending_migrations'
74
89
  after 'deploy:published', 'db:show_dump_usage'
75
90
  after 'deploy:finished', 'deploy:cleanup' # https://makandracards.com/makandra/1432
76
91
  CONTENT
77
92
 
78
- step 'the file "config/deploy.rb" should contain:', <<-CONTENT
93
+ step 'the file "config/deploy.rb" should contain:', <<-'CONTENT'
79
94
  # Default value for :format is :pretty
80
95
  # set :format, :pretty
81
96
 
@@ -90,7 +105,7 @@ set :linked_files, %w(config/database.yml config/secrets.yml)
90
105
 
91
106
  # Default value for linked_dirs is []
92
107
  # set :linked_dirs, fetch(:linked_dirs, []).push('log', 'tmp/pids', 'tmp/cache', 'tmp/sockets', 'vendor/bundle', 'public/system')
93
- set :linked_dirs, %w(log public/system tmp/pids)
108
+ set :linked_dirs, %w(log public/system tmp/pids node_modules public/packs)
94
109
 
95
110
  # Default value for default_env is {}
96
111
  # set :default_env, { path: "/opt/ruby/bin:$PATH" }
@@ -103,8 +118,7 @@ set :ssh_options, {
103
118
  set :repo_url, 'git@code.makandra.de:makandra/katapult_test_app.git'
104
119
 
105
120
  # set :whenever_roles, :cron
106
- # set :whenever_environment, defer { stage }
107
- # set :whenever_command, 'bundle exec whenever'
121
+ # set :whenever_identifier, ->{ "#{fetch(:application)}_#{fetch(:stage)}" }
108
122
 
109
123
  set :maintenance_template_path, 'public/maintenance.html.erb'
110
124
  CONTENT
@@ -116,7 +130,7 @@ set :deploy_to, '/var/www/katapult_test_app-staging'
116
130
  set :rails_env, 'staging'
117
131
  set :branch, ENV['DEPLOY_BRANCH'] || 'master'
118
132
 
119
- # server 'example.com', user: 'deploy-user', roles: %w(app web cron db)
133
+ # server 'example.com', user: 'deploy-user', roles: %w[app web cron db]
120
134
  CONTENT
121
135
 
122
136
  step 'the file "config/deploy/production.rb" should contain exactly:', <<-CONTENT
@@ -126,13 +140,12 @@ set :deploy_to, '/var/www/katapult_test_app'
126
140
  set :rails_env, 'production'
127
141
  set :branch, 'production'
128
142
 
129
- # server 'one.example.com', user: 'deploy-user', roles: %w(app web cron db)
130
- # server 'two.example.com', user: 'deploy-user', roles: %w(app web)
143
+ # server 'one.example.com', user: 'deploy-user', roles: %w[app web cron db]
144
+ # server 'two.example.com', user: 'deploy-user', roles: %w[app web]
131
145
  CONTENT
132
146
 
133
147
  step 'the file "lib/capistrano/tasks/db.rake" should contain ":warn_if_pending_migrations"'
134
148
  step 'the file "lib/capistrano/tasks/deploy.rake" should contain "Show deployed revision"'
135
- step 'the file "lib/capistrano/tasks/passenger.rake" should contain "Restart Application"'
136
149
 
137
150
  end
138
151
 
@@ -154,7 +167,7 @@ Then 'Webpacker should be employed' do
154
167
 
155
168
  step 'the file "config/webpacker.yml" should contain "source_path: app/webpack"'
156
169
  step 'the file "config/webpack/environment.js" should contain:', <<-CONTENT
157
- environment.plugins.set('Provide', new webpack.ProvidePlugin({
170
+ environment.plugins.prepend('Provide', new webpack.ProvidePlugin({
158
171
  $: 'jquery',
159
172
  CONTENT
160
173
 
@@ -213,8 +226,15 @@ Then 'styles should be prepared' do
213
226
  step 'a directory named "app/webpack/assets/stylesheets/blocks" should exist'
214
227
  step 'a directory named "app/webpack/assets/stylesheets/ext" should exist'
215
228
 
216
- # JS support for Bootstrap dropdowns
217
- step %(the file "app/webpack/assets/javascripts/bootstrap.js" should contain "import 'bootstrap-sass/assets/javascripts/bootstrap/dropdown'")
229
+ # JS support for Bootstrap dropdowns and mobile navbar
230
+ step 'the file "app/webpack/assets/javascripts/bootstrap.js" should contain:', <<-CONTENT
231
+ import 'bootstrap-sass/assets/javascripts/bootstrap/transition'
232
+ // import 'bootstrap-sass/assets/javascripts/bootstrap/alert'
233
+ // import 'bootstrap-sass/assets/javascripts/bootstrap/button'
234
+ // import 'bootstrap-sass/assets/javascripts/bootstrap/carousel'
235
+ import 'bootstrap-sass/assets/javascripts/bootstrap/collapse'
236
+ import 'bootstrap-sass/assets/javascripts/bootstrap/dropdown'
237
+ CONTENT
218
238
  end
219
239
 
220
240
  Then 'binstubs should be set up' do
@@ -323,3 +343,15 @@ Then 'the errors controller should be installed' do
323
343
  step 'a file named "app/controllers/errors_controller.rb" should exist'
324
344
  step 'the file "config/routes.rb" should contain "resources :errors, only: :new"'
325
345
  end
346
+
347
+ Then 'Katapult templates should have been copied to the application' do
348
+ steps %(
349
+ And a file "lib/templates/katapult/views/index.html.haml" should exist
350
+ And a file "lib/templates/katapult/views/show.html.haml" should exist
351
+ And a file "lib/templates/katapult/views/new.html.haml" should exist
352
+ And a file "lib/templates/katapult/views/edit.html.haml" should exist
353
+ And a file "lib/templates/katapult/views/_form.html.haml" should exist
354
+
355
+ And a file "lib/templates/katapult/web_ui/controller.rb" should exist
356
+ )
357
+ end
@@ -1,9 +1,11 @@
1
1
  When /^I run rspec/ do
2
2
  run_simple 'rspec', exit_timeout: 10
3
+ run_simple 'bundle exec parallel_test -t rspec -- spec', exit_timeout: 10
3
4
  end
4
5
 
5
6
  When /^I run cucumber/ do
6
7
  run_simple 'bundle exec cucumber', exit_timeout: 15
8
+ run_simple 'bundle exec parallel_test -t cucumber -- features', exit_timeout: 15
7
9
  end
8
10
 
9
11
  When 'debugger' do
@@ -0,0 +1,74 @@
1
+ #@announce-output
2
+ #@announce-stderr
3
+ Feature: Customizing the templates Katapult uses for code generation
4
+
5
+ Background:
6
+ Given a new Rails application with Katapult basics installed
7
+
8
+
9
+ Scenario: Custom controller template
10
+ When I write to "lib/katapult/application_model.rb" with:
11
+ """
12
+ crud 'Car' do |car|
13
+ car.attr 'name'
14
+ end
15
+ """
16
+ And I write to "lib/templates/katapult/web_ui/controller.rb" with:
17
+ """
18
+ # Custom <%= model_name(:classes) %>Controller template
19
+
20
+ """
21
+ And I successfully transform the application model
22
+ Then the file "app/controllers/cars_controller.rb" should contain exactly:
23
+ """
24
+ # Custom CarsController template
25
+
26
+ """
27
+
28
+
29
+ Scenario: Custom view templates
30
+ When I write to "lib/katapult/application_model.rb" with:
31
+ """
32
+ crud 'Car' do |car|
33
+ car.attr 'name'
34
+ end
35
+ """
36
+ And I write to "lib/templates/katapult/views/index.html.haml" with:
37
+ """
38
+ # Custom <%= model_name(:humans) %> list template
39
+
40
+ """
41
+ And I write to "lib/templates/katapult/views/_form.html.haml" with:
42
+ """
43
+ # Custom <%= model_name(:human) %> form template
44
+
45
+ """
46
+ And I successfully transform the application model
47
+ Then the file "app/views/cars/index.html.haml" should contain exactly:
48
+ """
49
+ # Custom cars list template
50
+
51
+ """
52
+ And the file "app/views/cars/_form.html.haml" should contain exactly:
53
+ """
54
+ # Custom car form template
55
+
56
+ """
57
+
58
+
59
+ Scenario: Custom model template
60
+ When I write to "lib/katapult/application_model.rb" with:
61
+ """
62
+ model 'Car'
63
+ """
64
+ And a file named "lib/templates/katapult/model/model.rb" with:
65
+ """
66
+ # Custom model template for <%= class_name %>
67
+
68
+ """
69
+ And I successfully transform the application model
70
+ Then the file "app/models/car.rb" should contain exactly:
71
+ """
72
+ # Custom model template for Car
73
+
74
+ """
@@ -2,8 +2,8 @@
2
2
  # by the full-fledged example below (which you can generate right away).
3
3
 
4
4
  # Define a model + generate views with CRUD actions
5
- # Since this generates the first web UI with an index action, the products list
6
- # will become the home page of the generated app
5
+ # The products list will become the home page of the generated app, because it
6
+ # (implicitly) defines the first index action.
7
7
  crud 'product' do |product|
8
8
  # The first attribute of each model is taken as a human identifier/label
9
9
  product.attr :title # Default type "string"
@@ -40,6 +40,7 @@ module Katapult
40
40
  # installed with a custom :path option
41
41
  @katapult = File.readlines('Gemfile').find{ |line| line =~ /^gem 'katapult'/ }
42
42
  template 'Gemfile', force: true
43
+ template 'Gemfile.lock', force: true
43
44
  end
44
45
 
45
46
  def bundle_install
@@ -163,6 +164,10 @@ config.time_zone = 'Berlin'
163
164
  directory 'app/helpers'
164
165
  end
165
166
 
167
+ def prepare_application_record
168
+ template 'app/models/application_record.rb', force: true
169
+ end
170
+
166
171
  def install_errors_controller
167
172
  template 'app/controllers/errors_controller.rb'
168
173
  route 'resources :errors, only: :new'
@@ -176,6 +181,9 @@ config.time_zone = 'Berlin'
176
181
  directory 'lib/ext'
177
182
  end
178
183
 
184
+ def copy_templates
185
+ invoke 'katapult:templates'
186
+ end
179
187
 
180
188
  # Configure 3rd party ####################################################
181
189
 
@@ -269,6 +277,9 @@ config.autoload_paths << "#{Rails.root}/app/controllers/shared"
269
277
 
270
278
  directory 'lib/capistrano/tasks'
271
279
  template 'lib/tasks/pending_migrations.rake'
280
+
281
+ # Whenever needs this file for deployment
282
+ create_file 'config/schedule.rb'
272
283
  end
273
284
 
274
285
  def setup_webpacker
@@ -280,7 +291,7 @@ config.autoload_paths << "#{Rails.root}/app/controllers/shared"
280
291
  inject_into_file 'config/webpack/environment.js', <<~JQUERY, after: /\A.*\n/ # 1st line
281
292
  const webpack = require('webpack')
282
293
 
283
- environment.plugins.set('Provide', new webpack.ProvidePlugin({
294
+ environment.plugins.prepend('Provide', new webpack.ProvidePlugin({
284
295
  $: 'jquery',
285
296
  jQuery: 'jquery'
286
297
  })
@@ -4,6 +4,10 @@ require 'capistrano/setup'
4
4
  # Include default deployment tasks
5
5
  require 'capistrano/deploy'
6
6
 
7
+ # Configure Opscomplete deployment
8
+ require 'capistrano/opscomplete'
9
+ require 'capistrano/passenger'
10
+
7
11
  # Use Git
8
12
  require 'capistrano/scm/git'
9
13
  install_plugin Capistrano::SCM::Git
@@ -23,6 +27,7 @@ Dir.glob('lib/capistrano/tasks/*.rake').sort.each do |r|
23
27
  end
24
28
 
25
29
  before 'deploy:updating', 'db:dump'
30
+ after 'deploy:updating', 'opscomplete:ruby:ensure'
26
31
  after 'deploy:published', 'deploy:restart'
27
32
  after 'deploy:published', 'db:warn_if_pending_migrations'
28
33
  after 'deploy:published', 'db:show_dump_usage'
@@ -33,7 +33,7 @@ group :development do
33
33
 
34
34
  gem 'thin'
35
35
 
36
- gem 'parallel_tests'
36
+ gem 'parallel_tests', '< 2.19' # Breaks compatibility with Cucumber 2
37
37
 
38
38
  gem 'guard-livereload', require: false
39
39
  gem 'rack-livereload'
@@ -71,4 +71,6 @@ group :deploy do
71
71
  gem 'capistrano-rails', require: false
72
72
  gem 'capistrano-bundler', require: false
73
73
  gem 'capistrano-maintenance'
74
+ gem 'capistrano-opscomplete'
75
+ gem 'capistrano-passenger'
74
76
  end
@@ -0,0 +1,376 @@
1
+ GEM
2
+ remote: https://rubygems.org/
3
+ specs:
4
+ actioncable (5.1.4)
5
+ actionpack (= 5.1.4)
6
+ nio4r (~> 2.0)
7
+ websocket-driver (~> 0.6.1)
8
+ actionmailer (5.1.4)
9
+ actionpack (= 5.1.4)
10
+ actionview (= 5.1.4)
11
+ activejob (= 5.1.4)
12
+ mail (~> 2.5, >= 2.5.4)
13
+ rails-dom-testing (~> 2.0)
14
+ actionpack (5.1.4)
15
+ actionview (= 5.1.4)
16
+ activesupport (= 5.1.4)
17
+ rack (~> 2.0)
18
+ rack-test (>= 0.6.3)
19
+ rails-dom-testing (~> 2.0)
20
+ rails-html-sanitizer (~> 1.0, >= 1.0.2)
21
+ actionview (5.1.4)
22
+ activesupport (= 5.1.4)
23
+ builder (~> 3.1)
24
+ erubi (~> 1.4)
25
+ rails-dom-testing (~> 2.0)
26
+ rails-html-sanitizer (~> 1.0, >= 1.0.3)
27
+ active_type (0.7.5)
28
+ activerecord (>= 3.2)
29
+ activejob (5.1.4)
30
+ activesupport (= 5.1.4)
31
+ globalid (>= 0.3.6)
32
+ activemodel (5.1.4)
33
+ activesupport (= 5.1.4)
34
+ activerecord (5.1.4)
35
+ activemodel (= 5.1.4)
36
+ activesupport (= 5.1.4)
37
+ arel (~> 8.0)
38
+ activesupport (5.1.4)
39
+ concurrent-ruby (~> 1.0, >= 1.0.2)
40
+ i18n (~> 0.7)
41
+ minitest (~> 5.1)
42
+ tzinfo (~> 1.1)
43
+ addressable (2.5.2)
44
+ public_suffix (>= 2.0.2, < 4.0)
45
+ airbrussh (1.3.0)
46
+ sshkit (>= 1.6.1, != 1.7.0)
47
+ arel (8.0.0)
48
+ assignable_values (0.13.2)
49
+ activerecord (>= 2.3)
50
+ better_errors (2.4.0)
51
+ coderay (>= 1.0.0)
52
+ erubi (>= 1.0.0)
53
+ rack (>= 0.9.0)
54
+ bindex (0.5.0)
55
+ binding_of_caller (0.8.0)
56
+ debug_inspector (>= 0.0.1)
57
+ builder (3.2.3)
58
+ byebug (10.0.0)
59
+ capistrano (3.10.1)
60
+ airbrussh (>= 1.0.0)
61
+ i18n
62
+ rake (>= 10.0.0)
63
+ sshkit (>= 1.9.0)
64
+ capistrano-bundler (1.3.0)
65
+ capistrano (~> 3.1)
66
+ sshkit (~> 1.2)
67
+ capistrano-maintenance (1.2.0)
68
+ capistrano (>= 3.0)
69
+ capistrano-opscomplete (0.2.0)
70
+ capistrano (>= 3.0, < 4.0.0)
71
+ capistrano-passenger (0.2.0)
72
+ capistrano (~> 3.0)
73
+ capistrano-rails (1.3.1)
74
+ capistrano (~> 3.1)
75
+ capistrano-bundler (~> 1.1)
76
+ capybara (2.18.0)
77
+ addressable
78
+ mini_mime (>= 0.1.3)
79
+ nokogiri (>= 1.3.3)
80
+ rack (>= 1.0.0)
81
+ rack-test (>= 0.5.4)
82
+ xpath (>= 2.0, < 4.0)
83
+ capybara-screenshot (1.0.18)
84
+ capybara (>= 1.0, < 3)
85
+ launchy
86
+ childprocess (0.9.0)
87
+ ffi (~> 1.0, >= 1.0.11)
88
+ chronic (0.10.2)
89
+ coderay (1.1.2)
90
+ concurrent-ruby (1.0.5)
91
+ crass (1.0.3)
92
+ cucumber (2.1.0)
93
+ builder (>= 2.1.2)
94
+ cucumber-core (~> 1.3.0)
95
+ diff-lcs (>= 1.1.3)
96
+ gherkin3 (~> 3.1.0)
97
+ multi_json (>= 1.7.5, < 2.0)
98
+ multi_test (>= 0.1.2)
99
+ cucumber-core (1.3.1)
100
+ gherkin3 (~> 3.1.0)
101
+ cucumber-rails (1.5.0)
102
+ capybara (>= 1.1.2, < 3)
103
+ cucumber (>= 1.3.8, < 4)
104
+ mime-types (>= 1.17, < 4)
105
+ nokogiri (~> 1.5)
106
+ railties (>= 4, < 5.2)
107
+ cucumber_factory (1.12.0)
108
+ activerecord
109
+ activesupport
110
+ cucumber
111
+ cucumber_priority (>= 0.2.0)
112
+ cucumber_priority (0.3.1)
113
+ cucumber
114
+ daemons (1.2.6)
115
+ database_cleaner (1.6.2)
116
+ debug_inspector (0.0.3)
117
+ diff-lcs (1.3)
118
+ edge_rider (0.3.2)
119
+ activerecord
120
+ em-websocket (0.5.1)
121
+ eventmachine (>= 0.12.9)
122
+ http_parser.rb (~> 0.6.0)
123
+ erubi (1.7.1)
124
+ erubis (2.7.0)
125
+ eventmachine (1.2.5)
126
+ exception_notification (4.2.2)
127
+ actionmailer (>= 4.0, < 6)
128
+ activesupport (>= 4.0, < 6)
129
+ factory_bot (4.8.2)
130
+ activesupport (>= 3.0.0)
131
+ factory_bot_rails (4.8.2)
132
+ factory_bot (~> 4.8.2)
133
+ railties (>= 3.0.0)
134
+ ffi (1.9.23)
135
+ formatador (0.2.5)
136
+ gherkin3 (3.1.2)
137
+ globalid (0.4.1)
138
+ activesupport (>= 4.2.0)
139
+ guard (2.14.2)
140
+ formatador (>= 0.2.4)
141
+ listen (>= 2.7, < 4.0)
142
+ lumberjack (>= 1.0.12, < 2.0)
143
+ nenv (~> 0.1)
144
+ notiffany (~> 0.0)
145
+ pry (>= 0.9.12)
146
+ shellany (~> 0.0)
147
+ thor (>= 0.18.1)
148
+ guard-compat (1.2.1)
149
+ guard-livereload (2.5.2)
150
+ em-websocket (~> 0.5)
151
+ guard (~> 2.8)
152
+ guard-compat (~> 1.0)
153
+ multi_json (~> 1.8)
154
+ haml (5.0.4)
155
+ temple (>= 0.8.0)
156
+ tilt
157
+ haml-rails (1.0.0)
158
+ actionpack (>= 4.0.1)
159
+ activesupport (>= 4.0.1)
160
+ haml (>= 4.0.6, < 6.0)
161
+ html2haml (>= 1.0.1)
162
+ railties (>= 4.0.1)
163
+ has_defaults (0.4.4)
164
+ activerecord
165
+ html2haml (2.2.0)
166
+ erubis (~> 2.7.0)
167
+ haml (>= 4.0, < 6)
168
+ nokogiri (>= 1.6.0)
169
+ ruby_parser (~> 3.5)
170
+ http_parser.rb (0.6.0)
171
+ i18n (0.9.5)
172
+ concurrent-ruby (~> 1.0)
173
+ launchy (2.4.3)
174
+ addressable (~> 2.3)
175
+ listen (3.1.5)
176
+ rb-fsevent (~> 0.9, >= 0.9.4)
177
+ rb-inotify (~> 0.9, >= 0.9.7)
178
+ ruby_dep (~> 1.2)
179
+ loofah (2.2.0)
180
+ crass (~> 1.0.2)
181
+ nokogiri (>= 1.5.9)
182
+ lumberjack (1.0.12)
183
+ mail (2.7.0)
184
+ mini_mime (>= 0.1.1)
185
+ method_source (0.9.0)
186
+ mime-types (3.1)
187
+ mime-types-data (~> 3.2015)
188
+ mime-types-data (3.2016.0521)
189
+ mini_mime (1.0.0)
190
+ mini_portile2 (2.3.0)
191
+ minitest (5.11.3)
192
+ modularity (2.0.1)
193
+ multi_json (1.13.1)
194
+ multi_test (0.1.2)
195
+ nenv (0.3.0)
196
+ net-scp (1.2.1)
197
+ net-ssh (>= 2.6.5)
198
+ net-ssh (4.2.0)
199
+ nio4r (2.3.0)
200
+ nokogiri (1.8.2)
201
+ mini_portile2 (~> 2.3.0)
202
+ notiffany (0.1.1)
203
+ nenv (~> 0.1)
204
+ shellany (~> 0.0)
205
+ parallel (1.12.1)
206
+ parallel_tests (2.21.2)
207
+ parallel
208
+ pg (0.21.0)
209
+ pry (0.11.3)
210
+ coderay (~> 1.1.0)
211
+ method_source (~> 0.9.0)
212
+ public_suffix (3.0.2)
213
+ query_diet (0.6.2)
214
+ rack (2.0.4)
215
+ rack-livereload (0.3.16)
216
+ rack
217
+ rack-proxy (0.6.4)
218
+ rack
219
+ rack-test (0.8.3)
220
+ rack (>= 1.0, < 3)
221
+ rails (5.1.4)
222
+ actioncable (= 5.1.4)
223
+ actionmailer (= 5.1.4)
224
+ actionpack (= 5.1.4)
225
+ actionview (= 5.1.4)
226
+ activejob (= 5.1.4)
227
+ activemodel (= 5.1.4)
228
+ activerecord (= 5.1.4)
229
+ activesupport (= 5.1.4)
230
+ bundler (>= 1.3.0)
231
+ railties (= 5.1.4)
232
+ sprockets-rails (>= 2.0.0)
233
+ rails-dom-testing (2.0.3)
234
+ activesupport (>= 4.2.0)
235
+ nokogiri (>= 1.6)
236
+ rails-html-sanitizer (1.0.3)
237
+ loofah (~> 2.0)
238
+ railties (5.1.4)
239
+ actionpack (= 5.1.4)
240
+ activesupport (= 5.1.4)
241
+ method_source
242
+ rake (>= 0.8.7)
243
+ thor (>= 0.18.1, < 2.0)
244
+ rake (12.3.0)
245
+ rb-fsevent (0.10.3)
246
+ rb-inotify (0.9.10)
247
+ ffi (>= 0.5.0, < 2)
248
+ rspec (3.7.0)
249
+ rspec-core (~> 3.7.0)
250
+ rspec-expectations (~> 3.7.0)
251
+ rspec-mocks (~> 3.7.0)
252
+ rspec-core (3.7.1)
253
+ rspec-support (~> 3.7.0)
254
+ rspec-expectations (3.7.0)
255
+ diff-lcs (>= 1.2.0, < 2.0)
256
+ rspec-support (~> 3.7.0)
257
+ rspec-mocks (3.7.0)
258
+ diff-lcs (>= 1.2.0, < 2.0)
259
+ rspec-support (~> 3.7.0)
260
+ rspec-rails (3.7.2)
261
+ actionpack (>= 3.0)
262
+ activesupport (>= 3.0)
263
+ railties (>= 3.0)
264
+ rspec-core (~> 3.7.0)
265
+ rspec-expectations (~> 3.7.0)
266
+ rspec-mocks (~> 3.7.0)
267
+ rspec-support (~> 3.7.0)
268
+ rspec-support (3.7.1)
269
+ ruby_dep (1.5.0)
270
+ ruby_parser (3.11.0)
271
+ sexp_processor (~> 4.9)
272
+ rubyzip (1.2.1)
273
+ selenium-webdriver (3.11.0)
274
+ childprocess (~> 0.5)
275
+ rubyzip (~> 1.2)
276
+ sexp_processor (4.10.1)
277
+ shellany (0.0.1)
278
+ shoulda-matchers (3.1.2)
279
+ activesupport (>= 4.0.0)
280
+ spreewald (1.11.3)
281
+ cucumber
282
+ cucumber_priority (>= 0.3.0)
283
+ spring (2.0.2)
284
+ activesupport (>= 4.2)
285
+ spring-commands-cucumber (1.0.1)
286
+ spring (>= 0.9.1)
287
+ spring-commands-rspec (1.0.4)
288
+ spring (>= 0.9.1)
289
+ sprockets (3.7.1)
290
+ concurrent-ruby (~> 1.0)
291
+ rack (> 1, < 3)
292
+ sprockets-rails (3.2.1)
293
+ actionpack (>= 4.0)
294
+ activesupport (>= 4.0)
295
+ sprockets (>= 3.0.0)
296
+ sshkit (1.16.0)
297
+ net-scp (>= 1.1.2)
298
+ net-ssh (>= 2.8.0)
299
+ temple (0.8.0)
300
+ thin (1.7.2)
301
+ daemons (~> 1.0, >= 1.0.9)
302
+ eventmachine (~> 1.0, >= 1.0.4)
303
+ rack (>= 1, < 3)
304
+ thor (0.20.0)
305
+ thread_safe (0.3.6)
306
+ tilt (2.0.8)
307
+ timecop (0.9.1)
308
+ tzinfo (1.2.5)
309
+ thread_safe (~> 0.1)
310
+ web-console (3.5.1)
311
+ actionview (>= 5.0)
312
+ activemodel (>= 5.0)
313
+ bindex (>= 0.4.0)
314
+ railties (>= 5.0)
315
+ webpacker (3.3.1)
316
+ activesupport (>= 4.2)
317
+ rack-proxy (>= 0.6.1)
318
+ railties (>= 4.2)
319
+ websocket-driver (0.6.5)
320
+ websocket-extensions (>= 0.1.0)
321
+ websocket-extensions (0.1.3)
322
+ whenever (0.10.0)
323
+ chronic (>= 0.6.3)
324
+ will_paginate (3.1.6)
325
+ xpath (3.0.0)
326
+ nokogiri (~> 1.8)
327
+
328
+ PLATFORMS
329
+ ruby
330
+
331
+ DEPENDENCIES
332
+ active_type
333
+ assignable_values
334
+ better_errors
335
+ binding_of_caller (>= 0.8.0)
336
+ byebug
337
+ capistrano-bundler
338
+ capistrano-maintenance
339
+ capistrano-opscomplete
340
+ capistrano-passenger
341
+ capistrano-rails
342
+ capybara
343
+ capybara-screenshot
344
+ cucumber (< 2.2)
345
+ cucumber-rails
346
+ cucumber_factory
347
+ database_cleaner
348
+ edge_rider
349
+ exception_notification
350
+ factory_bot_rails
351
+ guard-livereload
352
+ haml-rails
353
+ has_defaults
354
+ katapult
355
+ launchy
356
+ listen (< 3.2)
357
+ modularity
358
+ parallel_tests
359
+ pg
360
+ query_diet
361
+ rack-livereload
362
+ rails
363
+ rspec
364
+ rspec-rails
365
+ selenium-webdriver
366
+ shoulda-matchers
367
+ spreewald
368
+ spring
369
+ spring-commands-cucumber
370
+ spring-commands-rspec
371
+ thin
372
+ timecop
373
+ web-console
374
+ webpacker
375
+ whenever
376
+ will_paginate