myrails 5.0.0 → 6.0.0
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.
- checksums.yaml +5 -5
- data/lib/myrails.rb +39 -672
- data/lib/myrails/modules/application.rb +13 -0
- data/lib/myrails/modules/assets.rb +17 -0
- data/lib/myrails/modules/bootstrap.rb +80 -0
- data/lib/myrails/modules/capistrano.rb +110 -0
- data/lib/myrails/modules/database.rb +15 -0
- data/lib/myrails/modules/devise.rb +73 -0
- data/lib/myrails/modules/dotenv.rb +28 -0
- data/lib/myrails/modules/engine.rb +107 -0
- data/lib/myrails/modules/figaro.rb +20 -0
- data/lib/myrails/modules/footnotes.rb +19 -0
- data/lib/myrails/modules/gems.locked +10 -0
- data/lib/myrails/modules/gems.rb +62 -0
- data/lib/myrails/modules/heroku.rb +24 -0
- data/lib/myrails/modules/material.rb +43 -0
- data/lib/myrails/modules/pundit.rb +51 -0
- data/lib/myrails/modules/rails_generators.rb +102 -0
- data/lib/myrails/modules/rspec.rb +65 -0
- data/lib/myrails/modules/rspec_generators.rb +46 -0
- data/lib/myrails/modules/ui.rb +21 -0
- data/lib/myrails/version.rb +1 -1
- metadata +22 -3
@@ -0,0 +1,20 @@
|
|
1
|
+
module Install
|
2
|
+
module Figaro
|
3
|
+
def self.included(thor)
|
4
|
+
thor.class_eval do
|
5
|
+
|
6
|
+
def install_figaro
|
7
|
+
insert_into_file 'Gemfile', after: "gem 'tzinfo-data', platforms: [:mingw, :mswin, :x64_mingw, :jruby]\n" do <<-CODE
|
8
|
+
gem "figaro"
|
9
|
+
CODE
|
10
|
+
end
|
11
|
+
|
12
|
+
run 'bundle install'
|
13
|
+
run 'bundle exec figaro install'
|
14
|
+
copy_file 'rails/config/application.example.yml', 'config/application.example.yml'
|
15
|
+
end
|
16
|
+
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
module Install
|
2
|
+
module Footnotes
|
3
|
+
def self.included(thor)
|
4
|
+
thor.class_eval do
|
5
|
+
|
6
|
+
desc 'install_footnotes', 'Install rails-footnotes and run its generator'
|
7
|
+
def install_footnotes
|
8
|
+
insert_into_file 'Gemfile', after: "gem 'tzinfo-data', platforms: [:mingw, :mswin, :x64_mingw, :jruby]\n" do <<-CODE
|
9
|
+
gem 'rails-footnotes'
|
10
|
+
CODE
|
11
|
+
end
|
12
|
+
run 'bundle install'
|
13
|
+
run 'rails generate rails_footnotes:install'
|
14
|
+
end
|
15
|
+
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,62 @@
|
|
1
|
+
module Install
|
2
|
+
module Gems
|
3
|
+
def self.included(thor)
|
4
|
+
thor.class_eval do
|
5
|
+
|
6
|
+
def add_test_group
|
7
|
+
insert_into_file 'Gemfile', before: "group :development, :test do" do <<-CODE
|
8
|
+
group :test do
|
9
|
+
gem 'simplecov'
|
10
|
+
gem 'shoulda-matchers'
|
11
|
+
gem 'factory_bot_rails'
|
12
|
+
gem 'database_cleaner'
|
13
|
+
gem 'chromedriver-helper'
|
14
|
+
gem 'launchy'
|
15
|
+
gem 'rails-controller-testing'
|
16
|
+
end
|
17
|
+
CODE
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
def add_development_test_gems
|
22
|
+
insert_into_file 'Gemfile', after: "group :development, :test do\n" do <<-CODE
|
23
|
+
gem 'faker'
|
24
|
+
gem 'yard'
|
25
|
+
gem 'letter_opener'
|
26
|
+
gem "rails-erd"
|
27
|
+
CODE
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
def add_rails_gems
|
32
|
+
insert_into_file 'Gemfile', after: "gem 'tzinfo-data', platforms: [:mingw, :mswin, :x64_mingw, :jruby]\n" do <<-CODE
|
33
|
+
gem 'haml-rails'
|
34
|
+
gem "ransack"
|
35
|
+
gem 'will_paginate'
|
36
|
+
gem "font-awesome-rails"
|
37
|
+
gem 'trix'
|
38
|
+
gem 'record_tag_helper'
|
39
|
+
gem 'jquery-rails'
|
40
|
+
CODE
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
def add_private_section
|
45
|
+
insert_into_file 'app/controllers/application_controller.rb', before: 'end' do <<-CODE
|
46
|
+
private
|
47
|
+
CODE
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
def install_gems
|
52
|
+
add_test_group
|
53
|
+
add_development_test_gems
|
54
|
+
add_rails_gems
|
55
|
+
run 'bundle install'
|
56
|
+
add_private_section
|
57
|
+
end
|
58
|
+
|
59
|
+
end
|
60
|
+
end
|
61
|
+
end
|
62
|
+
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
module Install
|
2
|
+
module Heroku
|
3
|
+
def self.included(thor)
|
4
|
+
thor.class_eval do
|
5
|
+
|
6
|
+
desc 'install_heroku', 'setup application for use with heroku using sqlite3 for development'
|
7
|
+
def install_heroku
|
8
|
+
insert_into_file 'Gemfile', before: "group :development, :test do\n" do <<-CODE
|
9
|
+
group :production do
|
10
|
+
gem 'pg'
|
11
|
+
gem 'rails_12factor'
|
12
|
+
end
|
13
|
+
|
14
|
+
CODE
|
15
|
+
end
|
16
|
+
copy_file 'db/sqlite3_database.yml', 'config/database.yml'
|
17
|
+
copy_file 'heroku/Procfile', 'Procfile'
|
18
|
+
copy_file 'heroku/puma.rb', 'config/puma.rb'
|
19
|
+
end
|
20
|
+
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
@@ -0,0 +1,43 @@
|
|
1
|
+
module Layout
|
2
|
+
module Material
|
3
|
+
def self.included(thor)
|
4
|
+
thor.class_eval do
|
5
|
+
def copy_material_files
|
6
|
+
Dir["#{__dir__}/myrails/templates/rails/app/views/layout/material/**/*"].each do |file|
|
7
|
+
copy_file file, "app/views/layouts/#{File.basename(file)}"
|
8
|
+
end
|
9
|
+
end
|
10
|
+
|
11
|
+
desc 'install_material', 'Generate Material css theme'
|
12
|
+
def install_material
|
13
|
+
@templates = "#{__dir__}/../templates"
|
14
|
+
|
15
|
+
insert_into_file 'Gemfile', after: "gem 'tzinfo-data', platforms: [:mingw, :mswin, :x64_mingw, :jruby]\n" do <<-CODE
|
16
|
+
gem 'materialize-sass'
|
17
|
+
gem 'material_icons'
|
18
|
+
CODE
|
19
|
+
end
|
20
|
+
|
21
|
+
run 'bundle install'
|
22
|
+
|
23
|
+
copy_material_files
|
24
|
+
|
25
|
+
insert_into_file 'app/assets/stylesheets/application.css.sass', before: '@import trix' do <<-CODE
|
26
|
+
@import "materialize/components/color"
|
27
|
+
$primary-color: color("grey", "darken-3") !default
|
28
|
+
$secondary-color: color("grey", "base") !default
|
29
|
+
@import materialize
|
30
|
+
@import material_icons
|
31
|
+
CODE
|
32
|
+
end
|
33
|
+
|
34
|
+
insert_into_file 'app/assets/javascripts/application.js', before: "//= require trix" do <<-CODE
|
35
|
+
//= require materialize
|
36
|
+
CODE
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
@@ -0,0 +1,51 @@
|
|
1
|
+
module Install
|
2
|
+
module Pundit
|
3
|
+
def self.included(thor)
|
4
|
+
thor.class_eval do
|
5
|
+
|
6
|
+
def add_pundit_gems
|
7
|
+
insert_into_file 'Gemfile', after: "gem 'tzinfo-data', platforms: [:mingw, :mswin, :x64_mingw, :jruby]\n" do <<-CODE
|
8
|
+
gem 'pundit'
|
9
|
+
CODE
|
10
|
+
end
|
11
|
+
|
12
|
+
insert_into_file 'Gemfile', after: "group :test do\n" do <<-CODE
|
13
|
+
gem 'pundit-matchers'
|
14
|
+
CODE
|
15
|
+
end
|
16
|
+
run 'bundle update'
|
17
|
+
end
|
18
|
+
|
19
|
+
def enable_pundit
|
20
|
+
inject_into_file 'app/controllers/application_controller.rb', after: "class ApplicationController < ActionController::Base\n" do <<-CODE
|
21
|
+
# Add pundit authorization
|
22
|
+
include Pundit
|
23
|
+
# Rescue from pundit error
|
24
|
+
# (see #user_not_authorized)
|
25
|
+
rescue_from Pundit::NotAuthorizedError, with: :user_not_authorized
|
26
|
+
CODE
|
27
|
+
end
|
28
|
+
|
29
|
+
inject_into_file 'app/controllers/application_controller.rb', after: "private\n" do <<-CODE
|
30
|
+
# Method to gracefully let a user know they are are not authorized
|
31
|
+
#
|
32
|
+
# @return flash [Hash] the action notice
|
33
|
+
def user_not_authorized
|
34
|
+
flash[:alert] = "You are not authorized to perform this action."
|
35
|
+
redirect_to root_path
|
36
|
+
end
|
37
|
+
CODE
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
desc 'install_pundit', 'Install pundit gem and generate pundit files and application controller code'
|
42
|
+
def install_pundit
|
43
|
+
add_pundit_gems
|
44
|
+
run 'rails g pundit:install'
|
45
|
+
enable_pundit
|
46
|
+
end
|
47
|
+
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
@@ -0,0 +1,102 @@
|
|
1
|
+
module Rails
|
2
|
+
module Generators
|
3
|
+
def self.included(thor)
|
4
|
+
thor.class_eval do
|
5
|
+
|
6
|
+
desc 'model', "Generates a rails model with the given name along with its related spec file and namespace prefix for table creation. Use '/' to create a namespaced model"
|
7
|
+
option :name, required: true
|
8
|
+
def model
|
9
|
+
template 'rails/app/models/model.rb', "app/models/#{options[:name].downcase}.rb"
|
10
|
+
template 'rails/app/models/namespace_model.rb', "app/models/#{options[:name].split("/").first.singularize.downcase}.rb" if options[:name].include?("/")
|
11
|
+
template 'spec/model.rb', "spec/models/#{options[:name].downcase}_spec.rb"
|
12
|
+
end
|
13
|
+
|
14
|
+
desc 'controller', "Generates a rails controller with the given name along with related spec file. Use '/' to create a namespaced controller"
|
15
|
+
option :name, required: true
|
16
|
+
def controller
|
17
|
+
template 'rails/app/controllers/controller.rb', "app/controllers/#{options[:name].downcase.pluralize}_controller.rb"
|
18
|
+
if options[:name].include?("/")
|
19
|
+
parent, child = options[:name].split("/")
|
20
|
+
template 'rails/app/controllers/namespace_controller.rb', "app/controllers/#{parent}/#{parent.downcase}_controller.rb"
|
21
|
+
end
|
22
|
+
template 'spec/controller.rb', "spec/controllers/#{options[:name].downcase.pluralize}_controller_spec.rb"
|
23
|
+
run "mkdir -p app/views/#{options[:name].downcase.pluralize}"
|
24
|
+
end
|
25
|
+
|
26
|
+
desc 'policy', "Generates a pundit policy with the given name and a related spec file. Use '/' to create a namespaced policy"
|
27
|
+
option :name, required: true
|
28
|
+
def policy
|
29
|
+
template 'rails/app/policies/pundit.rb', "app/policies/#{options[:name].downcase}_policy.rb"
|
30
|
+
template 'spec/pundit.rb', "spec/policies/#{options[:name].downcase}_policy_spec.rb"
|
31
|
+
end
|
32
|
+
|
33
|
+
desc 'presenter', "Generates a presenter class with the given name and a related spec file. Use '/' to create a namespaced presenter"
|
34
|
+
option :name, required: true
|
35
|
+
def presenters
|
36
|
+
copy_file 'rails/app/presenters/base.rb', 'app/presenters/base_presenter.rb'
|
37
|
+
template 'rails/app/presenters/presenter.rb', "app/presenters/#{options[:name].downcase}_presenter.rb"
|
38
|
+
copy_file 'rails/app/presenters/presenter_config.rb', 'spec/support/configs/presenter.rb'
|
39
|
+
template 'rails/app/presenters/presenter_spec.rb', "spec/presenters/#{options[:name].downcase}_presenter_spec.rb"
|
40
|
+
end
|
41
|
+
|
42
|
+
desc 'factory', "Generates a factory_bot factory in the spec/factories directory. Use '/' to create a namespaced factory"
|
43
|
+
option :name, required: true
|
44
|
+
def factory
|
45
|
+
template 'spec/factory.rb', "spec/factories/#{options[:name].downcase}.rb"
|
46
|
+
end
|
47
|
+
|
48
|
+
desc 'sendgrid', 'Generate sendgrid initializer and mail interceptor'
|
49
|
+
option :email, required: true
|
50
|
+
def sendgrid
|
51
|
+
copy_file 'rails/app/mailers/sendgrid.rb', 'config/initializers/sendgrid.rb'
|
52
|
+
template 'rails/app/mailers/dev_mail_interceptor.rb', 'app/mailers/dev_mail_interceptor.rb'
|
53
|
+
ENVIRONMENTS.each do |environment|
|
54
|
+
unless environment == 'production'
|
55
|
+
inject_into_file "config/environments/#{environment}.rb", after: "Rails.application.configure do\n" do <<-CODE
|
56
|
+
ActionMailer::Base.register_interceptor(DevMailInterceptor)
|
57
|
+
CODE
|
58
|
+
end
|
59
|
+
end
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
63
|
+
desc 'config_env', 'Add code to environment files. Host refers to url options. Name option referes to controller and mailer default_url_options'
|
64
|
+
option :name, required: true
|
65
|
+
def config_env
|
66
|
+
ENVIRONMENTS.each do |environment|
|
67
|
+
case environment
|
68
|
+
when 'development'
|
69
|
+
inject_into_file 'config/environments/development.rb', after: "config.action_mailer.raise_delivery_errors = false\n" do <<-CODE
|
70
|
+
config.action_mailer.delivery_method = :letter_opener
|
71
|
+
config.action_mailer.perform_deliveries = false
|
72
|
+
config.action_mailer.default_url_options = { host: ENV['DEFAULT_HOST'] }
|
73
|
+
config.action_controller.default_url_options = { host: ENV['DEFAULT_HOST'] }
|
74
|
+
CODE
|
75
|
+
end
|
76
|
+
when 'test'
|
77
|
+
inject_into_file 'config/environments/test.rb', after: "config.action_mailer.delivery_method = :test\n" do <<-CODE
|
78
|
+
config.action_mailer.default_url_options = { host: ENV['DEFAULT_HOST'] }
|
79
|
+
config.action_controller.default_url_options = { host: ENV['DEFAULT_HOST'] }
|
80
|
+
CODE
|
81
|
+
end
|
82
|
+
when 'production'
|
83
|
+
inject_into_file 'config/environments/production.rb', after: "config.active_record.dump_schema_after_migration = false\n" do <<-CODE
|
84
|
+
config.action_mailer.default_url_options = { host: ENV['DEFAULT_HOST'] }
|
85
|
+
config.action_controller.default_url_options = { host: ENV['DEFAULT_HOST'] }
|
86
|
+
config.assets.compile = true
|
87
|
+
CODE
|
88
|
+
end
|
89
|
+
end
|
90
|
+
end
|
91
|
+
end
|
92
|
+
|
93
|
+
desc 'new_ui NAME', 'Create a new ui view'
|
94
|
+
def new_ui(name)
|
95
|
+
run "touch app/views/ui/#{name}.html.haml"
|
96
|
+
say "DON'T FORGET: Restart Powify App"
|
97
|
+
end
|
98
|
+
|
99
|
+
end
|
100
|
+
end
|
101
|
+
end
|
102
|
+
end
|
@@ -0,0 +1,65 @@
|
|
1
|
+
module Install
|
2
|
+
module RSpec
|
3
|
+
def self.included(thor)
|
4
|
+
thor.class_eval do
|
5
|
+
|
6
|
+
desc 'install_rspec', 'Generate rspec structure & rspec configuration that I commonly use'
|
7
|
+
def install_rspec
|
8
|
+
insert_into_file 'Gemfile', after: "gem 'tzinfo-data', platforms: [:mingw, :mswin, :x64_mingw, :jruby]\n" do <<-CODE
|
9
|
+
gem 'rspec-rails', group: :test
|
10
|
+
gem 'email-spec', group: :test
|
11
|
+
CODE
|
12
|
+
end
|
13
|
+
|
14
|
+
run 'bundle install'
|
15
|
+
run 'rails g rspec:install'
|
16
|
+
|
17
|
+
install_rails_helper
|
18
|
+
|
19
|
+
Dir["#{__dir__}/../templates/spec/**/*"].each do |file|
|
20
|
+
if file.include?('/support/') && !['devise'].include?(File.basename(file, '.rb'))
|
21
|
+
copy_file file, "#{file.gsub(__dir__+'/../templates/', '')}" unless File.directory? file
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
desc 'install_rails_helper', 'Add code to rspec/rails_helper so rspec runs the way I like'
|
27
|
+
def install_rails_helper
|
28
|
+
inject_into_file "spec/rails_helper.rb", after: "require 'rspec/rails'\n" do <<-CODE
|
29
|
+
require 'simplecov'
|
30
|
+
SimpleCov.start
|
31
|
+
|
32
|
+
Capybara.app_host = "http://localhost:3000"
|
33
|
+
Capybara.server_host = "localhost"
|
34
|
+
Capybara.server_port = "3000"
|
35
|
+
|
36
|
+
#use Chromedriver
|
37
|
+
unless ENV['NOCHROME']
|
38
|
+
Capybara.register_driver :selenium do |app|
|
39
|
+
Capybara::Selenium::Driver.new(app, :browser => :chrome)
|
40
|
+
end
|
41
|
+
end
|
42
|
+
CODE
|
43
|
+
end
|
44
|
+
|
45
|
+
gsub_file 'spec/rails_helper.rb', "# Dir[Rails.root.join('spec/support/**/*.rb')].each { |f| require f }", "Dir[Rails.root.join('spec/support/**/*.rb')].each { |f| require f }"
|
46
|
+
|
47
|
+
gsub_file "spec/rails_helper.rb", "config.use_transactional_fixtures = true", "config.use_transactional_fixtures = false"
|
48
|
+
|
49
|
+
inject_into_file 'spec/rails_helper.rb', after: "RSpec.configure do |config|\n" do <<-CODE
|
50
|
+
# Can use methods like dom_id in features
|
51
|
+
config.include ActionView::RecordIdentifier, type: :feature
|
52
|
+
# Can use methods likke strip_tags in features
|
53
|
+
config.include ActionView::Helpers::SanitizeHelper, type: :feature
|
54
|
+
# Can use methods like truncate
|
55
|
+
config.include ActionView::Helpers::TextHelper, type: :feature
|
56
|
+
config.include(JavascriptHelper, type: :feature)
|
57
|
+
config.include MailerHelper
|
58
|
+
CODE
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
62
|
+
end
|
63
|
+
end
|
64
|
+
end
|
65
|
+
end
|
@@ -0,0 +1,46 @@
|
|
1
|
+
module RSpec
|
2
|
+
module Generators
|
3
|
+
def self.included(thor)
|
4
|
+
thor.class_eval do
|
5
|
+
|
6
|
+
desc 'shared_example', 'Generates an RSpec shared example template in the support directory'
|
7
|
+
option :text, required: true
|
8
|
+
def shared_example
|
9
|
+
template 'spec/shared_example.rb', 'spec/support/shared_examples/shared_examples.rb'
|
10
|
+
end
|
11
|
+
|
12
|
+
desc 'request', 'Generates an RSpec request spec'
|
13
|
+
option :name, required: true
|
14
|
+
def request
|
15
|
+
template 'spec/request.rb', "spec/requests/#{options[:name]}_spec.rb"
|
16
|
+
copy_file 'spec/request_shared_example.rb', 'spec/support/shared_examples/request_shared_examples.rb'
|
17
|
+
end
|
18
|
+
|
19
|
+
desc 'feature', 'Generates an RSpec feature spec'
|
20
|
+
option :name, required: true
|
21
|
+
def feature
|
22
|
+
copy_file 'spec/feature.rb', "spec/features/#{options[:name]}_spec.rb"
|
23
|
+
end
|
24
|
+
|
25
|
+
desc 'helper', 'Generates an RSpec helper in support/helpers for extracting reusable code'
|
26
|
+
long_desc <<-LONGDESC
|
27
|
+
`myrails helper` will generate an RSpec helper module to use with rspec.
|
28
|
+
|
29
|
+
You can optionally specify a type parameter which will only include the module for the given type of spec.
|
30
|
+
|
31
|
+
> $ myrails helper --name article --type :feature
|
32
|
+
LONGDESC
|
33
|
+
option :name, required: true
|
34
|
+
option :type
|
35
|
+
def helper
|
36
|
+
template 'spec/helper.rb', "spec/support/helpers/#{options[:name].downcase.gsub("\s", '_')}.rb"
|
37
|
+
insert_into_file 'spec/rails_helper.rb', after: "RSpec.configure do |config|\n" do <<-CODE
|
38
|
+
config.include #{options[:name].camelize.gsub("\s", '')}Helper#{", type: #{options[:type]}" if options[:type]}
|
39
|
+
CODE
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|