Introducing 3 Days Project aka 3DP, a new Rails app generator template that adds and configures all the cool libraries/services that are needed to bootstrap new projects in no time.
Here is the magic one-liner command that does all the tricks for you:
rails new blog -m ~/Projects/3dp/rails-template.rb --skip-test-unit --skip-turbolinksLet's dive in and see whats going on under the hood but keep in mind that this project is in continuous development and things change quite often.
The first generation part is nothing than standard ``rails new`` generator in action, spitting out files and directories:
create
create README.md
create Rakefile
create .ruby-version
create config.ru
create .gitignore
create Gemfile
run git init from "."
Initialized empty Git repository in /home/icostan/Projects/icostan.gitlab.io/content/post/blog/.git/
create package.json
create app
create app/assets/config/manifest.js
create app/assets/javascripts/application.js
create app/assets/javascripts/cable.js
create app/assets/stylesheets/application.css
create app/channels/application_cable/channel.rb
create app/channels/application_cable/connection.rb
create app/controllers/application_controller.rb
create app/helpers/application_helper.rb
create app/jobs/application_job.rb
create app/mailers/application_mailer.rb
create app/models/application_record.rb
create app/views/layouts/application.html.erb
create app/views/layouts/mailer.html.erb
create app/views/layouts/mailer.text.erb
create app/assets/images/.keep
create app/assets/javascripts/channels
create app/assets/javascripts/channels/.keep
create app/controllers/concerns/.keep
create app/models/concerns/.keep
create bin
create bin/bundle
create bin/rails
create bin/rake
create bin/setup
create bin/update
create bin/yarn
create config
create config/routes.rb
create config/application.rb
create config/environment.rb
create config/cable.yml
create config/puma.rb
create config/storage.yml
create config/environments
create config/environments/development.rb
create config/environments/production.rb
create config/environments/test.rb
create config/initializers
create config/initializers/application_controller_renderer.rb
create config/initializers/assets.rb
create config/initializers/backtrace_silencers.rb
create config/initializers/content_security_policy.rb
create config/initializers/cookies_serializer.rb
create config/initializers/cors.rb
create config/initializers/filter_parameter_logging.rb
create config/initializers/inflections.rb
create config/initializers/mime_types.rb
create config/initializers/new_framework_defaults_5_2.rb
create config/initializers/wrap_parameters.rb
create config/locales
create config/locales/en.yml
create config/master.key
append .gitignore
create config/boot.rb
create config/database.yml
create db
create db/seeds.rb
create lib
create lib/tasks
create lib/tasks/.keep
create lib/assets
create lib/assets/.keep
create log
create log/.keep
create public
create public/404.html
create public/422.html
create public/500.html
create public/apple-touch-icon-precomposed.png
create public/apple-touch-icon.png
create public/favicon.ico
create public/robots.txt
create tmp
create tmp/.keep
create tmp/cache
create tmp/cache/assets
create vendor
create vendor/.keep
create test/fixtures
create test/fixtures/.keep
create test/fixtures/files
create test/fixtures/files/.keep
create test/controllers
create test/controllers/.keep
create test/mailers
create test/mailers/.keep
create test/models
create test/models/.keep
create test/helpers
create test/helpers/.keep
create test/integration
create test/integration/.keep
create test/test_helper.rb
create test/system
create test/system/.keep
create test/application_system_test_case.rb
create storage
create storage/.keep
create tmp/storage
create tmp/storage/.keep
remove config/initializers/cors.rb
remove config/initializers/new_framework_defaults_5_2.rb
Once default Rails app generation is finished, the 3DP project template is executed and it starts to inject needed gems and configuration files:
apply /home/icostan/Projects/3dp/rails-template.rb
identical .ruby-version
initializer generators.rb
Bootstrap front-end framework, SimpleForm with HAML templating, and Devise for authentication:
gemfile less-rails
gemfile less-rails-bootstrap
gemfile therubyracer
insert app/assets/stylesheets/application.css
insert app/assets/javascripts/application.js
create public/apple-touch-icon.ico
create public/apple-touch-icon-precomposed.ico
create public/css
create public/css/bootstrap.min.css
create public/css/styles.css
create public/js
create public/js/bootstrap.min.js
create public/index.html
gemfile haml-rails
gemfile simple_form
gemfile country_select
gemfile bootstrap-generators
gemfile momentjs-rails
gemfile bootstrap3-datetimepicker-rails
gemfile bower-rails
gemfile devise
Resque/Redis for background processing jobs:
gemfile redis
gemfile resque
gemfile resque-web
gemfile resque-scheduler
Lots of gems for testing, monitoring or linting:
- Cucumber - user acceptance testing
- RSpec - integration/unit testing
- Jasmine - headless JavaScript testing
- Factory_bot - mocking and dynamic fixtures
- Webmock - mocking HTTP requests
- VCR - record/reply HTTP interactions
gemfile rspec-rails
insert config/initializers/generators.rb
gemfile jasmine-rails
gemfile cucumber-rails
gemfile capybara-screenshot
gemfile database_cleaner
gemfile rubocop
gemfile guard
gemfile guard-rspec
gemfile guard-jasmine
gemfile factory_bot_rails
gemfile faker
gemfile vcr
gemfile webmock
gemfile rack-tracker
gemfile newrelic_rpm
gemfile rollbar
gemfile powder
Dependencies check and gems installation:
run bundle install
Fetching gem metadata from https://rubygems.org/.........
Fetching gem metadata from https://rubygems.org/.
Resolving dependencies......
Using rake 12.3.2
Using concurrent-ruby 1.1.5
Using i18n 1.6.0
Using minitest 5.11.3
Using thread_safe 0.3.6
Using tzinfo 1.2.5
Using activesupport 5.2.3
Using builder 3.2.3
Using erubi 1.8.0
Using mini_portile2 2.4.0
Using nokogiri 1.10.3
Using rails-dom-testing 2.0.3
Using crass 1.0.4
Using loofah 2.2.3
Using rails-html-sanitizer 1.0.4
Using actionview 5.2.3
Using rack 2.0.7
Using rack-test 1.1.0
Using actionpack 5.2.3
Using nio4r 2.4.0
Using websocket-extensions 0.1.4
Using websocket-driver 0.7.1
Using actioncable 5.2.3
Using globalid 0.4.2
Using activejob 5.2.3
Using mini_mime 1.0.2
Using mail 2.7.1
Using actionmailer 5.2.3
Using activemodel 5.2.3
Using arel 9.0.0
Using activerecord 5.2.3
Using mimemagic 0.3.3
Using marcel 0.3.3
Using activestorage 5.2.3
Using public_suffix 3.1.1
Using addressable 2.6.0
Using io-like 0.3.0
Using archive-zip 0.12.0
Using ast 2.4.0
Using backports 3.15.0
Using bcrypt 3.1.13
Using bindex 0.8.1
Using msgpack 1.3.0
Using bootsnap 1.4.4
Using method_source 0.9.2
Using thor 0.20.3
Using railties 5.2.3
Using bootstrap-generators 3.3.4
Using momentjs-rails 2.20.1
Using bootstrap3-datetimepicker-rails 4.17.47
Using bower-rails 0.11.0
Using bundler 2.0.2
Using byebug 11.0.1
Using regexp_parser 1.6.0
Using xpath 3.2.0
Using capybara 3.26.0
Using launchy 2.4.3
Using capybara-screenshot 1.0.23
Using childprocess 1.0.1
Using chromedriver-helper 2.1.1
Using coderay 1.1.2
Using coffee-script-source 1.12.2
Using execjs 2.7.0
Using coffee-script 2.4.1
Using coffee-rails 4.2.2
Using commonjs 0.2.7
Using i18n_data 0.8.0
Using sixarm_ruby_unaccent 1.2.0
Using unicode_utils 1.4.0
Using countries 3.0.0
Using sort_alphabetical 1.1.0
Using country_select 4.0.0
Using safe_yaml 1.0.5
Using crack 0.4.3
Using cucumber-tag_expressions 1.1.1
Using gherkin 5.1.0
Using cucumber-core 3.2.1
Using cucumber-expressions 6.0.1
Using cucumber-wire 0.0.1
Using diff-lcs 1.3
Using multi_json 1.13.1
Using multi_test 0.1.2
Using cucumber 3.1.2
Using mime-types-data 3.2019.0331
Using mime-types 3.2.2
Using cucumber-rails 1.7.0
Using database_cleaner 1.7.0
Using orm_adapter 0.5.0
Using responders 3.0.0
Using warden 1.2.8
Using devise 4.6.2
Using erubis 2.7.0
Using et-orbi 1.2.1
Using factory_bot 5.0.2
Using factory_bot_rails 5.0.2
Using faker 1.9.6
Using ffi 1.11.1
Using sassc 2.0.1
Using font-awesome-sass 5.9.0
Using formatador 0.2.5
Using raabro 1.1.6
Using fugit 1.2.3
Using rb-fsevent 0.10.3
Using rb-inotify 0.10.0
Using ruby_dep 1.5.0
Using listen 3.1.5
Using lumberjack 1.0.13
Using nenv 0.3.0
Using shellany 0.0.1
Using notiffany 0.1.1
Using pry 0.12.2
Using guard 2.15.0
Using guard-compat 1.2.1
Using jasmine-core 3.4.0
Using phantomjs 2.1.1.0
Using jasmine 3.4.0
Using tilt 2.0.9
Using guard-jasmine 3.1.0
Using rspec-support 3.8.2
Using rspec-core 3.8.2
Using rspec-expectations 3.8.4
Using rspec-mocks 3.8.1
Using rspec 3.8.0
Using guard-rspec 4.7.3
Using temple 0.8.1
Using haml 5.1.1
Using sexp_processor 4.12.1
Using ruby_parser 3.13.1
Using html2haml 2.2.0
Using haml-rails 2.0.1
Using hashdiff 1.0.0
Using jaro_winkler 1.5.3
Using sprockets 3.7.2
Using sprockets-rails 3.2.1
Using jasmine-rails 0.15.0
Using jbuilder 2.9.1
Using jquery-rails 4.3.5
Using less 2.6.0
Using less-rails 2.8.0
Using less-rails-bootstrap 3.3.5.0
Using libv8 3.16.14.19 (x86_64-linux)
Using mono_logger 1.1.0
Using mustermann 1.0.3
Using newrelic_rpm 6.5.0.357
Using parallel 1.17.0
Using parser 2.6.3.0
Using powder 0.4.0
Using puma 3.12.1
Using rack-protection 2.0.5
Using rack-tracker 1.10.0
Using rails 5.2.3
Using rainbow 3.0.0
Using redis 4.1.2
Using redis-namespace 1.6.0
Using ref 2.0.0
Using sinatra 2.0.5
Using vegas 0.1.11
Using resque 2.0.0
Using rufus-scheduler 3.6.0
Using resque-scheduler 4.4.0
Using sass-listen 4.0.0
Using sass 3.7.4
Using sass-rails 5.0.7
Using twitter-bootstrap-rails 4.0.0
Using resque-web 0.0.12
Using rollbar 2.21.0
Using rspec-rails 3.8.2
Using ruby-progressbar 1.10.1
Using unicode-display_width 1.6.0
Using rubocop 0.73.0
Using rubyzip 1.2.3
Using selenium-webdriver 3.142.3
Using simple_form 4.1.0
Using sqlite3 1.4.1
Using therubyracer 0.12.3
Using uglifier 4.1.20
Using vcr 5.0.0
Using web-console 3.7.0
Using webmock 3.6.0
Bundle complete! 47 Gemfile dependencies, 179 gems now installed.
Bundled gems are installed into `/home/icostan/.gem`
Now the fun part begins, code generation and configuration.
First thing first, the UI section with Bootstrap, SimpleForm and HAML:
remove app/views/layouts/application.html.erb
generate simple_form:install --bootstrap --force
create config/initializers/simple_form.rb
create config/initializers/simple_form_bootstrap.rb
exist config/locales
create config/locales/simple_form.en.yml
create lib/templates/haml/scaffold/_form.html.haml
=========================================================================
Be sure to have a copy of the Bootstrap stylesheet available on your
application, you can get it on http://getbootstrap.com/.
Inside your views, use the 'simple_form_for' with the Bootstrap form
class, '.form-inline', as the following:
= simple_form_for(@user, html: { class: 'form-inline' }) do |form|
=========================================================================
generate bootstrap:install --template-engine=haml --skip-turbolinks
insert app/assets/javascripts/application.js
create app/assets/javascripts/bootstrap.js.coffee
create app/assets/stylesheets/bootstrap_and_overrides.css.less
create config/locales/en.bootstrap.yml
gsub app/assets/stylesheets/application.css
generate bower_rails:initialize
create Bowerfile
create config/initializers/bower_rails.rb
Awesome Devise gem for authentication and authorization:
generate devise:install
create config/initializers/devise.rb
create config/locales/devise.en.yml
==========================================================================
Some setup you must do manually if you havent yet:
1. Ensure you have defined default url options in your environments files. Here
is an example of default_url_options appropriate for a development environment
in config/environments/development.rb:
config.action_mailer.default_url_options = { host: 'localhost', port: 3000 }
In production, :host should be set to the actual host of your application.
2. Ensure you have defined root_url to *something* in your config/routes.rb.
For example:
root to: "home#index"
3. Ensure you have flash messages in app/views/layouts/application.html.erb.
For example:
<p class="notice"><%= notice %></p>
<p class="alert"><%= alert %></p>
4. You can copy Devise views (for customization) to your app by running:
rails g devise:views
==========================================================================
Devise's User generation, the template is smart enough to detect that we have RSpec and FactoryBot gems and generate the appropriate "spec" and "factory" files.
generate devise User
invoke active_record
create db/migrate/20190720181253_devise_create_users.rb
create app/models/user.rb
invoke rspec
create spec/models/user_spec.rb
invoke factory_bot
create spec/factories/users.rb
insert app/models/user.rb
route devise_for :users
Configuration for Cucumber/RSpec and other testing gems:
generate rspec:install
create .rspec
exist spec
create spec/spec_helper.rb
create spec/rails_helper.rb
generate jasmine_rails:install
identical spec/javascripts/support/jasmine.yml
route mount JasmineRails::Engine => '/specs' if defined?(JasmineRails)
generate cucumber:install --capybara --rspec
create config/cucumber.yml
create script/cucumber
chmod script/cucumber
create features/step_definitions
create features/step_definitions/.gitkeep
create features/support
create features/support/env.rb
exist lib/tasks
create lib/tasks/cucumber.rake
gsub config/database.yml
gsub config/database.yml
force config/database.yml
gsub features/support/env.rb
create features/support/webmock.rb
create .rubocop.yml
run guard init from "."
create spec/vcr_helper.rb
insert .rspec
create config/initializer/rack-tracker.rb
create config/newrelic.yml
generate rollbar
Generator run without an access token; assuming you want to configure using an environment variable.
You'll need to add an environment variable ROLLBAR_ACCESS_TOKEN with your access token:
$ export ROLLBAR_ACCESS_TOKEN=yourtokenhere
If that's not what you wanted to do:
$ rm config/initializers/rollbar.rb
$ rails generate rollbar yourtokenhere
create config/initializers/rollbar.rb
create .powder
create .powrc
Initialize git repo and add initial git commit:
run git init from "."
Reinitialized existing Git repository in /home/icostan/Projects/icostan.gitlab.io/content/post/blog/.git/
run git add . from "."
run git commit -a -m 'Initial commit' from "."
[master (root-commit) 662b8e0] Initial commit
116 files changed, 3341 insertions(+)
create mode 100644 .gitignore
create mode 100644 .powder
create mode 100644 .powrc
create mode 100644 .rspec
create mode 100644 .rubocop.yml
create mode 100644 .ruby-version
create mode 100644 Bowerfile
create mode 100644 Gemfile
create mode 100644 Gemfile.lock
create mode 100644 README.md
create mode 100644 Rakefile
create mode 100644 app/assets/config/manifest.js
create mode 100644 app/assets/images/.keep
create mode 100644 app/assets/javascripts/application.js
create mode 100644 app/assets/javascripts/bootstrap.js.coffee
create mode 100644 app/assets/javascripts/cable.js
create mode 100644 app/assets/javascripts/channels/.keep
create mode 100644 app/assets/stylesheets/application.css
create mode 100644 app/assets/stylesheets/bootstrap_and_overrides.css.less
create mode 100644 app/channels/application_cable/channel.rb
create mode 100644 app/channels/application_cable/connection.rb
create mode 100644 app/controllers/application_controller.rb
create mode 100644 app/controllers/concerns/.keep
create mode 100644 app/helpers/application_helper.rb
create mode 100644 app/jobs/application_job.rb
create mode 100644 app/mailers/application_mailer.rb
create mode 100644 app/models/application_record.rb
create mode 100644 app/models/concerns/.keep
create mode 100644 app/models/user.rb
create mode 100644 app/views/layouts/mailer.html.erb
create mode 100644 app/views/layouts/mailer.text.erb
create mode 100755 bin/bundle
create mode 100755 bin/rails
create mode 100755 bin/rake
create mode 100755 bin/setup
create mode 100755 bin/update
create mode 100755 bin/yarn
create mode 100644 config.ru
create mode 100644 config/application.rb
create mode 100644 config/boot.rb
create mode 100644 config/cable.yml
create mode 100644 config/credentials.yml.enc
create mode 100644 config/cucumber.yml
create mode 100644 config/database.yml
create mode 100644 config/environment.rb
create mode 100644 config/environments/development.rb
create mode 100644 config/environments/production.rb
create mode 100644 config/environments/test.rb
create mode 100644 config/initializer/rack-tracker.rb
create mode 100644 config/initializers/application_controller_renderer.rb
create mode 100644 config/initializers/assets.rb
create mode 100644 config/initializers/backtrace_silencers.rb
create mode 100644 config/initializers/bower_rails.rb
create mode 100644 config/initializers/content_security_policy.rb
create mode 100644 config/initializers/cookies_serializer.rb
create mode 100644 config/initializers/devise.rb
create mode 100644 config/initializers/filter_parameter_logging.rb
create mode 100644 config/initializers/generators.rb
create mode 100644 config/initializers/inflections.rb
create mode 100644 config/initializers/mime_types.rb
create mode 100644 config/initializers/rollbar.rb
create mode 100644 config/initializers/simple_form.rb
create mode 100644 config/initializers/simple_form_bootstrap.rb
create mode 100644 config/initializers/wrap_parameters.rb
create mode 100644 config/locales/devise.en.yml
create mode 100644 config/locales/en.bootstrap.yml
create mode 100644 config/locales/en.yml
create mode 100644 config/locales/simple_form.en.yml
create mode 100644 config/newrelic.yml
create mode 100644 config/puma.rb
create mode 100644 config/routes.rb
create mode 100644 config/storage.yml
create mode 100644 db/migrate/20190720181253_devise_create_users.rb
create mode 100644 db/seeds.rb
create mode 100644 features/step_definitions/.gitkeep
create mode 100644 features/support/env.rb
create mode 100644 features/support/webmock.rb
create mode 100644 lib/assets/.keep
create mode 100644 lib/tasks/.keep
create mode 100644 lib/tasks/cucumber.rake
create mode 100644 lib/templates/haml/scaffold/_form.html.haml
create mode 100644 log/.keep
create mode 100644 package.json
create mode 100644 public/404.html
create mode 100644 public/422.html
create mode 100644 public/500.html
create mode 100644 public/apple-touch-icon-precomposed.ico
create mode 100644 public/apple-touch-icon-precomposed.png
create mode 100644 public/apple-touch-icon.ico
create mode 100644 public/apple-touch-icon.png
create mode 100644 public/css/bootstrap.min.css
create mode 100644 public/css/styles.css
create mode 100644 public/favicon.ico
create mode 100644 public/index.html
create mode 100644 public/js/bootstrap.min.js
create mode 100644 public/robots.txt
create mode 100755 script/cucumber
create mode 100644 spec/factories/users.rb
create mode 100644 spec/javascripts/support/jasmine.yml
create mode 100644 spec/models/user_spec.rb
create mode 100644 spec/rails_helper.rb
create mode 100644 spec/spec_helper.rb
create mode 100644 spec/vcr_helper.rb
create mode 100644 storage/.keep
create mode 100644 test/application_system_test_case.rb
create mode 100644 test/controllers/.keep
create mode 100644 test/fixtures/.keep
create mode 100644 test/fixtures/files/.keep
create mode 100644 test/helpers/.keep
create mode 100644 test/integration/.keep
create mode 100644 test/mailers/.keep
create mode 100644 test/models/.keep
create mode 100644 test/system/.keep
create mode 100644 test/test_helper.rb
create mode 100644 tmp/.keep
create mode 100644 vendor/.keep
PAM, Pam!! and last, generate the very first model with all the magic bullets linked together:
rails generate scaffold product name price:decimal
invoke active_record
create db/migrate/20190723132502_create_products.rb
create app/models/product.rb
invoke rspec
create spec/models/product_spec.rb
invoke factory_bot
create spec/factories/products.rb
invoke resource_route
route resources :products
invoke scaffold_controller
create app/controllers/products_controller.rb
invoke haml
create app/views/products
create app/views/products/index.html.haml
create app/views/products/edit.html.haml
create app/views/products/show.html.haml
create app/views/products/new.html.haml
create app/views/products/_form.html.haml
invoke rspec
create spec/controllers/products_controller_spec.rb
create spec/views/products/edit.html.haml_spec.rb
create spec/views/products/index.html.haml_spec.rb
create spec/views/products/new.html.haml_spec.rb
create spec/views/products/show.html.haml_spec.rb
create spec/routing/products_routing_spec.rb
invoke rspec
create spec/requests/products_spec.rb
invoke helper
create app/helpers/products_helper.rb
invoke rspec
create spec/helpers/products_helper_spec.rb
invoke jbuilder
create app/views/products/index.json.jbuilder
create app/views/products/show.json.jbuilder
create app/views/products/_product.json.jbuilder
invoke assets
invoke coffee
create app/assets/javascripts/products.coffee
invoke scss
Happy crafting and releasing cool new features.