Last active
July 15, 2021 23:48
-
-
Save yohfee/674fefebb1a33a828096fbb57ac13877 to your computer and use it in GitHub Desktop.
rails template
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# rails new app_name --database=mysql -m https://gist.github.com/yohfee/674fefebb1a33a828096fbb57ac13877/raw/9e5db01584b8ced1aa9b6e013de369744bbd63d5/app_template.rb | |
gem 'simple_form' | |
gem 'slim-rails' | |
gem 'high_voltage' | |
gem 'autoprefixer-rails' | |
gem 'recipient_interceptor' | |
gem 'title' | |
gem 'bourbon' | |
gem 'neat' | |
gem 'delayed_job_active_record' | |
gem_group :production do | |
gem 'rack-timeout' | |
end | |
gem_group :development, :test do | |
gem 'rspec-rails' | |
gem 'factory_bot_rails' | |
gem 'bullet' | |
gem 'awesome_print' | |
gem 'pry-byebug' | |
gem 'pry-rails' | |
gem 'bundler-audit', require: false | |
gem 'dotenv-rails' | |
end | |
gem_group :development do | |
gem 'spring-commands-rspec' | |
gem 'rack-mini-profiler', require: false | |
end | |
gem_group :test do | |
gem 'formulaic' | |
gem 'timecop' | |
gem 'webmock' | |
gem 'shoulda-matchers' | |
gem 'simplecov', require: false | |
gem 'capybara-selenium' | |
gem 'chromedriver-helper' | |
gem 'launchy' | |
end | |
initializers 'rack_mini_profiler.rb', <<~CODE | |
if ENV["RACK_MINI_PROFILER"].to_i > 0 | |
require "rack-mini-profiler" | |
Rack::MiniProfilerRails.initialize!(Rails.application) | |
end | |
CODE | |
initializers 'recipient_interceptor.rb', <<~CODE | |
if ENV["EMAIL_RECIPIENTS"].present? | |
Mail.register_interceptor RecipientInterceptor.new(ENV["EMAIL_RECIPIENTS"]) | |
end | |
CODE | |
initializers 'json_encoding.rb', <<~CODE | |
ActiveSupport::JSON::Encoding.time_precision = 0 | |
CODE | |
initializers 'active_job.rb', <<~CODE | |
require "active_job/logging" | |
ActiveSupport::Notifications.unsubscribe("enqueue.active_job") | |
module ActiveJob | |
module Logging | |
class EnqueueLogSubscriber < LogSubscriber | |
define_method :enqueue, instance_method(:enqueue) | |
end | |
end | |
end | |
ActiveJob::Logging::EnqueueLogSubscriber.attach_to(:active_job) | |
CODE | |
initializers 'errors.rb', <<~CODE | |
require "net/http" | |
require "net/smtp" | |
# Example: | |
# begin | |
# some http call | |
# rescue *HTTP_ERRORS => error | |
# notify_hoptoad error | |
# end | |
HTTP_ERRORS = [ | |
EOFError, | |
Errno::ECONNRESET, | |
Errno::EINVAL, | |
Net::HTTPBadResponse, | |
Net::HTTPHeaderSyntaxError, | |
Net::ProtocolError, | |
Timeout::Error, | |
] | |
SMTP_SERVER_ERRORS = [ | |
IOError, | |
Net::SMTPAuthenticationError, | |
Net::SMTPServerBusy, | |
Net::SMTPUnknownError, | |
Timeout::Error, | |
] | |
SMTP_CLIENT_ERRORS = [ | |
Net::SMTPFatalError, | |
Net::SMTPSyntaxError, | |
] | |
SMTP_ERRORS = SMTP_SERVER_ERRORS + SMTP_CLIENT_ERRORS | |
CODE | |
file 'spec/support/features.rb', <<~CODE | |
# Extend this module in spec/support/features/*.rb | |
module Features | |
include Formulaic::Dsl | |
end | |
CODE | |
file 'spec/support/shoulda_matchers.rb', <<~CODE | |
Shoulda::Matchers.configure do |config| | |
config.integrate do |with| | |
with.test_framework :rspec | |
with.library :rails | |
end | |
end | |
CODE | |
file 'spec/support/i18n.rb', <<~CODE | |
RSpec.configure do |config| | |
config.include ActionView::Helpers::TranslationHelper | |
end | |
CODE | |
file 'spec/support/action_mailer.rb', <<~CODE | |
RSpec.configure do |config| | |
config.before(:each) do | |
ActionMailer::Base.deliveries.clear | |
end | |
end | |
CODE | |
file 'spec/factories.rb', <<~CODE | |
FactoryBot.define do | |
end | |
CODE | |
file 'spec/support/factory_bot.rb', <<~CODE | |
RSpec.configure do |config| | |
config.include FactoryBot::Syntax::Methods | |
end | |
CODE | |
file 'spec/support/chromedriver.rb', <<~CODE | |
require "selenium/webdriver" | |
Capybara.register_driver :chrome do |app| | |
Capybara::Selenium::Driver.new(app, browser: :chrome) | |
end | |
Capybara.register_driver :headless_chrome do |app| | |
capabilities = Selenium::WebDriver::Remote::Capabilities.chrome( | |
chromeOptions: { args: %w(headless disable-gpu) }, | |
) | |
Capybara::Selenium::Driver.new app, | |
browser: :chrome, | |
desired_capabilities: capabilities | |
end | |
Capybara.javascript_driver = :headless_chrome | |
CODE | |
file 'browserslist', <<~CODE | |
Last 2 versions | |
Explorer >= 11 | |
Android >= 4.4 | |
CODE | |
file 'app/helpers/flashes_helper.rb', <<~CODE | |
module FlashesHelper | |
def user_facing_flashes | |
flash.to_hash.slice("alert", "error", "notice", "success") | |
end | |
end | |
CODE | |
file 'app/views/application/_flashes.html.slim', <<~CODE | |
- if flash.any? | |
.flashes | |
- user_facing_flashes.each do |key, value| | |
div(class = "flash-#{key}") = value | |
CODE | |
remove_file 'app/views/layouts/application.html.erb' | |
file 'app/views/layouts/application.html.slim', <<~CODE | |
doctype html | |
html(lang = I18n.locale) | |
head | |
meta(charset = "utf-8") | |
meta(name = "viewport" content = "width=device-width, initial-scale=1, shrink-to-fit=no") | |
title = title | |
= csrf_meta_tags | |
= csp_meta_tag | |
= stylesheet_link_tag :application, media: "all", 'data-turbolinks-track': 'reload' | |
- if Rails.env.test? | |
sass: | |
* | |
transition-property: none !important | |
= javascript_include_tag :application, 'data-turbolinks-track': 'reload' | |
body | |
= render "flashes" | |
= yield | |
CODE | |
remvove_file 'app/assets/stylesheets/application.css' | |
file 'app/assets/stylesheets/application.scss', <<~CODE | |
@charset "utf-8"; | |
@import "normalize.css/normalize"; | |
@import "bourbon"; | |
@import "neat"; | |
@import "base/base"; | |
CODE | |
file 'config/smtp.rb', <<~CODE | |
SMTP_SETTINGS = { | |
address: ENV.fetch("SMTP_ADDRESS"), # example: "smtp.sendgrid.net" | |
authentication: :plain, | |
domain: ENV.fetch("SMTP_DOMAIN"), # example: "heroku.com" | |
enable_starttls_auto: true, | |
password: ENV.fetch("SMTP_PASSWORD"), | |
port: "587", | |
user_name: ENV.fetch("SMTP_USERNAME") | |
} | |
CODE | |
file 'Procfile', <<~CODE | |
web: bundle exec puma -p $PORT -C ./config/puma.rb | |
worker: bundle exec rails jobs:work | |
CODE | |
environment <<~CODE | |
config.action_controller.action_on_unpermitted_parameters = :raise | |
config.assets.quiet = true | |
config.active_job.queue_adapter = :delayed_job | |
config.generators do |generate| | |
generate.helper false | |
generate.javascripts false | |
generate.request_specs false | |
generate.routing_specs false | |
generate.stylesheets false | |
generate.test_framework :rspec | |
generate.view_specs false | |
end | |
CODE | |
environment <<~CODE, env: 'test' | |
config.assets.raise_runtime_errors = true | |
config.action_mailer.default_url_options = { host: "www.example.com" } | |
config.action_mailer.asset_host = "http://www.example.com" | |
config.active_job.queue_adapter = :inline | |
config.action_view.raise_on_missing_translations = true | |
CODE | |
environment <<~CODE, env: 'development' | |
config.action_mailer.raise_delivery_errors = true | |
config.action_mailer.delivery_method = :file | |
config.action_mailer.default_url_options = { host: "localhost:3000" } | |
config.action_mailer.asset_host = "http://localhost:3000" | |
config.action_view.raise_on_missing_translations = true | |
config.after_initialize do | |
Bullet.enable = true | |
Bullet.bullet_logger = true | |
Bullet.rails_logger = true | |
end | |
CODE | |
environment <<~CODE, env: 'production' | |
config.force_ssl = true | |
config.public_file_server.headers = { | |
"Cache-Control" => "public, max-age=31557600", | |
} | |
config.action_controller.asset_host = ENV.fetch("ASSET_HOST", ENV.fetch("APPLICATION_HOST")) | |
config.action_mailer.default_url_options = { host: ENV.fetch("APPLICATION_HOST") } | |
config.action_mailer.asset_host = ENV.fetch("ASSET_HOST", ENV.fetch("APPLICATION_HOST")) | |
config.action_mailer.delivery_method = :smtp | |
config.action_mailer.smtp_settings = SMTP_SETTING | |
config.middleware.use Rack::Deflater | |
end | |
rakefile 'bundler_audit.rake', <<~CODE | |
if Rails.env.development? || Rails.env.test? | |
require "bundler/audit/task" | |
Bundler::Audit::Task.new | |
end | |
CODE | |
prepend_to_file 'config/environments/production.rb', 'require Rails.root.join("config/smtp")' | |
gsub_file 'config/initializers/assets.rb', /^(Rails\.application\.config\.assets\.version = )(.*)$/, '\1ENV["ASSETS_VERSION"] || \2' | |
comment_lines 'config/initializers/wrap_parameters.rb', <<~CODE | |
ActiveSupport.on_load(:action_controller) do | |
wrap_parameters format: [:json] | |
end | |
CODE | |
uncomment_lines 'config/puma.rb', 'workers ENV.fetch("WEB_CONCURRENCY") { 2 }' | |
uncomment_lines 'config/puma.rb', 'preload_app!' | |
append_to_file 'config/locales/en.yml', <<-CODE | |
titles: | |
application: | |
CODE | |
gsub_file 'config/database.yml', /^\s+encoding: utf8$/, <<-CODE | |
charset: utf8mb4 | |
encoding: utf8mb4 | |
collation: utf8mb4_bin | |
CODE | |
[404, 422, 500].each do |n| | |
insert_into_file "public/#{n}.html", <<~CODE, after: '<head>' | |
<meta charset="utf-8" /> | |
<meta name="viewport" content="initial-scale=1" /> | |
CODE | |
end | |
run 'yarn add normalize.css' | |
after_bundle do | |
run 'bundle exec spring binstub --all' | |
run 'bundle exec bitters install --path app/assets/stylesheets' | |
generate 'simple_form:install' | |
generate 'rspec:install' | |
generate 'delayed_job:active_record' | |
'spec/rails_helper.rb'.tap do |f| | |
uncomment_lines f, /^# Dir\[Rails\.root\.join\('spec', 'support'.*$/ | |
insert_into_file f, " config.include Features, type: :feature\n\n", after: "RSpec.configure do |config|\n" | |
prepend_to_file f, <<~CODE | |
if ENV.fetch("COVERAGE", false) | |
require "simplecov" | |
SimpleCov.coverage_dir(File.join(ENV["CIRCLE_ARTIFACTS"], "coverage")) if ENV["CIRCLE_ARTIFACTS"] | |
SimpleCov.start "rails" | |
end | |
require 'timecop' | |
require 'webmock/rspec' | |
CODE | |
append_to_file f, <<~CODE | |
Timecop.safe_mode = true | |
WebMock.disable_net_connect!(allow_localhost: true) | |
CODE | |
end | |
rails_command "db:create" | |
rails_command "db:migrate" | |
git :init | |
git add: "." | |
end |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment