voyage 1.44.0.7 → 1.44.0.8

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: f3069f490551d031bd77d95c0f11fafd36608a7c
4
- data.tar.gz: 2cf4fe7cc391b8a195be17da2d72bf849d216cd1
3
+ metadata.gz: 1a7660253e2c6e4fc6f64ad2e6edcd40a1b8927b
4
+ data.tar.gz: 24ac8a58416d07799c43e391399e597a5707ef37
5
5
  SHA512:
6
- metadata.gz: aa91712c84e2ef27758b693e36ef471788611f97c99454285a2662bd596fae2fa7f24142bcf622f05b74a46b1ac3c8d8e8519bb6ffb8ff99eea752a1c7229201
7
- data.tar.gz: c4812939c3c07301063aaf17baaa4cfee6af9c38b052baad26334f283df7077478c1600978cbfe4f30f580b2cb767c9ff9d6178bf6abeb16853a79f1e03a362f
6
+ metadata.gz: 40ccda0ba49723dabca96ea51e0fea2d9a17884acbfefa5ae997d15d28292035b65bb93b76d4ca4fa8b7919a7499b36251047e650eaef6ea97f6357bfb96a1df
7
+ data.tar.gz: 292dfb3e8a16c2e15decc2f0a827116d82ec4761f4014689380e09bf04d191a4965f97d603c09679c5e2d96eb18188c18fce6f9f2544b4cdd8e1eebd6cdb8c2c
data/LICENSE CHANGED
@@ -1,6 +1,6 @@
1
1
  The MIT License
2
2
 
3
- Copyright (c) 2008-2016 thoughtbot, inc.
3
+ Copyright (c) 2008-2017 thoughtbot, inc.
4
4
 
5
5
  Permission is hereby granted, free of charge, to any person obtaining a copy
6
6
  of this software and associated documentation files (the "Software"), to deal
data/README.md CHANGED
@@ -130,6 +130,7 @@ This:
130
130
  * Configures staging with `RACK_ENV` environment variable set
131
131
  to `staging`
132
132
  * Creates a [Heroku Pipeline] for review apps
133
+ * Schedules automated backups for 10AM UTC for both `staging` and `production`
133
134
 
134
135
  [Heroku Pipeline]: https://devcenter.heroku.com/articles/pipelines
135
136
 
@@ -205,7 +206,7 @@ Thank you, [contributors]!
205
206
 
206
207
  ## License
207
208
 
208
- Suspenders is Copyright © 2008-2016 thoughtbot.
209
+ Suspenders is Copyright © 2008-2017 thoughtbot.
209
210
  It is free software,
210
211
  and may be redistributed under the terms specified in the [LICENSE] file.
211
212
 
@@ -213,7 +214,7 @@ and may be redistributed under the terms specified in the [LICENSE] file.
213
214
 
214
215
  ## About thoughtbot
215
216
 
216
- ![thoughtbot](https://thoughtbot.com/logo.png)
217
+ [![thoughtbot][thoughtbot-logo]][thoughtbot]
217
218
 
218
219
  Suspenders is maintained and funded by thoughtbot, inc.
219
220
  The names and logos for thoughtbot are trademarks of thoughtbot, inc.
@@ -222,5 +223,7 @@ We love open source software!
222
223
  See [our other projects][community].
223
224
  We are [available for hire][hire].
224
225
 
226
+ [thoughtbot]: https://thoughtbot.com?utm_source=github
227
+ [thoughtbot-logo]: http://presskit.thoughtbot.com/images/thoughtbot-logo-for-readmes.svg
225
228
  [community]: https://thoughtbot.com/community?utm_source=github
226
229
  [hire]: https://thoughtbot.com?utm_source=github
@@ -37,6 +37,15 @@ module Suspenders
37
37
  end
38
38
  end
39
39
 
40
+ def set_heroku_backup_schedule
41
+ %w(staging production).each do |environment|
42
+ run_toolbelt_command(
43
+ "pg:backups:schedule DATABASE_URL --at '10:00 UTC'",
44
+ environment,
45
+ )
46
+ end
47
+ end
48
+
40
49
  def create_review_apps_setup_script
41
50
  app_builder.template(
42
51
  "bin_setup_review_app.erb",
@@ -12,6 +12,7 @@ module Suspenders
12
12
  :create_staging_heroku_app,
13
13
  :create_review_apps_setup_script,
14
14
  :set_heroku_rails_secrets,
15
+ :set_heroku_backup_schedule,
15
16
  :set_heroku_remotes,
16
17
  :set_heroku_application_host
17
18
 
@@ -370,8 +371,8 @@ Rack::Timeout.timeout = (ENV["RACK_TIMEOUT"] || 10).to_i
370
371
  If you have previously run the `./bin/setup` script,
371
372
  you can deploy to staging and production with:
372
373
 
373
- $ ./bin/deploy staging
374
- $ ./bin/deploy production
374
+ % ./bin/deploy staging
375
+ % ./bin/deploy production
375
376
  MARKDOWN
376
377
 
377
378
  append_file "README.md", instructions
@@ -401,7 +402,7 @@ you can deploy to staging and production with:
401
402
 
402
403
  def setup_bundler_audit
403
404
  copy_file "bundler_audit.rake", "lib/tasks/bundler_audit.rake"
404
- append_file "Rakefile", %{\ntask default: "bundler:audit"\n}
405
+ append_file "Rakefile", %{\ntask default: "bundle:audit"\n}
405
406
  end
406
407
 
407
408
  def setup_spring
@@ -164,6 +164,7 @@ module Suspenders
164
164
  build :set_heroku_remotes
165
165
  build :set_heroku_rails_secrets
166
166
  build :set_heroku_application_host
167
+ build :set_heroku_backup_schedule
167
168
  build :create_heroku_pipeline
168
169
  build :configure_automatic_deployment
169
170
  end
@@ -198,7 +198,7 @@ module Suspenders
198
198
  protected
199
199
 
200
200
  def devise_or_pages_controller?
201
- devise_controller? || is_a?(HighVoltage::PagesController)
201
+ devise_controller? == true || is_a?(HighVoltage::PagesController)
202
202
  end
203
203
 
204
204
  def sanitize_hash_javascript(hash)
@@ -539,6 +539,9 @@ module Suspenders
539
539
  def generate_data_migrations
540
540
  generate 'data_migrations:install'
541
541
 
542
+ file = Dir['db/migrate/*_create_data_migrations.rb'].first
543
+ replace_in_file file, 'class CreateDataMigrations < ActiveRecord::Migration', "class CreateDataMigrations < ActiveRecord::Migration[4.2]"
544
+
542
545
  empty_directory_with_keep_file 'db/data_migrate'
543
546
  end
544
547
 
@@ -567,7 +570,7 @@ module Suspenders
567
570
  # --------
568
571
  def downgrade_neat_1_8_so_refills_media_mixin_works
569
572
  replace_in_file 'Gemfile', "gem 'neat', '~> 2.0.0.beta.1'", "gem 'neat', '~> 1.8.0'"
570
- run 'gem uninstall -x neat -v2.0.0.beta.2'
573
+ run 'gem uninstall -x neat -v2.0.0'
571
574
  run 'bundle'
572
575
  end
573
576
  # ------------
@@ -593,6 +596,18 @@ module Suspenders
593
596
  end
594
597
  end
595
598
 
599
+ def add_app_css_file
600
+ create_file "app/assets/stylesheets/#{app_name}.sass" do <<-RUBY.gsub(/^ {8}/, '')
601
+ .main-content
602
+ padding: 18px
603
+ RUBY
604
+ end
605
+ end
606
+
607
+ def update_flashes_css_file
608
+ replace_in_file 'app/assets/stylesheets/refills/_flashes.scss', "margin-bottom: $base-spacing / 2;", "// margin-bottom: $base-spacing / 2;"
609
+ end
610
+
596
611
  def add_admin_links_to_navigation
597
612
  return unless @@use_devise
598
613
  inject_into_file 'app/views/refills/_navigation.html.erb', after: ' <li class="nav-link"><a href="javascript:void(0)">Contact</a></li>' do <<-RUBY
@@ -604,6 +619,12 @@ module Suspenders
604
619
  <li class="nav-link"><a href="/admin/users">Admin</a></li>
605
620
  <% end %>
606
621
  <% end %>
622
+
623
+ <% if current_user %>
624
+ <li class='nav-link'><%= link_to 'Sign Out', sign_out_path %></li>
625
+ <% else %>
626
+ <li class='nav-link'><%= link_to 'Sign In', sign_in_path %></li>
627
+ <% end %>
607
628
  RUBY
608
629
  end
609
630
  end
@@ -612,6 +633,8 @@ module Suspenders
612
633
  inject_into_file 'app/assets/stylesheets/application.scss', after: '@import "refills/flashes";' do <<-RUBY.gsub(/^ {8}/, '')
613
634
  \n@import "refills/navigation";
614
635
  @import "refills/footer";
636
+
637
+ @import "#{app_name}";
615
638
  RUBY
616
639
  end
617
640
  end
@@ -655,6 +678,15 @@ module Suspenders
655
678
  template '../templates/auto_annotate_models.rake', 'lib/tasks/auto_annotate_models.rake', force: true
656
679
  end
657
680
 
681
+ def update_delayed_job_migration_rails_5_1_specify_4_2
682
+ file = Dir['db/migrate/*_create_delayed_jobs.rb'].first
683
+ replace_in_file file, 'class CreateDelayedJobs < ActiveRecord::Migration', "class CreateDelayedJobs < ActiveRecord::Migration[4.2]"
684
+ end
685
+
686
+ def add_favicon
687
+ template '../templates/favicon.ico', 'app/assets/images/favicon.ico', force: true
688
+ end
689
+
658
690
  # Do this last
659
691
  def rake_db_setup
660
692
  rake 'db:migrate'
@@ -729,6 +761,11 @@ module Suspenders
729
761
  template '../templates/analytics_identify.html.erb.erb', 'app/views/application/_analytics_identify.html.erb', force: true
730
762
  end
731
763
 
764
+ def create_database
765
+ # Suspenders version also migrates, we don't want that yet... we migrate in the rake_db_setup method
766
+ bundle_command 'exec rake db:create'
767
+ end
768
+
732
769
  # --------------------------------
733
770
  # setup_test_environment overrides
734
771
  # --------------------------------
@@ -741,6 +778,8 @@ module Suspenders
741
778
  end
742
779
 
743
780
  def configure_background_jobs_for_rspec
781
+ # template '../templates/config_dj_rails5_patches.rb', 'config/dj_rails5_patches.rb', force: true
782
+
744
783
  run 'rails g delayed_job:active_record'
745
784
  end
746
785
 
@@ -33,11 +33,15 @@ module Suspenders
33
33
  invoke :add_high_voltage_static_pages
34
34
  invoke :downgrade_neat_1_8_so_refills_media_mixin_works # this should be temporary until they get refills re-written to take advantage of Neat 2.0
35
35
  invoke :generate_refills
36
+ invoke :add_app_css_file
37
+ invoke :update_flashes_css_file
36
38
  invoke :overwrite_application_layout
37
39
  invoke :generate_test_environment
38
40
  invoke :update_test_environment
39
41
  invoke :add_rubocop_config
40
42
  invoke :add_auto_annotate_models_rake_task
43
+ invoke :update_delayed_job_migration_rails_5_1_specify_4_2
44
+ invoke :add_favicon
41
45
 
42
46
 
43
47
  # Do these last
@@ -91,6 +95,14 @@ module Suspenders
91
95
  build :generate_refills
92
96
  end
93
97
 
98
+ def add_app_css_file
99
+ build :add_app_css_file
100
+ end
101
+
102
+ def update_flashes_css_file
103
+ build :update_flashes_css_file
104
+ end
105
+
94
106
  def overwrite_application_layout
95
107
  build :overwrite_application_layout
96
108
  end
@@ -111,6 +123,14 @@ module Suspenders
111
123
  build :add_auto_annotate_models_rake_task
112
124
  end
113
125
 
126
+ def update_delayed_job_migration_rails_5_1_specify_4_2
127
+ build :update_delayed_job_migration_rails_5_1_specify_4_2
128
+ end
129
+
130
+ def add_favicon
131
+ build :add_favicon
132
+ end
133
+
114
134
  def rake_db_setup
115
135
  build :rake_db_setup
116
136
  end
@@ -13,14 +13,13 @@ gem "normalize-rails", "~> 3.0.0"
13
13
  gem "pg"
14
14
  gem "puma"
15
15
  gem "rack-canonical-host"
16
- # gem "rails", "<%= Voyage::RAILS_VERSION %>"
17
- gem 'rails', git: 'https://github.com/rails/rails.git', branch: '5-0-stable' # OMG Fix deprecation warnings...
16
+ gem "rails", "<%= Voyage::RAILS_VERSION %>"
18
17
  gem "recipient_interceptor"
19
18
  gem "sass-rails", "~> 5.0"
20
19
  gem "simple_form"
21
20
  gem "skylight"
22
21
  gem "sprockets", ">= 3.0.0"
23
- gem 'suspenders'
22
+ gem 'voyage'
24
23
  gem "title"
25
24
  gem "uglifier"
26
25
 
@@ -77,6 +76,7 @@ group :development do
77
76
  gem 'better_errors' # A better error page for rails when a local 500 (or similar) is thrown
78
77
  gem 'binding_of_caller' # REPL in better_errors to debug in the browser at the point at which it failed
79
78
  gem 'bitters', '~> 1.3'
79
+ gem 'fix-db-schema-conflicts' # when working with multiple developers schema order of columns is standardized.
80
80
  gem 'meta_request' # for chrome rails console plugin found here: https://chrome.google.com/webstore/detail/railspanel/gjpfobpafnhjhbajcjgccbbdofdckggg?hl=en-US
81
81
  gem 'rails-erd' # auto gen ERD Diagram of models in the app on rake db:migrate
82
82
  gem 'redcarpet' # used to render the readme inside a static welcome page from the high_voltage gem
@@ -0,0 +1,20 @@
1
+ # RAILS 5 patches for delayed_job
2
+ # TODO: REMOVE WHEN upstream is updated
3
+
4
+ module DelayedWorkerPatches
5
+ def reload!
6
+ return unless self.class.reload_app?
7
+ if defined?(ActiveSupport::Reloader)
8
+ Rails.application.reloader.reload!
9
+ else
10
+ ActionDispatch::Reloader.cleanup!
11
+ ActionDispatch::Reloader.prepare!
12
+ end
13
+ end
14
+ end
15
+
16
+ module Delayed
17
+ class Worker
18
+ prepend DelayedWorkerPatches
19
+ end
20
+ end
Binary file
@@ -1,4 +1,4 @@
1
- # rubocop:disable Metrics/BlockLength, Metrics/LineLength, Rails/FilePath
1
+ # rubocop:disable Metrics/BlockLength, Metrics/LineLength, Rails/FilePath, Style/MixinGrouping
2
2
  require 'simplecov'
3
3
  SimpleCov.command_name 'Rspec'
4
4
 
@@ -38,6 +38,7 @@ AllCops:
38
38
  - 'config/initializers/rack_mini_profiler.rb'
39
39
  - 'config/initializers/wrap_parameters.rb'
40
40
  - 'bin/**/*'
41
+ - 'Rakefile'
41
42
  Include:
42
43
  - 'Gemfile'
43
44
  - '.simplecov'
@@ -26,12 +26,17 @@
26
26
  <%%= render 'flashes' -%>
27
27
  <%% if devise_controller? %>
28
28
  <% if config[:add_refills] %><%%= render 'refills/navigation' %><% end %>
29
- <%%= yield %>
29
+ <div class='main-content'>
30
+ <%%= yield %>
31
+ </div>
30
32
  <%% else %>
31
33
  <div class='grid-offset'>
32
34
  <div class='work-area'>
33
35
  <% if config[:add_refills] %><%%= render 'refills/navigation' %><% end %>
34
- <%%= yield %>
36
+
37
+ <div class='main-content'>
38
+ <%%= yield %>
39
+ </div>
35
40
  </div>
36
41
  </div>
37
42
  <%% end %>
@@ -1,9 +1,9 @@
1
1
  module Voyage
2
- RAILS_VERSION = '~> 5.0.1'.freeze
2
+ RAILS_VERSION = '~> 5.1.0.rc1'.freeze
3
3
  RUBY_VERSION =
4
4
  IO
5
5
  .read("#{File.dirname(__FILE__)}/../../.ruby-version")
6
6
  .strip
7
7
  .freeze
8
- VERSION = '1.44.0.7'.freeze
8
+ VERSION = '1.44.0.8'.freeze
9
9
  end
@@ -30,6 +30,16 @@ module Suspenders
30
30
  )
31
31
  end
32
32
 
33
+ it "sets the heroku backup schedule" do
34
+ app_builder = double(app_name: app_name)
35
+ allow(app_builder).to receive(:run)
36
+
37
+ Heroku.new(app_builder).set_heroku_backup_schedule
38
+
39
+ expect(app_builder).to have_backup_schedule("staging")
40
+ expect(app_builder).to have_backup_schedule("production")
41
+ end
42
+
33
43
  it "sets the application host" do
34
44
  app_builder = double(app_name: app_name)
35
45
  allow(app_builder).to receive(:run)
@@ -49,6 +59,11 @@ module Suspenders
49
59
  SuspendersTestHelpers::APP_NAME
50
60
  end
51
61
 
62
+ def have_backup_schedule(remote_name)
63
+ have_received(:run).
64
+ with(/pg:backups:schedule DATABASE_URL --at '10:00 UTC' --remote #{remote_name}/)
65
+ end
66
+
52
67
  def have_configured_var(remote_name, var)
53
68
  have_received(:run).with(/config:add #{var}=.+ --remote #{remote_name}/)
54
69
  end
@@ -29,6 +29,14 @@ RSpec.describe "Suspend a new project with default configuration" do
29
29
  end
30
30
  end
31
31
 
32
+ it "includes the bundle:audit task" do
33
+ Dir.chdir(project_path) do
34
+ Bundler.with_clean_env do
35
+ expect(`rake -T`).to include('rake bundle:audit')
36
+ end
37
+ end
38
+ end
39
+
32
40
  it "creates .ruby-version from Suspenders .ruby-version" do
33
41
  ruby_version_file = IO.read("#{project_path}/.ruby-version")
34
42
 
@@ -101,7 +109,7 @@ RSpec.describe "Suspend a new project with default configuration" do
101
109
  expect(analytics_partial).
102
110
  to include(%{<% if ENV["SEGMENT_KEY"] %>})
103
111
  expect(analytics_partial).
104
- to include(%{window.analytics.load("<%= ENV["SEGMENT_KEY"] %>");})
112
+ to include(%{analytics.load("<%= ENV["SEGMENT_KEY"] %>");})
105
113
  end
106
114
 
107
115
  it "raises on unpermitted parameters in all environments" do
@@ -1,7 +1,8 @@
1
1
  <% if ENV["SEGMENT_KEY"] %>
2
2
  <script type="text/javascript">
3
- window.analytics=window.analytics||[],window.analytics.methods=["identify","group","track","page","pageview","alias","ready","on","once","off","trackLink","trackForm","trackClick","trackSubmit"],window.analytics.factory=function(t){return function(){var a=Array.prototype.slice.call(arguments);return a.unshift(t),window.analytics.push(a),window.analytics}};for(var i=0;i<window.analytics.methods.length;i++){var key=window.analytics.methods[i];window.analytics[key]=window.analytics.factory(key)}window.analytics.load=function(t){if(!document.getElementById("analytics-js")){var a=document.createElement("script");a.type="text/javascript",a.id="analytics-js",a.async=!0,a.src=("https:"===document.location.protocol?"https://":"http://")+"cdn.segment.com/analytics.js/v1/"+t+"/analytics.min.js";var n=document.getElementsByTagName("script")[0];n.parentNode.insertBefore(a,n)}},window.analytics.SNIPPET_VERSION="2.0.9",
4
- window.analytics.load("<%= ENV["SEGMENT_KEY"] %>");
5
- window.analytics.page();
3
+ !function(){var analytics=window.analytics=window.analytics||[];if(!analytics.initialize)if(analytics.invoked)window.console&&console.error&&console.error("Segment snippet included twice.");else{analytics.invoked=!0;analytics.methods=["trackSubmit","trackClick","trackLink","trackForm","pageview","identify","reset","group","track","ready","alias","debug","page","once","off","on"];analytics.factory=function(t){return function(){var e=Array.prototype.slice.call(arguments);e.unshift(t);analytics.push(e);return analytics}};for(var t=0;t<analytics.methods.length;t++){var e=analytics.methods[t];analytics[e]=analytics.factory(e)}analytics.load=function(t){var e=document.createElement("script");e.type="text/javascript";e.async=!0;e.src=("https:"===document.location.protocol?"https://":"http://")+"cdn.segment.com/analytics.js/v1/"+t+"/analytics.min.js";var n=document.getElementsByTagName("script")[0];n.parentNode.insertBefore(e,n)};analytics.SNIPPET_VERSION="4.0.0";
4
+ analytics.load("<%= ENV["SEGMENT_KEY"] %>");
5
+ analytics.page();
6
+ }}();
6
7
  </script>
7
8
  <% end %>
@@ -11,7 +11,10 @@ fi
11
11
 
12
12
  PARENT_APP_NAME=<%= app_name.dasherize %>-staging
13
13
  APP_NAME=<%= app_name.dasherize %>-staging-pr-$1
14
- URL=`heroku pg:backups public-url -a $PARENT_APP_NAME`
14
+
15
+ heroku pg:backups:capture --app $PARENT_APP_NAME
16
+
17
+ URL=`heroku pg:backups public-url --app $PARENT_APP_NAME`
15
18
 
16
19
  heroku pg:backups restore $URL DATABASE_URL --confirm $APP_NAME --app $APP_NAME
17
20
  heroku run rake db:migrate --exit-code --app $APP_NAME
@@ -1,12 +1,4 @@
1
1
  if Rails.env.development? || Rails.env.test?
2
- require "bundler/audit/cli"
3
-
4
- namespace :bundler do
5
- desc "Updates the ruby-advisory-db and runs audit"
6
- task :audit do
7
- %w(update check).each do |command|
8
- Bundler::Audit::CLI.start [command]
9
- end
10
- end
11
- end
2
+ require "bundler/audit/task"
3
+ Bundler::Audit::Task.new
12
4
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: voyage
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.44.0.7
4
+ version: 1.44.0.8
5
5
  platform: ruby
6
6
  authors:
7
7
  - thoughtbot, headway
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2017-02-13 00:00:00.000000000 Z
11
+ date: 2017-04-02 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bitters
@@ -44,14 +44,14 @@ dependencies:
44
44
  requirements:
45
45
  - - "~>"
46
46
  - !ruby/object:Gem::Version
47
- version: 5.0.1
47
+ version: 5.1.0.rc1
48
48
  type: :runtime
49
49
  prerelease: false
50
50
  version_requirements: !ruby/object:Gem::Requirement
51
51
  requirements:
52
52
  - - "~>"
53
53
  - !ruby/object:Gem::Version
54
- version: 5.0.1
54
+ version: 5.1.0.rc1
55
55
  - !ruby/object:Gem::Dependency
56
56
  name: rspec
57
57
  requirement: !ruby/object:Gem::Requirement
@@ -115,10 +115,12 @@ files:
115
115
  - lib/voyage/templates/analytics_ruby_initializer.rb
116
116
  - lib/voyage/templates/application.js
117
117
  - lib/voyage/templates/auto_annotate_models.rake
118
+ - lib/voyage/templates/config_dj_rails5_patches.rb
118
119
  - lib/voyage/templates/config_locales_en.yml.erb
119
120
  - lib/voyage/templates/controller_helpers.rb
120
121
  - lib/voyage/templates/custom_cancan_matchers.rb
121
122
  - lib/voyage/templates/devise_registrations_controller.rb
123
+ - lib/voyage/templates/favicon.ico
122
124
  - lib/voyage/templates/rails_helper.rb.erb
123
125
  - lib/voyage/templates/rubocop.yml
124
126
  - lib/voyage/templates/seeder.rb.erb
@@ -200,7 +202,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
200
202
  version: '0'
201
203
  requirements: []
202
204
  rubyforge_project:
203
- rubygems_version: 2.6.10
205
+ rubygems_version: 2.6.11
204
206
  signing_key:
205
207
  specification_version: 4
206
208
  summary: Generate a Rails app using headway's best practices.