rails_app_generator 0.2.41 → 0.3.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (48) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +23 -0
  3. data/after_templates/addons/scenic/_.rb +64 -0
  4. data/after_templates/addons/scenic/app/controllers/home_controller.rb +24 -0
  5. data/after_templates/addons/scenic/app/services/seed_service.rb +104 -0
  6. data/after_templates/addons/scenic/app/views/home/index.html.erb +3 -0
  7. data/after_templates/addons/scenic/app/views/home/individual_visitors_by_monument.html.erb +24 -0
  8. data/after_templates/addons/scenic/app/views/home/reseed.html.erb +3 -0
  9. data/after_templates/addons/scenic/app/views/home/visitors_by_monument.html.erb +22 -0
  10. data/after_templates/addons/scenic/app/views/layouts/_footer.html.erb +0 -0
  11. data/after_templates/addons/scenic/app/views/layouts/_navbar.html.erb +10 -0
  12. data/after_templates/addons/scenic/app/views/layouts/application.html.erb +29 -0
  13. data/after_templates/addons/scenic/db/seeds.rb +1 -0
  14. data/after_templates/addons/scenic/db/views/individual_visitors_by_monuments_v01.sql +9 -0
  15. data/after_templates/addons/scenic/db/views/visitors_by_monuments_v01.sql +8 -0
  16. data/after_templates/application/klueless/_.rb +6 -1
  17. data/after_templates/application/klueless/app/avo/cards/amount_raised.rb +14 -0
  18. data/after_templates/application/klueless/app/avo/cards/example_custom_partial.rb +7 -0
  19. data/after_templates/application/klueless/app/avo/cards/example_metric.rb +38 -0
  20. data/after_templates/application/klueless/app/avo/cards/percent_done.rb +10 -0
  21. data/after_templates/application/klueless/app/avo/cards/rubocop_card.rb +10 -0
  22. data/after_templates/application/klueless/app/avo/resources/rubocop_resource.rb +8 -0
  23. data/after_templates/application/klueless/app/controllers/home_controller.rb +9 -1
  24. data/after_templates/application/klueless/app/services/seed_service.rb +49 -3
  25. data/after_templates/application/klueless/app/views/layouts/_navbar.html.erb +9 -3
  26. data/after_templates/application/klueless/db/seeds.rb +1 -18
  27. data/after_templates/application/klueless/db/views/rubocop_logs_v01.sql +23 -0
  28. data/docs/last_run/app_generator_class.json +8 -0
  29. data/docs/last_run/app_generator_data.json +1 -0
  30. data/docs/last_run/rails_options_class.json +8 -0
  31. data/docs/last_run/rails_options_data.json +1 -0
  32. data/lib/rails_app_generator/addons/scenic.rb +2 -25
  33. data/lib/rails_app_generator/app_generator.rb +1 -0
  34. data/lib/rails_app_generator/cli/profile.rb +1 -3
  35. data/lib/rails_app_generator/gem_query.rb +3 -1
  36. data/lib/rails_app_generator/rag_initializer.rb +2 -1
  37. data/lib/rails_app_generator/starter.rb +46 -8
  38. data/lib/rails_app_generator/version.rb +1 -1
  39. data/package-lock.json +2 -2
  40. data/package.json +1 -1
  41. data/profiles/addons/scenic.json +14 -0
  42. data/profiles/application/klueless.json +4 -2
  43. data/tasks/profile.thor +1 -0
  44. data/templates/thor_task/profile/after_template.rb +19 -30
  45. data/templates/thor_task/profile/app/controllers/home_controller.rb +4 -0
  46. data/templates/thor_task/profile/app/services/seed_service.rb +27 -0
  47. data/templates/thor_task/profile/db/seeds.rb +1 -0
  48. metadata +23 -2
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 6f266923a169ab15ff8606551f4e023723d947f785513dc89083e0762fd2d568
4
- data.tar.gz: 55093884128eff848ef3a6b21e415c3739530110590d58308bb7037674022744
3
+ metadata.gz: 93b684c48a45efa3c3ed644b2908e1299bd0a26e58ae14e3483dd007c2128360
4
+ data.tar.gz: 7b263e75514434f35912bfb867674506839c0a4883bdb94d1427dbe899a7c396
5
5
  SHA512:
6
- metadata.gz: aaf2fc71ee43c3d12c73b2ab6c91e1c7b5aacd31740a17284b845eb60aff94058634b7d346910242777d1e7ae17d4d75cde624002e6b67b2c5b73e530a6668d2
7
- data.tar.gz: c2c8a7dbb9d0cf975b4e02d19309147a3a90ae5a58da010b007eba9f2713d8289b6e3dbe1ee5caa04b33ef95a9d6c9eae31f97ec4480cad7969d4fdb1796642f
6
+ metadata.gz: 2cc5173515c7d24338097773dcfd3a632e09cd71b9cfbbf2b991cad560d631417f1dde2c1a9cb35dc6accf9c7d1fe5e779a76da5b1bb40cce9f208036b4f6353
7
+ data.tar.gz: 2eadb9067e14ab8812186a03b49b5a04287b69efd6ecedbc5859ad6c5458cbfe4373fa9e74e7445316a77009570a1e1b8bc73eddb1f272245228a8cdd9b08d6c
data/CHANGELOG.md CHANGED
@@ -1,3 +1,26 @@
1
+ ## [0.2.43](https://github.com/klueless-io/rails_app_generator/compare/v0.2.42...v0.2.43) (2022-08-31)
2
+
3
+
4
+ ### Bug Fixes
5
+
6
+ * add scenic profile ([dc309e6](https://github.com/klueless-io/rails_app_generator/commit/dc309e6f399cec7085de3133aa32989bc7ff7ed4))
7
+ * add scenic profile ([44614f7](https://github.com/klueless-io/rails_app_generator/commit/44614f70d73fe41cee5fd9cb9af5d20f0aa4f915))
8
+
9
+ ## [0.2.42](https://github.com/klueless-io/rails_app_generator/compare/v0.2.41...v0.2.42) (2022-08-30)
10
+
11
+
12
+ ### Bug Fixes
13
+
14
+ * add scenic addon ([93a9561](https://github.com/klueless-io/rails_app_generator/commit/93a9561131658399b91075e15c6d9680f1b73ece))
15
+ * cops ([fe3e6b7](https://github.com/klueless-io/rails_app_generator/commit/fe3e6b7031a57b0f212fd91491ebc7f32928b9c1))
16
+
17
+ ## [0.2.41](https://github.com/klueless-io/rails_app_generator/compare/v0.2.40...v0.2.41) (2022-08-30)
18
+
19
+
20
+ ### Bug Fixes
21
+
22
+ * update klueless profile ([e426b82](https://github.com/klueless-io/rails_app_generator/commit/e426b820b15e8e49d2cc6c6ec2ccfd4ed8ea1158))
23
+
1
24
  ## [0.2.40](https://github.com/klueless-io/rails_app_generator/compare/v0.2.39...v0.2.40) (2022-08-23)
2
25
 
3
26
 
@@ -0,0 +1,64 @@
1
+ # frozen_string_literal: true
2
+
3
+ # Ads methods to ActiveRecord:Migration to create and manage database views in Rails
4
+ #
5
+ # exe/rag addons/scenic
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
+ force_copy
15
+
16
+ create_db
17
+ scaffolds
18
+ setup_customizations
19
+ migrate_db
20
+ end
21
+
22
+ def scaffolds
23
+ add_scaffold('country', 'code', 'name')
24
+ add_scaffold('monument', 'name', 'description', 'country:references')
25
+ add_scaffold('visitor', 'name', 'monument:references')
26
+
27
+ generate('scenic:model visitors_by_monument')
28
+ generate('scenic:model individual_visitors_by_monument --materialized')
29
+
30
+ directory "db/views"
31
+ end
32
+
33
+ def setup_customizations
34
+ route("root 'home#index'")
35
+
36
+ add_controller('home', 'index', 'visitors_by_monument', 'individual_visitors_by_monument', 'reseed', 'refresh_material_view')
37
+
38
+ directory "app/controllers"
39
+ directory "app/models"
40
+ directory "app/views"
41
+ template 'app/views/layouts/application.html.erb' , 'app/views/layouts/application.html.erb'
42
+ directory "app/services"
43
+ end
44
+
45
+ def create_db
46
+ gsub_file('config/database.yml', ' encoding: unicode', db_development_settings)
47
+ rails_command('db:environment:set RAILS_ENV=development')
48
+ db(drop: true, create: true)
49
+ end
50
+
51
+ def migrate_db
52
+ template 'db/seeds.rb' , 'db/seeds.rb'
53
+
54
+ db(migrate: true, seed: true)
55
+ end
56
+
57
+ def db_development_settings
58
+ <<-'RUBY'
59
+ encoding: unicode
60
+ host: <%= ENV['DATABASE_HOST'] %>
61
+ username: <%= ENV['DATABASE_USERNAME'] %>
62
+ password: <%= ENV['DATABASE_PASSWORD'] %>
63
+ RUBY
64
+ end
@@ -0,0 +1,24 @@
1
+ class HomeController < ApplicationController
2
+ def index
3
+ end
4
+
5
+ def visitors_by_monument
6
+ @visitors = VisitorsByMonument.all.order(:visits)
7
+ end
8
+
9
+ def individual_visitors_by_monument
10
+ @visitors = IndividualVisitorsByMonument.all.order(:visits)
11
+ end
12
+
13
+ def reseed
14
+ SeedService.seed(variant: :refresh)
15
+
16
+ redirect_back_or_to root_path
17
+ end
18
+
19
+ def refresh_material_view
20
+ IndividualVisitorsByMonument.refresh
21
+
22
+ redirect_back_or_to root_path
23
+ end
24
+ end
@@ -0,0 +1,104 @@
1
+ # frozen_string_literal: true
2
+
3
+ class SeedService
4
+ class << self
5
+ def seed(variant: :reset)
6
+ service = SeedService.new
7
+ service.call(variant: variant)
8
+ end
9
+ end
10
+
11
+ NAMES = %w[
12
+ Adyson Aimee Aisha Akira Alani Albert Aleah Aleena Alena Alexus Alfred Ali Alia
13
+ Amelie Amina Amirah Amiya Anabella Anabelle Andrew Angeline Angelique Ann Annabel Aliana
14
+ Armani Arthur Aryana Ashanti Ashleigh Ashly Aspen Averie Avery Ayana Barbara
15
+ Brynlee Cailyn Cal Camilla Campbell Carina Carissa Carlee Carley Carlie Carolyn Cassie
16
+ Charlie Charlize Chaya Cherish Cierra Clair Clare Clarence Cloe Corinne Cristal
17
+ Destiney Dominique Dorsey Early Edith Edward Eileen Elaine Elisa Ellen Elmer Elsa Elsie
18
+ Fay Felicity Finley Frances Frank Fred Frederick Frida Gemma George Gia Giada Giana Gillian
19
+ Hana Harris Harry Haven Henderson Henry Herbert Hezekiah Hillary Iliana India
20
+ James Jamya Janae Janet Janiah Jaslyn Jaycee Jaylah Jaylee Jaylen Jaylene Jaylyn
21
+ John Johnie Joseph Joslyn Joyce Judith Julianne June Kaia Kaila Kailee Kaiya Kaley
22
+ Karma Kasey Katrina Kaya Kaylen Kayley Kaylyn Keely Kelsie Kendal Kenna Keyla Kierra
23
+ Leanna Lewis Leyla Libby Lilianna Lillianna Lilyana Lina Litzy Lizeth Lonzo Lorelai
24
+ Maeve Magdalena Maia Makena Maleah Maliyah Mara Mareli Mariam Marianna Mariela Marisa
25
+ Miah Micah Milagros Mina Mira Mollie Monique Monserrat Mont Moriah Mylie Natalya
26
+ Paloma Pamela Patience Paula Peter Phoenix Precious Raelynn Raina Raven Rayna Rayne Regan
27
+ Rollin Roselyn Rosemary Roy Ryann Saige Salma Sam Samuel Sanaa Sanai Sarahi Sariah Savanah
28
+ Shyann Shyanne Shyla Siena Sonia Stacy Stephany Susan Taliyah Tamara Taniya Taniyah
29
+ Tianna Tom Valery Walter Will William Willie Wilmer Xiomara Yadira Yamilet Yaritza Yasmine Yazmin
30
+ Yoselin Yuliana Zaniyah Zara Zaria Zion
31
+ %
32
+ ].freeze
33
+
34
+ attr_reader :au, :us, :gb, :monuments
35
+
36
+ def call(variant: :reset)
37
+ reset if variant == :reset
38
+ refresh if variant == :refresh
39
+ create
40
+ end
41
+
42
+ private
43
+
44
+ def reset
45
+ Visitor.delete_all
46
+ Monument.delete_all
47
+ Country.delete_all
48
+ end
49
+
50
+ def refresh
51
+ Visitor.delete_all
52
+ end
53
+
54
+ def create
55
+ upsert_countries
56
+ upsert_monuments
57
+ create_visitors
58
+ end
59
+
60
+ def upsert_countries
61
+ @au = Country.create_with(name: 'Australia').find_or_create_by(code: 'AU')
62
+ @us = Country.create_with(name: 'United States').find_or_create_by(code: 'US')
63
+ @gb = Country.create_with(name: 'United Kingdom').find_or_create_by(code: 'GB')
64
+ end
65
+
66
+ def upsert_monuments
67
+ @monuments = [
68
+ Monument.create_with(country: au,
69
+ description: 'The Sydney Opera House is a multi-venue performing arts centre in Sydney, New South Wales, Australia. It is the largest performing arts centre in Australia and the second largest in the world.')
70
+ .find_or_create_by(name: 'Sydney Opera House'),
71
+ Monument.create_with(country: au,
72
+ description: 'The Sydney Harbour Bridge is a viaduct bridge in Sydney, New South Wales, Australia. It is the longest viaduct bridge in Australia and the second longest in the world.')
73
+ .find_or_create_by(name: 'Sydney Harbour Bridge'),
74
+ Monument.create_with(country: au,
75
+ description: 'The Big Banana is a large, round, fruit-bearing tree in the Australian bushland of the Great Barrier Reef. It is the largest tree in the world.')
76
+ .find_or_create_by(name: 'The Big Banana'),
77
+ Monument.create_with(country: us,
78
+ description: 'The Statue of Liberty is a colossal neoclassical sculpture on Liberty Island in New York Harbor, New York, in the United States. The statue was a gift from the people of France to the people of the United States in 1886.')
79
+ .find_or_create_by(name: 'Statue of Liberty'),
80
+ Monument.create_with(country: us,
81
+ description: 'The Golden Gate Bridge is a suspension bridge spanning the Golden Gate, the one-mile-wide strait connecting San Francisco Bay and the Pacific Ocean. The bridge was completed in 1937.')
82
+ .find_or_create_by(name: 'Golden Gate Bridge'),
83
+ Monument.create_with(country: us,
84
+ description: 'The Empire State Building is a 102-story skyscraper in Midtown Manhattan, New York City. It is the world\'s tallest building, a structure that is the 4th-tallest building in the world.')
85
+ .find_or_create_by(name: 'Empire State Building'),
86
+ Monument.create_with(country: gb,
87
+ description: 'The Tower of London is a historic London tower on the north bank of the River Thames in central London. It is the most-visited paid monument in the world.')
88
+ .find_or_create_by(name: 'Tower of London'),
89
+ Monument.create_with(country: gb, description: 'The Big Ben is a clock tower in the north of London. It is the world\'s tallest clock tower.')
90
+ .find_or_create_by(name: 'Big Ben'),
91
+ Monument.create_with(country: gb,
92
+ description: 'The London Eye is a giant Ferris wheel situated on the South Bank of the River Thames in London, England. It is the world\'s largest Ferris wheel.')
93
+ .find_or_create_by(name: 'London Eye')
94
+ ]
95
+ end
96
+
97
+ def create_visitors
98
+ NAMES.each do |name|
99
+ rand(1..10).times do # number monuments to visited (duplicates are fine)
100
+ Visitor.create(name: name, monument: monuments.sample)
101
+ end
102
+ end
103
+ end
104
+ end
@@ -0,0 +1,3 @@
1
+ <h1>Scenic</h1>
2
+
3
+ <p>Ads methods to ActiveRecord:Migration to create and manage database views in Rails</p>
@@ -0,0 +1,24 @@
1
+ <h1>Individual Visitors by Monument</h1>
2
+
3
+ <pre><code><%= File.read('db/views/individual_visitors_by_monuments_v01.sql') %></code></pre>
4
+
5
+ <table>
6
+ <thead>
7
+ <tr>
8
+ <th>Person</th>
9
+ <th>Monument</th>
10
+ <th>Country</th>
11
+ <th>Visits</th>
12
+ </tr>
13
+ </thead>
14
+ <tbody>
15
+ <% @visitors.each do |visitor| %>
16
+ <tr>
17
+ <td><%= visitor.person %></td>
18
+ <td><%= visitor.monument %></td>
19
+ <td><%= visitor.country %></td>
20
+ <td><%= visitor.visits %></td>
21
+ </tr>
22
+ <% end %>
23
+ </tbody>
24
+ </table>
@@ -0,0 +1,3 @@
1
+ <h1>Re-Seed</h1>
2
+
3
+ <p>Database has been re-seeded</p>
@@ -0,0 +1,22 @@
1
+ <h1>Visitors by Monument</h1>
2
+
3
+ <pre><code><%= File.read('db/views/visitors_by_monuments_v01.sql') %></code></pre>
4
+
5
+ <table>
6
+ <thead>
7
+ <tr>
8
+ <th>Monument</th>
9
+ <th>Country</th>
10
+ <th>Visits</th>
11
+ </tr>
12
+ </thead>
13
+ <tbody>
14
+ <% @visitors.each do |visitor| %>
15
+ <tr>
16
+ <td><%= visitor.monument %></td>
17
+ <td><%= visitor.country %></td>
18
+ <td><%= visitor.visits %></td>
19
+ </tr>
20
+ <% end %>
21
+ </tbody>
22
+ </table>
@@ -0,0 +1,10 @@
1
+ <%= link_to 'Home', root_path %>
2
+ | <%= link_to 'Countries', countries_path %>
3
+ | <%= link_to 'Monuments', monuments_path %>
4
+ | <%= link_to 'Visitors', visitors_path %>
5
+ <br>
6
+ <%= link_to 'Visits (View)', home_visitors_by_monument_path %>
7
+ | <%= link_to 'Visits (Materialized)', home_individual_visitors_by_monument_path %>
8
+ | <%= link_to 'Re-Seed', home_reseed_path, style: 'color: blue; font-weight: 600;' %>
9
+ | <%= link_to 'Refresh Material View', home_refresh_material_view_path, style: 'color: blue; font-weight: 600;' %>
10
+ <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,9 @@
1
+ select
2
+ visitors.name as person,
3
+ monuments.name as monument,
4
+ countries.name as country,
5
+ count(*) as visits
6
+ from visitors
7
+ join monuments on visitors.monument_id = monuments.id
8
+ join countries on monuments.country_id = countries.id
9
+ group by person, monument, country
@@ -0,0 +1,8 @@
1
+ select
2
+ monuments.name as monument,
3
+ countries.name as country,
4
+ count(*) as visits
5
+ from visitors
6
+ join monuments on visitors.monument_id = monuments.id
7
+ join countries on monuments.country_id = countries.id
8
+ group by monument, country
@@ -44,6 +44,10 @@ def scaffolds
44
44
  # add_scaffold('db_schema_foreign_key', 'left', 'right', 'name', 'on_update', 'on_delete', 'column', 'db_schema_table:references')
45
45
  # add_scaffold('db_schema_index', 'name', 'fields', 'using', 'order:jsonb', 'where', 'unique', 'db_schema_table:references')
46
46
  # add_scaffold('db_schema_view', 'name', 'materialized:boolean', 'sql_definition', 'db_schema_table:references')
47
+
48
+ generate('scenic:model rubocop_log --materialized')
49
+
50
+ directory "db/views"
47
51
  end
48
52
 
49
53
  def setup_customizations
@@ -51,13 +55,14 @@ def setup_customizations
51
55
 
52
56
  force_copy
53
57
 
54
- add_controller('home', 'index', 'quick_signin', 'reseed')
58
+ add_controller('home', 'index', 'quick_signin', 'reseed', 'refresh_material_view')
55
59
 
56
60
  directory "app/controllers"
57
61
  directory "app/models"
58
62
  directory "app/views"
59
63
  template 'app/views/layouts/application.html.erb', 'app/views/layouts/application.html.erb'
60
64
  directory "app/queries"
65
+ directory "app/services"
61
66
  end
62
67
 
63
68
  def setup_avo
@@ -0,0 +1,14 @@
1
+ class AmountRaised < Avo::Dashboards::MetricCard
2
+ self.id = "amount_raised"
3
+ self.label = "Amount raised"
4
+ # self.description = "Some description"
5
+ # self.cols = 1
6
+ # self.initial_range = 30
7
+ # self.ranges = [7, 30, 60, 365, "TODAY", "MTD", "QTD", "YTD", "ALL"]
8
+ self.prefix = "$"
9
+ # self.suffix = ""
10
+
11
+ query do
12
+ result 9001
13
+ end
14
+ end
@@ -0,0 +1,7 @@
1
+ class ExampleCustomPartial < Avo::Dashboards::PartialCard
2
+ self.id = "users_custom_card"
3
+ self.cols = 3
4
+ self.rows = 4
5
+ self.partial = "avo/cards/custom_card"
6
+ self.description = "This card has been loaded from a custom partial."
7
+ end
@@ -0,0 +1,38 @@
1
+ class ExampleMetric < Avo::Dashboards::MetricCard
2
+ self.id = "users_metric"
3
+ self.label = "Users count"
4
+ self.description = "Users description"
5
+ self.cols = 1
6
+ self.initial_range = 30
7
+ self.ranges = [7, 30, 60, 365, "TODAY", "MTD", "QTD", "YTD", "ALL"]
8
+ # self.prefix = "$"
9
+ # self.suffix = "%"
10
+ self.refresh_every = 10.minutes
11
+
12
+ # You have access to context, params, range, current dashboard, and current card
13
+ query do
14
+ from = Date.today.midnight - 1.week
15
+ to = DateTime.current
16
+
17
+ if range.present?
18
+ if range.to_s == range.to_i.to_s
19
+ from = DateTime.current - range.to_i.days
20
+ else
21
+ case range
22
+ when "TODAY"
23
+ from = DateTime.current.beginning_of_day
24
+ when "MTD"
25
+ from = DateTime.current.beginning_of_month
26
+ when "QTD"
27
+ from = DateTime.current.beginning_of_quarter
28
+ when "YTD"
29
+ from = DateTime.current.beginning_of_year
30
+ when "ALL"
31
+ from = Time.at(0)
32
+ end
33
+ end
34
+ end
35
+
36
+ result User.where(created_at: from..to).count
37
+ end
38
+ end
@@ -0,0 +1,10 @@
1
+ class PercentDone < Avo::Dashboards::MetricCard
2
+ self.id = "percent_done"
3
+ self.label = "Percent done"
4
+ self.description = "This is the progress we made so far..."
5
+ self.suffix = "%"
6
+
7
+ query do
8
+ result 42
9
+ end
10
+ end
@@ -0,0 +1,10 @@
1
+ class RubocopCard < Avo::Dashboards::PartialCard
2
+ self.id = "percent_done"
3
+ self.label = "Percent done"
4
+ self.description = "This is the progress we made so far..."
5
+
6
+ self.cols = 3
7
+ self.rows = 20
8
+ self.partial = "avo/cards/rubocop_card"
9
+
10
+ end
@@ -9,4 +9,12 @@ class RubocopResource < Avo::BaseResource
9
9
  field :id, as: :id
10
10
  # field :data, as: :textarea, only_on: [:edit]
11
11
  # field :user_name, as: :text
12
+
13
+ tabs do
14
+ tab "List of Cops" do
15
+ panel do
16
+ field :id, as: :id
17
+ end
18
+ end
19
+ end
12
20
  end
@@ -7,6 +7,14 @@ class HomeController < ApplicationController
7
7
  end
8
8
 
9
9
  def reseed
10
- SeedService.seed
10
+ SeedService.seed(variant: :refresh)
11
+
12
+ redirect_back_or_to root_path
13
+ end
14
+
15
+ def refresh_material_view
16
+ RubocopLog.refresh
17
+
18
+ redirect_back_or_to root_path
11
19
  end
12
20
  end
@@ -1,7 +1,53 @@
1
+ # frozen_string_literal: true
2
+
1
3
  class SeedService
4
+ PRINTSPEAK_DATA_PATH = "/Users/davidcruwys/dev/printspeak/printspeak-generator/.builders/.data/"
5
+
2
6
  class << self
3
- def seed
4
- puts 'sssssssssssssssssssssss'
7
+ def seed(variant: :reset)
8
+ service = SeedService.new
9
+ service.call(variant: variant)
5
10
  end
6
11
  end
7
- end
12
+
13
+ def call(variant: :reset)
14
+ reset if variant == :reset
15
+ refresh if variant == :refresh
16
+ create
17
+ end
18
+
19
+ private
20
+
21
+ def get_data(filename)
22
+ json = File.read(File.join(PRINTSPEAK_DATA_PATH, filename))
23
+ JSON.parse(json)
24
+ end
25
+
26
+ def reset
27
+ User.delete_all
28
+ RailsApp.delete_all
29
+ Rubocop.delete_all
30
+ TableCount.delete_all
31
+ end
32
+
33
+ def refresh
34
+ end
35
+
36
+ def create
37
+ refresh_printspeak
38
+
39
+ RubocopLog.refresh
40
+ end
41
+
42
+ def refresh_printspeak
43
+ david = User.create_with(name: 'david', password: 'password').find_or_create_by(email: 'david@site.com')
44
+
45
+ rails_app = RailsApp.create_with(user: david).find_or_create_by(name: 'Printspeak')
46
+
47
+ puts 'Create Rubocop Data'
48
+ Rubocop.create(rails_app: rails_app, data: get_data('rubocop.json'))
49
+
50
+ puts 'Create Table Count Data'
51
+ TableCount.create(rails_app: rails_app, data: get_data('sql_count.json'))
52
+ end
53
+ end
@@ -1,4 +1,10 @@
1
- <%= link_to 'Home', root_path %>
2
- <%= link_to 'Quick Sign In', home_quick_signin_path %> |
3
- <%= link_to 'Admin', avo_path %>
1
+ <%= link_to 'Home', root_path %>
2
+ | <%= link_to 'Re-Seed', home_reseed_path, style: 'color: blue; font-weight: 600;' %>
3
+ | <%= link_to 'Refresh Material View', home_refresh_material_view_path, style: 'color: blue; font-weight: 600;' %>
4
+ | <%= link_to 'Quick Sign In', home_quick_signin_path %>
5
+ | <%= link_to 'Admin', avo_path %>
6
+ <hr />
7
+
8
+ <%= link_to 'Visits (View)', home_visitors_by_monument_path %>
9
+ | <%= link_to 'Visits (Materialized)', home_individual_visitors_by_monument_path %>
4
10
  <hr />
@@ -1,18 +1 @@
1
- @data_path = "/Users/davidcruwys/dev/printspeak/printspeak-generator/.builders/.data/"
2
-
3
- david = User.create_with(name: 'david', password: 'password').find_or_create_by(email: 'david@site.com')
4
-
5
- def get_data(filename)
6
- json = File.read(File.join(@data_path, filename))
7
- JSON.parse(json)
8
- end
9
-
10
- rails_app = RailsApp.create(name: 'Printspeak', user: david)
11
-
12
- puts 'Create Rubocop Data'
13
- Rubocop.create(rails_app: rails_app, data: get_data('rubocop.json'))
14
-
15
- puts 'Create Table Count Data'
16
- TableCount.create(rails_app: rails_app, data: get_data('sql_count.json'))
17
-
18
-
1
+ SeedService.seed
@@ -0,0 +1,23 @@
1
+ WITH
2
+
3
+ files AS (
4
+ SELECT jsonb_array_elements(data->'files') FROM rubocops
5
+ ),
6
+ lines AS (
7
+ SELECT
8
+ jsonb_array_elements(files)->>'file' as file,
9
+ jsonb_array_elements(files)->'lines' as lines
10
+ FROM files
11
+ ),
12
+ rubocop_log AS (
13
+ SELECT
14
+ jsonb_array_elements(lines)->>'position' as position,
15
+ jsonb_array_elements(lines)->>'status' as status,
16
+ jsonb_array_elements(lines)->>'status_message' as status_message,
17
+ jsonb_array_elements(lines)->>'cop' as cop,
18
+ jsonb_array_elements(lines)->>'message' as message,
19
+ jsonb_array_elements(lines)->>'full_line' as full_line,
20
+ jsonb_array_elements(lines)->>'file_name' as file_name
21
+ FROM lines
22
+ )
23
+ select * from rubocop_log
@@ -70,6 +70,7 @@
70
70
  "add_pretender",
71
71
  "add_public_suffix",
72
72
  "add_rails_html_sanitizer",
73
+ "add_scenic",
73
74
  "add_ransack",
74
75
  "add_redcarpet",
75
76
  "add_rolify",
@@ -567,6 +568,13 @@
567
568
  "default": false,
568
569
  "required": false
569
570
  },
571
+ {
572
+ "name": "add_scenic",
573
+ "description": "Indicates when to generate add scenic",
574
+ "type": "boolean",
575
+ "default": false,
576
+ "required": false
577
+ },
570
578
  {
571
579
  "name": "add_ransack",
572
580
  "description": "Indicates when to generate add ransack",
@@ -60,6 +60,7 @@
60
60
  "add_pretender": false,
61
61
  "add_public_suffix": false,
62
62
  "add_rails_html_sanitizer": false,
63
+ "add_scenic": true,
63
64
  "add_ransack": false,
64
65
  "add_redcarpet": false,
65
66
  "add_rolify": false,
@@ -70,6 +70,7 @@
70
70
  "add_pretender",
71
71
  "add_public_suffix",
72
72
  "add_rails_html_sanitizer",
73
+ "add_scenic",
73
74
  "add_ransack",
74
75
  "add_redcarpet",
75
76
  "add_rolify",
@@ -567,6 +568,13 @@
567
568
  "default": false,
568
569
  "required": false
569
570
  },
571
+ {
572
+ "name": "add_scenic",
573
+ "description": "",
574
+ "type": "boolean",
575
+ "default": false,
576
+ "required": false
577
+ },
570
578
  {
571
579
  "name": "add_ransack",
572
580
  "description": "",
@@ -70,6 +70,7 @@
70
70
  "add_pretender": false,
71
71
  "add_public_suffix": false,
72
72
  "add_rails_html_sanitizer": false,
73
+ "add_scenic": true,
73
74
  "add_ransack": false,
74
75
  "add_redcarpet": false,
75
76
  "add_rolify": false,
@@ -1,37 +1,14 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- # lib/rails_app_generator/rag_initializer.rb
4
- # add_if(:scenic)
5
- # rag.add_option :add_scenic , type: :boolean, default: false
6
-
7
3
  module RailsAppGenerator
8
4
  # Custom add-ons for RailsAppGenerator
9
5
  module AddOns
10
6
  # Add Scenic to rails application
11
7
  class Scenic < RailsAppGenerator::Addon
12
- required_gem gem.version('scenic', '1.6.0', '')
8
+ required_gem gem.version('scenic', '1.6.0', 'Ads methods to ActiveRecord:Migration to create and manage database views in Rails')
13
9
 
14
10
  def apply
15
- say 'Setting up Scenic'
16
- # template('scenic_template.rb', 'target/scenic.rb', force: true)
17
- # template('app/javascript/stylesheets/components.scss')
18
- # create_file('target/scenic.rb', 'put your content here')
19
- # directory 'app/template', 'app/target', force: true
20
- # empty_directory 'app/target'
21
- # inject_into_file('app/application.js', "some content")
22
- # rails_command('tailwindcss:install')
23
- end
24
-
25
- def before_template
26
- say 'Setting up Scenic - before custom template'
27
- end
28
-
29
- def before_bundle
30
- say 'Setting up Scenic - before bundle install'
31
- end
32
-
33
- def after_bundle
34
- say 'Setting up Scenic - after bundle install'
11
+ bundle_install
35
12
  end
36
13
  end
37
14
  end
@@ -208,6 +208,7 @@ module RailsAppGenerator
208
208
  add_if(:rails_app_generator) # TODO: needs testing
209
209
  add_if(:redcarpet) # tested
210
210
  add_if(:rolify) # tested
211
+ add_if(:scenic)
211
212
  add_if(:services) # TODO: needs testing
212
213
  add_if(:shoulda) # TODO: needs testing
213
214
  add_if(:sidekiq) # TODO: needs testing
@@ -29,9 +29,7 @@ module RailsAppGenerator
29
29
  RailsAppGenerator::Util.write_last_run('rails_options_data.json', opts.to_h)
30
30
 
31
31
  starter = RailsAppGenerator::Starter.new(**args)
32
-
33
- starter.delete_target_folder
34
- starter.start(opts)
32
+ starter.start(opts) if starter.handle_target_folder_existence?
35
33
  end
36
34
  # rubocop:enable Metrics/AbcSize
37
35
  end
@@ -23,7 +23,9 @@ module RailsAppGenerator
23
23
  info = Net::HTTP.get(URI.parse(link))
24
24
  json = JSON.parse(info)
25
25
 
26
- Rails::Generators::AppBase::GemfileEntry.new(json['name'], json['version'], json['description'])
26
+ comment = (json['description'] || json['info'] || '').gsub(/(\r?\n|\r)/, ' ').squeeze.strip
27
+
28
+ Rails::Generators::AppBase::GemfileEntry.new(json['name'], json['version'], comment)
27
29
  rescue SocketError
28
30
  abort 'Internet connection cannot be established to RubyGems.org'
29
31
  rescue JSON::ParserError
@@ -131,7 +131,7 @@ KConfig.configure do |config|
131
131
  rag.add_option :add_kaminari , type: :boolean, default: false
132
132
  rag.add_option :add_lograge , type: :boolean, default: false
133
133
  rag.add_option :add_minimal_css , type: :boolean, default: false
134
- rag.add_option :minimal_css_library , type: :string, default: 'water.css', description: "Minimal CSS library to get you started. [options: water.css (default)]"
134
+ rag.add_option :minimal_css_library , type: :string , default: 'water.css', description: "Minimal CSS library to get you started. [options: water.css (default)]"
135
135
  rag.add_option :add_mini_magick , type: :boolean, default: false
136
136
  rag.add_option :add_motor_admin , type: :boolean, default: false
137
137
  rag.add_option :add_phony_rails , type: :boolean, default: false
@@ -139,6 +139,7 @@ KConfig.configure do |config|
139
139
  rag.add_option :add_public_suffix , type: :boolean, default: false
140
140
  # pundit
141
141
  rag.add_option :add_rails_html_sanitizer , type: :boolean, default: false
142
+ rag.add_option :add_scenic , type: :boolean, default: false
142
143
  # rails_app_generator
143
144
  rag.add_option :add_ransack , type: :boolean, default: false
144
145
  rag.add_option :add_redcarpet , type: :boolean, default: false
@@ -28,17 +28,22 @@ module RailsAppGenerator
28
28
  # points to templates related to rails addons
29
29
  attr_reader :addon_template_path
30
30
 
31
+ attr_reader :target_folder_exist_action # [abort destroy keep_git overwrite]
32
+
31
33
  attr_reader :capture_output
32
34
  attr_reader :console_output
33
35
 
36
+ # rubocop:disable Metrics/CyclomaticComplexity
34
37
  def initialize(**args)
35
- @app_path = args[:app_path] || '.'
36
- @destination_root = args[:destination_root] || Dir.pwd
37
- @rails_template_path = args[:rails_template_path] || AppGenerator.rails_template_path
38
- @override_template_path = args[:override_template_path] || AppGenerator.override_template_path
39
- @addon_template_path = args[:addon_template_path] || AppGenerator.addon_template_path
40
- @capture_output = args[:capture_output].nil? ? false : args[:capture_output]
38
+ @app_path = args[:app_path] || '.'
39
+ @destination_root = args[:destination_root] || Dir.pwd
40
+ @rails_template_path = args[:rails_template_path] || AppGenerator.rails_template_path
41
+ @override_template_path = args[:override_template_path] || AppGenerator.override_template_path
42
+ @addon_template_path = args[:addon_template_path] || AppGenerator.addon_template_path
43
+ @target_folder_exist_action = args[:target_folder_exist_action] || 'abort'
44
+ @capture_output = args[:capture_output].nil? ? false : args[:capture_output]
41
45
  end
46
+ # rubocop:enable Metrics/CyclomaticComplexity
42
47
 
43
48
  def target_path
44
49
  File.expand_path(File.join(destination_root, app_path))
@@ -58,12 +63,45 @@ module RailsAppGenerator
58
63
  end
59
64
  end
60
65
 
61
- def delete_target_folder
62
- FileUtils.rm_rf(target_path)
66
+ def handle_target_folder_found?
67
+ return true unless File.directory?(target_path)
68
+
69
+ case target_folder_exist_action
70
+ when 'abort'
71
+ puts "Target folder [#{target_path}] already exists. Aborting"
72
+ false
73
+ when 'destroy'
74
+ puts "Target folder [#{target_path}] already exists. Destroying it"
75
+ FileUtils.rm_rf(target_path)
76
+ true
77
+ when 'keep_git'
78
+ puts "Target folder [#{target_path}] already exists. Wiping it but keeping git history"
79
+ clean_target_folder
80
+ true
81
+ when 'overwrite'
82
+ puts "Target folder [#{target_path}] already exists. Overwriting it"
83
+ true
84
+ else
85
+ raise "Invalid target_folder_exist_action: #{target_folder_exist_action}"
86
+ end
63
87
  end
64
88
 
65
89
  private
66
90
 
91
+ def clean_target_folder
92
+ Dir.entries(target_path).each do |entry|
93
+ entry_path = File.join(target_path, entry)
94
+
95
+ next if ['.', '..', '.git'].include?(entry)
96
+
97
+ if File.file?(entry_path)
98
+ File.delete(entry_path)
99
+ elsif File.directory?(entry_path)
100
+ FileUtils.rm_rf(entry_path)
101
+ end
102
+ end
103
+ end
104
+
67
105
  # Rails options returns a flat array of options
68
106
  #
69
107
  # It can work accept a flat array of options or a
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module RailsAppGenerator
4
- VERSION = '0.2.41'
4
+ VERSION = '0.3.0'
5
5
  end
data/package-lock.json CHANGED
@@ -1,12 +1,12 @@
1
1
  {
2
2
  "name": "rails_app_generator",
3
- "version": "0.2.41",
3
+ "version": "0.3.0",
4
4
  "lockfileVersion": 2,
5
5
  "requires": true,
6
6
  "packages": {
7
7
  "": {
8
8
  "name": "rails_app_generator",
9
- "version": "0.2.41",
9
+ "version": "0.3.0",
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.41",
3
+ "version": "0.3.0",
4
4
  "description": "Create new Rails Application with custom opinions",
5
5
  "scripts": {
6
6
  "release": "semantic-release"
@@ -0,0 +1,14 @@
1
+ {
2
+ "args": {
3
+ "app_path": "r7_scenic",
4
+ "destination_root": "/Users/davidcruwys/dev/kgems/rails_app_generator/a/addons"
5
+ },
6
+ "opts": {
7
+ "skip_git": true,
8
+ "skip_test": true,
9
+ "database": "postgresql",
10
+ "add_minimal_css": true,
11
+ "template": "/Users/davidcruwys/dev/kgems/rails_app_generator/after_templates/addons/scenic/_.rb",
12
+ "add_scenic": true
13
+ }
14
+ }
@@ -2,7 +2,8 @@
2
2
  "args": {
3
3
  "app_path": "klueless",
4
4
  "destination_root": "/Users/davidcruwys/dev/kweb",
5
- "note": "add sidekiq to handle the data import tasks, add impersonate"
5
+ "note": "add sidekiq to handle the data import tasks, add impersonate",
6
+ "target_folder_exists": "keep_git"
6
7
  },
7
8
  "opts": {
8
9
  "skip_test": true,
@@ -18,6 +19,7 @@
18
19
  "add_factory_bot_rails": true,
19
20
  "add_faker": true,
20
21
  "add_ransack": false,
21
- "add_rubocop": true
22
+ "add_rubocop": true,
23
+ "add_scenic": true
22
24
  }
23
25
  }
data/tasks/profile.thor CHANGED
@@ -42,6 +42,7 @@ class Profile < Thor
42
42
  template('profile/after_template.rb' , after_template_path('_.rb') , force: options[:force])
43
43
  template('profile/app/controllers/home_controller.rb' , after_template_path('app/controllers/home_controller.rb') , force: options[:force])
44
44
  template('profile/app/views/home/index.html.erb' , after_template_path('app/views/home/index.html.erb') , force: options[:force])
45
+ template('profile/app/services/seed_service.rb' , after_template_path('app/services/seed_service.rb') , force: options[:force])
45
46
 
46
47
  copy_file('profile/app/views/layouts/_navbar.html.erb' , after_template_path('app/views/layouts/_navbar.html.erb') , force: options[:force])
47
48
  copy_file('profile/app/views/layouts/_footer.html.erb' , after_template_path('app/views/layouts/_footer.html.erb') , force: options[:force])
@@ -11,9 +11,10 @@ gac 'base rails 7 image created'
11
11
  prepare_environment
12
12
 
13
13
  after_bundle do
14
+ create_db
14
15
  scaffolds
15
16
  setup_customizations
16
- setup_db
17
+ migrate_db
17
18
  end
18
19
 
19
20
  def scaffolds
@@ -33,38 +34,26 @@ def setup_customizations
33
34
  directory "app/models"
34
35
  directory "app/views"
35
36
  template 'app/views/layouts/application.html.erb' , 'app/views/layouts/application.html.erb'
37
+ directory "app/services"
36
38
  end
37
39
 
38
- def setup_db
40
+ def create_db
41
+ # uncomment this if you need custom configuration in database.yml
42
+ # gsub_file('config/database.yml', ' encoding: unicode', db_development_settings)
43
+ db(drop: true, create: true)
44
+ end
45
+
46
+ def migrate_db
39
47
  template 'db/seeds.rb' , 'db/seeds.rb'
40
48
 
41
- db_migrate
42
- db_seed
49
+ db(migrate: true, seed: true)
43
50
  end
44
51
 
45
- # Other template command examples
46
- # prepare_environment
47
- # bundle_install
48
- # css_install('tailwind')
49
- # rails_command('db:migrate')
50
- # rails_command('db:migrate')
51
- # bundle_add('hotwire-rails')
52
- # rails_command('hotwire:install')
53
- # run('bin/importmap pin sortablejs')
54
- # run('npm install daisyui')
55
- # rubocop
56
- #
57
- # directory 'app/assets/images'
58
- # create_file 'app/assets/stylesheets/custom-bootstrap-import.scss' , read_template('custom-bootstrap-import.scss')
59
- # append_to_file 'app/assets/config/manifest.js' , read_template('manifest.js')
60
- # insert_into_file 'app/views/layouts/application.html.erb', read_template('application.html.erb'),
61
- # before: %( <%%= javascript_include_tag "application", "data-turbo-track": "reload", defer: true %>)
62
- # gsub_file 'app/views/layouts/application.html.erb', %(container mx-auto mt-28 px-5 flex), 'container mx-auto px-5'
63
- # template 'home.css', 'app/assets/stylesheets/home.css'
64
- #
65
- # add_controller('page', 'benefits', 'faq', 'terms', 'privacy', '--skip-routes')
66
- # route(<<-'RUBY')
67
- # PageController.action_methods.each do |action|
68
- # get "/#{action}", to: "page##{action}", as: "page_#{action}"
69
- # end
70
- # RUBY
52
+ def db_development_settings
53
+ <<-'RUBY'
54
+ encoding: unicode
55
+ host: <%= ENV['DATABASE_HOST'] %>
56
+ username: <%= ENV['DATABASE_USERNAME'] %>
57
+ password: <%= ENV['DATABASE_PASSWORD'] %>
58
+ RUBY
59
+ end
@@ -1,4 +1,8 @@
1
1
  class HomeController < ApplicationController
2
2
  def index
3
3
  end
4
+
5
+ # def reseed
6
+ # SeedService.seed
7
+ # end
4
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
@@ -1,3 +1,4 @@
1
+ # SeedService.seed
1
2
  # david = User.create(email: 'david@site.com', name: 'david', password: 'password')
2
3
  # james = User.create(email: 'james@site.com', name: 'james', password: 'password')
3
4
  # sally = User.create(email: 'sally@site.com', name: 'sally', password: 'password')
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.41
4
+ version: 0.3.0
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-30 00:00:00.000000000 Z
11
+ date: 2022-09-02 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bootsnap
@@ -440,11 +440,29 @@ files:
440
440
  - after_templates/addons/rubocop/app/controllers/home_controller.rb
441
441
  - after_templates/addons/rubocop/app/views/home/index.html.erb
442
442
  - after_templates/addons/rubocop/app/views/layouts/application.html.erb
443
+ - after_templates/addons/scenic/_.rb
444
+ - after_templates/addons/scenic/app/controllers/home_controller.rb
445
+ - after_templates/addons/scenic/app/services/seed_service.rb
446
+ - after_templates/addons/scenic/app/views/home/index.html.erb
447
+ - after_templates/addons/scenic/app/views/home/individual_visitors_by_monument.html.erb
448
+ - after_templates/addons/scenic/app/views/home/reseed.html.erb
449
+ - after_templates/addons/scenic/app/views/home/visitors_by_monument.html.erb
450
+ - after_templates/addons/scenic/app/views/layouts/_footer.html.erb
451
+ - after_templates/addons/scenic/app/views/layouts/_navbar.html.erb
452
+ - after_templates/addons/scenic/app/views/layouts/application.html.erb
453
+ - after_templates/addons/scenic/db/seeds.rb
454
+ - after_templates/addons/scenic/db/views/individual_visitors_by_monuments_v01.sql
455
+ - after_templates/addons/scenic/db/views/visitors_by_monuments_v01.sql
443
456
  - after_templates/addons/twilio_ruby/_.rb
444
457
  - after_templates/addons/twilio_ruby/app/controllers/home_controller.rb
445
458
  - after_templates/addons/twilio_ruby/app/views/home/index.html.erb
446
459
  - after_templates/addons/twilio_ruby/config/initializers/twilio.rb
447
460
  - after_templates/application/klueless/_.rb
461
+ - after_templates/application/klueless/app/avo/cards/amount_raised.rb
462
+ - after_templates/application/klueless/app/avo/cards/example_custom_partial.rb
463
+ - after_templates/application/klueless/app/avo/cards/example_metric.rb
464
+ - after_templates/application/klueless/app/avo/cards/percent_done.rb
465
+ - after_templates/application/klueless/app/avo/cards/rubocop_card.rb
448
466
  - after_templates/application/klueless/app/avo/dashboards/dashboard.rb
449
467
  - after_templates/application/klueless/app/avo/resources/db_schema_resource.rb
450
468
  - after_templates/application/klueless/app/avo/resources/rails_app_resource.rb
@@ -468,6 +486,7 @@ files:
468
486
  - after_templates/application/klueless/config/initializers/avo.rb
469
487
  - after_templates/application/klueless/config/locales/en.yml
470
488
  - after_templates/application/klueless/db/seeds.rb
489
+ - after_templates/application/klueless/db/views/rubocop_logs_v01.sql
471
490
  - after_templates/application/printspeak/_.rb
472
491
  - after_templates/application/printspeak/app/assets/images/.keep
473
492
  - after_templates/application/printspeak/app/assets/images/about/1.jpg
@@ -800,6 +819,7 @@ files:
800
819
  - profiles/addons/redcarpet.json
801
820
  - profiles/addons/rolify.json
802
821
  - profiles/addons/rubocop.json
822
+ - profiles/addons/scenic.json
803
823
  - profiles/addons/twilio_ruby.json
804
824
  - profiles/application/klueless.json
805
825
  - profiles/application/printspeak.json
@@ -861,6 +881,7 @@ files:
861
881
  - templates/thor_task/addon/addon.tt
862
882
  - templates/thor_task/profile/after_template.rb
863
883
  - templates/thor_task/profile/app/controllers/home_controller.rb
884
+ - templates/thor_task/profile/app/services/seed_service.rb
864
885
  - templates/thor_task/profile/app/views/home/index.html.erb.tt
865
886
  - templates/thor_task/profile/app/views/layouts/_footer.html.erb.tt
866
887
  - templates/thor_task/profile/app/views/layouts/_navbar.html.erb