myrails 6.0.0 → 7.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (60) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +48 -30
  3. data/lib/myrails.rb +46 -122
  4. data/lib/myrails/modules/application_generator_actions.rb +61 -0
  5. data/lib/myrails/modules/application_generators.rb +80 -0
  6. data/lib/myrails/modules/assets.rb +28 -2
  7. data/lib/myrails/modules/bootstrap.rb +16 -12
  8. data/lib/myrails/modules/capistrano.rb +11 -6
  9. data/lib/myrails/modules/database_generator.rb +33 -0
  10. data/lib/myrails/modules/database_generator_actions.rb +18 -0
  11. data/lib/myrails/modules/devise.rb +11 -5
  12. data/lib/myrails/modules/dotenv.rb +30 -6
  13. data/lib/myrails/modules/draper.rb +29 -0
  14. data/lib/myrails/modules/engine_generator_actions.rb +117 -0
  15. data/lib/myrails/modules/engine_generators.rb +66 -0
  16. data/lib/myrails/modules/figaro.rb +18 -2
  17. data/lib/myrails/modules/gems.rb +7 -2
  18. data/lib/myrails/modules/heroku.rb +28 -9
  19. data/lib/myrails/modules/material.rb +23 -13
  20. data/lib/myrails/modules/pundit.rb +30 -6
  21. data/lib/myrails/modules/rails_generator_actions.rb +110 -0
  22. data/lib/myrails/modules/rails_generators.rb +49 -95
  23. data/lib/myrails/modules/rspec.rb +70 -40
  24. data/lib/myrails/modules/rspec_generator_actions.rb +56 -0
  25. data/lib/myrails/modules/rspec_generators.rb +36 -35
  26. data/lib/myrails/modules/ui.rb +24 -7
  27. data/lib/myrails/templates/rails/app/assets/javascripts/application.js +0 -4
  28. data/lib/myrails/templates/rails/app/controllers/controller.rb +6 -6
  29. data/lib/myrails/templates/rails/app/controllers/namespace_controller.rb +1 -1
  30. data/lib/myrails/templates/rails/app/decorators/application_decorator.rb +10 -0
  31. data/lib/myrails/templates/rails/app/decorators/decoration.rb +13 -0
  32. data/lib/myrails/templates/rails/app/helpers/application_helper.rb +0 -7
  33. data/lib/myrails/templates/rails/app/mailers/dev_mail_interceptor.rb +1 -1
  34. data/lib/myrails/templates/rails/app/models/model.rb +1 -1
  35. data/lib/myrails/templates/rails/app/models/namespace_model.rb +2 -2
  36. data/lib/myrails/templates/rails/app/policies/pundit.rb +2 -8
  37. data/lib/myrails/templates/rails/app/presenters/presenter.rb +5 -5
  38. data/lib/myrails/templates/rails/app/presenters/presenter_spec.rb +4 -4
  39. data/lib/myrails/templates/rails/app/views/layout/material/footer.html.haml +24 -0
  40. data/lib/myrails/templates/rails/config/application.example.yml +23 -23
  41. data/lib/myrails/templates/rails/config/initializers/sendgrid.rb +10 -0
  42. data/lib/myrails/templates/spec/controller.rb +37 -37
  43. data/lib/myrails/templates/spec/decorator_spec.rb +16 -0
  44. data/lib/myrails/templates/spec/factory.rb +1 -1
  45. data/lib/myrails/templates/spec/feature.rb +2 -2
  46. data/lib/myrails/templates/spec/helper.rb +1 -1
  47. data/lib/myrails/templates/spec/model.rb +1 -1
  48. data/lib/myrails/templates/spec/pundit.rb +5 -4
  49. data/lib/myrails/templates/spec/request.rb +27 -27
  50. data/lib/myrails/templates/spec/shared_example.rb +2 -2
  51. data/lib/myrails/templates/{rails/app/presenters/presenter_config.rb → spec/support/configs/decorator_presenter.rb} +0 -0
  52. data/lib/myrails/templates/ui/ui_controller.rb +1 -1
  53. data/lib/myrails/version.rb +1 -1
  54. data/myrails.gemspec +3 -3
  55. metadata +24 -15
  56. data/lib/myrails/modules/application.rb +0 -13
  57. data/lib/myrails/modules/database.rb +0 -15
  58. data/lib/myrails/modules/engine.rb +0 -107
  59. data/lib/myrails/modules/footnotes.rb +0 -19
  60. data/lib/myrails/templates/rails/app/mailers/sendgrid.rb +0 -8
@@ -2,63 +2,93 @@ module Install
2
2
  module RSpec
3
3
  def self.included(thor)
4
4
  thor.class_eval do
5
-
6
- desc 'install_rspec', 'Generate rspec structure & rspec configuration that I commonly use'
7
- def install_rspec
5
+
6
+ desc 'add_rspec_gem', 'Add RSpec gem to Gemfile and run bundler'
7
+ def add_rspec_gem
8
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
9
+ gem 'rspec-rails', group: :test
10
+ CODE
12
11
  end
13
12
 
14
13
  run 'bundle install'
14
+ end
15
+
16
+ desc 'generate_rspec', 'Run RSpec generator'
17
+ def generate_rspec
15
18
  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
19
  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
20
+
21
+ desc 'setup_rspec_defaults', 'add default entris to spec/rails_helper.rb'
22
+ def setup_simplecov_capybara
28
23
  inject_into_file "spec/rails_helper.rb", after: "require 'rspec/rails'\n" do <<-CODE
29
- require 'simplecov'
30
- SimpleCov.start
24
+ require 'simplecov'
25
+ SimpleCov.start
31
26
 
32
- Capybara.app_host = "http://localhost:3000"
33
- Capybara.server_host = "localhost"
34
- Capybara.server_port = "3000"
27
+ Capybara.app_host = "http://localhost:3000"
28
+ Capybara.server_host = "localhost"
29
+ Capybara.server_port = "3000"
35
30
 
36
- #use Chromedriver
37
- unless ENV['NOCHROME']
38
- Capybara.register_driver :selenium do |app|
39
- Capybara::Selenium::Driver.new(app, :browser => :chrome)
40
- end
31
+ #use Chromedriver
32
+ unless ENV['NOCHROME']
33
+ Capybara.register_driver :selenium do |app|
34
+ Capybara::Selenium::Driver.new(app, :browser => :chrome)
41
35
  end
42
- CODE
36
+ end
37
+ CODE
43
38
  end
44
-
39
+ end
40
+
41
+ desc 'enable_support', 'Enable support files'
42
+ def enable_support
45
43
  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
-
44
+ end
45
+
46
+ desc 'disable_transctional_fixtures', 'Turn off transactional fixtures option'
47
+ def disable_transctional_fixtures
47
48
  gsub_file "spec/rails_helper.rb", "config.use_transactional_fixtures = true", "config.use_transactional_fixtures = false"
48
-
49
+ end
50
+
51
+
52
+ desc 'include_modules', 'Include useful modules used in feature specs'
53
+ def include_modules
49
54
  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
55
+ # Can use methods like dom_id in features
56
+ config.include ActionView::RecordIdentifier, type: :feature
57
+ # Can use methods likke strip_tags in features
58
+ config.include ActionView::Helpers::SanitizeHelper, type: :feature
59
+ # Can use methods like truncate
60
+ config.include ActionView::Helpers::TextHelper, type: :feature
61
+ config.include(JavascriptHelper, type: :feature)
62
+ config.include MailerHelper
63
+ CODE
59
64
  end
60
65
  end
61
66
 
67
+ desc 'install_rails_helper', 'Add code to rspec/rails_helper so rspec runs the way I like'
68
+ def setup_rails_helper
69
+ setup_simplecov_capybara
70
+ enable_support
71
+ disable_transctional_fixtures
72
+ include_modules
73
+ end
74
+
75
+ desc 'setup_support_files', 'Generate RSpecsupport files'
76
+ def setup_support_files
77
+ Dir["#{__dir__}/../templates/spec/**/*"].each do |file|
78
+ if file.include?('/support/') && !['devise'].include?(File.basename(file, '.rb'))
79
+ copy_file file, "#{file.gsub(__dir__+'/../templates/', '')}" unless File.directory? file
80
+ end
81
+ end
82
+ end
83
+
84
+ desc 'setup_rspec', 'Generate rspec structure & rspec configuration that I commonly use'
85
+ def setup_rspec
86
+ add_rspec_gem
87
+ generate_rspec
88
+ setup_rails_helper
89
+ setup_support_files
90
+ end
91
+
62
92
  end
63
93
  end
64
94
  end
@@ -0,0 +1,56 @@
1
+ module RSpec
2
+ module Generator
3
+ module Actions
4
+
5
+
6
+ def self.included(thor)
7
+
8
+ thor.class_eval do
9
+
10
+ desc 'shared_example', 'Generates an RSpec shared example template in the support directory'
11
+ def shared_example
12
+ @description = ask "What is the NAME of shared example?, Ex: requires authorization. Default: ", :yellow, default: 'shared example'
13
+ @context = ask "What is the CONTEXT of the shared example?, Ex: authorized user. Default: ", :yellow, default: 'shared example'
14
+
15
+ template 'spec/shared_example.rb', "spec/support/shared_examples/#{@param.downcase.gsub("\s", '_')}_shared_examples.rb"
16
+ end
17
+
18
+ desc 'request', 'Generates an RSpec request spec'
19
+ def request
20
+ template 'spec/request.rb', "spec/requests/#{@param.downcase.gsub("\s", "_")}_spec.rb"
21
+ copy_file 'spec/request_shared_example.rb', 'spec/support/shared_examples/request_shared_examples.rb'
22
+ end
23
+
24
+ desc 'feature', 'Generates an RSpec feature spec'
25
+ def feature
26
+ @description = ask "What is the description of feature?, Ex: user management. Default: ", :yellow, default: 'feature'
27
+ @scenario = ask "What is the CONTEXT of the shared example?, Ex: as a user ... Default: ", :yellow, default: 'scneario'
28
+
29
+ template 'spec/feature.rb', "spec/features/#{@param.downcase.gsub("\s", '_')}_spec.rb"
30
+ end
31
+
32
+ desc 'helper', 'Generates an RSpec helper in support/helpers for extracting reusable code'
33
+ long_desc <<-LONGDESC
34
+ `myrails helper` will generate an RSpec helper module to use with rspec.
35
+
36
+ You can optionally specify a type parameter which will only include the module for the given type of spec.
37
+
38
+ > $ myrails helper --name article --type :feature
39
+ LONGDESC
40
+
41
+ def helper
42
+ @type = ask 'What is the type? Ex: :feature, :controller, :request, :model. Deafult: ', :yellow, default: :feature
43
+ template 'spec/helper.rb', "spec/support/helpers/#{@param.downcase.gsub("\s", '_')}.rb"
44
+ insert_into_file 'spec/rails_helper.rb', after: "RSpec.configure do |config|\n" do <<-CODE
45
+ config.include #{@param.camelize.gsub("\s", '')}Helper#{", type: #{':' unless @type.include?(':')}#{@type}" if @type}
46
+ CODE
47
+ end
48
+ end
49
+
50
+ end
51
+
52
+ end
53
+
54
+ end
55
+ end
56
+ end
@@ -2,44 +2,45 @@ module RSpec
2
2
  module Generators
3
3
  def self.included(thor)
4
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
5
+
6
+ desc 'spec <OPTION> <NAME>', 'Execute without options to see HELP. Generate a rspec template with a given name'
7
+ def spec(*opts)
8
+ item, @param = opts
9
+
10
+ option = {
11
+ example: 'Generate RSpec shared example temlate. Prompts for name and context',
12
+ feature: 'Generate RSpec feature template',
13
+ helper: 'Generates an RSpec helper in support/helpers for extracting reusable code',
14
+ request: 'Generate RSpec request template'
15
+ }
16
+
17
+ unless item
18
+ say 'ERROR: "myrails spec" was called with no arguments'
19
+ say 'Usage: "myrails spec <OPTION> <NAME>"'
20
+ say "Available Options:\n"
21
+ option.each{|k,v| say "* #{k}: #{v}"}
22
+ exit
23
+ end
24
+
25
+ raise ArgumentError, "NAME must be specified for #{item} option. Ex: `myrails spec <OPTION> <NAME>`" unless @param
26
+
27
+ case item
28
+ when 'example'
29
+ shared_example
30
+ when 'feature'
31
+ feature
32
+ when 'helper'
33
+ helper
34
+ when 'request'
35
+ request
36
+ else
37
+ say "Unknown Action! #{@param}"
40
38
  end
41
39
  end
42
40
 
41
+ desc 's', 'spec shortcut'
42
+ alias_method :s, :spec
43
+
43
44
  end
44
45
  end
45
46
  end
@@ -2,18 +2,35 @@ module Install
2
2
  module Ui
3
3
  def self.included(thor)
4
4
  thor.class_eval do
5
- def install_ui
5
+
6
+ desc 'generate_ui_controller', 'Generate the ui controller'
7
+ def generate_ui_controller
6
8
  copy_file 'ui/ui_controller.rb', 'app/controllers/ui_controller.rb'
9
+ end
10
+
11
+ desc 'generate_index', 'Generate index view'
12
+ def generate_index
7
13
  copy_file 'ui/index.html.haml', 'app/views/ui/index.html.haml'
14
+ end
15
+
16
+ desc 'setup_route', 'Add route code to routes config'
17
+ def setup_route
8
18
  inject_into_file 'config/routes.rb', after: "Rails.application.routes.draw do\n" do <<-CODE
9
- # Requires an application restart everytime a new page is added.
10
- Dir.glob('app/views/ui/*.html.haml').sort.each do |file|
11
- action = File.basename(file,'.html.haml')
12
- get \"ui/\#{action}\", controller: 'ui', action: action
13
- end
14
- CODE
19
+ # Requires an application restart everytime a new page is added.
20
+ Dir.glob('app/views/ui/*.html.haml').sort.each do |file|
21
+ action = File.basename(file,'.html.haml')
22
+ get \"ui/\#{action}\", controller: 'ui', action: action
23
+ end
24
+ CODE
15
25
  end
16
26
  end
27
+
28
+ desc 'setup_ui', 'Generate UI route, controller and view setup'
29
+ def setup_ui
30
+ generate_ui_controller
31
+ generate_index
32
+ setup_route
33
+ end
17
34
 
18
35
  end
19
36
  end
@@ -3,7 +3,3 @@
3
3
  //= require turbolinks
4
4
  //= require trix
5
5
  //= require_tree .
6
-
7
- $(function() {
8
- $('.datepicker').datepicker({dateFormat: 'yy-mm-dd'});
9
- });
@@ -1,12 +1,12 @@
1
- class <%= options[:name].pluralize.camelize %>Controller < <% if options[:name].include?("/")%><%= options[:name].split("/").first.camelize %>::<%= options[:name].split("/").first.camelize %><% else %>Application<% end %>Controller
2
- # before_action :<%= options[:name].split("/").last.singularize %>, only: []
1
+ class <%= @name.pluralize.camelize %>Controller < <% if @name.include?("/")%><%= @name.split("/").first.camelize %>::<%= @name.split("/").first.camelize %><% else %>Application<% end %>Controller
2
+ # before_action :<%= @name.split("/").last.singularize %>, only: []
3
3
  private
4
4
 
5
- def <%= options[:name].split("/").last.singularize %>
6
- @<%= options[:name].split("/").last.singularize %> = <%= options[:name].camelize.singularize %>.find(params[:id])
5
+ def <%= @name.split("/").last.singularize %>
6
+ @<%= @name.split("/").last.singularize %> = <%= @name.camelize.singularize %>.find(params[:id])
7
7
  end
8
8
 
9
- def <%= options[:name].split("/").last.singularize %>_params
10
- params.require(:<%= options[:name].split("/").last.singularize %>).permit()
9
+ def <%= @name.split("/").last.singularize %>_params
10
+ params.require(:<%= @name.split("/").last.singularize %>).permit()
11
11
  end
12
12
  end
@@ -1,2 +1,2 @@
1
- class <%= options[:name].split("/").first.camelize %>::<%= options[:name].split("/").first.camelize %>Controller < ApplicationController
1
+ class <%= @name.split("/").first.camelize %>::<%= @name.split("/").first.camelize %>Controller < ApplicationController
2
2
  end
@@ -0,0 +1,10 @@
1
+ class ApplicationDecorator < Draper::Decorator
2
+ delegate_all
3
+ include Draper::LazyHelpers
4
+ # Define methods for all decorated objects.
5
+ # Helpers are accessed through `helpers` (aka `h`). For example:
6
+ #
7
+ # def percent_amount
8
+ # h.number_to_percentage object.amount, precision: 2
9
+ # end
10
+ end
@@ -0,0 +1,13 @@
1
+ class <%= @name.camelize %>Decorator < ApplicationDecorator
2
+ #decorates Namespaced::Model
3
+
4
+ # Return concatenated full name
5
+ def name
6
+ <%= @name %>.attribute + " " + <%= @name %>.attribute
7
+ end
8
+
9
+ # Return edit path
10
+ def edit_link
11
+ link_to :Edit, edit_<%= @name%>_path(<%= @name %>)
12
+ end
13
+ end
@@ -39,11 +39,4 @@ module ApplicationHelper
39
39
  def us_date(date)
40
40
  date.strftime("%m/%d/%Y at %H:%M %p") rescue 'unknown'
41
41
  end
42
-
43
- def present(object, klass = nil)
44
- klass ||= "#{object.class}Presenter".constantize
45
- presenter = klass.new(object, self)
46
- yield presenter if block_given?
47
- presenter
48
- end
49
42
  end
@@ -8,7 +8,7 @@ class DevMailInterceptor
8
8
  dev_text += "BCC address is: #{message.bcc.to_a.join(", ")}\n"
9
9
 
10
10
  message.subject = "[#{Socket.gethostname}] [#{Rails.env}] #{message.subject}"
11
- message.to = '<%= options[:email]%>'
11
+ message.to = '<%= @email %>'
12
12
  message.cc = ""
13
13
  message.bcc = ""
14
14
  append_address_info(message, dev_text)
@@ -1,2 +1,2 @@
1
- class <%= options[:name].camelize %> < ApplicationRecord
1
+ class <%= @name.camelize %> < ApplicationRecord
2
2
  end
@@ -1,5 +1,5 @@
1
- module <%= options[:name].split("/").first.camelize %>
1
+ module <%= @name.split("/").first.camelize %>
2
2
  def self.table_name_prefix
3
- '<%= options[:name].split("/").first.downcase %>_'
3
+ '<%= @name.split("/").first.downcase %>_'
4
4
  end
5
5
  end
@@ -1,24 +1,18 @@
1
- # Authorization for <%= options[:name] %> objects
2
- class <%= options[:name].camelize %>Policy < ApplicationPolicy
3
- # Allow all users to access new <%= options[:name] %>
1
+ class <%= @name.camelize %>Policy < ApplicationPolicy
2
+
4
3
  def new?
5
4
  true
6
5
  end
7
6
 
8
- # Allows owner to edit <%= options[:name].camelize %>
9
7
  def edit?
10
8
  user == record.user
11
9
  end
12
10
 
13
- # Allows all users to create <%= options[:name].camelize %>
14
11
  alias_method :create?, :new?
15
12
 
16
- # Allows all users to view <%= options[:name].camelize %>
17
13
  alias_method :show?, :new?
18
14
 
19
- # Allows owner to update an <%= options[:name].camelize %>
20
15
  alias_method :update?, :edit?
21
16
 
22
- # Allows owner to remove an <%= options[:name].camelize %>
23
17
  alias_method :destroy?, :edit?
24
18
  end
@@ -1,17 +1,17 @@
1
1
  # Presenter class for object views
2
- class <%= options[:name].camelize %>Presenter < BasePresenter
2
+ class <%= @name.camelize %>Presenter < BasePresenter
3
3
  # Reference initialized object_presenter as object
4
- presents :<%= options[:name]%>
4
+ presents :<%= @name%>
5
5
 
6
- # delegate :attribute, to: :<%= options[:name]%>, allow_nil: true
6
+ # delegate :attribute, to: :<%= @name %>, allow_nil: true
7
7
 
8
8
  # Return concatenated full name
9
9
  def name
10
- <%= options[:name]%>.attribute + " " + <%= options[:name]%>.attribute
10
+ <%= @name %>.attribute + " " + <%= @name %>.attribute
11
11
  end
12
12
 
13
13
  # Return edit path
14
14
  def edit_link
15
- link_to :Edit, edit_<%= options[:name]%>_path(<%= options[:name]%>)
15
+ link_to :Edit, edit_<%= @name%>_path(<%= @name %>)
16
16
  end
17
17
  end