rails_app_generator 0.1.12 → 0.1.13

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: f2307c0ebef36cdf172922b01efbf07d2e24adaa855afca17b7e6490dd4b3e45
4
- data.tar.gz: 6dff48114607c3adaa8ef5325651762e0738a62032e9e50e6f41e1c7cfbae536
3
+ metadata.gz: 1505eaa23b41f69afe5f4060221b479ae01209f1a76df69577ef715b17c9455f
4
+ data.tar.gz: f33d5a7001365a84503d2640053604e3e6fe52632f54f0c03c17fe36ff83c869
5
5
  SHA512:
6
- metadata.gz: e1daf6f4579973228d26d984c4db2adf8531091fd9bb169a17ead6df4c641e817f3fe29ba3bf929b5f674a11323ecce929eb2e839d79a866ed82f7725cdfd3b4
7
- data.tar.gz: ea7d93cb6434418ab160fc2d37b6981b9a6056b26fa8f49baa198d3084be07e06e29d09ef2af0d6893b34d68bc2d2521f9d07e02a3439faa1e0b78a4d048ac2d
6
+ metadata.gz: 00b2d94306f636e25800d4d6ed09d8536535f47c630662ee6beda2939dbf871e01721d2978e19dc6bb5c0e281f47913d73535bfb2ef8ecaee427726e9308be7f
7
+ data.tar.gz: 3dde1c772e2d56ad34d9b190742c25725e744145e4754630425613ced8525e026d935a671f8335b3fb60a56122547b0bc589845bb9f1de61689c94a74b5e0070
data/CHANGELOG.md CHANGED
@@ -1,3 +1,10 @@
1
+ ## [0.1.12](https://github.com/klueless-io/rails_app_generator/compare/v0.1.11...v0.1.12) (2022-08-02)
2
+
3
+
4
+ ### Bug Fixes
5
+
6
+ * update rails-html-sanitizer example ([7f3a2d8](https://github.com/klueless-io/rails_app_generator/commit/7f3a2d810a968748baf4f8a4a147b086a26781c0))
7
+
1
8
  ## [0.1.11](https://github.com/klueless-io/rails_app_generator/compare/v0.1.10...v0.1.11) (2022-08-02)
2
9
 
3
10
 
@@ -0,0 +1,46 @@
1
+ # frozen_string_literal: true
2
+
3
+ # require 'pry'
4
+
5
+ # Make managing application errors a more pleasant experience.
6
+ #
7
+ # exe/rag addons/honeybadger
8
+ # see: https://honeybadger.wistia.com/medias/l3cmyucx8f
9
+
10
+ self.local_template_path = File.dirname(__FILE__)
11
+
12
+ gac 'base rails 7 image created'
13
+
14
+ add_controller('home', 'index')
15
+ route("root 'home#index'")
16
+
17
+ force_copy
18
+
19
+ copy_file 'app/views/home/index.html.erb', 'app/views/home/index.html.erb'
20
+ copy_file 'app/controllers/application_controller.rb', 'app/controllers/application_controller.rb'
21
+ copy_file 'app/controllers/errors_controller.rb', 'app/controllers/errors_controller.rb'
22
+
23
+ # Test if this is really needed
24
+ insert_into_file 'config/application.rb', after: 'class Application < Rails::Application' do
25
+ <<-RUBY
26
+ config.generators.system_tests = nil
27
+ RUBY
28
+ end
29
+
30
+ copy_file 'public/404.html', 'public/404.html'
31
+ copy_file 'public/500.html', 'public/500.html'
32
+
33
+ copy_file 'config/locales/en.yml', 'config/locales/en.yml'
34
+
35
+ move_file('config/honeybadger.sample.yml', 'config/honeybadger.yml')
36
+
37
+ after_bundle do
38
+ setup_db
39
+ end
40
+
41
+ def setup_db
42
+ add_scaffold('product', 'name', 'price:integer')
43
+ copy_file 'app/controllers/products_controller.rb', 'app/controllers/products_controller.rb'
44
+
45
+ db_migrate
46
+ end
@@ -0,0 +1,9 @@
1
+ class ApplicationController < ActionController::Base
2
+ before_action do |_|
3
+ Honeybadger.context(
4
+ user_email: 'klueless-io@example.com',
5
+ name: 'David',
6
+ company: 'AppyDave'
7
+ )
8
+ end
9
+ end
@@ -0,0 +1,17 @@
1
+ class ErrorsController < ApplicationController
2
+ def not_found
3
+ render status: 404
4
+ end
5
+
6
+ def internal_server
7
+ render status: 500
8
+ end
9
+
10
+ def unprocessable
11
+ render status: 422
12
+ end
13
+
14
+ def unacceptable
15
+ render status: 406
16
+ end
17
+ end
@@ -0,0 +1,72 @@
1
+ class ProductsController < ApplicationController
2
+ before_action :set_product, only: %i[ show edit update destroy ]
3
+
4
+ # GET /products or /products.json
5
+ def index
6
+ @products = Product.all
7
+ end
8
+
9
+ # GET /products/1 or /products/1.json
10
+ def show
11
+ end
12
+
13
+ # GET /products/new
14
+ def new
15
+ # remove this comment to see error in Honeybadger
16
+ raise 'Oh No!'
17
+ @product = Product.new
18
+ end
19
+
20
+ # GET /products/1/edit
21
+ def edit
22
+ end
23
+
24
+ # POST /products or /products.json
25
+ def create
26
+ @product = Product.new(product_params)
27
+
28
+ respond_to do |format|
29
+ if @product.save
30
+ format.html { redirect_to product_url(@product), notice: "Product was successfully created." }
31
+ format.json { render :show, status: :created, location: @product }
32
+ else
33
+ format.html { render :new, status: :unprocessable_entity }
34
+ format.json { render json: @product.errors, status: :unprocessable_entity }
35
+ end
36
+ end
37
+ end
38
+
39
+ # PATCH/PUT /products/1 or /products/1.json
40
+ def update
41
+ respond_to do |format|
42
+ if @product.update(product_params)
43
+ format.html { redirect_to product_url(@product), notice: "Product was successfully updated." }
44
+ format.json { render :show, status: :ok, location: @product }
45
+ else
46
+ format.html { render :edit, status: :unprocessable_entity }
47
+ format.json { render json: @product.errors, status: :unprocessable_entity }
48
+ end
49
+ end
50
+ end
51
+
52
+ # DELETE /products/1 or /products/1.json
53
+ def destroy
54
+ @product.destroy
55
+
56
+ respond_to do |format|
57
+ format.html { redirect_to products_url, notice: "Product was successfully destroyed." }
58
+ format.json { head :no_content }
59
+ end
60
+ end
61
+
62
+ private
63
+ # Use callbacks to share common setup or constraints between actions.
64
+ def set_product
65
+ @product = Product.find(params[:id])
66
+ end
67
+
68
+ # Only allow a list of trusted parameters through.
69
+ def product_params
70
+ params.require(:product).permit(:name, :price)
71
+ end
72
+ end
@@ -0,0 +1,49 @@
1
+ <h1>Honeybadger</h1>
2
+
3
+ <h2>Make managing application errors a more pleasant experience.</h2>
4
+
5
+ <p>Follow the instructions below and then click on products -> new</p>
6
+
7
+ <%= link_to 'Products', products_path %>
8
+
9
+ <h2>Instructions</h2>
10
+
11
+ <p>If you want to see 404/500 HTML inplace of the debug routing error when in development then alter the following file</p>
12
+
13
+ <b>config/environments/development.rb</b>
14
+ <pre>
15
+
16
+ # config.consider_all_requests_local = true
17
+ config.consider_all_requests_local = false
18
+
19
+ </pre>
20
+
21
+ <p>If you want to see the exception message in Honeybadger then make sure then remove the comment<p>
22
+
23
+ <b>config/honeybadger.yml</b>
24
+
25
+ <pre>
26
+ # report_data: true
27
+ report_data: true
28
+ </pre>
29
+
30
+ <p>If you want to send the exception message to Honeybadger then make sure your remove development from the list<p>
31
+
32
+ <pre>
33
+ # development_environments:
34
+ - test
35
+ - development
36
+ - cucumber
37
+ </pre>
38
+
39
+ <p>Test frrom the command line using</p>
40
+
41
+ <pre>
42
+ bundle exec honeybadger test
43
+ </pre>
44
+
45
+ <p>More information can be found at
46
+ <a href="http://honeybadger.io/">http://honeybadger.io/</a> and
47
+ <a hreg="https://honeybadger.wistia.com/medias/l3cmyucx8f">https://honeybadger.wistia.com/medias/l3cmyucx8f</a>
48
+
49
+ </p>
@@ -0,0 +1,69 @@
1
+ <!DOCTYPE html>
2
+ <html>
3
+ <head>
4
+ <title>The page you were looking for doesn't exist (404)</title>
5
+ <meta name="viewport" content="width=device-width,initial-scale=1">
6
+ <style>
7
+ .rails-default-error-page {
8
+ background-color: #EFEFEF;
9
+ color: #2E2F30;
10
+ text-align: center;
11
+ font-family: arial, sans-serif;
12
+ margin: 0;
13
+ }
14
+
15
+ .rails-default-error-page div.dialog {
16
+ width: 95%;
17
+ max-width: 33em;
18
+ margin: 4em auto 0;
19
+ }
20
+
21
+ .rails-default-error-page div.dialog > div {
22
+ border: 1px solid #CCC;
23
+ border-right-color: #999;
24
+ border-left-color: #999;
25
+ border-bottom-color: #BBB;
26
+ border-top: #B00100 solid 4px;
27
+ border-top-left-radius: 9px;
28
+ border-top-right-radius: 9px;
29
+ background-color: white;
30
+ padding: 7px 12% 0;
31
+ box-shadow: 0 3px 8px rgba(50, 50, 50, 0.17);
32
+ }
33
+
34
+ .rails-default-error-page h1 {
35
+ font-size: 100%;
36
+ color: #730E15;
37
+ line-height: 1.5em;
38
+ }
39
+
40
+ .rails-default-error-page div.dialog > p {
41
+ margin: 0 0 1em;
42
+ padding: 1em;
43
+ background-color: #F7F7F7;
44
+ border: 1px solid #CCC;
45
+ border-right-color: #999;
46
+ border-left-color: #999;
47
+ border-bottom-color: #999;
48
+ border-bottom-left-radius: 4px;
49
+ border-bottom-right-radius: 4px;
50
+ border-top-color: #DADADA;
51
+ color: #666;
52
+ box-shadow: 0 3px 8px rgba(50, 50, 50, 0.17);
53
+ }
54
+ </style>
55
+ </head>
56
+
57
+ <body class="rails-default-error-page">
58
+ <!-- This file lives in public/404.html -->
59
+ <div class="dialog">
60
+ <div>
61
+ <h1>The page you were looking for doesn't exist.</h1>
62
+ <p>You may have mistyped the address or the page may have moved.</p>
63
+ </div>
64
+ <p>If you are the application owner check the logs for more information.</p>
65
+ </div>
66
+ <!-- HONEYBADGER FEEDBACK -->
67
+ <!-- HONEYBADGER ERROR -->
68
+ </body>
69
+ </html>
@@ -0,0 +1,68 @@
1
+ <!DOCTYPE html>
2
+ <html>
3
+ <head>
4
+ <title>We're sorry, but something went wrong (500)</title>
5
+ <meta name="viewport" content="width=device-width,initial-scale=1">
6
+ <style>
7
+ .rails-default-error-page {
8
+ background-color: #EFEFEF;
9
+ color: #2E2F30;
10
+ text-align: center;
11
+ font-family: arial, sans-serif;
12
+ margin: 0;
13
+ }
14
+
15
+ .rails-default-error-page div.dialog {
16
+ width: 95%;
17
+ max-width: 33em;
18
+ margin: 4em auto 0;
19
+ }
20
+
21
+ .rails-default-error-page div.dialog > div {
22
+ border: 1px solid #CCC;
23
+ border-right-color: #999;
24
+ border-left-color: #999;
25
+ border-bottom-color: #BBB;
26
+ border-top: #B00100 solid 4px;
27
+ border-top-left-radius: 9px;
28
+ border-top-right-radius: 9px;
29
+ background-color: white;
30
+ padding: 7px 12% 0;
31
+ box-shadow: 0 3px 8px rgba(50, 50, 50, 0.17);
32
+ }
33
+
34
+ .rails-default-error-page h1 {
35
+ font-size: 100%;
36
+ color: #730E15;
37
+ line-height: 1.5em;
38
+ }
39
+
40
+ .rails-default-error-page div.dialog > p {
41
+ margin: 0 0 1em;
42
+ padding: 1em;
43
+ background-color: #F7F7F7;
44
+ border: 1px solid #CCC;
45
+ border-right-color: #999;
46
+ border-left-color: #999;
47
+ border-bottom-color: #999;
48
+ border-bottom-left-radius: 4px;
49
+ border-bottom-right-radius: 4px;
50
+ border-top-color: #DADADA;
51
+ color: #666;
52
+ box-shadow: 0 3px 8px rgba(50, 50, 50, 0.17);
53
+ }
54
+ </style>
55
+ </head>
56
+
57
+ <body class="rails-default-error-page">
58
+ <!-- This file lives in public/500.html -->
59
+ <!-- HONEYBADGER FEEDBACK -->
60
+ <!-- HONEYBADGER ERROR -->
61
+ <div class="dialog">
62
+ <div>
63
+ <h1>We're sorry, but something went wrong.</h1>
64
+ </div>
65
+ <p>If you are the application owner check the logs for more information.</p>
66
+ </div>
67
+ </body>
68
+ </html>
@@ -21,6 +21,7 @@ module RailsAppGenerator
21
21
  def apply; end
22
22
 
23
23
  # list any methods that you want access to, but not to be exposed as a thor command
24
+ # rubocop:disable Metrics/BlockLength
24
25
  no_commands do
25
26
  def source_paths
26
27
  [
@@ -43,7 +44,42 @@ module RailsAppGenerator
43
44
  klass = addon_name.nil? ? self.class : self.class.get(addon_name)
44
45
  Dependencies.new(klass, context).satisfied?
45
46
  end
47
+
48
+ def read_template(template_file)
49
+ path = find_in_source_paths(template_file)
50
+
51
+ File.read(path)
52
+ end
53
+
54
+ # Moves a file at given location, to another location. Both files are relative to the destination_root
55
+ #
56
+ # ==== Parameters
57
+ # path<String>:: source_path of the file to be moved (relative to destination_root)
58
+ # path<String>:: target_path of the file moving to (relative to destination_root)
59
+ # config<Hash>:: give :verbose => false to not log the status.
60
+ #
61
+ # ==== Example
62
+ #
63
+ # move_file 'README', 'readme.md'
64
+ # move_file 'config/xmen.sample.yml', 'config/xmen.yml
65
+ #
66
+ # rubocop:disable Metrics/AbcSize
67
+ def move_file(source_path, target_path, config = {})
68
+ source = File.expand_path(source_path, destination_root)
69
+ target = File.expand_path(target_path, destination_root)
70
+ config.merge!({ verbose: true })
71
+
72
+ say_status :move_file_source, relative_to_original_destination_root(source), config.fetch(:verbose, true)
73
+ say_status :move_file_source, relative_to_original_destination_root(target), config.fetch(:verbose, true)
74
+
75
+ return unless !options[:pretend] && File.exist?(source)
76
+
77
+ require 'fileutils'
78
+ ::FileUtils.mv(source, target)
79
+ end
80
+ # rubocop:enable Metrics/AbcSize
46
81
  end
82
+ # rubocop:enable Metrics/BlockLength
47
83
 
48
84
  class << self
49
85
  def apply(context = Context.new({}))
@@ -0,0 +1,19 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RailsAppGenerator
4
+ # Custom add-ons for RailsAppGenerator
5
+ module AddOns
6
+ # Add Honeybadger to rails application
7
+ class Honeybadger < AddOn
8
+ required_gem gem.version('honeybadger', '4.12.1', 'Make managing application errors a more pleasant experience.')
9
+
10
+ def apply
11
+ run('bundle exec honeybadger install 1111')
12
+ say 'Update the honeybadger.yml file with your API key.'
13
+
14
+ copy_file('honeybadger.sample.yml', 'config/honeybadger.sample.yml')
15
+ append_to_file('config/locales/en.yml', read_template('en.yml'))
16
+ end
17
+ end
18
+ end
19
+ end
@@ -149,6 +149,7 @@ module RailsAppGenerator
149
149
  # gem "net-sftp", "3.0.0"
150
150
  # gem "prawn", "2.4.0"
151
151
  # gem "prawn-table", "0.2.2"
152
+ # gem "appraisal"
152
153
 
153
154
  class_option :add_irbrc , type: :boolean, default: false
154
155
  class_option :add_foreman , type: :boolean, default: false
@@ -173,6 +174,7 @@ module RailsAppGenerator
173
174
 
174
175
  # NEW GEM ADDONS
175
176
  class_option :add_rails_html_sanitizer , type: :boolean, default: false
177
+ class_option :add_honeybadger , type: :boolean, default: false
176
178
 
177
179
  class << self
178
180
  # points to the original rails templates
@@ -300,6 +302,7 @@ module RailsAppGenerator
300
302
  # # add(:rspec) if options[:testing_framework] == 'rspec'
301
303
  # end
302
304
 
305
+ # rubocop:disable Metrics/AbcSize
303
306
  def finish_template
304
307
  puts 'finish template'
305
308
 
@@ -315,33 +318,16 @@ module RailsAppGenerator
315
318
  add(:views, :errors, :scaffold) if options[:add_views]
316
319
  add_if(:factory_bot)
317
320
  add_if(:shoulda)
321
+ add_if(:rails_app_generator)
322
+ add_if(:honeybadger)
318
323
 
319
324
  # invoke :rails_customization
320
325
  super
321
326
  end
327
+ # rubocop:enable Metrics/AbcSize
322
328
 
323
329
  no_commands do
324
- # Template command examples
325
- # gac 'base rails 7 image created'
326
- # force_copy
327
- # add_controller('home', 'index')
328
- # add_scaffold('people', 'first_name', 'last_name', 'age:integer', 'address:text')
329
- # route("root 'home#index'")
330
- # css_install('tailwind')
331
- # rails_command('db:migrate')
332
- # db_migrate
333
- # bundle_add('hotwire-rails')
334
- # rails_command('hotwire:install')
335
- # run('bin/importmap pin sortablejs')
336
- # run('npm install daisyui')
337
- # create_file 'app/assets/stylesheets/custom-bootstrap-import.scss' , read_template('custom-bootstrap-import.scss')
338
- # append_to_file 'app/assets/config/manifest.js' , read_template('manifest.js')
339
- # insert_into_file 'app/views/layouts/application.html.erb', read_template('application.html.erb')
340
- # insert_into_file 'app/views/layouts/application.html.erb', read_template('application.html.erb'),
341
- # before: %( <%= javascript_include_tag "application", "data-turbo-track": "reload", defer: true %>)
342
-
343
- # gsub_file 'app/views/layouts/application.html.erb', %(container mx-auto mt-28 px-5 flex), 'container mx-auto px-5'
344
- # template 'home.css', 'app/assets/stylesheets/home.css'
330
+ # https://codingpackets.com/blog/rails-generators-cheat-sheet/
345
331
 
346
332
  # OLD style will be removed soon
347
333
  def local_template_base(xxx)
@@ -396,6 +382,10 @@ module RailsAppGenerator
396
382
  run("bundle add #{name}")
397
383
  end
398
384
 
385
+ def bundle_exec(name, *args)
386
+ run("bundle exec #{name} #{args.join(' ')}")
387
+ end
388
+
399
389
  # If you need to manually install tailwind (instead of using the --template option)
400
390
  # you can use css_install('tailwind')
401
391
  def css_install(name)
@@ -435,6 +425,34 @@ module RailsAppGenerator
435
425
  template_files.map { |template_file| read_template(template_file) }.join(join)
436
426
  end
437
427
 
428
+ # Moves a file at given location, to another location. Both files are relative to the destination_root
429
+ #
430
+ # ==== Parameters
431
+ # path<String>:: source_path of the file to be moved (relative to destination_root)
432
+ # path<String>:: target_path of the file moving to (relative to destination_root)
433
+ # config<Hash>:: give :verbose => false to not log the status.
434
+ #
435
+ # ==== Example
436
+ #
437
+ # move_file 'README', 'readme.md'
438
+ # move_file 'config/xmen.sample.yml', 'config/xmen.yml
439
+ #
440
+ # rubocop:disable Metrics/AbcSize
441
+ def move_file(source_path, target_path, config = {})
442
+ source = File.expand_path(source_path, destination_root)
443
+ target = File.expand_path(target_path, destination_root)
444
+ config.merge!({ verbose: true })
445
+
446
+ say_status :move_file_source, relative_to_original_destination_root(source), config.fetch(:verbose, true)
447
+ say_status :move_file_source, relative_to_original_destination_root(target), config.fetch(:verbose, true)
448
+
449
+ return unless !options[:pretend] && File.exist?(source)
450
+
451
+ require 'fileutils'
452
+ ::FileUtils.mv(source, target)
453
+ end
454
+ # rubocop:enable Metrics/AbcSize
455
+
438
456
  # Local template path is handy when you want template files used when working with the --template flag
439
457
  attr_accessor :local_template_path
440
458
 
@@ -466,17 +484,16 @@ module RailsAppGenerator
466
484
  end
467
485
 
468
486
  def add_if(addon)
469
- option_name = "add_#{addon}".to_sym
470
- add(addon) if options[option_name]
487
+ add(addon) if active?(addon)
471
488
  end
472
489
 
473
- def skip_flag?(option_name)
474
- value = options["skip_#{option_name}".to_sym]
490
+ # def skip_flag?(option_name)
491
+ # value = options["skip_#{option_name}".to_sym]
475
492
 
476
- return false if value.nil?
493
+ # return true if value.nil?
477
494
 
478
- value == true
479
- end
495
+ # value == true
496
+ # end
480
497
 
481
498
  def add_flag?(option_name)
482
499
  value = options["add_#{option_name}".to_sym]
@@ -487,7 +504,7 @@ module RailsAppGenerator
487
504
  end
488
505
 
489
506
  def active?(option_name)
490
- add_flag?(option_name) || !skip_flag?(option_name)
507
+ add_flag?(option_name) # || !skip_flag?(option_name)
491
508
  end
492
509
 
493
510
  def uses?(addon)
@@ -505,10 +522,18 @@ module RailsAppGenerator
505
522
  end
506
523
  end
507
524
 
508
- def addon_gemfile_entries
525
+ def addon_classes
509
526
  AddOns.constants
510
- .select { |klass| AddOns.const_get(klass).is_a?(Class) }
511
- .flat_map { |klass| AddOns.const_get(klass).gem_entries }
527
+ .map { |addon_klass_name| AddOns.const_get(addon_klass_name) }
528
+ .select { |klass| klass.is_a?(Class) && klass.respond_to?(:addon_name) }
529
+ end
530
+
531
+ def active_addon_classes
532
+ addon_classes.select { |klass| active?(klass.addon_name) }
533
+ end
534
+
535
+ def addon_gemfile_entries
536
+ active_addon_classes.flat_map(&:gem_entries)
512
537
  end
513
538
  end
514
539
 
@@ -60,6 +60,7 @@ module RailsAppGenerator
60
60
 
61
61
  # NEW GEM ADDONS
62
62
  register_option :add_rails_html_sanitizer , type: :boolean, default: false
63
+ register_option :add_honeybadger , type: :boolean, default: false
63
64
 
64
65
  # if options[:minimal]
65
66
  # self.options = options.merge(
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module RailsAppGenerator
4
- VERSION = '0.1.12'
4
+ VERSION = '0.1.13'
5
5
  end
data/package-lock.json CHANGED
@@ -1,12 +1,12 @@
1
1
  {
2
2
  "name": "rails_app_generator",
3
- "version": "0.1.12",
3
+ "version": "0.1.13",
4
4
  "lockfileVersion": 2,
5
5
  "requires": true,
6
6
  "packages": {
7
7
  "": {
8
8
  "name": "rails_app_generator",
9
- "version": "0.1.12",
9
+ "version": "0.1.13",
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.1.12",
3
+ "version": "0.1.13",
4
4
  "description": "Create new Rails Application with custom opinions",
5
5
  "scripts": {
6
6
  "release": "semantic-release"
@@ -1,12 +1,12 @@
1
1
  {
2
2
  "args": {
3
- "app_path": "rails_html_sanitizer",
3
+ "app_path": "honeybadger",
4
4
  "destination_root": "/Users/davidcruwys/dev/kgems/rails_app_generator/a/addons"
5
5
  },
6
6
  "opts": {
7
7
  "skip_git": true,
8
8
  "skip_test": true,
9
- "template": "/Users/davidcruwys/dev/kgems/rails_app_generator/after_templates/addons/rails_html_sanitizer/_.rb",
10
- "add_rails_html_sanitizer": true
9
+ "template": "/Users/davidcruwys/dev/kgems/rails_app_generator/after_templates/addons/honeybadger/_.rb",
10
+ "add_honeybadger": true
11
11
  }
12
12
  }
data/tasks/addon.thor CHANGED
@@ -12,10 +12,19 @@ class AddOn < Thor
12
12
 
13
13
  source_root(File.expand_path('../templates/thor_task', File.dirname(__FILE__)))
14
14
 
15
+ Data = Struct.new(
16
+ :name,
17
+ :name_dash,
18
+ :name_snake,
19
+ :name_human,
20
+ :name_camel,
21
+ :addon_config_code,
22
+ keyword_init: true
23
+ )
15
24
  GemInfo = Struct.new(:name, :version, :description, keyword_init: true)
16
25
 
17
26
  attr_accessor :name
18
- attr_accessor :addon_config_code
27
+ attr_accessor :data
19
28
 
20
29
  # method_option :from, :required => true
21
30
  desc 'new', 'Create a new Addon for Rails App Generator'
@@ -24,14 +33,12 @@ class AddOn < Thor
24
33
  method_option :depends_on, type: :string, desc: 'This AddOn depends on another AddOn/Gem. active_record is a common dependency'
25
34
  def new(name)
26
35
  self.name = name
27
-
28
- code = [build_depends_on_code, build_required_gem_code].compact
29
- code << '' if code.any?
30
- self.addon_config_code = code.join("\n")
36
+ self.data = build_data(name)
31
37
 
32
38
  template('addon/addon', "lib/rails_app_generator/addons/#{name}.rb", force: options[:force])
33
39
  end
34
40
 
41
+ # rubocop:disable Metrics/BlockLength
35
42
  no_commands do
36
43
  def build_depends_on_code
37
44
  return nil unless options[:depends_on]
@@ -53,5 +60,36 @@ class AddOn < Thor
53
60
 
54
61
  ::GemInfo.get(gem_name)
55
62
  end
63
+
64
+ def build_data(name)
65
+ code = [build_depends_on_code, build_required_gem_code].compact
66
+ code << '' if code.any?
67
+
68
+ Data.new(
69
+ name: name,
70
+ name_dash: dash(name),
71
+ name_snake: snake(name),
72
+ name_human: human(name),
73
+ name_camel: camel(name),
74
+ addon_config_code: code.join("\n")
75
+ )
76
+ end
77
+
78
+ def human(value)
79
+ Cmdlet::Case::Human.new.call(value)
80
+ end
81
+
82
+ def dash(value)
83
+ Cmdlet::Case::Dash.new.call(value)
84
+ end
85
+
86
+ def snake(value)
87
+ Cmdlet::Case::Snake.new.call(value)
88
+ end
89
+
90
+ def camel(value)
91
+ Cmdlet::Case::Camel.new.call(value)
92
+ end
56
93
  end
94
+ # rubocop:enable Metrics/BlockLength
57
95
  end
data/tasks/profile.thor CHANGED
@@ -17,6 +17,7 @@ class Profile < Thor
17
17
  :name_dash,
18
18
  :name_snake,
19
19
  :name_human,
20
+ :name_camel,
20
21
  :description,
21
22
  :destination_root,
22
23
  :template_file,
@@ -44,18 +45,6 @@ class Profile < Thor
44
45
 
45
46
  # rubocop:disable Metrics/BlockLength
46
47
  no_commands do
47
- def human(value)
48
- Cmdlet::Case::Human.new.call(value)
49
- end
50
-
51
- def dash(value)
52
- Cmdlet::Case::Dash.new.call(value)
53
- end
54
-
55
- def snake(value)
56
- Cmdlet::Case::Snake.new.call(value)
57
- end
58
-
59
48
  def profile_path(file)
60
49
  path = 'profiles'
61
50
  path = File.join(path, options[:variant]) if options[:variant]
@@ -72,18 +61,17 @@ class Profile < Thor
72
61
  def build_data(name)
73
62
  gi = gem_info(name)
74
63
 
75
- name_dash = dash(name)
76
- name_snake = snake(name)
77
64
  description = gi ? gi.description : 'Description goes here'
78
65
 
79
66
  Data.new(
80
67
  name: name,
81
- name_dash: name_dash,
82
- name_snake: name_snake,
83
- name_human: human(name_dash),
68
+ name_dash: dash(name),
69
+ name_snake: snake(name),
70
+ name_human: human(name),
71
+ name_camel: camel(name),
84
72
  description: description,
85
73
  destination_root: build_destination_root,
86
- template_file: build_template_file(name_snake)
74
+ template_file: build_template_file(snake(name))
87
75
  )
88
76
  end
89
77
 
@@ -109,6 +97,22 @@ class Profile < Thor
109
97
 
110
98
  GemInfo.get(gem_name)
111
99
  end
100
+
101
+ def human(value)
102
+ Cmdlet::Case::Human.new.call(value)
103
+ end
104
+
105
+ def dash(value)
106
+ Cmdlet::Case::Dash.new.call(value)
107
+ end
108
+
109
+ def snake(value)
110
+ Cmdlet::Case::Snake.new.call(value)
111
+ end
112
+
113
+ def camel(value)
114
+ Cmdlet::Case::Camel.new.call(value)
115
+ end
112
116
  end
113
117
  # rubocop:enable Metrics/BlockLength
114
118
  end
@@ -0,0 +1,10 @@
1
+ honeybadger:
2
+ feedback:
3
+ heading: "Care to help us fix this?"
4
+ explanation: "Any information you can provide will help us fix the problem."
5
+ submit: "Send"
6
+ thanks: "Thanks for the feedback!"
7
+ labels:
8
+ name: "Your name"
9
+ email: "Your email address"
10
+ comment: "Comment (required)"
@@ -0,0 +1,37 @@
1
+ ---
2
+ # For more options, see https://docs.honeybadger.io/lib/ruby/gem-reference/configuration
3
+
4
+ api_key: 'hbp_f56DVeEaIvMMjqbMJAT7haJpQ7qfLP1ezvc0'
5
+
6
+ # The environment your app is running in.
7
+ env: "<%= Rails.env %>"
8
+
9
+ # The absolute path to your project folder.
10
+ root: "<%= Rails.root.to_s %>"
11
+
12
+ # Honeybadger won't report errors in these environments.
13
+ development_environments:
14
+ - test
15
+ - development
16
+ - cucumber
17
+
18
+ # By default, Honeybadger won't report errors in the development_environments.
19
+ # You can override this by explicitly setting report_data to true or false.
20
+ # report_data: true
21
+
22
+ # The current Git revision of your project. Defaults to the last commit hash.
23
+ # revision: null
24
+
25
+ # Enable verbose debug logging (useful for troubleshooting).
26
+ debug: false
27
+
28
+ # Displaying the Error ID
29
+ # Add to your html: <!-- HONEYBADGER ERROR -->
30
+ user_informer:
31
+ enabled: true
32
+ info: "Error ID: {{error_id}}"
33
+
34
+ # Displaying a Feedback Form
35
+ # Add to your html: <!-- HONEYBADGER FEEDBACK -->
36
+ feedback:
37
+ enabled: true
@@ -1,16 +1,23 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ # NEW GEM ADDONS
4
+ # lib/rails_app_generator/app_generator.rb
5
+ # class_option :add_<%= data.name_snake %>, type: :boolean, default: false
6
+ # add_if(:<%= data.name_snake %>)
7
+ # lib/rails_app_generator/options/rails_options.rb
8
+ # register_option :add_<%= data.name_snake %>, type: :boolean, default: false
9
+
3
10
  module RailsAppGenerator
4
11
  # Custom add-ons for RailsAppGenerator
5
12
  module AddOns
6
- # Add <%= Thor::Util.camel_case(name) %> to rails application
7
- class <%= Thor::Util.camel_case(name) %> < AddOn
8
- <%= addon_config_code %>
13
+ # Add <%= data.name_camel %> to rails application
14
+ class <%= data.name_camel %> < AddOn
15
+ <%= data.addon_config_code %>
9
16
  def apply
10
- # say 'Setting up <%= Thor::Util.camel_case(name)%>'
11
- # template('<%= Thor::Util.snake_case(name)%>_template.rb', 'target/<%= Thor::Util.snake_case(name)%>.rb', force: true)
17
+ # say 'Setting up <%= data.name_camel %>'
18
+ # template('<%= data.name_snake%>_template.rb', 'target/<%= data.name_snake%>.rb', force: true)
12
19
  # template('app/javascript/stylesheets/components.scss')
13
- # create_file('target/<%= Thor::Util.snake_case(name)%>.rb', 'put your content here')
20
+ # create_file('target/<%= data.name_snake%>.rb', 'put your content here')
14
21
  # directory 'app/template', 'app/target', force: true
15
22
  # empty_directory 'app/target'
16
23
  # inject_into_file('app/application.js', "some content")
@@ -1,7 +1,10 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ # require 'pry'
4
+
3
5
  # <%= data.description %>
4
- require 'pry'
6
+ #
7
+ # exe/rag addons/<%= data.name_snake %>
5
8
 
6
9
  self.local_template_path = File.dirname(__FILE__)
7
10
 
@@ -13,3 +16,29 @@ route("root 'home#index'")
13
16
  force_copy
14
17
 
15
18
  copy_file 'home/index.html.erb', 'app/views/home/index.html.erb'
19
+
20
+ after_bundle do
21
+ setup_db
22
+ end
23
+
24
+ def setup_db
25
+ # add_scaffold('post', 'title', 'body:text')
26
+ # add_scaffold('people', 'first_name', 'last_name', 'age:integer', 'address:text')
27
+ # add_scaffold('product', 'name', 'price:integer')
28
+
29
+ # db_migrate
30
+ end
31
+
32
+ # Other template command examples
33
+ # css_install('tailwind')
34
+ # rails_command('db:migrate')
35
+ # bundle_add('hotwire-rails')
36
+ # rails_command('hotwire:install')
37
+ # run('bin/importmap pin sortablejs')
38
+ # run('npm install daisyui')
39
+ # create_file 'app/assets/stylesheets/custom-bootstrap-import.scss' , read_template('custom-bootstrap-import.scss')
40
+ # append_to_file 'app/assets/config/manifest.js' , read_template('manifest.js')
41
+ # insert_into_file 'app/views/layouts/application.html.erb', read_template('application.html.erb'),
42
+ # before: %( <%%= javascript_include_tag "application", "data-turbo-track": "reload", defer: true %>)
43
+ # gsub_file 'app/views/layouts/application.html.erb', %(container mx-auto mt-28 px-5 flex), 'container mx-auto px-5'
44
+ # template 'home.css', 'app/assets/stylesheets/home.css'
@@ -1,3 +1,7 @@
1
1
  <h1><%= data.name_human %></h1>
2
2
 
3
3
  <h2><%= data.description %></h2>
4
+
5
+ <%%= link_to 'Products', products_path %> |
6
+ <%%= link_to 'Posts', posts_path %> |
7
+ <%%= link_to 'People', people_path %>
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.1.12
4
+ version: 0.1.13
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-02 00:00:00.000000000 Z
11
+ date: 2022-08-03 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bootsnap
@@ -160,6 +160,13 @@ files:
160
160
  - README.md
161
161
  - Rakefile
162
162
  - after_templates/README.md
163
+ - after_templates/addons/honeybadger/_.rb
164
+ - after_templates/addons/honeybadger/app/controllers/application_controller.rb
165
+ - after_templates/addons/honeybadger/app/controllers/errors_controller.rb
166
+ - after_templates/addons/honeybadger/app/controllers/products_controller.rb
167
+ - after_templates/addons/honeybadger/app/views/home/index.html.erb
168
+ - after_templates/addons/honeybadger/public/404.html
169
+ - after_templates/addons/honeybadger/public/500.html
163
170
  - after_templates/addons/rails_html_sanitizer/_.rb
164
171
  - after_templates/addons/rails_html_sanitizer/home/index.html.erb
165
172
  - after_templates/addons/rails_html_sanitizer_xxx/home/index.html.erb
@@ -304,6 +311,7 @@ files:
304
311
  - lib/rails_app_generator/addons/foreman.rb
305
312
  - lib/rails_app_generator/addons/generators.rb
306
313
  - lib/rails_app_generator/addons/high_voltage.rb
314
+ - lib/rails_app_generator/addons/honeybadger.rb
307
315
  - lib/rails_app_generator/addons/inline_svg.rb
308
316
  - lib/rails_app_generator/addons/irbrc.rb
309
317
  - lib/rails_app_generator/addons/lograge.rb
@@ -353,8 +361,8 @@ files:
353
361
  - lib/rails_app_generator/version.rb
354
362
  - package-lock.json
355
363
  - package.json
364
+ - profiles/addons/honeybadger.json
356
365
  - profiles/addons/rails-html-sanitizer.json
357
- - profiles/addons/rails_html_sanitizer.json
358
366
  - profiles/rag-add-some-pages.json
359
367
  - profiles/rag-bootstrap.json
360
368
  - profiles/rag-devise.json
@@ -401,6 +409,8 @@ files:
401
409
  - templates/addons/generators/lib/generators/rails/navigation/navigation_generator.rb
402
410
  - templates/addons/generators/lib/generators/rails/scaffold_controller_generator.rb
403
411
  - templates/addons/high_voltage/config/initializers/high_voltage.rb
412
+ - templates/addons/honeybadger/en.yml
413
+ - templates/addons/honeybadger/honeybadger.sample.yml
404
414
  - templates/addons/irbrc/.irbrc.erb
405
415
  - templates/addons/lograge/config/initializers/lograge.rb
406
416
  - templates/addons/pundit/app/controllers/authorized_controller.rb.erb