Skip to content

Instantly share code, notes, and snippets.

@yohfee
Last active July 15, 2021 23:48
Show Gist options
  • Save yohfee/674fefebb1a33a828096fbb57ac13877 to your computer and use it in GitHub Desktop.
Save yohfee/674fefebb1a33a828096fbb57ac13877 to your computer and use it in GitHub Desktop.
rails template
# 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