bluebase_api 1.1.1

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 (60) hide show
  1. checksums.yaml +7 -0
  2. data/.envrc +1 -0
  3. data/.gitignore +22 -0
  4. data/.hound.yml +6 -0
  5. data/.rubocop.yml +12 -0
  6. data/.ruby-gemset +1 -0
  7. data/.ruby-version +1 -0
  8. data/Gemfile +4 -0
  9. data/LICENSE.txt +22 -0
  10. data/README.md +85 -0
  11. data/Rakefile +8 -0
  12. data/bin/bluebase_api +13 -0
  13. data/bin/build +6 -0
  14. data/bin/bundler +16 -0
  15. data/bin/rake +16 -0
  16. data/bin/rspec +16 -0
  17. data/bluebase_api.gemspec +31 -0
  18. data/lib/bluebase_api.rb +4 -0
  19. data/lib/bluebase_api/actions.rb +25 -0
  20. data/lib/bluebase_api/app_builder.rb +379 -0
  21. data/lib/bluebase_api/generators/app_generator.rb +151 -0
  22. data/lib/bluebase_api/version.rb +5 -0
  23. data/spec/fakes/bin/heroku +5 -0
  24. data/spec/fakes/bin/hub +5 -0
  25. data/spec/features/github_spec.rb +10 -0
  26. data/spec/features/heroku_spec.rb +24 -0
  27. data/spec/features/new_project_spec.rb +68 -0
  28. data/spec/spec_helper.rb +24 -0
  29. data/spec/support/bluebase_api.rb +49 -0
  30. data/spec/support/fake_github.rb +21 -0
  31. data/spec/support/fake_heroku.rb +32 -0
  32. data/templates/.envrc +1 -0
  33. data/templates/.hound.yml +12 -0
  34. data/templates/.rspec +2 -0
  35. data/templates/.rubocop.yml +20 -0
  36. data/templates/Gemfile.erb +65 -0
  37. data/templates/Guardfile +43 -0
  38. data/templates/README.md.erb +30 -0
  39. data/templates/app/controllers/api/base_controller.rb +3 -0
  40. data/templates/app/controllers/bluebase_api_application_controller.rb +5 -0
  41. data/templates/bin/setup +27 -0
  42. data/templates/bluebase_api_gitignore +18 -0
  43. data/templates/config/application.yml.sample.erb +27 -0
  44. data/templates/config/bluebase_api_routes.rb +7 -0
  45. data/templates/config/bluebase_api_secrets.yml +14 -0
  46. data/templates/config/database.yml.sample.erb +15 -0
  47. data/templates/config/database.yml.travis.erb +4 -0
  48. data/templates/config/devise.rb +298 -0
  49. data/templates/config/en.yml.erb +19 -0
  50. data/templates/config/figaro.rb +2 -0
  51. data/templates/config/i18n-tasks.yml +93 -0
  52. data/templates/config/smtp.rb +9 -0
  53. data/templates/config/staging.rb.erb +9 -0
  54. data/templates/spec/action_mailer.rb +5 -0
  55. data/templates/spec/database_cleaner_and_factory_girl_lint.rb +26 -0
  56. data/templates/spec/factory_girl.rb +3 -0
  57. data/templates/spec/i18n.rb +3 -0
  58. data/templates/spec/rails_helper.rb +32 -0
  59. data/templates/spec/spec_helper.rb +17 -0
  60. metadata +194 -0
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: d6ddcaa4125f7f7b4ae65c32b1b4c12c243b4809
4
+ data.tar.gz: 238f701b724851a0af98c568cc9b046fb4e55909
5
+ SHA512:
6
+ metadata.gz: 93ed4092807a3c739e96d36394bd15fc38d613db67b97b73ec71f92614cdd7ba8595b4a6a58296b3a488f379f69ea8d14ee97b6e0288deb3fe9749c123221a4f
7
+ data.tar.gz: 00259e82b18122fe23bd387c66183a3cea3f61556999215fea1ee5dd1d6473424d9d8c690692216dfdbbf6c8f9500554c6e264338df84c585be81b0f004310b1
data/.envrc ADDED
@@ -0,0 +1 @@
1
+ PATH_add bin
@@ -0,0 +1,22 @@
1
+ *.gem
2
+ *.rbc
3
+ .bundle
4
+ .config
5
+ .yardoc
6
+ Gemfile.lock
7
+ InstalledFiles
8
+ _yardoc
9
+ coverage
10
+ doc/
11
+ lib/bundler/man
12
+ pkg
13
+ rdoc
14
+ spec/reports
15
+ test/tmp
16
+ test/version_tmp
17
+ tmp
18
+ *.bundle
19
+ *.so
20
+ *.o
21
+ *.a
22
+ mkmf.log
@@ -0,0 +1,6 @@
1
+ ruby:
2
+ enabled: true
3
+ config_file: ./.rubocop.yml
4
+
5
+ # Show cop names by default; can commment out if needed
6
+ ShowCopNames: true
@@ -0,0 +1,12 @@
1
+ AllCops:
2
+ Exclude: ~
3
+
4
+ Metrics/LineLength:
5
+ Description: 'Limit lines to 110 characters.'
6
+ Max: 110
7
+
8
+ Style/StringLiterals:
9
+ Enabled: false
10
+
11
+ Style/Documentation:
12
+ Enabled: false
@@ -0,0 +1 @@
1
+ bluebase_api
@@ -0,0 +1 @@
1
+ 2.2.0
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in bluebase_api.gemspec
4
+ gemspec
@@ -0,0 +1,22 @@
1
+ Copyright (c) 2014 Cal Blueprint
2
+
3
+ MIT License
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining
6
+ a copy of this software and associated documentation files (the
7
+ "Software"), to deal in the Software without restriction, including
8
+ without limitation the rights to use, copy, modify, merge, publish,
9
+ distribute, sublicense, and/or sell copies of the Software, and to
10
+ permit persons to whom the Software is furnished to do so, subject to
11
+ the following conditions:
12
+
13
+ The above copyright notice and this permission notice shall be
14
+ included in all copies or substantial portions of the Software.
15
+
16
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
@@ -0,0 +1,85 @@
1
+ # Bluebase
2
+
3
+ The base API for Blueprint's Rails mobile applications.
4
+
5
+ ## Features
6
+
7
+ Core gems:
8
+ - [Thin](https://github.com/macournoyer/thin/) for the server
9
+ - [Postgres](https://rubygems.org/gems/pg) to use postgres as the database
10
+ - [Figaro](https://github.com/laserlemon/figaro) for environment variables
11
+
12
+ Component gems:
13
+ - [Devise](https://github.com/plataformatec/devise) for user auth
14
+ - [Gon](https://github.com/gazay/gon) to push data to javascript
15
+ - [Kaminari](https://github.com/amatsuda/kaminari) for pagination
16
+ - [Recipient Interceptor](https://github.com/croaky/recipient_interceptor) to stop email sending from staging
17
+
18
+ Development gems:
19
+ - [Annotate](https://github.com/ctran/annotate_models) to annotate models
20
+ - [FFaker](https://github.com/EmmanuelOga/ffaker) to generate random data
21
+ - [Better Errors](https://github.com/charliesome/better_errors) + [Binding of Caller](https://github.com/banister/binding_of_caller) for useful error pages
22
+ - [Quiet Assets](https://github.com/evrone/quiet_assets) to quiet asset rending output in the server
23
+ - [Spring](https://github.com/rails/spring) for fast commands
24
+ - [Rubocop](https://github.com/bbatsov/rubocop) for Rails linting
25
+ - [I18n Tasks](https://github.com/glebm/i18n-tasks) to lint translation files
26
+ - [Awesome Print](https://github.com/michaeldv/awesome_print) for better console object printing
27
+ - [Guard](https://github.com/guard/guard) to run tasks on file changes
28
+ - [Pry](https://github.com/pry/pry) and [Pry Byebug](https://github.com/deivid-rodriguez/pry-byebug) to explore objects and debug
29
+
30
+ Test gems:
31
+ - [RSpec](https://github.com/rspec/rspec-rails) for specs
32
+ - [Capybara](https://github.com/jnicklas/capybara) for integration tests
33
+ - [FactoryGirl](https://github.com/thoughtbot/factory_girl) for test data
34
+ - [Shoulda Matchers](https://github.com/thoughtbot/shoulda) for common RSpec matchers
35
+ - Launchy to use ```save_and_open_page``` in Capybara
36
+ - [Database Cleaner](https://github.com/DatabaseCleaner/database_cleaner) to clear the database for specs
37
+ - [CodeClimate Test Reporter](https://github.com/codeclimate/ruby-test-reporter) to track test coverage
38
+
39
+ Production gems/features (most of these require setup):
40
+ - New Relic for monitoring performance
41
+ - Rollbar for error logging
42
+ - Rails 12Factor for Heroku
43
+
44
+ Other features:
45
+ - Staging environment config
46
+ - Email config using SMTP
47
+ - The ```./bin/setup``` convention for new developer setup
48
+ - Rails' flashes set up and in application layout
49
+ - Configuration for Rubocop/[Hound](https://houndci.com/)
50
+ - A Guardfile set up with [Livereload](https://chrome.google.com/webstore/detail/livereload/jnihajbhpnppcggbcgedagnkighmdlei?hl=en), RSpec, and Rubocop
51
+ - A few nice time formats set up for localization
52
+ - ```Rack::Deflater``` to compress responses with Gzip
53
+ - A low database connection pool limit
54
+ - ```t()``` and ```l()``` in specs without prefixing with I18n
55
+ - An automatically-created ```SECRET_KEY_BASE``` environment variable in all environments.
56
+ - Config for Google Analytics
57
+
58
+ ## Installation
59
+
60
+ Run
61
+
62
+ gem install bluebase_api
63
+
64
+ Then you can run
65
+
66
+ bluebase_api app_name
67
+
68
+ To create an app called ```app_name```. Optionally append ```-G repo_name``` and ```-H``` to create a Github repo and staging + production Heroku apps, respectively.
69
+
70
+ ## Contributing
71
+
72
+ Feel free to open issues or send pull requests with improvements. Thanks in
73
+ advance for your help!
74
+
75
+ ## Cal Blueprint
76
+ ![bp](http://bptech.berkeley.edu/assets/logo-full-large-d6419503b443e360bc6c404a16417583.png "BP Banner")
77
+ **[Cal Blueprint](http://www.calblueprint.org/)** is a student-run UC Berkeley organization devoted to matching the skills of its members to our desire to see social good enacted in our community. Each semester, teams of 4-5 students work closely with a non-profit to bring technological solutions to the problems they face every day.
78
+
79
+ ## Credits
80
+ Bluebase is a fork of thoughtbot's [suspenders](https://github.com/thoughtbot/suspenders)
81
+
82
+ ## License
83
+
84
+ Bluebase is Copyright © 2014 Cal Blueprint. It is free software, and may be redistributed under the terms
85
+ specified in the LICENSE.txt file.
@@ -0,0 +1,8 @@
1
+ require 'bundler/setup'
2
+ require 'bundler/gem_tasks'
3
+ require 'rspec/core/rake_task'
4
+
5
+ RSpec::Core::RakeTask.new(:rspec)
6
+
7
+ desc 'Run the test suite'
8
+ task default: :rspec
@@ -0,0 +1,13 @@
1
+ #!/usr/bin/env ruby
2
+ require 'pathname'
3
+
4
+ source_path = (Pathname.new(__FILE__).dirname + '../lib').expand_path
5
+ $LOAD_PATH << source_path
6
+
7
+ require 'bluebase_api'
8
+
9
+ templates_root = File.expand_path(File.join("..", "templates"), File.dirname(__FILE__))
10
+ Bluebase_api::AppGenerator.source_root templates_root
11
+ Bluebase_api::AppGenerator.source_paths << Rails::Generators::AppGenerator.source_root << templates_root
12
+
13
+ Bluebase_api::AppGenerator.start
@@ -0,0 +1,6 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require_relative "../lib/bluebase_api"
4
+ version = Bluebase_api::VERSION
5
+ %x(gem build bluebase_api.gemspec)
6
+ %x(gem install ./bluebase_api-#{version}.gem)
@@ -0,0 +1,16 @@
1
+ #!/usr/bin/env ruby
2
+ #
3
+ # This file was generated by Bundler.
4
+ #
5
+ # The application 'bundler' is installed as part of a gem, and
6
+ # this file is here to facilitate running it.
7
+ #
8
+
9
+ require 'pathname'
10
+ ENV['BUNDLE_GEMFILE'] ||= File.expand_path("../../Gemfile",
11
+ Pathname.new(__FILE__).realpath)
12
+
13
+ require 'rubygems'
14
+ require 'bundler/setup'
15
+
16
+ load Gem.bin_path('bluebase_api', 'bundler')
@@ -0,0 +1,16 @@
1
+ #!/usr/bin/env ruby
2
+ #
3
+ # This file was generated by Bundler.
4
+ #
5
+ # The application 'rake' is installed as part of a gem, and
6
+ # this file is here to facilitate running it.
7
+ #
8
+
9
+ require 'pathname'
10
+ ENV['BUNDLE_GEMFILE'] ||= File.expand_path("../../Gemfile",
11
+ Pathname.new(__FILE__).realpath)
12
+
13
+ require 'rubygems'
14
+ require 'bundler/setup'
15
+
16
+ load Gem.bin_path('bluebase_api', 'rake')
@@ -0,0 +1,16 @@
1
+ #!/usr/bin/env ruby
2
+ #
3
+ # This file was generated by Bundler.
4
+ #
5
+ # The application 'rspec' is installed as part of a gem, and
6
+ # this file is here to facilitate running it.
7
+ #
8
+
9
+ require 'pathname'
10
+ ENV['BUNDLE_GEMFILE'] ||= File.expand_path("../../Gemfile",
11
+ Pathname.new(__FILE__).realpath)
12
+
13
+ require 'rubygems'
14
+ require 'bundler/setup'
15
+
16
+ load Gem.bin_path('bluebase_api', 'rspec')
@@ -0,0 +1,31 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'bluebase_api/version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = "bluebase_api"
8
+ spec.version = Bluebase_api::VERSION
9
+ spec.authors = ["Sam Lau, Tricia Fu and Quinton Dang", "Cal Blueprint"]
10
+ spec.email = ["team@calblueprint.org"]
11
+ spec.summary = "Bluebase_api creates a Rails API app with all of our favorite defaults."
12
+ spec.description = <<-HERE
13
+ Bluebase_api is Blueprint's base Rails API app. We use it internally to get a jump start on our Rails projects.
14
+ HERE
15
+ spec.homepage = "https://github.com/calblueprint/bluebase_api"
16
+ spec.license = "MIT"
17
+
18
+ spec.files = `git ls-files -z`.split("\x0")
19
+ spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
20
+ spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
21
+ spec.require_paths = ["lib"]
22
+
23
+ spec.required_ruby_version = ">= #{Bluebase_api::RUBY_VERSION}"
24
+
25
+ spec.add_runtime_dependency "rails", Bluebase_api::RAILS_VERSION
26
+ spec.add_runtime_dependency "bundler", "~> 1.6"
27
+
28
+ spec.add_development_dependency "rspec", "~> 3.2", ">= 3.2.0"
29
+ spec.add_development_dependency "pry", "~> 0.10"
30
+ spec.add_development_dependency "capybara", "~> 2.4"
31
+ end
@@ -0,0 +1,4 @@
1
+ require_relative "bluebase_api/version"
2
+ require_relative "bluebase_api/generators/app_generator"
3
+ require_relative "bluebase_api/actions"
4
+ require_relative "bluebase_api/app_builder"
@@ -0,0 +1,25 @@
1
+ module Bluebase_api
2
+ module Actions
3
+ def replace_in_file(relative_path, find, replace)
4
+ path = File.join(destination_root, relative_path)
5
+ contents = IO.read(path)
6
+ unless contents.gsub!(find, replace)
7
+ raise "#{find.inspect} not found in #{relative_path}"
8
+ end
9
+ File.open(path, "w") { |file| file.write(contents) }
10
+ end
11
+
12
+ def action_mailer_host(rails_env, host)
13
+ host_config = "config.action_mailer.default_url_options = { host: '#{host}' }"
14
+ configure_environment(rails_env, host_config)
15
+ end
16
+
17
+ def configure_environment(rails_env, config)
18
+ inject_into_file(
19
+ "config/environments/#{rails_env}.rb",
20
+ "\n\n #{config}",
21
+ before: "\nend"
22
+ )
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,379 @@
1
+ module Bluebase_api
2
+ class AppBuilder < Rails::AppBuilder
3
+ include Bluebase_api::Actions
4
+
5
+ #########################################################
6
+ # Root directory files
7
+ #########################################################
8
+ def readme
9
+ template "README.md.erb", "README.md"
10
+ end
11
+
12
+ def replace_gemfile
13
+ remove_file "Gemfile"
14
+ template "Gemfile.erb", "Gemfile"
15
+ end
16
+
17
+ def add_envrc
18
+ copy_file ".envrc", ".envrc"
19
+ end
20
+
21
+ def replace_gitignore
22
+ remove_file ".gitignore"
23
+ copy_file "bluebase_api_gitignore", ".gitignore"
24
+ end
25
+
26
+ def add_rubocop_and_hound_config
27
+ copy_file ".hound.yml", ".hound.yml"
28
+ copy_file ".rubocop.yml", ".rubocop.yml"
29
+ end
30
+
31
+ def add_rvm_config
32
+ create_file ".ruby-gemset", "#{app_path}\n"
33
+ create_file ".ruby-version", "#{Bluebase_api::RUBY_VERSION}\n"
34
+ end
35
+
36
+ def add_guardfile
37
+ copy_file "Guardfile", "Guardfile"
38
+ end
39
+
40
+ def add_dot_rspec
41
+ copy_file ".rspec", ".rspec"
42
+ end
43
+
44
+ #########################################################
45
+ # app/ directory files
46
+ #########################################################
47
+
48
+ # Only front-end changes were contained here, so removed for API app.
49
+ def configure_api_directory
50
+ empty_directory "app/controllers/api"
51
+ end
52
+
53
+ def configure_v1_directory
54
+ empty_directory_with_keep_file "app/controllers/api/v1"
55
+ end
56
+
57
+ def add_base_controller
58
+ template "app/controllers/api/base_controller.rb", "app/controllers/api/base_controller.rb"
59
+ end
60
+
61
+ def replace_application_controller
62
+ file = "app/controllers/application_controller.rb"
63
+ remove_file file
64
+ template "app/controllers/bluebase_api_application_controller.rb", file
65
+ end
66
+
67
+ def add_serializers_directory
68
+ empty_directory_with_keep_file "app/serializers"
69
+ end
70
+
71
+ def remove_app_assets_directory
72
+ run "rm -rf app/assets"
73
+ end
74
+
75
+ def remove_app_views_directory
76
+ run "rm -rf app/views"
77
+ end
78
+
79
+ #########################################################
80
+ # vendor directory files
81
+ #########################################################
82
+ def remove_vendor_assets_directories
83
+ run "rm -rf vendor"
84
+ empty_directory_with_keep_file "vendor"
85
+ end
86
+ #########################################################
87
+ # public/ directory files
88
+ #########################################################
89
+ def remove_html_files
90
+ remove_file "public/404.html"
91
+ remove_file "public/422.html"
92
+ remove_file "public/500.html"
93
+ run "rm -rf public/favicon.ico"
94
+ end
95
+
96
+ #########################################################
97
+ # bin/ directory files
98
+ #########################################################
99
+ def add_setup_to_bin
100
+ copy_file "bin/setup", "bin/setup"
101
+ run "chmod a+x bin/setup"
102
+ end
103
+
104
+ #########################################################
105
+ # lib/ directory files
106
+ #########################################################
107
+ def remove_lib_assets_directory
108
+ run "rm -rf lib/assets"
109
+ end
110
+
111
+ #########################################################
112
+ # tmp/ directory files
113
+ #########################################################
114
+ def remove_tmp_assets_directory
115
+ run "rm -rf tmp/cache"
116
+ empty_directory_with_keep_file "tmp/cache"
117
+ end
118
+ #########################################################
119
+ # config/ directory files
120
+ #########################################################
121
+ def configure_application_environment
122
+ config = <<-RUBY
123
+
124
+ config.generators do |generate|
125
+ generate.helper false
126
+ generate.javascript_engine false
127
+ generate.request_specs false
128
+ generate.routing_specs false
129
+ generate.stylesheets false
130
+ generate.test_framework :rspec
131
+ generate.view_specs false
132
+ end
133
+
134
+ RUBY
135
+ inject_into_class "config/application.rb", "Application", config
136
+
137
+ config = <<-RUBY
138
+ config.active_record.default_timezone = :utc
139
+ RUBY
140
+ inject_into_class "config/application.rb", "Application", config
141
+
142
+ config = <<-RUBY
143
+ config.i18n.enforce_available_locales = true
144
+ RUBY
145
+ inject_into_class "config/application.rb", "Application", config
146
+
147
+ config = <<-RUBY
148
+ config.action_controller.action_on_unpermitted_parameters = :raise
149
+ RUBY
150
+
151
+ inject_into_class "config/application.rb", "Application", config
152
+ end
153
+
154
+ def configure_development_environment
155
+ replace_in_file "config/environments/development.rb",
156
+ "raise_delivery_errors = false", "raise_delivery_errors = true"
157
+ inject_into_file "config/environments/development.rb",
158
+ " # Don't send emails in development\n config.action_mailer.perform_deliveries = false",
159
+ after: "raise_delivery_errors = true\n"
160
+ raise_on_missing_translations_in "development"
161
+ action_mailer_host "development", "localhost:3000"
162
+ end
163
+
164
+ def configure_test_environment
165
+ raise_on_missing_translations_in "test"
166
+ end
167
+
168
+ def configure_production_environment
169
+ prepend_file "config/environments/production.rb",
170
+ %{require Rails.root.join("config/smtp")\n}
171
+
172
+ config = <<-RUBY
173
+
174
+ config.action_mailer.delivery_method = :smtp
175
+ config.action_mailer.smtp_settings = SMTP_SETTINGS
176
+ RUBY
177
+ inject_into_file "config/environments/production.rb", config,
178
+ after: "config.action_mailer.raise_delivery_errors = false"
179
+
180
+ config = <<-RUBY
181
+
182
+ # Enable deflate / gzip compression of controller-generated responses
183
+ config.middleware.use Rack::Deflater
184
+ RUBY
185
+ inject_into_file "config/environments/production.rb", config,
186
+ after: "config.serve_static_assets = false\n"
187
+
188
+ action_mailer_host "production", "please-change-me.com"
189
+ end
190
+
191
+ def add_staging_environment
192
+ template "config/staging.rb.erb", "config/environments/staging.rb"
193
+ end
194
+
195
+ def add_devise_config
196
+ copy_file "config/devise.rb", "config/initializers/devise.rb"
197
+ end
198
+
199
+ def add_figaro_config
200
+ copy_file "config/figaro.rb", "config/initializers/figaro.rb"
201
+ end
202
+
203
+ def replace_en_yml
204
+ file = "config/locales/en.yml"
205
+ remove_file file
206
+ template "config/en.yml.erb", file
207
+ end
208
+
209
+ def add_application_yml
210
+ template "config/application.yml.sample.erb", "config/application.yml.sample"
211
+
212
+ template "config/application.yml.sample.erb", "config/application.yml"
213
+ replace_in_file "config/application.yml",
214
+ "# Copy this file into application.yml and change env variables as necessary.",
215
+ "# Change env variables as necessary."
216
+ end
217
+
218
+ def add_database_yml
219
+ template "config/database.yml.sample.erb", "config/database.yml.sample"
220
+
221
+ remove_file "config/database.yml"
222
+ template "config/database.yml.sample.erb", "config/database.yml"
223
+ replace_in_file "config/database.yml",
224
+ "# and then copy the file into database.yml", ""
225
+ end
226
+
227
+ def add_i18n_tasks_yml
228
+ file = "config/i18n-tasks.yml"
229
+ copy_file file, file
230
+ end
231
+
232
+ def replace_secrets_yml
233
+ file = "config/secrets.yml"
234
+ remove_file file
235
+ copy_file "config/bluebase_api_secrets.yml", file
236
+ end
237
+
238
+ def add_smtp_settings
239
+ file = "config/smtp.rb"
240
+ copy_file file, file
241
+ end
242
+
243
+ def replace_routes_rb
244
+ file = "config/routes.rb"
245
+ remove_file file
246
+ template "config/bluebase_api_routes.rb", file
247
+ end
248
+
249
+ #########################################################
250
+ # spec/ directory files
251
+ #########################################################
252
+ def add_spec_dirs
253
+ empty_directory "spec"
254
+ empty_directory_with_keep_file "spec/features"
255
+ empty_directory_with_keep_file "spec/factories"
256
+ end
257
+
258
+ def configure_rspec
259
+ %w(spec/rails_helper.rb spec/spec_helper.rb).each do |file|
260
+ copy_file file, file
261
+ end
262
+ end
263
+
264
+ def configure_factorygirl
265
+ copy_file "spec/factory_girl.rb", "spec/support/factory_girl.rb"
266
+ end
267
+
268
+ def configure_actionmailer
269
+ copy_file "spec/action_mailer.rb", "spec/support/action_mailer.rb"
270
+ end
271
+
272
+ def configure_i18n
273
+ copy_file "spec/i18n.rb", "spec/support/i18n.rb"
274
+ end
275
+
276
+ def configure_database_cleaner
277
+ copy_file "spec/database_cleaner_and_factory_girl_lint.rb",
278
+ "spec/support/database_cleaner_and_factory_girl_lint.rb"
279
+ end
280
+
281
+ #########################################################
282
+ # git/heroku setup
283
+ #########################################################
284
+ def git_init
285
+ run 'git init'
286
+ end
287
+
288
+ def create_github_repo(repo_name)
289
+ path_addition = override_path_for_tests
290
+ run "#{path_addition} hub create #{repo_name}"
291
+ end
292
+
293
+ def create_heroku_apps
294
+ run_heroku "create #{heroku_app_name :production}", "production"
295
+ run_heroku "create #{heroku_app_name :staging}", "staging"
296
+ run_heroku "config:add RACK_ENV=staging RAILS_ENV=staging", "staging"
297
+ end
298
+
299
+ def set_heroku_remotes
300
+ remotes = <<-SHELL
301
+
302
+ # Set up the staging and production apps.
303
+ #{join_heroku_app :staging}
304
+ #{join_heroku_app :production}
305
+ SHELL
306
+
307
+ append_file "bin/setup", remotes
308
+ end
309
+
310
+ def set_heroku_env_variables
311
+ config = <<-SHELL
312
+ # Sets Heroku env variables
313
+ figaro heroku:set -a #{heroku_app_name :production} -e production
314
+ figaro heroku:set -a #{heroku_app_name :staging} -e production
315
+ SHELL
316
+ append_file "bin/setup", config
317
+ end
318
+
319
+ def add_heroku_addons
320
+ config = <<-SHELL
321
+
322
+ # Heroku addons for production
323
+ heroku addons:add mandrill --app #{heroku_app_name :production}
324
+ heroku addons:add newrelic:stark --app #{heroku_app_name :production}
325
+ heroku addons:add rollbar --app #{heroku_app_name :production}
326
+ SHELL
327
+ append_file "bin/setup", config
328
+ end
329
+
330
+ def set_memory_management_variable
331
+ %w(staging production).each do |environment|
332
+ run_heroku "config:add NEW_RELIC_AGGRESSIVE_KEEPALIVE=1", environment
333
+ end
334
+ end
335
+
336
+ #########################################################
337
+ # Helper methods
338
+ #########################################################
339
+ private
340
+
341
+ def raise_on_missing_translations_in(environment)
342
+ config = "config.action_view.raise_on_missing_translations = true"
343
+
344
+ uncomment_lines("config/environments/#{environment}.rb", config)
345
+ end
346
+
347
+ def run_heroku(command, environment)
348
+ path_addition = override_path_for_tests
349
+ run "#{path_addition} heroku #{command} --remote #{environment}"
350
+ end
351
+
352
+ def heroku_app_name(environment)
353
+ "#{app_name.gsub '_', '-'}-#{environment}"
354
+ end
355
+
356
+ def join_heroku_app(environment)
357
+ name = heroku_app_name environment
358
+ <<-SHELL
359
+ if heroku join --app #{name} &> /dev/null; then
360
+ git remote add #{environment} git@heroku.com:#{name}.git || true
361
+ printf 'You are a collaborator on the "#{name}" Heroku app\n'
362
+ else
363
+ printf 'Ask for access to the "#{name}" Heroku app\n'
364
+ fi
365
+ SHELL
366
+ end
367
+
368
+ def generate_secret
369
+ SecureRandom.hex(64)
370
+ end
371
+
372
+ def override_path_for_tests
373
+ if ENV['TESTING']
374
+ support_bin = File.expand_path(File.join('..', '..', 'spec', 'fakes', 'bin'))
375
+ "PATH=#{support_bin}:$PATH"
376
+ end
377
+ end
378
+ end
379
+ end