run "if uname | grep -q 'Darwin'; then pgrep spring | xargs kill -9; fi" # GEMFILE ######################################## inject_into_file 'Gemfile', before: 'group :development, :test do' do <<~RUBY gem 'devise' gem 'autoprefixer-rails', '10.2.5' gem 'font-awesome-sass' gem 'simple_form' RUBY end inject_into_file 'Gemfile', after: 'group :development, :test do' do <<-RUBY gem 'pry-byebug' gem 'pry-rails' gem 'dotenv-rails' RUBY end gsub_file('Gemfile', /# gem 'redis'/, "gem 'redis'") # Assets ######################################## run 'rm -rf app/assets/stylesheets' run 'rm -rf vendor' run 'curl -L https://github.com/lewagon/rails-stylesheets/archive/master.zip > stylesheets.zip' run 'unzip stylesheets.zip -d app/assets && rm stylesheets.zip && mv app/assets/rails-stylesheets-master app/assets/stylesheets' # Dev environment ######################################## gsub_file('config/environments/development.rb', /config\.assets\.debug.*/, 'config.assets.debug = false') # Layout ######################################## if Rails.version < "6" scripts = <<~HTML <%= javascript_include_tag 'application', 'data-turbolinks-track': 'reload', defer: true %> <%= javascript_pack_tag 'application', 'data-turbolinks-track': 'reload' %> HTML gsub_file('app/views/layouts/application.html.erb', "<%= javascript_include_tag 'application', 'data-turbolinks-track': 'reload' %>", scripts) end gsub_file('app/views/layouts/application.html.erb', "<%= javascript_pack_tag 'application', 'data-turbolinks-track': 'reload' %>", "<%= javascript_pack_tag 'application', 'data-turbolinks-track': 'reload', defer: true %>") style = <<~HTML <%= stylesheet_link_tag 'application', media: 'all', 'data-turbolinks-track': 'reload' %> HTML gsub_file('app/views/layouts/application.html.erb', "<%= stylesheet_link_tag 'application', media: 'all', 'data-turbolinks-track': 'reload' %>", style) # Flashes ######################################## file 'app/views/shared/_flashes.html.erb', <<~HTML <% if notice %> <% end %> <% if alert %> <% end %> HTML run 'curl -L https://github.com/lewagon/awesome-navbars/raw/master/templates/_navbar_wagon.html.erb > app/views/shared/_navbar.html.erb' inject_into_file 'app/views/layouts/application.html.erb', after: '' do <<-HTML <%= render 'shared/navbar' %> <%= render 'shared/flashes' %> HTML end # README ######################################## markdown_file_content = <<-MARKDOWN Rails app generated with [lewagon/rails-templates](https://github.com/lewagon/rails-templates), created by the [Le Wagon coding bootcamp](https://www.lewagon.com) team. MARKDOWN file 'README.md', markdown_file_content, force: true # Generators ######################################## generators = <<~RUBY config.generators do |generate| generate.assets false generate.helper false generate.test_framework :test_unit, fixture: false end RUBY environment generators ######################################## # AFTER BUNDLE ######################################## after_bundle do # Generators: db + simple form + pages controller ######################################## rails_command 'db:drop db:create db:migrate' generate('simple_form:install', '--bootstrap') generate(:controller, 'pages', 'home', '--skip-routes', '--no-test-framework') # Routes ######################################## route "root to: 'pages#home'" # Git ignore ######################################## append_file '.gitignore', <<~TXT # Ignore .env file containing credentials. .env* # Ignore Mac and Linux file system files *.swp .DS_Store TXT # Devise install + user ######################################## generate('devise:install') generate('devise', 'User') # App controller ######################################## run 'rm app/controllers/application_controller.rb' file 'app/controllers/application_controller.rb', <<~RUBY class ApplicationController < ActionController::Base #{ "protect_from_forgery with: :exception\n" if Rails.version < "5.2"} before_action :authenticate_user! end RUBY # migrate + devise views ######################################## rails_command 'db:migrate' generate('devise:views') # Pages Controller ######################################## run 'rm app/controllers/pages_controller.rb' file 'app/controllers/pages_controller.rb', <<~RUBY class PagesController < ApplicationController skip_before_action :authenticate_user!, only: [ :home ] def home end end RUBY # Environments ######################################## environment 'config.action_mailer.default_url_options = { host: "http://localhost:3000" }', env: 'development' environment 'config.action_mailer.default_url_options = { host: "http://TODO_PUT_YOUR_DOMAIN_HERE" }', env: 'production' # Webpacker / Yarn ######################################## run 'yarn add popper.js jquery bootstrap@4.6' append_file 'app/javascript/packs/application.js', <<~JS // ---------------------------------------------------- // Note(lewagon): ABOVE IS RAILS DEFAULT CONFIGURATION // WRITE YOUR OWN JS STARTING FROM HERE 👇 // ---------------------------------------------------- // External imports import "bootstrap"; // Internal imports, e.g: // import { initSelect2 } from '../components/init_select2'; document.addEventListener('turbolinks:load', () => { // Call your functions here, e.g: // initSelect2(); }); JS inject_into_file 'config/webpack/environment.js', before: 'module.exports' do <<~JS const webpack = require('webpack'); // Preventing Babel from transpiling NodeModules packages environment.loaders.delete('nodeModules'); // Bootstrap 4 has a dependency over jQuery & Popper.js: environment.plugins.prepend('Provide', new webpack.ProvidePlugin({ $: 'jquery', jQuery: 'jquery', Popper: ['popper.js', 'default'] }) ); JS end # Dotenv ######################################## run 'touch .env' # Rubocop ######################################## run 'curl -L https://raw.githubusercontent.com/lewagon/rails-templates/master/.rubocop.yml > .rubocop.yml' # Git ######################################## git add: '.' git commit: "-m 'Initial commit with devise template from https://github.com/lewagon/rails-templates'" # Fix puma config gsub_file('config/puma.rb', 'pidfile ENV.fetch("PIDFILE") { "tmp/pids/server.pid" }', '# pidfile ENV.fetch("PIDFILE") { "tmp/pids/server.pid" }') end