katapult 0.4.1 → 0.5.0

Sign up to get free protection for your applications and to get access to all the features.
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