rails_app_generator 0.2.37 → 0.2.40

Sign up to get free protection for your applications and to get access to all the features.
Files changed (56) 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/factory_bot_rails/_.rb +45 -0
  14. data/after_templates/addons/factory_bot_rails/app/controllers/home_controller.rb +8 -0
  15. data/after_templates/addons/factory_bot_rails/app/services/seed_service.rb +27 -0
  16. data/after_templates/addons/factory_bot_rails/app/views/home/index.html.erb +3 -0
  17. data/after_templates/addons/factory_bot_rails/app/views/home/reseed.html.erb +6 -0
  18. data/after_templates/addons/factory_bot_rails/app/views/layouts/_footer.html.erb +0 -0
  19. data/after_templates/addons/factory_bot_rails/app/views/layouts/_navbar.html.erb +6 -0
  20. data/after_templates/addons/factory_bot_rails/app/views/layouts/application.html.erb +29 -0
  21. data/after_templates/addons/factory_bot_rails/db/seeds.rb +1 -0
  22. data/after_templates/addons/factory_bot_rails/factories.rb +27 -0
  23. data/after_templates/addons/friendly_id/_.rb +68 -0
  24. data/after_templates/addons/friendly_id/app/controllers/home_controller.rb +5 -0
  25. data/after_templates/addons/friendly_id/app/controllers/posts_controller.rb +66 -0
  26. data/after_templates/addons/friendly_id/app/models/post.rb +16 -0
  27. data/after_templates/addons/friendly_id/app/views/home/index.html.erb +22 -0
  28. data/after_templates/addons/friendly_id/app/views/layouts/_footer.html.erb +0 -0
  29. data/after_templates/addons/friendly_id/app/views/layouts/_navbar.html.erb +3 -0
  30. data/after_templates/addons/friendly_id/app/views/layouts/application.html.erb +29 -0
  31. data/after_templates/addons/friendly_id/app/views/posts/_form.html.erb +32 -0
  32. data/after_templates/addons/friendly_id/app/views/posts/_post.html.erb +17 -0
  33. data/after_templates/addons/friendly_id/app/views/posts/_post.json.jbuilder +2 -0
  34. data/after_templates/addons/friendly_id/app/views/posts/edit.html.erb +10 -0
  35. data/after_templates/addons/friendly_id/app/views/posts/index.html.erb +14 -0
  36. data/after_templates/addons/friendly_id/app/views/posts/index.json.jbuilder +1 -0
  37. data/after_templates/addons/friendly_id/app/views/posts/new.html.erb +9 -0
  38. data/after_templates/addons/friendly_id/app/views/posts/show.html.erb +19 -0
  39. data/after_templates/addons/friendly_id/app/views/posts/show.json.jbuilder +1 -0
  40. data/after_templates/addons/friendly_id/db/seeds.rb +47 -0
  41. data/docs/last_run/app_generator_class.json +16 -0
  42. data/docs/last_run/app_generator_data.json +9 -7
  43. data/docs/last_run/rails_options_class.json +16 -0
  44. data/docs/last_run/rails_options_data.json +9 -7
  45. data/lib/rails_app_generator/addons/factory_bot_rails.rb +15 -0
  46. data/lib/rails_app_generator/addons/friendly_id.rb +2 -1
  47. data/lib/rails_app_generator/app_generator.rb +9 -0
  48. data/lib/rails_app_generator/rag_initializer.rb +1 -0
  49. data/lib/rails_app_generator/version.rb +1 -1
  50. data/package-lock.json +2 -2
  51. data/package.json +1 -1
  52. data/profiles/addons/avo.json +1 -1
  53. data/profiles/addons/factory_bot_rails.json +14 -0
  54. data/profiles/addons/friendly_id.json +14 -0
  55. data/templates/thor_task/profile/app/views/layouts/_navbar.html.erb +3 -3
  56. metadata +35 -2
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 2f4ca958feef477475984a4ba7c07c2bacca73ab9e08c3bfa6159230b9e5da13
4
- data.tar.gz: d0d6cb5bdfbcc3cf808e99f6d28e55752353ac359981495684f63c373e1002f7
3
+ metadata.gz: 635081352fed9b65ca6d9905c209e40edc4d74ea8eb1fcc5ae1f53b58c080fe6
4
+ data.tar.gz: 0a0e858ef8a51a3c6ae1dca71ffb112e6e61cfb8802c6a3f4f2139d77195334d
5
5
  SHA512:
6
- metadata.gz: 9fe692be0b91354f45d868b6e5180110547895fb812dd01470babd91d1282f06e33abc615d9b332ba0ae0c5ed8d04da6fc6d73db280e5031f246eb4ef239b6ca
7
- data.tar.gz: 03b60799b0a908b6cbc54dd354cd8a58f4ae0f56d276359080f9482ce27e6cab675bba980218366136d48c5dc561b8e0767e0aad89a394e058b037d497d911e2
6
+ metadata.gz: b75d081dad75b16ff179fd916c3b25f0f1c2a1fbcd1def2749a7b5cceb2f6af77f950c07abd14fad51a7db3a2d4f12ae3b9c3a8d9ca87f018991c34f3e7889b6
7
+ data.tar.gz: 537cac1df29fefd9294470bc47fcbe4510004189f637b7e0da70a815dc2b48a78f9ffb373be70d3b23c4cc0a85c0f8e1f2876f1a6fded9bb44e53de7a236fb3d
data/CHANGELOG.md CHANGED
@@ -1,3 +1,24 @@
1
+ ## [0.2.39](https://github.com/klueless-io/rails_app_generator/compare/v0.2.38...v0.2.39) (2022-08-23)
2
+
3
+
4
+ ### Bug Fixes
5
+
6
+ * add friendly_id profile, add factory_bot_rails addon ([75d51ce](https://github.com/klueless-io/rails_app_generator/commit/75d51ceb63a5a560977073b2a6199545c5c8d17f))
7
+
8
+ ## [0.2.38](https://github.com/klueless-io/rails_app_generator/compare/v0.2.37...v0.2.38) (2022-08-22)
9
+
10
+
11
+ ### Bug Fixes
12
+
13
+ * add friendly_id addon ([5c34df5](https://github.com/klueless-io/rails_app_generator/commit/5c34df5fdbca8bc6810bd3cc9343d8b799d63ac3))
14
+
15
+ ## [0.2.37](https://github.com/klueless-io/rails_app_generator/compare/v0.2.36...v0.2.37) (2022-08-22)
16
+
17
+
18
+ ### Bug Fixes
19
+
20
+ * add friendly_id addon ([e6fc42e](https://github.com/klueless-io/rails_app_generator/commit/e6fc42e7d4ef017775c6b33850fb22aabc156ca5))
21
+
1
22
  ## [0.2.36](https://github.com/klueless-io/rails_app_generator/compare/v0.2.35...v0.2.36) (2022-08-22)
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,45 @@
1
+ # frozen_string_literal: true
2
+
3
+ # Provides Rails integration for factory_bot
4
+ #
5
+ # exe/rag addons/factory_bot_rails
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', 'is_featured:boolean')
21
+ add_scaffold('person', 'first_name', 'last_name', 'email', 'password', 'address:text')
22
+ add_scaffold('project', 'name', 'status', 'budget:decimal', 'country', 'progress:integer')
23
+ end
24
+
25
+ def setup_customizations
26
+ route("root 'home#index'")
27
+
28
+ force_copy
29
+
30
+ add_controller('home', 'index', 'reseed')
31
+
32
+ directory "app/controllers"
33
+ directory "app/models"
34
+ directory "app/services"
35
+ directory "app/views"
36
+ template 'app/views/layouts/application.html.erb' , 'app/views/layouts/application.html.erb'
37
+ copy_file 'factories.rb', 'factories.rb'
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,8 @@
1
+ class HomeController < ApplicationController
2
+ def index
3
+ end
4
+
5
+ def reseed
6
+ SeedService.seed
7
+ end
8
+ end
@@ -0,0 +1,27 @@
1
+ class SeedService
2
+ class << self
3
+ def seed
4
+ service = SeedService.new
5
+ service.call
6
+ end
7
+ end
8
+
9
+ def call
10
+ reset
11
+ create
12
+ end
13
+
14
+ private
15
+
16
+ def reset
17
+ Person.delete_all
18
+ Post.delete_all
19
+ Project.delete_all
20
+ end
21
+
22
+ def create
23
+ FactoryBot.create_list(:post, rand(10..20))
24
+ FactoryBot.create_list(:person, rand(10..20))
25
+ FactoryBot.create_list(:project, rand(10..20))
26
+ end
27
+ end
@@ -0,0 +1,3 @@
1
+ <h1>Factory bot rails</h1>
2
+
3
+ <p></p>
@@ -0,0 +1,6 @@
1
+ <h1>Re-Seed</h1>
2
+ <p>Database has been re-seeded</p>
3
+
4
+ <p>Posts: <%= Post.count %></p>
5
+ <p>People: <%= Person.count %></p>
6
+ <p>Projects: <%= Project.count %></p>
@@ -0,0 +1,6 @@
1
+ <%= link_to 'Home', root_path %>
2
+ | <%= link_to 'Re-Seed', home_reseed_path %>
3
+ | <%= link_to 'Posts', posts_path %>
4
+ | <%= link_to 'People', people_path %>
5
+ | <%= link_to 'Projects', projects_path %>
6
+ <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 @@
1
+ SeedService.seed
@@ -0,0 +1,27 @@
1
+ FactoryBot.define do
2
+ # add_scaffold('post', 'title', 'body:text', 'is_featured:boolean')
3
+ # add_scaffold('person', 'first_name', 'last_name', 'email', 'password', 'is_featured:boolean', 'address:text')
4
+ # add_scaffold('project', 'status', 'budget:decimal', 'country', 'progress:integer')
5
+
6
+ factory :person do
7
+ first_name { Faker::Name.first_name }
8
+ last_name { Faker::Name.last_name }
9
+ email { Faker::Internet.email }
10
+ password { Faker::Internet.password }
11
+ address { Faker::Address.full_address }
12
+ end
13
+
14
+ factory :post do
15
+ title { Faker::Quote.famous_last_words }
16
+ body { Faker::Lorem.paragraphs(number: rand(4...10)).join("\n") }
17
+ is_featured { [true, false].sample }
18
+ end
19
+
20
+ factory :project do
21
+ name { Faker::App.name }
22
+ status { [:closed, :rejected, :failed, :loading, :running, :waiting, :done, :finalized, :archived, :finished].sample }
23
+ budget { Faker::Number.decimal(l_digits: 4) }
24
+ country { Faker::Address.country_code }
25
+ progress { Faker::Number.between(from: 0, to: 100) }
26
+ end
27
+ end
@@ -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
@@ -52,7 +52,9 @@
52
52
  "add_devise",
53
53
  "add_devise_masquerade",
54
54
  "add_dotenv",
55
+ "add_factory_bot_rails",
55
56
  "add_faker",
57
+ "add_friendly_id",
56
58
  "add_groupdate",
57
59
  "add_hexapdf",
58
60
  "add_httparty",
@@ -439,6 +441,13 @@
439
441
  "default": false,
440
442
  "required": false
441
443
  },
444
+ {
445
+ "name": "add_factory_bot_rails",
446
+ "description": "Indicates when to generate add factory bot rails",
447
+ "type": "boolean",
448
+ "default": false,
449
+ "required": false
450
+ },
442
451
  {
443
452
  "name": "add_faker",
444
453
  "description": "Indicates when to generate add faker",
@@ -446,6 +455,13 @@
446
455
  "default": false,
447
456
  "required": false
448
457
  },
458
+ {
459
+ "name": "add_friendly_id",
460
+ "description": "Indicates when to generate add friendly",
461
+ "type": "boolean",
462
+ "default": false,
463
+ "required": false
464
+ },
449
465
  {
450
466
  "name": "add_groupdate",
451
467
  "description": "Indicates when to generate add groupdate",
@@ -32,22 +32,24 @@
32
32
  "test": "rspec",
33
33
  "add_acts_as_list": false,
34
34
  "add_administrate": false,
35
- "add_annotate": true,
36
- "add_avo": true,
35
+ "add_annotate": false,
36
+ "add_avo": false,
37
37
  "add_bcrypt": false,
38
38
  "add_brakeman": false,
39
39
  "add_browser": false,
40
40
  "add_bundler_audit": false,
41
41
  "add_chartkick": false,
42
- "add_devise": true,
42
+ "add_devise": false,
43
43
  "add_devise_masquerade": false,
44
44
  "add_dotenv": false,
45
+ "add_factory_bot_rails": true,
45
46
  "add_faker": true,
47
+ "add_friendly_id": false,
46
48
  "add_groupdate": false,
47
49
  "add_hexapdf": false,
48
50
  "add_httparty": false,
49
51
  "add_honeybadger": false,
50
- "add_image_processing": true,
52
+ "add_image_processing": false,
51
53
  "add_kaminari": false,
52
54
  "add_lograge": false,
53
55
  "add_minimal_css": true,
@@ -58,11 +60,11 @@
58
60
  "add_pretender": false,
59
61
  "add_public_suffix": false,
60
62
  "add_rails_html_sanitizer": false,
61
- "add_ransack": true,
63
+ "add_ransack": false,
62
64
  "add_redcarpet": false,
63
65
  "add_rolify": false,
64
- "add_rubocop": true,
66
+ "add_rubocop": false,
65
67
  "add_twilio_ruby": false,
66
- "template": "/Users/davidcruwys/dev/kgems/rails_app_generator/after_templates/addons/avo/_.rb"
68
+ "template": "/Users/davidcruwys/dev/kgems/rails_app_generator/after_templates/addons/factory_bot_rails/_.rb"
67
69
  }
68
70
  }
@@ -52,7 +52,9 @@
52
52
  "add_devise",
53
53
  "add_devise_masquerade",
54
54
  "add_dotenv",
55
+ "add_factory_bot_rails",
55
56
  "add_faker",
57
+ "add_friendly_id",
56
58
  "add_groupdate",
57
59
  "add_hexapdf",
58
60
  "add_httparty",
@@ -439,6 +441,13 @@
439
441
  "default": false,
440
442
  "required": false
441
443
  },
444
+ {
445
+ "name": "add_factory_bot_rails",
446
+ "description": "",
447
+ "type": "boolean",
448
+ "default": false,
449
+ "required": false
450
+ },
442
451
  {
443
452
  "name": "add_faker",
444
453
  "description": "",
@@ -446,6 +455,13 @@
446
455
  "default": false,
447
456
  "required": false
448
457
  },
458
+ {
459
+ "name": "add_friendly_id",
460
+ "description": "",
461
+ "type": "boolean",
462
+ "default": false,
463
+ "required": false
464
+ },
449
465
  {
450
466
  "name": "add_groupdate",
451
467
  "description": "",
@@ -7,7 +7,7 @@
7
7
  "quiet": false,
8
8
  "skip": false,
9
9
  "ruby": "/Users/davidcruwys/.asdf/installs/ruby/3.1.1/bin/ruby",
10
- "template": "/Users/davidcruwys/dev/kgems/rails_app_generator/after_templates/addons/avo/_.rb",
10
+ "template": "/Users/davidcruwys/dev/kgems/rails_app_generator/after_templates/addons/factory_bot_rails/_.rb",
11
11
  "database": "sqlite3",
12
12
  "skip_git": true,
13
13
  "skip_keeps": false,
@@ -42,22 +42,24 @@
42
42
  "test": "rspec",
43
43
  "add_acts_as_list": false,
44
44
  "add_administrate": false,
45
- "add_annotate": true,
46
- "add_avo": true,
45
+ "add_annotate": false,
46
+ "add_avo": false,
47
47
  "add_bcrypt": false,
48
48
  "add_brakeman": false,
49
49
  "add_browser": false,
50
50
  "add_bundler_audit": false,
51
51
  "add_chartkick": false,
52
- "add_devise": true,
52
+ "add_devise": false,
53
53
  "add_devise_masquerade": false,
54
54
  "add_dotenv": false,
55
+ "add_factory_bot_rails": true,
55
56
  "add_faker": true,
57
+ "add_friendly_id": false,
56
58
  "add_groupdate": false,
57
59
  "add_hexapdf": false,
58
60
  "add_httparty": false,
59
61
  "add_honeybadger": false,
60
- "add_image_processing": true,
62
+ "add_image_processing": false,
61
63
  "add_kaminari": false,
62
64
  "add_lograge": false,
63
65
  "add_minimal_css": true,
@@ -68,10 +70,10 @@
68
70
  "add_pretender": false,
69
71
  "add_public_suffix": false,
70
72
  "add_rails_html_sanitizer": false,
71
- "add_ransack": true,
73
+ "add_ransack": false,
72
74
  "add_redcarpet": false,
73
75
  "add_rolify": false,
74
- "add_rubocop": true,
76
+ "add_rubocop": false,
75
77
  "add_twilio_ruby": false
76
78
  }
77
79
  }
@@ -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
@@ -5,9 +5,10 @@ module RailsAppGenerator
5
5
  module AddOns
6
6
  # Add FriendlyId to rails application
7
7
  class FriendlyId < RailsAppGenerator::Addon
8
- required_gem gem.version('friendly_id', '5.4.2', '')
8
+ required_gem gem.version('friendly_id', '5.4.2', 'FriendlyId provides slugging and permalink support for Active Record.')
9
9
 
10
10
  def apply
11
+ bundle_install
11
12
  generate('friendly_id')
12
13
  end
13
14
  end
@@ -184,6 +184,7 @@ 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
188
189
  add_if(:friendly_id) # tested
189
190
  add_if(:generators) # TODO: needs testing
@@ -365,6 +366,14 @@ module RailsAppGenerator
365
366
  template_files.map { |template_file| read_template(template_file) }.join(join)
366
367
  end
367
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
+
368
377
  # Moves a file at given location, to another location. Both files are relative to the destination_root
369
378
  #
370
379
  # ==== Parameters
@@ -118,6 +118,7 @@ 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
122
123
  rag.add_option :add_friendly_id , type: :boolean, default: false
123
124
  # generators
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module RailsAppGenerator
4
- VERSION = '0.2.37'
4
+ VERSION = '0.2.40'
5
5
  end
data/package-lock.json CHANGED
@@ -1,12 +1,12 @@
1
1
  {
2
2
  "name": "rails_app_generator",
3
- "version": "0.2.37",
3
+ "version": "0.2.40",
4
4
  "lockfileVersion": 2,
5
5
  "requires": true,
6
6
  "packages": {
7
7
  "": {
8
8
  "name": "rails_app_generator",
9
- "version": "0.2.37",
9
+ "version": "0.2.40",
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.37",
3
+ "version": "0.2.40",
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_factory_bot_rails",
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/factory_bot_rails/_.rb",
11
+ "add_factory_bot_rails": true,
12
+ "add_faker": true
13
+ }
14
+ }
@@ -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.37
4
+ version: 0.2.40
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
@@ -292,6 +294,16 @@ files:
292
294
  - after_templates/addons/dotenv/app/controllers/home_controller.rb
293
295
  - after_templates/addons/dotenv/app/views/home/index.html.erb
294
296
  - after_templates/addons/dotenv/app/views/layouts/application.html.erb
297
+ - after_templates/addons/factory_bot_rails/_.rb
298
+ - after_templates/addons/factory_bot_rails/app/controllers/home_controller.rb
299
+ - after_templates/addons/factory_bot_rails/app/services/seed_service.rb
300
+ - after_templates/addons/factory_bot_rails/app/views/home/index.html.erb
301
+ - after_templates/addons/factory_bot_rails/app/views/home/reseed.html.erb
302
+ - after_templates/addons/factory_bot_rails/app/views/layouts/_footer.html.erb
303
+ - after_templates/addons/factory_bot_rails/app/views/layouts/_navbar.html.erb
304
+ - after_templates/addons/factory_bot_rails/app/views/layouts/application.html.erb
305
+ - after_templates/addons/factory_bot_rails/db/seeds.rb
306
+ - after_templates/addons/factory_bot_rails/factories.rb
295
307
  - after_templates/addons/faker/_.rb
296
308
  - after_templates/addons/faker/app/controllers/home_controller.rb
297
309
  - after_templates/addons/faker/app/views/home/index.html.erb
@@ -299,6 +311,24 @@ files:
299
311
  - after_templates/addons/faker/app/views/layouts/_footer.html.erb
300
312
  - after_templates/addons/faker/app/views/layouts/_navbar.html.erb
301
313
  - after_templates/addons/faker/app/views/layouts/application.html.erb
314
+ - after_templates/addons/friendly_id/_.rb
315
+ - after_templates/addons/friendly_id/app/controllers/home_controller.rb
316
+ - after_templates/addons/friendly_id/app/controllers/posts_controller.rb
317
+ - after_templates/addons/friendly_id/app/models/post.rb
318
+ - after_templates/addons/friendly_id/app/views/home/index.html.erb
319
+ - after_templates/addons/friendly_id/app/views/layouts/_footer.html.erb
320
+ - after_templates/addons/friendly_id/app/views/layouts/_navbar.html.erb
321
+ - after_templates/addons/friendly_id/app/views/layouts/application.html.erb
322
+ - after_templates/addons/friendly_id/app/views/posts/_form.html.erb
323
+ - after_templates/addons/friendly_id/app/views/posts/_post.html.erb
324
+ - after_templates/addons/friendly_id/app/views/posts/_post.json.jbuilder
325
+ - after_templates/addons/friendly_id/app/views/posts/edit.html.erb
326
+ - after_templates/addons/friendly_id/app/views/posts/index.html.erb
327
+ - after_templates/addons/friendly_id/app/views/posts/index.json.jbuilder
328
+ - after_templates/addons/friendly_id/app/views/posts/new.html.erb
329
+ - after_templates/addons/friendly_id/app/views/posts/show.html.erb
330
+ - after_templates/addons/friendly_id/app/views/posts/show.json.jbuilder
331
+ - after_templates/addons/friendly_id/db/seeds.rb
302
332
  - after_templates/addons/hexapdf/_.rb
303
333
  - after_templates/addons/hexapdf/app/controllers/home_controller.rb
304
334
  - after_templates/addons/hexapdf/app/views/home/index.html.erb
@@ -644,6 +674,7 @@ files:
644
674
  - lib/rails_app_generator/addons/docker_compose.rb
645
675
  - lib/rails_app_generator/addons/dotenv.rb
646
676
  - lib/rails_app_generator/addons/factory_bot.rb
677
+ - lib/rails_app_generator/addons/factory_bot_rails.rb
647
678
  - lib/rails_app_generator/addons/faker.rb
648
679
  - lib/rails_app_generator/addons/foreman.rb
649
680
  - lib/rails_app_generator/addons/friendly_id.rb
@@ -726,7 +757,9 @@ files:
726
757
  - profiles/addons/devise.json
727
758
  - profiles/addons/devise_masquerade.json
728
759
  - profiles/addons/dotenv.json
760
+ - profiles/addons/factory_bot_rails.json
729
761
  - profiles/addons/faker.json
762
+ - profiles/addons/friendly_id.json
730
763
  - profiles/addons/hexapdf.json
731
764
  - profiles/addons/honeybadger.json
732
765
  - profiles/addons/httparty.json