rails_app_generator 0.2.36 → 0.2.39

Sign up to get free protection for your applications and to get access to all the features.
Files changed (45) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +21 -0
  3. data/after_templates/addons/avo/_.rb +11 -3
  4. data/after_templates/addons/avo/app/avo/resources/post_resource.rb +3 -0
  5. data/after_templates/addons/avo/app/avo/resources/user_resource.rb +1 -0
  6. data/after_templates/addons/avo/app/controllers/home_controller.rb +4 -0
  7. data/after_templates/addons/avo/app/models/post.rb +3 -2
  8. data/after_templates/addons/avo/app/models/user.rb +6 -0
  9. data/after_templates/addons/avo/app/services/seed_service.rb +9 -0
  10. data/after_templates/addons/avo/app/views/home/index.html.erb +4 -2
  11. data/after_templates/addons/avo/app/views/layouts/_navbar.html.erb +7 -1
  12. data/after_templates/addons/avo/db/seeds.rb +1 -1
  13. data/after_templates/addons/friendly_id/_.rb +68 -0
  14. data/after_templates/addons/friendly_id/app/controllers/home_controller.rb +5 -0
  15. data/after_templates/addons/friendly_id/app/controllers/posts_controller.rb +66 -0
  16. data/after_templates/addons/friendly_id/app/models/post.rb +16 -0
  17. data/after_templates/addons/friendly_id/app/views/home/index.html.erb +22 -0
  18. data/after_templates/addons/friendly_id/app/views/layouts/_footer.html.erb +0 -0
  19. data/after_templates/addons/friendly_id/app/views/layouts/_navbar.html.erb +3 -0
  20. data/after_templates/addons/friendly_id/app/views/layouts/application.html.erb +29 -0
  21. data/after_templates/addons/friendly_id/app/views/posts/_form.html.erb +32 -0
  22. data/after_templates/addons/friendly_id/app/views/posts/_post.html.erb +17 -0
  23. data/after_templates/addons/friendly_id/app/views/posts/_post.json.jbuilder +2 -0
  24. data/after_templates/addons/friendly_id/app/views/posts/edit.html.erb +10 -0
  25. data/after_templates/addons/friendly_id/app/views/posts/index.html.erb +14 -0
  26. data/after_templates/addons/friendly_id/app/views/posts/index.json.jbuilder +1 -0
  27. data/after_templates/addons/friendly_id/app/views/posts/new.html.erb +9 -0
  28. data/after_templates/addons/friendly_id/app/views/posts/show.html.erb +19 -0
  29. data/after_templates/addons/friendly_id/app/views/posts/show.json.jbuilder +1 -0
  30. data/after_templates/addons/friendly_id/db/seeds.rb +47 -0
  31. data/docs/last_run/app_generator_class.json +8 -0
  32. data/docs/last_run/app_generator_data.json +1 -0
  33. data/docs/last_run/rails_options_class.json +8 -0
  34. data/docs/last_run/rails_options_data.json +1 -0
  35. data/lib/rails_app_generator/addons/factory_bot_rails.rb +15 -0
  36. data/lib/rails_app_generator/addons/friendly_id.rb +16 -0
  37. data/lib/rails_app_generator/app_generator.rb +10 -0
  38. data/lib/rails_app_generator/rag_initializer.rb +2 -0
  39. data/lib/rails_app_generator/version.rb +1 -1
  40. data/package-lock.json +2 -2
  41. data/package.json +1 -1
  42. data/profiles/addons/avo.json +1 -1
  43. data/profiles/addons/friendly_id.json +14 -0
  44. data/templates/thor_task/profile/app/views/layouts/_navbar.html.erb +3 -3
  45. metadata +25 -2
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: cee7a5479ca62a445db49b49b597da3a641a39efb84d56f7da3c4c6b973ad52f
4
- data.tar.gz: 9e12b9abed0a5c13bf57b3cdccacf95d97be64ac2a9e3097d84039f00e66c438
3
+ metadata.gz: be981683729c562f221e7f00120145d345ea0111fbe80aa5f4cf9f2d03eaff03
4
+ data.tar.gz: 4a1a65620ae0fcecd12f0c27cd88fe0cb51da1c57843fc7afced0508cf31dfb1
5
5
  SHA512:
6
- metadata.gz: 42698c111605eda6d7e8d014a7d1472b2438227f8f663cc4ab92837373a1f4a8526704adbfcab21fc1ea367fa2879586621ea06371ea511fe728989bb2c43925
7
- data.tar.gz: d798bef8f2dc50312db9708ece229b14eb69215bc3de141a66aa51ea8e31df62fc83bef8b2540045e2097c25e136b140bb868dc0e55a5cffcf89fdf1c9dfa438
6
+ metadata.gz: d1fe4dfc123fb768fde98d6e40ed82e51955f3612751afa0241a05868d31d7fe7e209036bac26f42573cd7b7ef2f099415ab4e6e8177cd00322c59746f11e486
7
+ data.tar.gz: f79cefc7816b714aac7717d35b7a6d64ccc3302d5b90c31e7747e4e0897bd0c1a2820f87017ca86de4221ca9c593735e34eb8d52bd55a85906e08fcef5652fb9
data/CHANGELOG.md CHANGED
@@ -1,3 +1,24 @@
1
+ ## [0.2.38](https://github.com/klueless-io/rails_app_generator/compare/v0.2.37...v0.2.38) (2022-08-22)
2
+
3
+
4
+ ### Bug Fixes
5
+
6
+ * add friendly_id addon ([5c34df5](https://github.com/klueless-io/rails_app_generator/commit/5c34df5fdbca8bc6810bd3cc9343d8b799d63ac3))
7
+
8
+ ## [0.2.37](https://github.com/klueless-io/rails_app_generator/compare/v0.2.36...v0.2.37) (2022-08-22)
9
+
10
+
11
+ ### Bug Fixes
12
+
13
+ * add friendly_id addon ([e6fc42e](https://github.com/klueless-io/rails_app_generator/commit/e6fc42e7d4ef017775c6b33850fb22aabc156ca5))
14
+
15
+ ## [0.2.36](https://github.com/klueless-io/rails_app_generator/compare/v0.2.35...v0.2.36) (2022-08-22)
16
+
17
+
18
+ ### Bug Fixes
19
+
20
+ * update avo profile ([f02ee7f](https://github.com/klueless-io/rails_app_generator/commit/f02ee7f7e6e5e25842a023f210674d9602edfe58))
21
+
1
22
  ## [0.2.35](https://github.com/klueless-io/rails_app_generator/compare/v0.2.34...v0.2.35) (2022-08-20)
2
23
 
3
24
 
@@ -18,13 +18,19 @@ after_bundle do
18
18
  setup_customizations
19
19
  setup_db
20
20
  setup_avo
21
+
22
+ swap1 = ' resources :users'
23
+ swap2 = " devise_for :users, controllers: { sessions: 'users/sessions', registrations: 'users/registrations' }"
24
+
25
+ swap_lines('config/routes.rb', swap1, swap2)
21
26
  end
22
27
 
23
28
  def scaffolds
24
29
  add_scaffold_controller('users', 'name', 'email')
25
- # add_scaffold('author', 'name', 'email', 'bio:text')
26
30
  add_scaffold('category', 'title', 'description:text')
27
- add_scaffold('post', 'title content:text', 'published:boolean', 'user:references', 'category:references')
31
+ add_scaffold('post', 'title', 'content:text', 'published:boolean', 'user:references', 'category:references')
32
+ add_scaffold('comment', 'body:text', 'commentable:references{polymorphic}', 'user:references')
33
+
28
34
  add_scaffold('location', 'name', 'description:text') #, 'photo:file')
29
35
  add_scaffold('room', 'name', 'description:text', 'location:references') #, 'photo:file'
30
36
  add_scaffold('booking', 'user:references', 'room:references', 'booked_at:datetime', 'booked_for:integer')
@@ -35,11 +41,12 @@ def setup_customizations
35
41
 
36
42
  force_copy
37
43
 
38
- add_controller('home', 'index', 'quick_signin')
44
+ add_controller('home', 'index', 'quick_signin', 'reseed')
39
45
 
40
46
  directory "app/controllers"
41
47
  directory "app/models"
42
48
  directory "app/views"
49
+ directory "app/services"
43
50
  template 'app/views/layouts/application.html.erb' , 'app/views/layouts/application.html.erb'
44
51
  end
45
52
 
@@ -55,6 +62,7 @@ def setup_avo
55
62
 
56
63
  generate('avo:resource Category')
57
64
  generate('avo:resource Post')
65
+ generate('avo:resource Comment')
58
66
  generate('avo:resource Location')
59
67
  generate('avo:resource Room')
60
68
  generate('avo:resource Booking')
@@ -22,4 +22,7 @@ class PostResource < Avo::BaseResource
22
22
 
23
23
  # tutorial (related category): https://youtu.be/WgNK-oINFww?t=328
24
24
  field :category, as: :belongs_to
25
+
26
+ # tutorial (related category with custom name): https://youtu.be/WgNK-oINFww?t=722
27
+ field :user, name: "Author", as: :belongs_to
25
28
  end
@@ -20,4 +20,5 @@ class UserResource < Avo::BaseResource
20
20
  field :name, as: :text
21
21
  field :email, as: :text, as_description: true
22
22
  field :password, as: :text
23
+ field :posts, as: :has_many
23
24
  end
@@ -5,4 +5,8 @@ class HomeController < ApplicationController
5
5
  def quick_signin
6
6
  sign_in(:user, User.first)
7
7
  end
8
+
9
+ def reseed
10
+ SeedService.seed
11
+ end
8
12
  end
@@ -1,9 +1,10 @@
1
1
  class Post < ApplicationRecord
2
- belongs_to :author, class_name: 'User', foreign_key: :user_id
2
+ # belongs_to :author, class_name: 'User', foreign_key: :user_id
3
+ belongs_to :user
3
4
  belongs_to :category
4
5
 
5
6
  # tutorial: https://youtu.be/WgNK-oINFww?t=209
6
7
  def excerpt
7
- ActionView::Base.full_sanitizer.sanitize(content).truncate(100)
8
+ ActionView::Base.full_sanitizer.sanitize(content).truncate(50)
8
9
  end
9
10
  end
@@ -0,0 +1,6 @@
1
+ class User < ApplicationRecord
2
+ devise :database_authenticatable, :registerable, :recoverable, :rememberable, :validatable
3
+
4
+ has_many :posts
5
+ has_many :comments
6
+ end
@@ -0,0 +1,9 @@
1
+ require 'open-uri'
2
+
3
+ class SeedService
4
+ class << self
5
+ def seed
6
+ puts 'sssssssssssssssssssssss'
7
+ end
8
+ end
9
+ end
@@ -1,3 +1,5 @@
1
- <h1>I18n.t('application_name')</h1>
1
+ <h1><%= I18n.t('application_name') %></h1>
2
2
 
3
- <p>Avo abstracts away the common parts of building apps, letting your engineers work on your app's essential components. The result is a full-featured admin panel that works out of the box, ready to give to your end-users.</p>
3
+ <p>Avo abstracts away the common parts of building apps, letting your engineers work on your app's essential components.</p>
4
+
5
+ <p>The result is a full-featured admin panel that works out of the box, ready to give to your end-users.</p>
@@ -1,13 +1,19 @@
1
1
  <%= link_to 'Home', root_path %> |
2
+ <%= link_to 'Re-Seed', home_reseed_path %> |
2
3
  <%= link_to 'Quick Sign In', home_quick_signin_path %> |
3
4
  <%= link_to 'AVO', avo_path %>
5
+ <% if current_user %>
6
+ <br>
4
7
  (
5
- <%= link_to 'Posts', posts_path, class: 'simple_scaffold' %> |
6
8
  <%= link_to 'Categories', categories_path, class: 'simple_scaffold' %> |
9
+ <%= link_to 'Posts', posts_path, class: 'simple_scaffold' %> |
10
+ <%= link_to 'Comments', comments_path, class: 'simple_scaffold' %> |
7
11
  <%= link_to 'Authors', users_path, class: 'simple_scaffold' %>
8
12
  )
9
13
  (
10
14
  <%= link_to 'Locations', locations_path, class: 'simple_scaffold' %> |
11
15
  <%= link_to 'Rooms', rooms_path, class: 'simple_scaffold' %> |
16
+ <%= link_to 'Comments', comments_path, class: 'simple_scaffold' %> |
12
17
  <%= link_to 'Bookings', bookings_path, class: 'simple_scaffold' %>
13
18
  )
19
+ <% end %>
@@ -176,7 +176,7 @@ end
176
176
  content: Faker::Lorem.sentences(number: 5).join('<br />'),
177
177
  published: Faker::Boolean.boolean(true_ratio: 0.6),
178
178
  category: Category.all.sample,
179
- author: User.all.sample)
179
+ user: User.all.sample)
180
180
  end
181
181
 
182
182
  # 200.times do
@@ -0,0 +1,68 @@
1
+ # frozen_string_literal: true
2
+
3
+ # FriendlyId provides slugging and permalink support for Active Record. It lets you create pretty URLs and work with human-friendly strings as if they were numeric ids.
4
+ #
5
+ # exe/rag addons/friendly_id
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', 'category', 'body:text', 'slug:uniq')
21
+ end
22
+
23
+ def setup_customizations
24
+ route("root 'home#index'")
25
+
26
+ force_copy
27
+
28
+ add_controller('home', 'index')
29
+
30
+ directory "app/controllers"
31
+ directory "app/models"
32
+ directory "app/views"
33
+ template 'app/views/layouts/application.html.erb' , 'app/views/layouts/application.html.erb'
34
+ end
35
+
36
+ def setup_db
37
+ template 'db/seeds.rb' , 'db/seeds.rb'
38
+
39
+ db_migrate
40
+ db_seed
41
+ end
42
+
43
+ # Other template command examples
44
+ # prepare_environment
45
+ # bundle_install
46
+ # css_install('tailwind')
47
+ # rails_command('db:migrate')
48
+ # rails_command('db:migrate')
49
+ # bundle_add('hotwire-rails')
50
+ # rails_command('hotwire:install')
51
+ # run('bin/importmap pin sortablejs')
52
+ # run('npm install daisyui')
53
+ # rubocop
54
+ #
55
+ # directory 'app/assets/images'
56
+ # create_file 'app/assets/stylesheets/custom-bootstrap-import.scss' , read_template('custom-bootstrap-import.scss')
57
+ # append_to_file 'app/assets/config/manifest.js' , read_template('manifest.js')
58
+ # insert_into_file 'app/views/layouts/application.html.erb', read_template('application.html.erb'),
59
+ # before: %( <%= javascript_include_tag "application", "data-turbo-track": "reload", defer: true %>)
60
+ # gsub_file 'app/views/layouts/application.html.erb', %(container mx-auto mt-28 px-5 flex), 'container mx-auto px-5'
61
+ # template 'home.css', 'app/assets/stylesheets/home.css'
62
+ #
63
+ # add_controller('page', 'benefits', 'faq', 'terms', 'privacy', '--skip-routes')
64
+ # route(<<-'RUBY')
65
+ # PageController.action_methods.each do |action|
66
+ # get "/#{action}", to: "page##{action}", as: "page_#{action}"
67
+ # end
68
+ # RUBY
@@ -0,0 +1,5 @@
1
+ class HomeController < ApplicationController
2
+ def index
3
+ @posts = Post.all
4
+ end
5
+ end
@@ -0,0 +1,66 @@
1
+ class PostsController < ApplicationController
2
+ before_action :set_post, only: %i[ edit update destroy ]
3
+
4
+ def index
5
+ @posts = Post.all
6
+ end
7
+
8
+ # GET /posts/1 or /posts/some-friendly-slug
9
+ def show
10
+ @post = Post.friendly.find(params[:id])
11
+ @friendly = @post.slug == params[:id]
12
+ end
13
+
14
+ def new
15
+ @post = Post.new
16
+ end
17
+
18
+ def edit
19
+ end
20
+
21
+ def create
22
+ @post = Post.new(post_params)
23
+
24
+ respond_to do |format|
25
+ if @post.save
26
+ format.html { redirect_to post_url(@post), notice: "Post was successfully created." }
27
+ format.json { render :show, status: :created, location: @post }
28
+ else
29
+ format.html { render :new, status: :unprocessable_entity }
30
+ format.json { render json: @post.errors, status: :unprocessable_entity }
31
+ end
32
+ end
33
+ end
34
+
35
+ def update
36
+ respond_to do |format|
37
+ if @post.update(post_params)
38
+ format.html { redirect_to post_url(@post), notice: "Post was successfully updated." }
39
+ format.json { render :show, status: :ok, location: @post }
40
+ else
41
+ format.html { render :edit, status: :unprocessable_entity }
42
+ format.json { render json: @post.errors, status: :unprocessable_entity }
43
+ end
44
+ end
45
+ end
46
+
47
+ def destroy
48
+ @post.destroy
49
+
50
+ respond_to do |format|
51
+ format.html { redirect_to posts_url, notice: "Post was successfully destroyed." }
52
+ format.json { head :no_content }
53
+ end
54
+ end
55
+
56
+ private
57
+ # Use callbacks to share common setup or constraints between actions.
58
+ def set_post
59
+ @post = Post.find(params[:id])
60
+ end
61
+
62
+ # Only allow a list of trusted parameters through.
63
+ def post_params
64
+ params.require(:post).permit(:title, :body)
65
+ end
66
+ end
@@ -0,0 +1,16 @@
1
+ class Post < ApplicationRecord
2
+ extend FriendlyId
3
+
4
+ # friendly_id :title, use: :slugged
5
+
6
+ friendly_id :title_fallbacks, use: :slugged
7
+
8
+ private
9
+
10
+ def title_fallbacks
11
+ [
12
+ :title,
13
+ [:title, :category]
14
+ ]
15
+ end
16
+ end
@@ -0,0 +1,22 @@
1
+ <h1>Friendly</h1>
2
+
3
+ <p>FriendlyId provides slugging and permalink support for Active Record. It lets you create pretty URLs and work with human-friendly strings as if they were numeric ids.</p>
4
+
5
+ <table>
6
+ <thead>
7
+ <tr>
8
+ <td>Title</td>
9
+ <td style='width: 100px;'>Category</td>
10
+ <td>Friendly URL</td>
11
+ </tr>
12
+ </thead>
13
+ <tbody>
14
+ <% @posts.each do |post| %>
15
+ <tr>
16
+ <td><%= post.title %></td>
17
+ <td style='width: 100px;'><%= post.category %></td>
18
+ <td><%= link_to post.slug, post %></td>
19
+ </tr>
20
+ <% end %>
21
+ </tbody>
22
+ </table>
@@ -0,0 +1,3 @@
1
+ <%= link_to 'Home', root_path %>
2
+ | <%= link_to 'Posts', posts_path %>
3
+ <hr />
@@ -0,0 +1,29 @@
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
+ </head>
15
+
16
+ <body>
17
+ <header>
18
+ <%%= render 'layouts/navbar' %>
19
+ <hr />
20
+ </header>
21
+ <main>
22
+ <%%= yield %>
23
+ </main>
24
+ <footer>
25
+ <%%= render 'layouts/footer' %>
26
+ </footer>
27
+ </body>
28
+ </html>
29
+
@@ -0,0 +1,32 @@
1
+ <%= form_with(model: post) do |form| %>
2
+ <% if post.errors.any? %>
3
+ <div style="color: red">
4
+ <h2><%= pluralize(post.errors.count, "error") %> prohibited this post from being saved:</h2>
5
+
6
+ <ul>
7
+ <% post.errors.each do |error| %>
8
+ <li><%= error.full_message %></li>
9
+ <% end %>
10
+ </ul>
11
+ </div>
12
+ <% end %>
13
+
14
+ <div>
15
+ <%= form.label :title, style: "display: block" %>
16
+ <%= form.text_field :title %>
17
+ </div>
18
+
19
+ <div>
20
+ <%= form.label :body, style: "display: block" %>
21
+ <%= form.text_area :body %>
22
+ </div>
23
+
24
+ <div>
25
+ <%= form.label :slug, style: "display: block" %>
26
+ <%= form.text_field :slug %>
27
+ </div>
28
+
29
+ <div>
30
+ <%= form.submit %>
31
+ </div>
32
+ <% end %>
@@ -0,0 +1,17 @@
1
+ <div id="<%= dom_id post %>">
2
+ <p>
3
+ <strong>Title:</strong>
4
+ <%= post.title %>
5
+ </p>
6
+
7
+ <p>
8
+ <strong>Body:</strong>
9
+ <%= post.body %>
10
+ </p>
11
+
12
+ <p>
13
+ <strong>Slug:</strong>
14
+ <%= post.slug %>
15
+ </p>
16
+
17
+ </div>
@@ -0,0 +1,2 @@
1
+ json.extract! post, :id, :title, :body, :slug, :created_at, :updated_at
2
+ json.url post_url(post, format: :json)
@@ -0,0 +1,10 @@
1
+ <h1>Editing post</h1>
2
+
3
+ <%= render "form", post: @post %>
4
+
5
+ <br>
6
+
7
+ <div>
8
+ <%= link_to "Show this post", @post %> |
9
+ <%= link_to "Back to posts", posts_path %>
10
+ </div>
@@ -0,0 +1,14 @@
1
+ <p style="color: green"><%= notice %></p>
2
+
3
+ <h1>Posts</h1>
4
+
5
+ <div id="posts">
6
+ <% @posts.each do |post| %>
7
+ <%= render post %>
8
+ <p>
9
+ <%= link_to "Show this post", post %>
10
+ </p>
11
+ <% end %>
12
+ </div>
13
+
14
+ <%= link_to "New post", new_post_path %>
@@ -0,0 +1 @@
1
+ json.array! @posts, partial: "posts/post", as: :post
@@ -0,0 +1,9 @@
1
+ <h1>New post</h1>
2
+
3
+ <%= render "form", post: @post %>
4
+
5
+ <br>
6
+
7
+ <div>
8
+ <%= link_to "Back to posts", posts_path %>
9
+ </div>
@@ -0,0 +1,19 @@
1
+ <% if @friendly %>
2
+
3
+ <h1><%= @post.title %></h1>
4
+ <p><%= @post.body %></p>
5
+
6
+ <% else %>
7
+
8
+ <p style="color: green"><%= notice %></p>
9
+
10
+ <%= render @post %>
11
+
12
+ <div>
13
+ <%= link_to "Edit this post", edit_post_path(@post) %> |
14
+ <%= link_to "Back to posts", posts_path %>
15
+
16
+ <%= button_to "Destroy this post", @post, method: :delete %>
17
+ </div>
18
+
19
+ <% end %>
@@ -0,0 +1 @@
1
+ json.partial! "posts/post", post: @post
@@ -0,0 +1,47 @@
1
+ posts = [
2
+ 'can ruby on rails run on windows',
3
+ 'can ruby on rails be used for mobile apps',
4
+ 'does ruby on rails have a future',
5
+ 'what does ruby on rails do',
6
+ 'how does ruby on rails work',
7
+ 'what is rails ruby',
8
+ 'where ruby on rails',
9
+ 'what ruby on rails is used for',
10
+ 'where ruby on rails active record',
11
+ 'where ruby on rails performance',
12
+ 'which companies use ruby on rails',
13
+ 'what is ruby on rails developer',
14
+ 'who created ruby on rails',
15
+ 'what is ruby on rails good for',
16
+ 'is ruby on rails worth learning',
17
+ 'is ruby on rails hard to learn',
18
+ 'is ruby on rails backend or frontend',
19
+ 'is ruby on rails a programming language',
20
+ 'is ruby on rails easy to learn',
21
+ 'who uses ruby on rails',
22
+ 'who created ruby on rails',
23
+ 'is ruby rails dead',
24
+ 'what is rails ruby',
25
+ 'when to use ruby on rails',
26
+ 'why ruby on rails is good',
27
+ 'where ruby on rails is used',
28
+ 'where ruby on rails',
29
+ 'where ruby on rails active record',
30
+ 'where ruby on rails performance',
31
+ 'query where ruby on rails'
32
+ ]
33
+
34
+ categories = [
35
+ 'ruby',
36
+ 'rails',
37
+ 'ruby on rails',
38
+ 'ror',
39
+ 'rails 7',
40
+ 'full stack',
41
+ 'web',
42
+ 'web app'
43
+ ]
44
+
45
+ posts.each do |post|
46
+ Post.create(title: post.capitalize, category: categories.sample, body: Faker::Lorem.paragraphs(number: 20).join(' '))
47
+ end
@@ -53,6 +53,7 @@
53
53
  "add_devise_masquerade",
54
54
  "add_dotenv",
55
55
  "add_faker",
56
+ "add_friendly_id",
56
57
  "add_groupdate",
57
58
  "add_hexapdf",
58
59
  "add_httparty",
@@ -446,6 +447,13 @@
446
447
  "default": false,
447
448
  "required": false
448
449
  },
450
+ {
451
+ "name": "add_friendly_id",
452
+ "description": "Indicates when to generate add friendly",
453
+ "type": "boolean",
454
+ "default": false,
455
+ "required": false
456
+ },
449
457
  {
450
458
  "name": "add_groupdate",
451
459
  "description": "Indicates when to generate add groupdate",
@@ -43,6 +43,7 @@
43
43
  "add_devise_masquerade": false,
44
44
  "add_dotenv": false,
45
45
  "add_faker": true,
46
+ "add_friendly_id": false,
46
47
  "add_groupdate": false,
47
48
  "add_hexapdf": false,
48
49
  "add_httparty": false,
@@ -53,6 +53,7 @@
53
53
  "add_devise_masquerade",
54
54
  "add_dotenv",
55
55
  "add_faker",
56
+ "add_friendly_id",
56
57
  "add_groupdate",
57
58
  "add_hexapdf",
58
59
  "add_httparty",
@@ -446,6 +447,13 @@
446
447
  "default": false,
447
448
  "required": false
448
449
  },
450
+ {
451
+ "name": "add_friendly_id",
452
+ "description": "",
453
+ "type": "boolean",
454
+ "default": false,
455
+ "required": false
456
+ },
449
457
  {
450
458
  "name": "add_groupdate",
451
459
  "description": "",
@@ -53,6 +53,7 @@
53
53
  "add_devise_masquerade": false,
54
54
  "add_dotenv": false,
55
55
  "add_faker": true,
56
+ "add_friendly_id": false,
56
57
  "add_groupdate": false,
57
58
  "add_hexapdf": false,
58
59
  "add_httparty": false,
@@ -0,0 +1,15 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RailsAppGenerator
4
+ # Custom add-ons for RailsAppGenerator
5
+ module AddOns
6
+ # Add FactoryBotRails to rails application
7
+ class FactoryBotRails < RailsAppGenerator::Addon
8
+ required_gem gem.version('factory_bot_rails', '6.2.0', 'Provides Rails integration for factory_bot.')
9
+
10
+ def apply
11
+ say 'Setting up FactoryBotRails'
12
+ end
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,16 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RailsAppGenerator
4
+ # Custom add-ons for RailsAppGenerator
5
+ module AddOns
6
+ # Add FriendlyId to rails application
7
+ class FriendlyId < RailsAppGenerator::Addon
8
+ required_gem gem.version('friendly_id', '5.4.2', 'FriendlyId provides slugging and permalink support for Active Record.')
9
+
10
+ def apply
11
+ bundle_install
12
+ generate('friendly_id')
13
+ end
14
+ end
15
+ end
16
+ end
@@ -184,7 +184,9 @@ module RailsAppGenerator
184
184
  # docker
185
185
  add_if(:dotenv) # tested
186
186
  add_if(:factory_bot) # TODO: needs testing
187
+ add_if(:factory_bot_rails) # tested
187
188
  add_if(:faker) # tested
189
+ add_if(:friendly_id) # tested
188
190
  add_if(:generators) # TODO: needs testing
189
191
  add_if(:groupdate) # TODO: does not have a profile
190
192
  add_if(:hexapdf) # tested
@@ -364,6 +366,14 @@ module RailsAppGenerator
364
366
  template_files.map { |template_file| read_template(template_file) }.join(join)
365
367
  end
366
368
 
369
+ # swap two lines using the gsub_file
370
+ def swap_lines(file, swap1, swap2)
371
+ swap_temp = '##SWAP_IT##'
372
+ gsub_file(file, swap1, swap_temp)
373
+ gsub_file(file, swap2, swap1)
374
+ gsub_file(file, swap_temp, swap2)
375
+ end
376
+
367
377
  # Moves a file at given location, to another location. Both files are relative to the destination_root
368
378
  #
369
379
  # ==== Parameters
@@ -118,7 +118,9 @@ KConfig.configure do |config|
118
118
  # docker
119
119
  rag.add_option :add_dotenv , type: :boolean, default: false
120
120
  # factory_bot
121
+ rag.add_option :add_factory_bot_rails , type: :boolean, default: false
121
122
  rag.add_option :add_faker , type: :boolean, default: false
123
+ rag.add_option :add_friendly_id , type: :boolean, default: false
122
124
  # generators
123
125
  rag.add_option :add_groupdate , type: :boolean, default: false
124
126
  rag.add_option :add_hexapdf , type: :boolean, default: false
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module RailsAppGenerator
4
- VERSION = '0.2.36'
4
+ VERSION = '0.2.39'
5
5
  end
data/package-lock.json CHANGED
@@ -1,12 +1,12 @@
1
1
  {
2
2
  "name": "rails_app_generator",
3
- "version": "0.2.36",
3
+ "version": "0.2.39",
4
4
  "lockfileVersion": 2,
5
5
  "requires": true,
6
6
  "packages": {
7
7
  "": {
8
8
  "name": "rails_app_generator",
9
- "version": "0.2.36",
9
+ "version": "0.2.39",
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.36",
3
+ "version": "0.2.39",
4
4
  "description": "Create new Rails Application with custom opinions",
5
5
  "scripts": {
6
6
  "release": "semantic-release"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "args": {
3
- "app_path": "avo",
3
+ "app_path": "r7_avo",
4
4
  "destination_root": "/Users/davidcruwys/dev/kgems/rails_app_generator/a/addons"
5
5
  },
6
6
  "opts": {
@@ -0,0 +1,14 @@
1
+ {
2
+ "args": {
3
+ "app_path": "r7_friendly_id",
4
+ "destination_root": "/Users/davidcruwys/dev/kgems/rails_app_generator/a/addons"
5
+ },
6
+ "opts": {
7
+ "skip_git": true,
8
+ "skip_test": true,
9
+ "add_minimal_css": true,
10
+ "template": "/Users/davidcruwys/dev/kgems/rails_app_generator/after_templates/addons/friendly_id/_.rb",
11
+ "add_faker": true,
12
+ "add_friendly_id": true
13
+ }
14
+ }
@@ -1,5 +1,5 @@
1
1
  <%= link_to 'Home', root_path %>
2
- <%# link_to 'Products', products_path %>
3
- <%# link_to 'Posts', posts_path %>
4
- <%# link_to 'People', people_path %>
2
+ | <%= link_to 'Products', products_path %>
3
+ | <%= link_to 'Posts', posts_path %>
4
+ | <%= link_to 'People', people_path %>
5
5
  <hr />
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.36
4
+ version: 0.2.39
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-22 00:00:00.000000000 Z
11
+ date: 2022-08-23 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bootsnap
@@ -214,6 +214,8 @@ files:
214
214
  - after_templates/addons/avo/app/controllers/home_controller.rb
215
215
  - after_templates/addons/avo/app/models/category.rb
216
216
  - after_templates/addons/avo/app/models/post.rb
217
+ - after_templates/addons/avo/app/models/user.rb
218
+ - after_templates/addons/avo/app/services/seed_service.rb
217
219
  - after_templates/addons/avo/app/views/home/index.html.erb
218
220
  - after_templates/addons/avo/app/views/home/quick_signin.html.erb
219
221
  - after_templates/addons/avo/app/views/layouts/_footer.html.erb
@@ -299,6 +301,24 @@ files:
299
301
  - after_templates/addons/faker/app/views/layouts/_footer.html.erb
300
302
  - after_templates/addons/faker/app/views/layouts/_navbar.html.erb
301
303
  - after_templates/addons/faker/app/views/layouts/application.html.erb
304
+ - after_templates/addons/friendly_id/_.rb
305
+ - after_templates/addons/friendly_id/app/controllers/home_controller.rb
306
+ - after_templates/addons/friendly_id/app/controllers/posts_controller.rb
307
+ - after_templates/addons/friendly_id/app/models/post.rb
308
+ - after_templates/addons/friendly_id/app/views/home/index.html.erb
309
+ - after_templates/addons/friendly_id/app/views/layouts/_footer.html.erb
310
+ - after_templates/addons/friendly_id/app/views/layouts/_navbar.html.erb
311
+ - after_templates/addons/friendly_id/app/views/layouts/application.html.erb
312
+ - after_templates/addons/friendly_id/app/views/posts/_form.html.erb
313
+ - after_templates/addons/friendly_id/app/views/posts/_post.html.erb
314
+ - after_templates/addons/friendly_id/app/views/posts/_post.json.jbuilder
315
+ - after_templates/addons/friendly_id/app/views/posts/edit.html.erb
316
+ - after_templates/addons/friendly_id/app/views/posts/index.html.erb
317
+ - after_templates/addons/friendly_id/app/views/posts/index.json.jbuilder
318
+ - after_templates/addons/friendly_id/app/views/posts/new.html.erb
319
+ - after_templates/addons/friendly_id/app/views/posts/show.html.erb
320
+ - after_templates/addons/friendly_id/app/views/posts/show.json.jbuilder
321
+ - after_templates/addons/friendly_id/db/seeds.rb
302
322
  - after_templates/addons/hexapdf/_.rb
303
323
  - after_templates/addons/hexapdf/app/controllers/home_controller.rb
304
324
  - after_templates/addons/hexapdf/app/views/home/index.html.erb
@@ -644,8 +664,10 @@ files:
644
664
  - lib/rails_app_generator/addons/docker_compose.rb
645
665
  - lib/rails_app_generator/addons/dotenv.rb
646
666
  - lib/rails_app_generator/addons/factory_bot.rb
667
+ - lib/rails_app_generator/addons/factory_bot_rails.rb
647
668
  - lib/rails_app_generator/addons/faker.rb
648
669
  - lib/rails_app_generator/addons/foreman.rb
670
+ - lib/rails_app_generator/addons/friendly_id.rb
649
671
  - lib/rails_app_generator/addons/generators.rb
650
672
  - lib/rails_app_generator/addons/groupdate.rb
651
673
  - lib/rails_app_generator/addons/hexapdf.rb
@@ -726,6 +748,7 @@ files:
726
748
  - profiles/addons/devise_masquerade.json
727
749
  - profiles/addons/dotenv.json
728
750
  - profiles/addons/faker.json
751
+ - profiles/addons/friendly_id.json
729
752
  - profiles/addons/hexapdf.json
730
753
  - profiles/addons/honeybadger.json
731
754
  - profiles/addons/httparty.json