myrails 6.0.0 → 7.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.
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