rails_app_generator 0.2.26 → 0.2.29

Sign up to get free protection for your applications and to get access to all the features.
Files changed (51) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +22 -0
  3. data/after_templates/addons/devise_masquerade/_.rb +7 -7
  4. data/after_templates/addons/devise_masquerade/app/views/home/index.html.erb +2 -6
  5. data/after_templates/addons/pretender/_.rb +36 -0
  6. data/after_templates/addons/pretender/app/controllers/application_controller.rb +3 -0
  7. data/after_templates/addons/pretender/app/controllers/home_controller.rb +4 -0
  8. data/after_templates/addons/pretender/app/models/user.rb +15 -0
  9. data/after_templates/addons/pretender/app/views/home/index.html.erb +67 -0
  10. data/after_templates/addons/pretender/app/views/layouts/_footer.html.erb +1 -0
  11. data/after_templates/addons/pretender/app/views/layouts/_navbar.html.erb +8 -0
  12. data/after_templates/addons/pretender/app/views/layouts/application.html.erb +58 -0
  13. data/after_templates/addons/pretender/db/seeds.rb +3 -0
  14. data/after_templates/addons/rolify/_.rb +45 -0
  15. data/after_templates/addons/rolify/app/controllers/home_controller.rb +35 -0
  16. data/after_templates/addons/rolify/app/controllers/rolify_controller.rb +26 -0
  17. data/after_templates/addons/rolify/app/models/post.rb +3 -0
  18. data/after_templates/addons/rolify/app/models/user.rb +25 -0
  19. data/after_templates/addons/rolify/app/views/home/_roles.html.erb +5 -0
  20. data/after_templates/addons/rolify/app/views/home/bossy_boots.html.erb +5 -0
  21. data/after_templates/addons/rolify/app/views/home/index.html.erb +37 -0
  22. data/after_templates/addons/rolify/app/views/home/super_hero.html.erb +5 -0
  23. data/after_templates/addons/rolify/app/views/home/use_in_moderation.html.erb +5 -0
  24. data/after_templates/addons/rolify/app/views/home/use_me.html.erb +5 -0
  25. data/after_templates/addons/rolify/app/views/layouts/_footer.html.erb +1 -0
  26. data/after_templates/addons/rolify/app/views/layouts/_navbar.html.erb +18 -0
  27. data/after_templates/addons/rolify/app/views/layouts/application.html.erb +52 -0
  28. data/after_templates/addons/rolify/app/views/rolify/_form.html.erb +61 -0
  29. data/after_templates/addons/rolify/app/views/rolify/_user.html.erb +34 -0
  30. data/after_templates/addons/rolify/app/views/rolify/edit.html.erb +4 -0
  31. data/after_templates/addons/rolify/app/views/rolify/show.html.erb +5 -0
  32. data/after_templates/addons/rolify/db/seeds.rb +19 -0
  33. data/docs/last_run/app_generator_class.json +21 -5
  34. data/docs/last_run/app_generator_data.json +6 -4
  35. data/docs/last_run/rails_options_class.json +19 -3
  36. data/docs/last_run/rails_options_data.json +7 -6
  37. data/lib/rails_app_generator/addon.rb +6 -0
  38. data/lib/rails_app_generator/addons/devise.rb +19 -3
  39. data/lib/rails_app_generator/addons/pretender.rb +6 -1
  40. data/lib/rails_app_generator/addons/rolify.rb +18 -0
  41. data/lib/rails_app_generator/app_generator.rb +1 -0
  42. data/lib/rails_app_generator/rag_initializer.rb +1 -0
  43. data/lib/rails_app_generator/version.rb +1 -1
  44. data/package-lock.json +2 -2
  45. data/package.json +1 -1
  46. data/profiles/addons/pretender.json +16 -0
  47. data/profiles/addons/rolify.json +17 -0
  48. data/templates/addons/pretender/app/controllers/pretender_controller.rb +14 -0
  49. data/templates/thor_task/profile/after_template.rb +22 -16
  50. data/templates/thor_task/profile/profile.json.tt +1 -1
  51. metadata +34 -2
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: '0080278d3ec15331c53403ac5ff928f153f26c4fddcc5d066d5c5104155600d8'
4
- data.tar.gz: '07905d7681aac0916bc0ebdcb5eabaf8f6568c4ba52e1ed09109043ca4352eb7'
3
+ metadata.gz: 9814e53f17fa635ed1ab01effbdc7b434ccac9c09c8b4f3b25f2bd75c905bc34
4
+ data.tar.gz: 2986a8435c7bac002667d0826759ca8d480ac9b6f3397c717166eb08cc2ef84f
5
5
  SHA512:
6
- metadata.gz: 5e903d7fb73c50d7f04fa6c9f7e3658a4c13bda299066bf8439de52734a55ff20e6e32858eb3689e3a9360604f2f4fbcf2fa7375053f63931ad8ad77399391a7
7
- data.tar.gz: 6f17a342e51ed8304e0b127b2d57b25162747d8dd7fbd0222855ada67fc99e08dca4b81559cf6447e2e00640fe22f03cb66d8a62bce87f49ce3f0975ae0c1555
6
+ metadata.gz: 1299bd5a332ca9b2a8b9cefcbb51ea4338f5fefbb52f2c872429dee01ec6a94bb8d1838fe20c8ab6d3a2fcbd44e00b3f09e76abb28528a9f9944598d0c068c7e
7
+ data.tar.gz: bac96b22350786b254f9f5c713736ce9394462bc9caa22d64e5490a892f40122b5fd8b2c3c7f6fa5058eafc5b80ce07b30c2297ba62d389d7b7b2682beba8892
data/CHANGELOG.md CHANGED
@@ -1,3 +1,25 @@
1
+ ## [0.2.28](https://github.com/klueless-io/rails_app_generator/compare/v0.2.27...v0.2.28) (2022-08-17)
2
+
3
+
4
+ ### Bug Fixes
5
+
6
+ * add rolify addon ([804ecf1](https://github.com/klueless-io/rails_app_generator/commit/804ecf1ba1fe1a56512b6d335a77558b0da3ad97))
7
+
8
+ ## [0.2.27](https://github.com/klueless-io/rails_app_generator/compare/v0.2.26...v0.2.27) (2022-08-17)
9
+
10
+
11
+ ### Bug Fixes
12
+
13
+ * add pretender profile ([25abb2b](https://github.com/klueless-io/rails_app_generator/commit/25abb2b5b4a187db13d62d9747b7a8e283298a88))
14
+ * add pretender profile ([5d24dfc](https://github.com/klueless-io/rails_app_generator/commit/5d24dfcd5f0420e7e1004a30de33e9003f1e9d5c))
15
+
16
+ ## [0.2.26](https://github.com/klueless-io/rails_app_generator/compare/v0.2.25...v0.2.26) (2022-08-17)
17
+
18
+
19
+ ### Bug Fixes
20
+
21
+ * add pretender addon ([e0bda54](https://github.com/klueless-io/rails_app_generator/commit/e0bda54cc74da230a579ff1219b9b2f2172936d1))
22
+
1
23
  ## [0.2.25](https://github.com/klueless-io/rails_app_generator/compare/v0.2.24...v0.2.25) (2022-08-17)
2
24
 
3
25
 
@@ -15,13 +15,6 @@ after_bundle do
15
15
  setup_db
16
16
  end
17
17
 
18
- def setup_db
19
- template 'db/seeds.rb' , 'db/seeds.rb'
20
-
21
- db_migrate
22
- db_seed
23
- end
24
-
25
18
  def setup_customizations
26
19
  route("root 'home#index'")
27
20
 
@@ -34,3 +27,10 @@ def setup_customizations
34
27
  directory "app/views"
35
28
  template 'app/views/layouts/application.html.erb' , 'app/views/layouts/application.html.erb'
36
29
  end
30
+
31
+ def setup_db
32
+ template 'db/seeds.rb' , 'db/seeds.rb'
33
+
34
+ db_migrate
35
+ db_seed
36
+ end
@@ -4,7 +4,7 @@
4
4
 
5
5
  <p><b class='alert'>Warning!</b> If <code>masquerade?</code> is never returning <code>true</code> then ensure you have turned on caching in development using <code>rails dev:cache</code> </p>
6
6
 
7
- <pre><code>user_masquerade? => <%= user_masquerade? %></code></pre>
7
+ <pre><code>true_user => <%= current_user ? true_user.name : 'NOT SIGNED IN' %></code></pre>
8
8
 
9
9
  <p>Sign in with an <b>Admin</b> user and then impersonate other users</p>
10
10
 
@@ -46,7 +46,7 @@
46
46
  <% if current_user.user? %>
47
47
  Cannot masquerade
48
48
  <% elsif user.user? %>
49
- <%= link_to user.name.capitalize, masquerade_path(user) %>
49
+ <%= link_to user.name.capitalize, masquerade_path(user), data: { turbo_method: :post } %>
50
50
  <% else %>
51
51
 
52
52
  <% end %>
@@ -60,7 +60,3 @@
60
60
  </tr>
61
61
  <% end %>
62
62
  </table>
63
-
64
- <% if current_user&.user? && !user_masquerade? %>
65
- <p class='alert'>Sign in as an admin user</p>
66
- <% end %>
@@ -0,0 +1,36 @@
1
+ # frozen_string_literal: true
2
+
3
+ # Log in as another user in Rails
4
+ #
5
+ # exe/rag addons/pretender
6
+
7
+ self.local_template_path = File.dirname(__FILE__)
8
+
9
+ gac 'base rails 7 image created'
10
+
11
+ prepare_environment
12
+
13
+ after_bundle do
14
+ setup_customizations
15
+ setup_db
16
+ end
17
+
18
+ def setup_customizations
19
+ route("root 'home#index'")
20
+
21
+ force_copy
22
+
23
+ add_controller('home', 'index')
24
+
25
+ directory "app/controllers"
26
+ directory "app/models"
27
+ directory "app/views"
28
+ template 'app/views/layouts/application.html.erb' , 'app/views/layouts/application.html.erb'
29
+ end
30
+
31
+ def setup_db
32
+ template 'db/seeds.rb' , 'db/seeds.rb'
33
+
34
+ db_migrate
35
+ db_seed
36
+ end
@@ -0,0 +1,3 @@
1
+ class ApplicationController < ActionController::Base
2
+ impersonates :user
3
+ end
@@ -0,0 +1,4 @@
1
+ class HomeController < ApplicationController
2
+ def index
3
+ end
4
+ end
@@ -0,0 +1,15 @@
1
+ class User < ApplicationRecord
2
+ after_initialize :set_default_role, if: :new_record?
3
+
4
+ devise :database_authenticatable, :registerable, :recoverable, :rememberable, :validatable
5
+
6
+ has_many :posts
7
+
8
+ enum role: { user: 0, moderator: 1, admin: 9 }
9
+
10
+ private
11
+
12
+ def set_default_role
13
+ self.role ||= :user
14
+ end
15
+ end
@@ -0,0 +1,67 @@
1
+ <h1>Pretender</h1>
2
+
3
+ <h4>Log in as another user in Rails</h4>
4
+
5
+ <pre><code>true_user => <%= current_user ? true_user.name : 'NOT SIGNED IN' %></code></pre>
6
+
7
+ <p>Sign in with an <b>Admin</b> user and then impersonate other users</p>
8
+
9
+ <h3>Sample users and passwords</h3>
10
+
11
+ <% if current_user %>
12
+ <% if current_user.admin? %>
13
+ <h1 class='admin'><%= current_user.name.capitalize %> - Admininstrator</h1>
14
+ <% elsif current_user.user? %>
15
+ <h1 class='user'><%= current_user.name.capitalize %> - User</h1>
16
+ <% end %>
17
+ <% else %>
18
+ <h1 class='not-signed-in'>Not currently signed in</h1>
19
+ <% end %>
20
+
21
+ <table style='width: 600px;'>
22
+ <tr>
23
+ <th>Name</th>
24
+ <th>Email</th>
25
+ <th>Role</th>
26
+ <% if current_user %>
27
+ <th>Impersonate</th>
28
+ <% else %>
29
+ <th>Password</th>
30
+ <% end %>
31
+ </tr>
32
+
33
+ <% if current_user != true_user %>
34
+ You (<%= true_user.name %>) are signed in as <%= current_user.name %>
35
+ <% end %>
36
+
37
+ <% User.all.each do |user| %>
38
+ <tr>
39
+ <td><%= user.name %></td>
40
+ <td><%= user.email %></td>
41
+ <td><%= user.role %></td>
42
+ <td>
43
+ <% if current_user %>
44
+ <% if current_user.admin? %>
45
+ <% if user.admin? && current_user != true_user %>
46
+ <%= link_to "Back to #{user.name.capitalize}", stop_impersonating_user_path, data: { turbo_method: :post } %>
47
+ <% elsif user.user? %>
48
+ <%= link_to user.name.capitalize, impersonate_user_path(user), data: { turbo_method: :post } %>
49
+ <% end %>
50
+ <% else %>
51
+ <% if user.admin? && current_user != true_user %>
52
+ <%= link_to "Back to #{user.name.capitalize}", stop_impersonating_user_path, data: { turbo_method: :post } %>
53
+ <% elsif current_user == true_user %>
54
+ N/A
55
+ <% else %>
56
+
57
+ <% end %>
58
+ <% end %>
59
+ <% else %>
60
+ password
61
+ <% end %>
62
+
63
+ </td>
64
+ </td>
65
+ </tr>
66
+ <% end %>
67
+ </table>
@@ -0,0 +1,8 @@
1
+ <%= link_to 'Home', root_path %>
2
+ <% if current_user %>
3
+ | <%= link_to 'Sign Out', destroy_user_session_path, data: { turbo_method: :delete } %>
4
+ | Current User: <b><%= current_user.name.capitalize %></b>
5
+ | True User: <b><%= true_user.name.capitalize %></b>
6
+ <% else %>
7
+ | <%= link_to 'Sign In', new_user_session_path %>
8
+ <% end%>
@@ -0,0 +1,58 @@
1
+ <!DOCTYPE html>
2
+ <html>
3
+ <head>
4
+ <title><%= camelized %></title>
5
+ <meta name="viewport" content="width=device-width,initial-scale=1">
6
+ <%%= csrf_meta_tags %>
7
+ <%%= csp_meta_tag %>
8
+
9
+ <%- if options[:skip_hotwire] || options[:skip_javascript] -%>
10
+ <%%= stylesheet_link_tag "application" %>
11
+ <%- else -%>
12
+ <%%= stylesheet_link_tag "application", "data-turbo-track": "reload" %>
13
+ <%- end -%>
14
+ <%%= javascript_include_tag "application", "data-turbo-track": "reload", defer: true %>
15
+ <style>
16
+ .notice {
17
+ color: green;
18
+ }
19
+ .alert {
20
+ color: red;
21
+ }
22
+ table {
23
+ border-collapse: collapse;
24
+ }
25
+ th, td {
26
+ border: 1px solid #ccc;
27
+ padding: 5px;
28
+ }
29
+ .admin {
30
+ background-color: pink;
31
+ }
32
+ .user {
33
+ background-color: lightgreen;
34
+ }
35
+ .not-signed-in {
36
+ background-color: lightgrey;
37
+ }
38
+ .admin, .user, .not-signed-in {
39
+ text-align: center;
40
+ }
41
+ </style>
42
+ </head>
43
+
44
+ <body>
45
+ <header>
46
+ <%%= render 'layouts/navbar' %>
47
+ <hr />
48
+ <%%= render 'layouts/alerts' %>
49
+ </header>
50
+ <main>
51
+ <%%= yield %>
52
+ </main>
53
+ <footer>
54
+ <%%= render 'layouts/footer' %>
55
+ </footer>
56
+ </body>
57
+ </html>
58
+
@@ -0,0 +1,3 @@
1
+ User.create(email: 'david@site.com', name: 'david', password: 'password', password_confirmation: 'password', role: :admin)
2
+ User.create(email: 'james@site.com', name: 'james', password: 'password', password_confirmation: 'password')
3
+ User.create(email: 'sally@site.com', name: 'sally', password: 'password', password_confirmation: 'password')
@@ -0,0 +1,45 @@
1
+ # frozen_string_literal: true
2
+
3
+ # Role management library with resource scoping
4
+ #
5
+ # exe/rag addons/rolify
6
+
7
+ self.local_template_path = File.dirname(__FILE__)
8
+
9
+ gac 'base rails 7 image created'
10
+
11
+ prepare_environment
12
+
13
+ after_bundle do
14
+ scaffolds
15
+ setup_customizations
16
+ setup_db
17
+ end
18
+
19
+ def scaffolds
20
+ add_scaffold('post', 'title', 'body:text')
21
+ end
22
+
23
+ def setup_customizations
24
+ route("root 'home#index'")
25
+ route("get 'home/quick_sign_in/:user_id', to: 'home#quick_sign_in', as: 'quick_sign_in'")
26
+ route("get 'rolify/:id', to: 'rolify#show', as: 'rolify'")
27
+ route("get 'rolify/:id/edit', to: 'rolify#edit', as: 'edit_rolify'")
28
+ route("patch 'rolify/:id', to: 'rolify#update'")
29
+
30
+ force_copy
31
+
32
+ add_controller('home', 'index', 'quick_sign_in', 'bossy_boots', 'use_in_moderation', 'use_me', 'super_hero')
33
+
34
+ directory "app/controllers"
35
+ directory "app/models"
36
+ directory "app/views"
37
+ template 'app/views/layouts/application.html.erb' , 'app/views/layouts/application.html.erb'
38
+ end
39
+
40
+ def setup_db
41
+ template 'db/seeds.rb' , 'db/seeds.rb'
42
+
43
+ db_migrate
44
+ db_seed
45
+ end
@@ -0,0 +1,35 @@
1
+ class HomeController < ApplicationController
2
+ before_action :require_permission, except: %i[index quick_sign_in]
3
+
4
+ def index
5
+ end
6
+
7
+ def quick_sign_in
8
+ user = User.find(params[:user_id])
9
+ sign_in(user)
10
+ redirect_to root_path
11
+ end
12
+
13
+ def bossy_boots
14
+ end
15
+
16
+ def use_in_moderation
17
+ end
18
+
19
+ def use_me
20
+ end
21
+
22
+ def super_hero
23
+ end
24
+
25
+ def require_permission
26
+ return if current_user&.is_super_user?
27
+ return if current_user&.is_admin? && action_name == "bossy_boots"
28
+ return if current_user&.is_moderator? && action_name == "use_in_moderation"
29
+ return if current_user&.is_user? && action_name == "use_me"
30
+
31
+ flash.alert = "You do not have permission to access #{action_name.titleize}"
32
+
33
+ redirect_to root_path
34
+ end
35
+ end
@@ -0,0 +1,26 @@
1
+ class RolifyController < ApplicationController
2
+ before_action :set_user, only: %i[ show edit update ]
3
+
4
+ def show
5
+ end
6
+
7
+ def edit
8
+ end
9
+
10
+ def update
11
+ if @user.update(user_params)
12
+ redirect_to root_path, notice: "User was successfully updated."
13
+ else
14
+ render :edit, status: :unprocessable_entity
15
+ end
16
+ end
17
+
18
+ private
19
+ def set_user
20
+ @user = User.find(params[:id])
21
+ end
22
+
23
+ def user_params
24
+ params.require(:user).permit(role_ids: [])
25
+ end
26
+ end
@@ -0,0 +1,3 @@
1
+ class Post < ApplicationRecord
2
+ resourcify
3
+ end
@@ -0,0 +1,25 @@
1
+ class User < ApplicationRecord
2
+ # Rolify needs to be called before assigning default role due to a bug in Rolify
3
+ # see: https://github.com/RolifyCommunity/rolify/issues/518#issuecomment-1218705389
4
+ rolify
5
+
6
+ after_create :assign_default_role
7
+
8
+ devise :database_authenticatable, :registerable, :recoverable, :rememberable, :validatable
9
+
10
+ validate :must_have_role, on: :update
11
+
12
+ def assign_default_role
13
+ self.add_role(:user) if self.roles.blank?
14
+ end
15
+
16
+ def role_names
17
+ roles.distinct.pluck(:name)
18
+ end
19
+
20
+ def must_have_role
21
+ if self.roles.blank?
22
+ errors.add(:roles, "User must have at least one role")
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,5 @@
1
+ <ul>
2
+ <% current_user&.roles&.each do |role| %>
3
+ <li><code><%= role.name %></code></li>
4
+ <% end %>
5
+ </ul>
@@ -0,0 +1,5 @@
1
+ <h1>Bossy Boots</h1>
2
+
3
+ <p>Accessible by people with the role <code>:super_user</code> or <code>:admin</code></p>
4
+
5
+ <%= render 'roles' %>
@@ -0,0 +1,37 @@
1
+ <h1>Rolify</h1>
2
+
3
+ <h4>Role management library with resource scoping</h4>
4
+
5
+ <ul>
6
+ <li>Role <b>admin</b>, can access <b>Bossy Boots</b></li>
7
+ <li>Role <b>moderator</b>, can access <b>Use in moderation</b></li>
8
+ <li>Role <b>user</b>, can access <b>Use Me</b></li>
9
+ <li>Role <b>super_user</b>, can access <b>every thing</b></li>
10
+ </ul>
11
+
12
+ <h3>Sample users and passwords</h3>
13
+
14
+ <table style='width: 800px;'>
15
+ <tr>
16
+ <th>Name</th>
17
+ <th>Email</th>
18
+ <th>Roles</th>
19
+ <th>Be who you wanna be</th>
20
+ <th>Manage Roles</th>
21
+ </tr>
22
+ <% User.all.each do |user| %>
23
+ <tr>
24
+ <td><%= user.name %></td>
25
+ <td><%= user.email %></td>
26
+ <td>
27
+ <ul style='list-style-type: none; padding: 2px; margin: 0px'>
28
+ <% user.role_names.each do |role| %>
29
+ <li><%= role %></li>
30
+ <% end %>
31
+ </ul>
32
+ </td>
33
+ <td><%= link_to "Sign In", quick_sign_in_path(user) %></td>
34
+ <td><%= link_to "Manage", edit_rolify_path(user) %></td>
35
+ </tr>
36
+ <% end %>
37
+ </table>
@@ -0,0 +1,5 @@
1
+ <h1>You are a Super Hero</h1>
2
+
3
+ <p>Accessible by people with the role <code>:super_user</code></p>
4
+
5
+ <%= render 'roles' %>
@@ -0,0 +1,5 @@
1
+ <h1>Use in moderation</h1>
2
+
3
+ <p>Accessible by people with the role <code>:super_user</code> or <code>:moderator</code></p>
4
+
5
+ <%= render 'roles' %>
@@ -0,0 +1,5 @@
1
+ <h1>Use Me</h1>
2
+
3
+ <p>Accessible by people with the role <code>:super_user</code> or <code>:user</code></p>
4
+
5
+ <%= render 'roles' %>
@@ -0,0 +1,18 @@
1
+ <%= link_to 'Home', root_path %>
2
+ | <%= link_to 'Posts', posts_path %>
3
+ [ <%= link_to 'Bossy Boots', home_bossy_boots_path, class: current_user&.is_super_user? || current_user&.is_admin? ? "has-role" : "has-no-role" %>
4
+ | <%= link_to 'Use in Moderation', home_use_in_moderation_path, class: current_user&.is_super_user? || current_user&.is_moderator? ? "has-role" : "has-no-role" %>
5
+ | <%= link_to 'Use Me', home_use_me_path, class: current_user&.is_super_user? || current_user&.is_user? ? "has-role" : "has-no-role" %>
6
+ | <%= link_to 'I will be your Hero', home_super_hero_path, class: current_user&.is_super_user? ? "has-role" : "has-no-role" %>
7
+ ]
8
+ <br>
9
+ <% if current_user %>
10
+ <%= current_user.name.capitalize %>
11
+ <%= link_to "Edit Roles", edit_rolify_path(current_user) %>
12
+ <% if current_user.roles.present? %><%= "(#{current_user.roles.map(&:name).join(', ')})" %><% end %>
13
+ | <%= link_to 'Sign Out', destroy_user_session_path, data: { turbo_method: :delete } %>
14
+
15
+ <% else %>
16
+ | <%= link_to 'Sign Up', new_user_registration_path %>
17
+ | <%= link_to 'Sign In', new_user_session_path %>
18
+ <% end%>
@@ -0,0 +1,52 @@
1
+ <!DOCTYPE html>
2
+ <html>
3
+ <head>
4
+ <title><%= camelized %></title>
5
+ <meta name="viewport" content="width=device-width,initial-scale=1">
6
+ <%%= csrf_meta_tags %>
7
+ <%%= csp_meta_tag %>
8
+
9
+ <%- if options[:skip_hotwire] || options[:skip_javascript] -%>
10
+ <%%= stylesheet_link_tag "application" %>
11
+ <%- else -%>
12
+ <%%= stylesheet_link_tag "application", "data-turbo-track": "reload" %>
13
+ <%- end -%>
14
+ <%%= javascript_include_tag "application", "data-turbo-track": "reload", defer: true %>
15
+ <style>
16
+ .notice {
17
+ color: green;
18
+ }
19
+ .alert {
20
+ color: red;
21
+ }
22
+ table {
23
+ border-collapse: collapse;
24
+ }
25
+ th, td {
26
+ border: 1px solid #ccc;
27
+ padding: 5px;
28
+ }
29
+ .has-role {
30
+ color: green;
31
+ }
32
+ .has-no-role {
33
+ color: grey;
34
+ }
35
+ </style>
36
+ </head>
37
+
38
+ <body>
39
+ <header>
40
+ <%%= render 'layouts/navbar' %>
41
+ <hr />
42
+ <%%= render 'layouts/alerts' %>
43
+ </header>
44
+ <main>
45
+ <%%= yield %>
46
+ </main>
47
+ <footer>
48
+ <%%= render 'layouts/footer' %>
49
+ </footer>
50
+ </body>
51
+ </html>
52
+
@@ -0,0 +1,61 @@
1
+ <%# , url: { controller: "rolify", action: "update" }, html: { :turbo_method => :post } %>
2
+ <%= form_with(model: user, url: rolify_path(user)) do |form| %>
3
+
4
+ <% if user.errors.any? %>
5
+ <div style="color: red">
6
+ <h2><%= pluralize(user.errors.count, "error") %> prohibited this user from being saved:</h2>
7
+
8
+ <ul>
9
+ <% user.errors.each do |error| %>
10
+ <li><%= error.full_message %></li>
11
+ <% end %>
12
+ </ul>
13
+ </div>
14
+ <% end %>
15
+
16
+ <p>
17
+ <strong>Name:</strong>
18
+ <%= user.name %>
19
+ </p>
20
+
21
+ <p>
22
+ <strong>Email:</strong>
23
+ <%= user.email %>
24
+ </p>
25
+
26
+ <p>
27
+ <%= form.label :current_roles, style: "display: block" %>
28
+ <%= user.roles.where(resource_type: nil).map { |role| role.name.capitalize }.to_sentence %>
29
+ </p>
30
+
31
+ <div>
32
+ <%= form.label :raw_roles, style: "display: block" %>
33
+ <pre>
34
+ <code>
35
+ <% user.roles.each do |role| %>
36
+ <%=
37
+ extra_info = if role.resource_type
38
+ " (#{role.resource_type}: #{role.resource_id})"
39
+ else
40
+ ""
41
+ end
42
+ "#{role.id} - #{role.name}, #{extra_info}"
43
+ %>
44
+ <% end %>
45
+ </code>
46
+ </pre>
47
+ </div>
48
+
49
+ <div>
50
+ <%= form.label :user_roles, style: "display: block" %>
51
+ <% Role.where(resource_type: nil).each do |role| %>
52
+ <%= form.check_box :role_ids, { multiple: true, checked: user.role_ids.include?(role.id) }, role.id, nil %>
53
+ <%= role.name %><br />
54
+ <% end %>
55
+ </ul>
56
+ </div>
57
+
58
+ <div>
59
+ <%= form.submit %>
60
+ </div>
61
+ <% end %>
@@ -0,0 +1,34 @@
1
+ <div id="<%= dom_id user %>">
2
+ <p>
3
+ <strong>Name:</strong>
4
+ <%= user.name %>
5
+ </p>
6
+
7
+ <p>
8
+ <strong>Email:</strong>
9
+ <%= user.email %>
10
+ </p>
11
+
12
+ <div>
13
+ <strong>Current Roles:</strong>
14
+ <%= user.roles.where(resource_type: nil).map { |role| role.name.capitalize }.join(', ') %>
15
+ </div>
16
+
17
+ <div>
18
+ <pre>
19
+ <code>
20
+ <% user.roles.each do |role| %>
21
+ <%=
22
+ extra_info = if role.resource_type
23
+ " (#{role.resource_type}: #{role.resource_id})"
24
+ else
25
+ ""
26
+ end
27
+ "#{role.id} - #{role.name}, #{extra_info}"
28
+ %>
29
+ <% end %>
30
+ </code>
31
+ </pre>
32
+ </div>
33
+
34
+ </div>
@@ -0,0 +1,4 @@
1
+ <h1>Edit User Roles</h1>
2
+
3
+ <%= render "form", user: @user %>
4
+
@@ -0,0 +1,5 @@
1
+ <%= render "user", user: @user %>
2
+
3
+ <div>
4
+ <%= link_to "Edit roles for this user", edit_rolify_path(@user) %>
5
+ </div>
@@ -0,0 +1,19 @@
1
+ david = User.create(email: 'david@site.com', name: 'david', password: 'password', password_confirmation: 'password')
2
+ james = User.create(email: 'james@site.com', name: 'james', password: 'password', password_confirmation: 'password')
3
+ sally = User.create(email: 'sally@site.com', name: 'sally', password: 'password', password_confirmation: 'password')
4
+ chloe = User.create(email: 'chloe@site.com', name: 'chloe', password: 'password', password_confirmation: 'password')
5
+
6
+ david.add_role(:super_user)
7
+ james.add_role(:admin)
8
+ sally.add_role(:moderator)
9
+ chloe.add_role(:admin)
10
+ chloe.add_role(:moderator)
11
+
12
+ 10.times do
13
+ user = User.all.sample
14
+ post = Post.create(
15
+ title: "Post #{Faker::Lorem.words(number: rand(1..3)).join(' ')}",
16
+ body: "#{Faker::Lorem.sentences(number: 8).join("<br />")}"
17
+ )
18
+ user.add_role(:author, post)
19
+ end
@@ -60,10 +60,12 @@
60
60
  "minimal_css_library",
61
61
  "add_mini_magick",
62
62
  "add_motor_admin",
63
- "add_public_suffix",
64
63
  "add_phony_rails",
64
+ "add_pretender",
65
+ "add_public_suffix",
65
66
  "add_rails_html_sanitizer",
66
67
  "add_redcarpet",
68
+ "add_rolify",
67
69
  "add_rubocop",
68
70
  "add_twilio_ruby"
69
71
  ],
@@ -489,15 +491,22 @@
489
491
  "required": false
490
492
  },
491
493
  {
492
- "name": "add_public_suffix",
493
- "description": "Indicates when to generate add public suffix",
494
+ "name": "add_phony_rails",
495
+ "description": "Indicates when to generate add phony rails",
494
496
  "type": "boolean",
495
497
  "default": false,
496
498
  "required": false
497
499
  },
498
500
  {
499
- "name": "add_phony_rails",
500
- "description": "Indicates when to generate add phony rails",
501
+ "name": "add_pretender",
502
+ "description": "Indicates when to generate add pretender",
503
+ "type": "boolean",
504
+ "default": false,
505
+ "required": false
506
+ },
507
+ {
508
+ "name": "add_public_suffix",
509
+ "description": "Indicates when to generate add public suffix",
501
510
  "type": "boolean",
502
511
  "default": false,
503
512
  "required": false
@@ -516,6 +525,13 @@
516
525
  "default": false,
517
526
  "required": false
518
527
  },
528
+ {
529
+ "name": "add_rolify",
530
+ "description": "Indicates when to generate add rolify",
531
+ "type": "boolean",
532
+ "default": false,
533
+ "required": false
534
+ },
519
535
  {
520
536
  "name": "add_rubocop",
521
537
  "description": "Indicates when to generate add rubocop",
@@ -38,9 +38,9 @@
38
38
  "add_browser": false,
39
39
  "add_chartkick": false,
40
40
  "add_devise": true,
41
- "add_devise_masquerade": true,
41
+ "add_devise_masquerade": false,
42
42
  "add_dotenv": false,
43
- "add_faker": false,
43
+ "add_faker": true,
44
44
  "add_groupdate": false,
45
45
  "add_hexapdf": false,
46
46
  "add_httparty": false,
@@ -50,12 +50,14 @@
50
50
  "minimal_css_library": "water.css",
51
51
  "add_mini_magick": false,
52
52
  "add_motor_admin": false,
53
- "add_public_suffix": false,
54
53
  "add_phony_rails": false,
54
+ "add_pretender": false,
55
+ "add_public_suffix": false,
55
56
  "add_rails_html_sanitizer": false,
56
57
  "add_redcarpet": false,
58
+ "add_rolify": true,
57
59
  "add_rubocop": false,
58
60
  "add_twilio_ruby": false,
59
- "template": "/Users/davidcruwys/dev/kgems/rails_app_generator/after_templates/addons/devise_masquerade/_.rb"
61
+ "template": "/Users/davidcruwys/dev/kgems/rails_app_generator/after_templates/addons/rolify/_.rb"
60
62
  }
61
63
  }
@@ -60,10 +60,12 @@
60
60
  "minimal_css_library",
61
61
  "add_mini_magick",
62
62
  "add_motor_admin",
63
- "add_public_suffix",
64
63
  "add_phony_rails",
64
+ "add_pretender",
65
+ "add_public_suffix",
65
66
  "add_rails_html_sanitizer",
66
67
  "add_redcarpet",
68
+ "add_rolify",
67
69
  "add_rubocop",
68
70
  "add_twilio_ruby"
69
71
  ],
@@ -489,14 +491,21 @@
489
491
  "required": false
490
492
  },
491
493
  {
492
- "name": "add_public_suffix",
494
+ "name": "add_phony_rails",
493
495
  "description": "",
494
496
  "type": "boolean",
495
497
  "default": false,
496
498
  "required": false
497
499
  },
498
500
  {
499
- "name": "add_phony_rails",
501
+ "name": "add_pretender",
502
+ "description": "",
503
+ "type": "boolean",
504
+ "default": false,
505
+ "required": false
506
+ },
507
+ {
508
+ "name": "add_public_suffix",
500
509
  "description": "",
501
510
  "type": "boolean",
502
511
  "default": false,
@@ -516,6 +525,13 @@
516
525
  "default": false,
517
526
  "required": false
518
527
  },
528
+ {
529
+ "name": "add_rolify",
530
+ "description": "",
531
+ "type": "boolean",
532
+ "default": false,
533
+ "required": false
534
+ },
519
535
  {
520
536
  "name": "add_rubocop",
521
537
  "description": "",
@@ -7,7 +7,7 @@
7
7
  "quiet": false,
8
8
  "skip": false,
9
9
  "ruby": "/Users/davidcruwys/.asdf/installs/ruby/2.7.6/bin/ruby",
10
- "template": "/Users/davidcruwys/dev/kgems/rails_app_generator/after_templates/addons/devise_masquerade/_.rb",
10
+ "template": "/Users/davidcruwys/dev/kgems/rails_app_generator/after_templates/addons/rolify/_.rb",
11
11
  "database": "sqlite3",
12
12
  "skip_git": true,
13
13
  "skip_keeps": false,
@@ -48,9 +48,9 @@
48
48
  "add_browser": false,
49
49
  "add_chartkick": false,
50
50
  "add_devise": true,
51
- "add_devise_masquerade": true,
51
+ "add_devise_masquerade": false,
52
52
  "add_dotenv": false,
53
- "add_faker": false,
53
+ "add_faker": true,
54
54
  "add_groupdate": false,
55
55
  "add_hexapdf": false,
56
56
  "add_httparty": false,
@@ -60,12 +60,13 @@
60
60
  "minimal_css_library": "water.css",
61
61
  "add_mini_magick": false,
62
62
  "add_motor_admin": false,
63
- "add_public_suffix": false,
64
63
  "add_phony_rails": false,
64
+ "add_pretender": false,
65
+ "add_public_suffix": false,
65
66
  "add_rails_html_sanitizer": false,
66
67
  "add_redcarpet": false,
68
+ "add_rolify": true,
67
69
  "add_rubocop": false,
68
- "add_twilio_ruby": false,
69
- "notes": "there is a name conflict if the rails application has the same name as the gem and so devise_masquerade has been renamed to devise_masquerade_sample"
70
+ "add_twilio_ruby": false
70
71
  }
71
72
  }
@@ -94,6 +94,12 @@ module RailsAppGenerator
94
94
  ::FileUtils.mv(source, target)
95
95
  end
96
96
  # rubocop:enable Metrics/AbcSize
97
+
98
+ def bundle_install
99
+ Util.bundler_environment(environment_style: :unbundled_env) do
100
+ run('bundle install')
101
+ end
102
+ end
97
103
  end
98
104
  # rubocop:enable Metrics/BlockLength
99
105
 
@@ -10,10 +10,11 @@ module RailsAppGenerator
10
10
  required_gem gem.version('devise', '4.8.1', 'Flexible authentication solution for Rails with Warden')
11
11
 
12
12
  def apply
13
+ bundle_install
14
+
13
15
  generate('devise:install', capture: true)
14
- generate(:devise, 'User', 'name', 'role:integer', capture: true)
15
16
 
16
- update_migration
17
+ setup_db
17
18
 
18
19
  add_trackable if option?(:devise_has_trackable)
19
20
  add_confirmable if option?(:devise_has_confirmable)
@@ -39,7 +40,22 @@ module RailsAppGenerator
39
40
 
40
41
  private
41
42
 
42
- def update_migration
43
+ def setup_db
44
+ if active?(:rolify)
45
+ # Rolify will setup up a role relationship
46
+ user_basic
47
+ else
48
+ user_with_simplified_role
49
+ end
50
+ end
51
+
52
+ def user_basic
53
+ generate(:devise, 'User', 'name', capture: true)
54
+ end
55
+
56
+ def user_with_simplified_role
57
+ generate(:devise, 'User', 'name', 'role:integer', capture: true)
58
+
43
59
  in_root do
44
60
  migration = Dir.glob('db/migrate/*').max_by { |f| File.mtime(f) }
45
61
  gsub_file migration, /:role/, ':role, default: 0'
@@ -7,7 +7,12 @@ module RailsAppGenerator
7
7
  class Pretender < RailsAppGenerator::Addon
8
8
  required_gem gem.version('pretender', '0.4.0', 'Log in as another user in Rails')
9
9
 
10
- def apply; end
10
+ def apply
11
+ copy_file('app/controllers/pretender_controller.rb', 'app/controllers/pretender_controller.rb')
12
+
13
+ route("post 'pretender/:user_id/impersonate' , to: 'pretender#impersonate' , :as => :impersonate_user")
14
+ route("post 'pretender/stop_impersonating' , to: 'pretender#stop_impersonating' , :as => :stop_impersonating_user")
15
+ end
11
16
  end
12
17
  end
13
18
  end
@@ -0,0 +1,18 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RailsAppGenerator
4
+ # Custom add-ons for RailsAppGenerator
5
+ module AddOns
6
+ # Add Rolify to rails application
7
+ class Rolify < RailsAppGenerator::Addon
8
+ required_gem gem.version('rolify', '6.0.0', 'Role management library with resource scoping')
9
+
10
+ def apply
11
+ # bundle_install
12
+ generate('rolify', 'Role', 'User', capture: true)
13
+
14
+ gsub_file 'config/initializers/rolify.rb', '# config.use_dynamic_shortcuts', 'config.use_dynamic_shortcuts'
15
+ end
16
+ end
17
+ end
18
+ end
@@ -199,6 +199,7 @@ module RailsAppGenerator
199
199
  add_if(:rails_html_sanitizer) # tested
200
200
  add_if(:rails_app_generator) # TODO: needs testing
201
201
  add_if(:redcarpet) # tested
202
+ add_if(:rolify) # tested
202
203
  add_if(:services) # TODO: needs testing
203
204
  add_if(:shoulda) # TODO: needs testing
204
205
  add_if(:sidekiq) # TODO: needs testing
@@ -136,6 +136,7 @@ KConfig.configure do |config|
136
136
  # rails_app_generator
137
137
  # RANSACK
138
138
  rag.add_option :add_redcarpet , type: :boolean, default: false
139
+ rag.add_option :add_rolify , type: :boolean, default: false
139
140
  # services
140
141
  # shoulda
141
142
  # sidekiq
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module RailsAppGenerator
4
- VERSION = '0.2.26'
4
+ VERSION = '0.2.29'
5
5
  end
data/package-lock.json CHANGED
@@ -1,12 +1,12 @@
1
1
  {
2
2
  "name": "rails_app_generator",
3
- "version": "0.2.26",
3
+ "version": "0.2.29",
4
4
  "lockfileVersion": 2,
5
5
  "requires": true,
6
6
  "packages": {
7
7
  "": {
8
8
  "name": "rails_app_generator",
9
- "version": "0.2.26",
9
+ "version": "0.2.29",
10
10
  "dependencies": {
11
11
  "daisyui": "^2.20.0"
12
12
  },
data/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "rails_app_generator",
3
- "version": "0.2.26",
3
+ "version": "0.2.29",
4
4
  "description": "Create new Rails Application with custom opinions",
5
5
  "scripts": {
6
6
  "release": "semantic-release"
@@ -0,0 +1,16 @@
1
+ {
2
+ "args": {
3
+ "app_path": "r7_pretender",
4
+ "destination_root": "/Users/davidcruwys/dev/kgems/rails_app_generator/a/addons"
5
+ },
6
+ "opts": {
7
+ "skip_git": true,
8
+ "skip_test": true,
9
+ "template": "/Users/davidcruwys/dev/kgems/rails_app_generator/after_templates/addons/pretender/_.rb",
10
+ "javascript": "esbuild",
11
+ "add_annotate": true,
12
+ "add_devise": true,
13
+ "add_pretender": true,
14
+ "add_minimal_css": true
15
+ }
16
+ }
@@ -0,0 +1,17 @@
1
+ {
2
+ "args": {
3
+ "app_path": "r7_rolify",
4
+ "destination_root": "/Users/davidcruwys/dev/kgems/rails_app_generator/a/addons"
5
+ },
6
+ "opts": {
7
+ "skip_git": true,
8
+ "skip_test": true,
9
+ "template": "/Users/davidcruwys/dev/kgems/rails_app_generator/after_templates/addons/rolify/_.rb",
10
+ "javascript": "esbuild",
11
+ "add_annotate": true,
12
+ "add_devise": true,
13
+ "add_rolify": true,
14
+ "add_faker": true,
15
+ "add_minimal_css": true
16
+ }
17
+ }
@@ -0,0 +1,14 @@
1
+ class PretenderController < ApplicationController
2
+ before_action :authenticate_user!
3
+
4
+ def impersonate
5
+ user = User.find(params[:user_id])
6
+ impersonate_user(user)
7
+ redirect_to root_path
8
+ end
9
+
10
+ def stop_impersonating
11
+ stop_impersonating_user
12
+ redirect_to root_path
13
+ end
14
+ end
@@ -10,30 +10,36 @@ gac 'base rails 7 image created'
10
10
 
11
11
  prepare_environment
12
12
 
13
- add_controller('home', 'index')
14
-
15
- route("root 'home#index'")
16
-
17
- force_copy
18
-
19
- directory "app/controllers"
20
- directory "app/views/home"
21
- directory "app/views/layouts"
22
- template 'app/views/layouts/application.html.erb' , 'app/views/layouts/application.html.erb'
23
-
24
- template 'db/seeds.rb' , 'db/seeds.rb'
25
-
26
13
  after_bundle do
14
+ scaffolds
15
+ setup_customizations
27
16
  setup_db
28
17
  end
29
18
 
30
- def setup_db
19
+ def scaffolds
31
20
  # add_scaffold('post', 'title', 'body:text', 'user:references')
32
21
  # add_scaffold('people', 'first_name', 'last_name', 'age:integer', 'address:text')
33
22
  # add_scaffold('product', 'name', 'price:integer')
23
+ end
24
+
25
+ def setup_customizations
26
+ route("root 'home#index'")
27
+
28
+ force_copy
29
+
30
+ add_controller('home', 'index')
31
+
32
+ directory "app/controllers"
33
+ directory "app/models"
34
+ directory "app/views"
35
+ template 'app/views/layouts/application.html.erb' , 'app/views/layouts/application.html.erb'
36
+ end
37
+
38
+ def setup_db
39
+ template 'db/seeds.rb' , 'db/seeds.rb'
34
40
 
35
- # db_migrate
36
- # db_seed
41
+ db_migrate
42
+ db_seed
37
43
  end
38
44
 
39
45
  # Other template command examples
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "args": {
3
- "app_path": "<%= data.name_snake %>",
3
+ "app_path": "r7_<%= data.name_snake %>",
4
4
  "destination_root": "<%= data.destination_root %>"
5
5
  },
6
6
  "opts": {
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rails_app_generator
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.26
4
+ version: 0.2.29
5
5
  platform: ruby
6
6
  authors:
7
7
  - David Cruwys
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2022-08-17 00:00:00.000000000 Z
11
+ date: 2022-08-19 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bootsnap
@@ -327,6 +327,15 @@ files:
327
327
  - after_templates/addons/phony_rails/app/controllers/home_controller.rb
328
328
  - after_templates/addons/phony_rails/app/views/home/index.html.erb
329
329
  - after_templates/addons/phony_rails/app/views/layouts/application.html.erb
330
+ - after_templates/addons/pretender/_.rb
331
+ - after_templates/addons/pretender/app/controllers/application_controller.rb
332
+ - after_templates/addons/pretender/app/controllers/home_controller.rb
333
+ - after_templates/addons/pretender/app/models/user.rb
334
+ - after_templates/addons/pretender/app/views/home/index.html.erb
335
+ - after_templates/addons/pretender/app/views/layouts/_footer.html.erb
336
+ - after_templates/addons/pretender/app/views/layouts/_navbar.html.erb
337
+ - after_templates/addons/pretender/app/views/layouts/application.html.erb
338
+ - after_templates/addons/pretender/db/seeds.rb
330
339
  - after_templates/addons/public_suffix/_.rb
331
340
  - after_templates/addons/public_suffix/app/controllers/home_controller.rb
332
341
  - after_templates/addons/public_suffix/app/views/home/index.html.erb
@@ -339,6 +348,25 @@ files:
339
348
  - after_templates/addons/redcarpet/app/views/layouts/_footer.html.erb
340
349
  - after_templates/addons/redcarpet/app/views/layouts/_navbar.html.erb
341
350
  - after_templates/addons/redcarpet/app/views/layouts/application.html.erb
351
+ - after_templates/addons/rolify/_.rb
352
+ - after_templates/addons/rolify/app/controllers/home_controller.rb
353
+ - after_templates/addons/rolify/app/controllers/rolify_controller.rb
354
+ - after_templates/addons/rolify/app/models/post.rb
355
+ - after_templates/addons/rolify/app/models/user.rb
356
+ - after_templates/addons/rolify/app/views/home/_roles.html.erb
357
+ - after_templates/addons/rolify/app/views/home/bossy_boots.html.erb
358
+ - after_templates/addons/rolify/app/views/home/index.html.erb
359
+ - after_templates/addons/rolify/app/views/home/super_hero.html.erb
360
+ - after_templates/addons/rolify/app/views/home/use_in_moderation.html.erb
361
+ - after_templates/addons/rolify/app/views/home/use_me.html.erb
362
+ - after_templates/addons/rolify/app/views/layouts/_footer.html.erb
363
+ - after_templates/addons/rolify/app/views/layouts/_navbar.html.erb
364
+ - after_templates/addons/rolify/app/views/layouts/application.html.erb
365
+ - after_templates/addons/rolify/app/views/rolify/_form.html.erb
366
+ - after_templates/addons/rolify/app/views/rolify/_user.html.erb
367
+ - after_templates/addons/rolify/app/views/rolify/edit.html.erb
368
+ - after_templates/addons/rolify/app/views/rolify/show.html.erb
369
+ - after_templates/addons/rolify/db/seeds.rb
342
370
  - after_templates/addons/rubocop/_.rb
343
371
  - after_templates/addons/rubocop/app/assets/images/cop-output.png
344
372
  - after_templates/addons/rubocop/app/controllers/home_controller.rb
@@ -597,6 +625,7 @@ files:
597
625
  - lib/rails_app_generator/addons/pundit.rb
598
626
  - lib/rails_app_generator/addons/rails_html_sanitizer.rb
599
627
  - lib/rails_app_generator/addons/redcarpet.rb
628
+ - lib/rails_app_generator/addons/rolify.rb
600
629
  - lib/rails_app_generator/addons/rspec.rb
601
630
  - lib/rails_app_generator/addons/rubocop.rb
602
631
  - lib/rails_app_generator/addons/scaffold.rb
@@ -661,9 +690,11 @@ files:
661
690
  - profiles/addons/minimal_css.json
662
691
  - profiles/addons/motor_admin.json
663
692
  - profiles/addons/phony_rails.json
693
+ - profiles/addons/pretender.json
664
694
  - profiles/addons/public_suffix.json
665
695
  - profiles/addons/rails_html_sanitizer.json
666
696
  - profiles/addons/redcarpet.json
697
+ - profiles/addons/rolify.json
667
698
  - profiles/addons/rubocop.json
668
699
  - profiles/addons/twilio_ruby.json
669
700
  - profiles/application/printspeak.json
@@ -710,6 +741,7 @@ files:
710
741
  - templates/addons/honeybadger/honeybadger.sample.yml
711
742
  - templates/addons/irbrc/.irbrc.erb
712
743
  - templates/addons/lograge/config/initializers/lograge.rb
744
+ - templates/addons/pretender/app/controllers/pretender_controller.rb
713
745
  - templates/addons/pundit/app/controllers/authorized_controller.rb.erb
714
746
  - templates/addons/pundit/app/policies/application_policy.rb
715
747
  - templates/addons/rspec/spec/rails_helper.rb