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
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 8450b1df8a8d157e8f7dbe333953599cb38350e97f57fad2105c6d121ed48e4a
4
- data.tar.gz: a06d4fef3fdfac38da6c9e1edb3295fc99abdfe0ce0995bb7851bb02c6efd957
3
+ metadata.gz: d6fd730074c6669bfd1c5bd8689479314e5dfd576f8ae35ce3e83ab33ce34166
4
+ data.tar.gz: a2d148e81059221440ca418b6efcf1e461ba0c194906a2280bac87b526b9f382
5
5
  SHA512:
6
- metadata.gz: 136f26e0eaf3bb7c1d227c91be28497f100e936751372547c01fd35bf5d36a032954ef413d774d99d8b201b136b1a3c9a043f0f6194cab019cea836acdc5192b
7
- data.tar.gz: 89eb02894b6d8757220d786dd050df8192755dc838a66f869c7efcdd63b0f02b0cf034220838cc9382689dd87e14d221284dd5e00cb320cd5c8bdadbcf681a2f
6
+ metadata.gz: 9614cb17e78b3c439617ffe053606453ed29e26b0b0a8a3e2db0de28c016a71ba0d53bbd929c7883d64eb6496399dd1a9d44fc482b21f3e3c3a1f34cd76d48d6
7
+ data.tar.gz: 15e0c1974ec3ed82c6371c27f871715e7ae0cead5fded1a00e6f79ac2be4fc017fb1d078385c99a83601e5b8a303b3c900cff0ee763ff6a2efeed68bde53950f
data/README.md CHANGED
@@ -1,30 +1,34 @@
1
- # Myrails
1
+ # MyRails
2
2
 
3
- This gem was created to make generating rails related files and other rails gem files (that I use) a lot easier. It is a thor backed gem that was designed with rails 5 in mind but most of it "should" work with rails 4.
3
+ A library for generating rails related templates and configuring some standard gems (that I use) a lot easier. This was designed with Rails 5 in mind but most of it "should" work with rails 4. An example of the design differences is, a generated model inherit from `ApplicatinoRecord` instead of `ActiveRecord::Base`
4
4
 
5
- This gem is not endorsed by the rails core team. I wrote it as a convenience for generating files that I would otherwise have written by hand.
5
+ This library is not endorsed by the Rails core team. I wrote it as a convenience for generating code that I would otherwise have written by hand or would have had to manage with code snippets (I use more than one editor)
6
6
 
7
7
  ## Disclaimer
8
8
 
9
- `user at your own risk!` I am not held responsible for using this gem. If you are not usre it will work for you, install it on a vagrant vm and give it a try there. You can use even use the Vagrantfile that is in this repo to take care of configuring a useable vm.
9
+ `Use at your own risk!` I am not responsible for any issues that come from using this library. If you are not sure it will work for you, install it on a vagrant vm and give it a try there. You can even use the Vagrantfile that is in this repo to take care of configuring a useable vm.
10
+
11
+ This does not work with the windows environment
10
12
 
11
13
  ## Notes
12
14
 
13
- Use 1.1.1 if you are primarily developing in rails 3 & 4
15
+ Use v1.1.1 if you are primarily developing in rails 3 & 4
14
16
 
15
- Use the latest version if are primarily developing in rails 5
17
+ Use the latest version if you are primarily developing in rails 5
16
18
 
17
- ## Examples
19
+ ## Requirements
18
20
 
19
- Here is an example of the gem works:
21
+ Ruby 2.2 and above
20
22
 
21
- Lets say I use pundit. With this gem I am able to run the following:
23
+ ## Examples
24
+
25
+ A gem I use often is pundit. With this library I can generate a policy along with an RSpec pundit matcher file to test the policy with. I am able to run the following:
22
26
 
23
27
  ```ruby
24
- myrails policy --name=article
28
+ myrails kickstart policy article
25
29
  ```
26
30
 
27
- which outputs:
31
+ which outputs something like:
28
32
 
29
33
  ```
30
34
  create app/policies/article_policy.rb
@@ -44,39 +48,34 @@ with corresponding files:
44
48
  └── article_policy_spec.rb
45
49
  ```
46
50
 
47
- Inside app/policies/articles_policy.rb is boiler plate code like:
51
+ Inside app/policies/articles_policy.rb is boiler plate code (something like):
48
52
 
49
- ```
53
+ ```ruby
50
54
  class ArticlePolicy < ApplicationPolicy
51
- # Allow all users to access new article
55
+
52
56
  def new?
53
57
  true
54
58
  end
55
59
 
56
- # Allows owner to edit Article
57
60
  def edit?
58
61
  user == record.user
59
62
  end
60
63
 
61
- # Allows all users to create Article
62
64
  alias_method :create?, :new?
63
65
 
64
- # Allows all users to view Article
65
66
  alias_method :show?, :new?
66
67
 
67
- # Allows owner to update an Article
68
68
  alias_method :update?, :edit?
69
69
 
70
- # Allows owner to remove an Article
71
70
  alias_method :destroy?, :edit?
72
71
  end
73
72
  ```
74
73
 
75
- Inside the spec/policies/articles_policy_spec.rb is boiler plate code like:
74
+ Inside the spec/policies/articles_policy_spec.rb is boiler plate code (something like):
76
75
 
77
- ```
78
- # Use with Pundit Matches: https://github.com/chrisalley/pundit-matchers
76
+ ```ruby
79
77
  require 'rails_helper'
78
+
80
79
  describe ArticlePolicy do
81
80
  subject { ArticlePolicy.new(user, article) }
82
81
 
@@ -107,15 +106,17 @@ end
107
106
 
108
107
  ## Installation
109
108
 
110
- In your terminal:
109
+ In the terminal:
111
110
 
112
- ```ruby
113
- # For development in rails 3 & 4 primarily
111
+ ### For use with Rails 3 & 4
114
112
 
113
+ ```ruby
115
114
  gem install myrails -v 1.1.1
115
+ ```
116
116
 
117
- # For development in rails 5 primarily
117
+ ### For use with Rails 5
118
118
 
119
+ ```ruby
119
120
  gem install myrails
120
121
  ```
121
122
 
@@ -123,17 +124,34 @@ gem install myrails
123
124
 
124
125
  Simply type `myrails` to see the help menu
125
126
 
127
+ The current options available are:
128
+
129
+ * db - Rails database options
130
+ * engine (aliase e) - Rails engine options
131
+ * install (aliase i) - Rails gems and configuration options
132
+ * kickstart (aliase ks) - Rails template generation options
133
+ * spec (aliase s) - RSpec template generation options
134
+ * setup_sendgrid - Install sendgrid initializer with mail interceptor
135
+
136
+ Every option also has a help menu. For instance, specifying `myrails kickstart` will display something like:
137
+
126
138
  ```ruby
127
- # Example for generating a presenter class
128
- myrails presenter --name=post
139
+ ERROR: "myrails kickstart" was called with no arguments
140
+ Usage: "myrails kickstart <OPTION> <NAME>"
141
+ Available Options:
142
+ * controller: Generate rails controller with corresponding RSpec file
143
+ * decorator: Generate draper decorator with corresponding RSpec file
144
+ * factory: Generate factory[girl|bot] factory
145
+ * model: Generate rails model with corresponding RSpec file
146
+ * policy: Generate pundit policy with corresponding RSpec file
147
+ * ui: Generate a ui file for mocking front end
129
148
  ```
130
- This generates a PostPresenter class in app/presenters that inherits from app/presenters/base_presenter.rb to be used in views. This also generates a spec/presenters/post_presenter_spec.rb file for testing.
131
149
 
132
150
  ## Development
133
151
 
134
152
  After checking out the repo, run `bin/setup` to install dependencies. Then, run `rake spec` to run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
135
153
 
136
- To install this gem onto your local machine, run `bundle exec rake install`.
154
+ To install this gem onto your local machine, run `bundle exec rake build` then `bundle exec rake install`.
137
155
 
138
156
  ## Releasing
139
157
  To release a new version,
@@ -6,160 +6,84 @@ require_relative 'myrails/modules/bootstrap'
6
6
  require_relative 'myrails/modules/material'
7
7
  require_relative 'myrails/modules/ui'
8
8
  require_relative 'myrails/modules/assets'
9
- require_relative 'myrails/modules/application'
9
+ require_relative 'myrails/modules/application_generators'
10
+ require_relative 'myrails/modules/application_generator_actions'
10
11
  require_relative 'myrails/modules/capistrano'
11
- require_relative 'myrails/modules/database'
12
+ require_relative 'myrails/modules/database_generator'
13
+ require_relative 'myrails/modules/database_generator_actions'
12
14
  require_relative 'myrails/modules/devise'
13
15
  require_relative 'myrails/modules/dotenv'
14
- require_relative 'myrails/modules/engine'
16
+ require_relative 'myrails/modules/draper'
17
+ require_relative 'myrails/modules/engine_generators'
18
+ require_relative 'myrails/modules/engine_generator_actions'
15
19
  require_relative 'myrails/modules/figaro'
16
- require_relative 'myrails/modules/footnotes'
17
20
  require_relative 'myrails/modules/heroku'
18
21
  require_relative 'myrails/modules/pundit'
19
22
  require_relative 'myrails/modules/rails_generators'
23
+ require_relative 'myrails/modules/rails_generator_actions'
20
24
  require_relative 'myrails/modules/rspec_generators'
25
+ require_relative 'myrails/modules/rspec_generator_actions'
21
26
  require_relative 'myrails/modules/rspec'
27
+
22
28
  module Myrails
23
29
  class Myrails < Thor
24
30
  include Thor::Actions
31
+
25
32
  source_root "#{__dir__}/myrails/templates"
33
+
26
34
  TEMPLATES = source_root
27
- ENVIRONMENTS = %w(development test production)
28
35
 
29
36
  no_tasks do
30
37
  include Install::Gems
31
38
  include Install::Ui
32
- include Install::ApplicationHelper
33
39
  include Install::RSpec
34
40
  include Install::Devise
35
41
  include Install::Pundit
36
- include Install::Footnotes
37
42
  include Install::DotEnv
38
43
  include Install::Heroku
39
44
  include Install::Capistrano
40
45
  include Install::Assets
41
46
  include Install::Figaro
47
+ include Install::Draper
42
48
  include Layout::Bootstrap
43
49
  include Layout::Material
44
-
45
- desc 'install_layout', 'Generate common layout files'
46
- def install_layout
47
- answer = ask 'Would you like to use [B]ootstrap or [M]aterial'
48
-
49
- run 'rm app/views/layouts/application.html.erb'
50
-
51
- install_assets
52
-
53
- if answer =~ /^B|b/
54
- install_bootstrap
55
- elsif answer =~ /^M|m/
56
- install_material
57
- end
58
-
59
- insert_into_file 'app/controllers/application_controller.rb', after: "class ApplicationController < ActionController::Base\n" do <<-CODE
60
- add_flash_types :error, :success
61
- CODE
62
- end
63
- end
64
-
65
- desc 'git_init', "Initialize git with some files automatically ignored"
66
- def git_init
67
- run 'git init'
68
- run 'echo /coverage >> .gitignore'
69
- run 'echo /config/application.yml >> .gitignore'
70
- run 'git add --all'
71
- run "git commit -m 'initial commit'"
72
- end
73
-
74
- desc 'base_install', 'Run the most common actions in the right order'
75
- def base_install
76
- install_gems
77
- install_application_helper
78
- install_assets
79
- install_layout
80
- install_css
81
- install_footer
82
- install_ui
83
- install_pundit
84
- install_rspec
85
- install_footnotes
86
- config_env
87
- install_figaro
88
- git_init
89
- say 'Dont forget to run config_env'
90
- end
91
-
92
- end
93
- # end of no_tasks
50
+ include Rails::Generator::Actions
51
+ include RSpec::Generator::Actions
52
+ include Engine::Generator::Actions
53
+ include Database::Generator::Actions
54
+ include Application::Generator::Actions
55
+
56
+ end # end of no_tasks
57
+
58
+
94
59
  include Rails::Generators
95
60
  include RSpec::Generators
96
- include Rails::Engines
97
- include Rails::Database
98
-
99
- desc 'install NAME', 'Install customizations to configure application quickly. Type `myrails install` for options'
100
- def install(name=nil)
101
- options = {
102
- application_helper: 'Overwrite default application helper with a custom helper',
103
- gems: 'Install default gem set',
104
- layout: 'Generate assets and custom styles using either Boostrap or Material',
105
- ui: 'Generate UI resource',
106
- pundit: 'Install and configure Pundit gem',
107
- rspec: 'Install and configure Rspec gem',
108
- footnotes: 'Install and configure Footnotes gem',
109
- base: 'Run through all options listed in this list',
110
- git: 'Generate git directory and ignore default files',
111
- heroku: 'Generate needed setup for Heroku deployment',
112
- devise: 'Generate and configure Devise gem',
113
- dotenv: 'Generate and configure Dotenv gem (Do not use if figaro is already installed)',
114
- capistrano: 'Generate capistrano with default deployment',
115
- figaro: 'Generate and configure Figaro Gem (Do not use if dotenv is already installed)',
116
- env_config: 'Configure environment files with default hosts etc.'
117
- }
118
- unless name
119
- say 'ERROR: "myrails install" was called with no arguments'
120
- say 'Usage: "myrails install NAME"'
121
- say "Available Options:\n"
122
- options.each{|k,v| say "* #{k}: #{v}"}
123
- exit
124
- end
125
-
126
- case name
127
- when 'application_helper'
128
- install_application_helper
129
- when 'gems'
130
- install_gems
131
- when 'layout'
132
- install_layout
133
- when 'ui'
134
- install_ui
135
- when 'pundit'
136
- install_pundit
137
- install_rails_helper
138
- when 'rspec'
139
- install_rspec
140
- when 'footnotes'
141
- install_footnotes
142
- when 'base'
143
- base_install
144
- when 'git'
145
- git_init
146
- when 'heroku'
147
- install_heroku
148
- when 'devise'
149
- install_devise
150
- when 'dotenv'
151
- install_dotenv
152
- when 'capistrano'
153
- install_capistrano
154
- when 'figaro'
155
- install_figaro
156
- when 'env_config'
157
- config_env
158
- else
159
- say "Unknown Action! #{name}"
61
+ include Engine::Generators
62
+ include Database::Generators
63
+ include Application::Generators
64
+
65
+ # Moved here because it envokes draper kickstart method for some reason.
66
+ # Will address later.
67
+ desc 'setup_sendgrid', 'Generate sendgrid initializer and mail interceptor'
68
+ def setup_sendgrid
69
+ environments = %w(development test production)
70
+
71
+ @email = ask 'What email address would you like to use?', :yellow
72
+
73
+ raise ArgumentError, 'Email address required' unless @email
74
+
75
+ copy_file 'rails/config/initializers/sendgrid.rb', 'config/initializers/sendgrid.rb'
76
+ template 'rails/app/mailers/dev_mail_interceptor.rb', 'app/mailers/dev_mail_interceptor.rb'
77
+
78
+ environments.each do |environment|
79
+ unless environment == 'production'
80
+ inject_into_file "config/environments/#{environment}.rb", after: "Rails.application.configure do\n" do <<-CODE
81
+ ActionMailer::Base.register_interceptor(DevMailInterceptor)
82
+ CODE
83
+ end
84
+ end
160
85
  end
161
86
  end
162
-
163
87
 
164
88
  end
165
89
  end
@@ -0,0 +1,61 @@
1
+ module Application
2
+ module Generator
3
+ module Actions
4
+ def self.included(thor)
5
+ thor.class_eval do
6
+
7
+ desc 'setup_application_helper', 'overwrite rails application helper with some default code'
8
+ def setup_application_helper
9
+ copy_file 'rails/app/helpers/application_helper.rb', 'app/helpers/application_helper.rb'
10
+ end
11
+
12
+ desc 'setup_layout', 'Generate JS and CSS files with a choice of CSS Framework'
13
+ def setup_layout
14
+ answer = ask 'Would you like to use [B]ootstrap or [M]aterial? Default: ', :yellow, default: 'M'
15
+
16
+ run 'rm app/views/layouts/application.html.erb'
17
+
18
+ setup_assets
19
+
20
+ if answer =~ /^B|b/
21
+ setup_bootstrap
22
+ elsif answer =~ /^M|m/
23
+ setup_material
24
+ end
25
+
26
+ insert_into_file 'app/controllers/application_controller.rb', after: "class ApplicationController < ActionController::Base\n" do <<-CODE
27
+ add_flash_types :error, :success
28
+ CODE
29
+ end
30
+ end
31
+
32
+ desc 'setup_git', "Initialize git with some files set to be ignored"
33
+ def setup_git
34
+ run 'git init' unless File.exist?('.git')
35
+ run 'echo /coverage >> .gitignore'
36
+ run 'echo /config/application.yml >> .gitignore'
37
+ run 'git add --all'
38
+ run "git commit -m 'initial commit'"
39
+ end
40
+
41
+ desc 'base_setup', 'Run the most common setup actions in the right order'
42
+ def base_setup
43
+ setup_gems
44
+ setup_application_helper
45
+ setup_layout
46
+ setup_ui
47
+ setup_pundit
48
+ setup_draper
49
+ setup_rspec
50
+ config_env
51
+ setup_figaro
52
+ setup_git
53
+ say 'Dont forget to run setup config/application.yml with initial values.'
54
+ end
55
+
56
+
57
+ end
58
+ end
59
+ end
60
+ end
61
+ end
@@ -0,0 +1,80 @@
1
+ module Application
2
+ module Generators
3
+ def self.included(thor)
4
+ thor.class_eval do
5
+
6
+ desc 'install NAME', 'Install customizations to configure application quickly. Type `myrails install` for options'
7
+ def install(name=nil)
8
+ options = {
9
+ app_helper: 'Overwrite default application helper with a custom helper',
10
+ base: 'Run through all options listed in this list',
11
+ capistrano: 'Generate capistrano with default deployment',
12
+ devise: 'Generate and configure Devise gem',
13
+ dotenv: 'Generate and configure Dotenv gem (Do not use if figaro is already installed)',
14
+ draper: 'Generate and configure Draper gem',
15
+ env_config: 'Configure environment files with default hosts etc.',
16
+ figaro: 'Generate and configure Figaro Gem (Do not use if dotenv is already installed)',
17
+ gems: 'Install default gem set',
18
+ git: 'Generate git directory and ignore default files',
19
+ heroku: 'Generate needed setup for Heroku deployment',
20
+ layout: 'Generate assets and custom styles using either Boostrap or Material',
21
+ pundit: 'Install and configure Pundit gem',
22
+ rspec: 'Install and configure Rspec gem',
23
+ # sendgrid: 'Install and configure ActionMailer to use sendgrid',
24
+ ui: 'Generate UI resource'
25
+ }
26
+
27
+ unless name
28
+ say 'ERROR: "myrails install" was called with no arguments'
29
+ say 'Usage: "myrails install NAME"'
30
+ say "Available Options:\n"
31
+ options.each{|k,v| say "* #{k}: #{v}"}
32
+ exit
33
+ end
34
+
35
+ case name
36
+ when 'app_helper'
37
+ setup_application_helper
38
+ when 'gems'
39
+ setup_gems
40
+ when 'layout'
41
+ setup_layout
42
+ when 'ui'
43
+ setup_ui
44
+ when 'pundit'
45
+ setup_pundit
46
+ setup_rails_helper
47
+ when 'rspec'
48
+ setup_rspec
49
+ when 'base'
50
+ base_setup
51
+ when 'git'
52
+ setup_git
53
+ when 'heroku'
54
+ setup_heroku
55
+ when 'devise'
56
+ setup_devise
57
+ when 'dotenv'
58
+ setup_dotenv
59
+ when 'capistrano'
60
+ setup_capistrano
61
+ when 'figaro'
62
+ setup_figaro
63
+ when 'env_config'
64
+ config_env
65
+ when 'draper',
66
+ setup_draper
67
+ # when 'sendgrid'
68
+ # setup_sendgrid
69
+ else
70
+ say "Unknown Action! #{name}"
71
+ end
72
+ end
73
+
74
+ desc 'i', 'Install shortcut'
75
+ alias_method :i, :install
76
+
77
+ end
78
+ end
79
+ end
80
+ end