rails_app_generator 0.2.43 → 0.3.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +22 -0
- data/README.md +22 -1
- data/after_templates/addons/factory_bot/_.rb +82 -0
- data/after_templates/addons/factory_bot/app/controllers/home_controller.rb +10 -0
- data/after_templates/addons/factory_bot/app/services/seed_service.rb +35 -0
- data/after_templates/addons/factory_bot/app/views/home/index.html.erb +3 -0
- data/after_templates/addons/factory_bot/app/views/layouts/_footer.html.erb +0 -0
- data/after_templates/addons/factory_bot/app/views/layouts/_navbar.html.erb +10 -0
- data/after_templates/addons/factory_bot/app/views/layouts/application.html.erb +29 -0
- data/after_templates/addons/factory_bot/db/seeds.rb +1 -0
- data/after_templates/addons/factory_bot/factories.rb +73 -0
- data/after_templates/addons/factory_bot/factory-create-user.png +0 -0
- data/after_templates/addons/factory_bot/factory-employee-bad.png +0 -0
- data/after_templates/addons/factory_bot/factory-employee-good.png +0 -0
- data/after_templates/addons/factory_bot/factory-role.png +0 -0
- data/after_templates/addons/factory_bot/factory-video.png +0 -0
- data/after_templates/application/klueless/.rubocop.yml +40 -0
- data/after_templates/application/klueless/_.rb +31 -12
- data/after_templates/application/klueless/app/avo/cards/amount_raised.rb +14 -0
- data/after_templates/application/klueless/app/avo/cards/example_custom_partial.rb +7 -0
- data/after_templates/application/klueless/app/avo/cards/example_metric.rb +38 -0
- data/after_templates/application/klueless/app/avo/cards/percent_done.rb +10 -0
- data/after_templates/application/klueless/app/avo/cards/rubocop_card.rb +10 -0
- data/after_templates/application/klueless/app/avo/filters/rubocop_entry_cop_filter.rb +15 -0
- data/after_templates/application/klueless/app/avo/filters/rubocop_entry_filename_filter.rb +13 -0
- data/after_templates/application/klueless/app/avo/filters/rubocop_entry_message_filter.rb +13 -0
- data/after_templates/application/klueless/app/avo/filters/rubocop_entry_status_filter.rb +15 -0
- data/after_templates/application/klueless/app/avo/filters/table_count_entry_tablename_filter.rb +13 -0
- data/after_templates/application/klueless/app/avo/resource_tools/rubocop_info.rb +4 -0
- data/after_templates/application/klueless/app/avo/resources/rubocop_entry_resource.rb +28 -0
- data/after_templates/application/klueless/app/avo/resources/rubocop_resource.rb +9 -0
- data/after_templates/application/klueless/app/avo/resources/table_count_entry_resource.rb +18 -0
- data/after_templates/application/klueless/app/controllers/home_controller.rb +9 -1
- data/after_templates/application/klueless/app/services/seed_service.rb +49 -3
- data/after_templates/application/klueless/app/views/home/index.html.erb +2 -2
- data/after_templates/application/klueless/app/views/layouts/_navbar.html.erb +6 -3
- data/after_templates/application/klueless/config/initializers/avo.rb +4 -2
- data/after_templates/application/klueless/db/seeds.rb +1 -18
- data/after_templates/application/klueless/db/views/rubocop_entries_v01.sql +23 -0
- data/after_templates/application/klueless/db/views/table_count_entries_v01.sql +11 -0
- data/docs/last_run/app_generator_data.json +7 -7
- data/docs/last_run/rails_options_data.json +10 -8
- data/lib/rails_app_generator/app_generator.rb +18 -4
- data/lib/rails_app_generator/cli/profile.rb +1 -3
- data/lib/rails_app_generator/starter.rb +49 -8
- data/lib/rails_app_generator/version.rb +1 -1
- data/package-lock.json +2 -2
- data/package.json +1 -1
- data/profiles/addons/factory_bot.json +18 -0
- data/profiles/addons/faker.json +1 -1
- data/profiles/application/klueless.json +7 -3
- data/templates/README.md.erb +2 -2
- data/templates/thor_task/profile/app/services/seed_service.rb +8 -4
- data/templates/thor_task/profile/profile.json.tt +2 -1
- metadata +33 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: c53c84982de8f9b1f3180f4c84b7527a04cc623dac815cdec90d325f7e56183f
|
4
|
+
data.tar.gz: 0f2d44fc8597836b396faa7b3ef6995896e41222b34362a0cb73802bd2fbd70d
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 0d2f6fe3d00ca2befc5acaf668f58f655c60e7f0a0d14f7670067f5e3847861e92cf93a927d284d36546a26bf85ea8beebb7ac76cc183d88c0bf2b06e8c60d18
|
7
|
+
data.tar.gz: 24704cce18d58445b1a1d69122df8e098e3f2b87627030df4b1e863931e7320e0da89e71b8e5d4ac7e886c03c01d7b593aec20da3cc3165703771e8b5945c4c9
|
data/CHANGELOG.md
CHANGED
@@ -1,3 +1,25 @@
|
|
1
|
+
## [0.3.1](https://github.com/klueless-io/rails_app_generator/compare/v0.3.0...v0.3.1) (2022-09-02)
|
2
|
+
|
3
|
+
|
4
|
+
### Bug Fixes
|
5
|
+
|
6
|
+
* rename to when_folder_exist ([3363b0c](https://github.com/klueless-io/rails_app_generator/commit/3363b0c5df5c161f3578ae422b79c3bb7f3b863e))
|
7
|
+
|
8
|
+
# [0.3.0](https://github.com/klueless-io/rails_app_generator/compare/v0.2.43...v0.3.0) (2022-09-02)
|
9
|
+
|
10
|
+
|
11
|
+
### Features
|
12
|
+
|
13
|
+
* add target_folder_exists handling ([cf0b7c6](https://github.com/klueless-io/rails_app_generator/commit/cf0b7c6d9b09fddc6cef940b17d3ce431b9c4eff))
|
14
|
+
|
15
|
+
## [0.2.43](https://github.com/klueless-io/rails_app_generator/compare/v0.2.42...v0.2.43) (2022-08-31)
|
16
|
+
|
17
|
+
|
18
|
+
### Bug Fixes
|
19
|
+
|
20
|
+
* add scenic profile ([dc309e6](https://github.com/klueless-io/rails_app_generator/commit/dc309e6f399cec7085de3133aa32989bc7ff7ed4))
|
21
|
+
* add scenic profile ([44614f7](https://github.com/klueless-io/rails_app_generator/commit/44614f70d73fe41cee5fd9cb9af5d20f0aa4f915))
|
22
|
+
|
1
23
|
## [0.2.42](https://github.com/klueless-io/rails_app_generator/compare/v0.2.41...v0.2.42) (2022-08-30)
|
2
24
|
|
3
25
|
|
data/README.md
CHANGED
@@ -22,7 +22,7 @@ Or install it yourself as:
|
|
22
22
|
gem install rails_app_generator
|
23
23
|
```
|
24
24
|
|
25
|
-
Use the Gem
|
25
|
+
### Use the Gem
|
26
26
|
|
27
27
|
```
|
28
28
|
rag rag-simple
|
@@ -30,6 +30,27 @@ rag rag-tailwind
|
|
30
30
|
rag rag-bootstrap
|
31
31
|
```
|
32
32
|
|
33
|
+
### Create new Addon to Rails App Generator
|
34
|
+
|
35
|
+
If you need to make a new addon available then use `thor addon:new`
|
36
|
+
|
37
|
+
Generally an Addon will be for a gem so if you use the `--gem` option, it will bring in the GEM info such as latest version number
|
38
|
+
|
39
|
+
```
|
40
|
+
thor addon:new image_processing --gem
|
41
|
+
thor addon:new kaminari --gem
|
42
|
+
```
|
43
|
+
|
44
|
+
### Create new Profile to Rails App Generator
|
45
|
+
|
46
|
+
A profile is a sample Rails application template with files that allows you to test one or more Addons and produces a working Rails 7 application.
|
47
|
+
|
48
|
+
If you are just keeping the example to a simple GEM then use the `--variant` option with the folder you would like to write code into, e.g. `addons`
|
49
|
+
|
50
|
+
```
|
51
|
+
thor profile:new factory_bot --variant=addons
|
52
|
+
thor profile:new kaminari --variant=addons
|
53
|
+
```
|
33
54
|
|
34
55
|
## Notes
|
35
56
|
|
@@ -0,0 +1,82 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
# factory_bot provides a framework and DSL for defining and using factories - less error-prone, more explicit, and all-around easier to work with than fixtures.
|
4
|
+
#
|
5
|
+
# exe/rag addons/factory_bot
|
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
|
+
create_db
|
15
|
+
scaffolds
|
16
|
+
setup_customizations
|
17
|
+
migrate_db
|
18
|
+
end
|
19
|
+
|
20
|
+
# Goals:
|
21
|
+
# - Store Factories in subfolder under spec
|
22
|
+
# -
|
23
|
+
# - Use the faker GEM with both standard and custom data
|
24
|
+
# - Custom data goes in custom locales folder, see: https://stackoverflow.com/questions/28153540/extending-faker-in-a-gem-where-do-i-put-the-yaml-file
|
25
|
+
# - Use associations to affectively create related records
|
26
|
+
# - Create default and NULL factory example
|
27
|
+
# - Create Seed Data services
|
28
|
+
# - Add support for STI
|
29
|
+
# - Add support for polymorphic associations
|
30
|
+
# Things to be aware of in faker
|
31
|
+
# - Random focused data is better then sequence
|
32
|
+
# sequence(:name) { |n| "Category #{n}" }
|
33
|
+
# vs
|
34
|
+
# name { Faker::Hipster.word }
|
35
|
+
# -
|
36
|
+
|
37
|
+
|
38
|
+
def scaffolds
|
39
|
+
add_scaffold('app', 'title', 'description', 'settings:json')
|
40
|
+
add_scaffold('tenant', 'name', 'slug', 'active:boolean', 'app:references')
|
41
|
+
add_scaffold('role', 'code') # contributor, moderator, admin
|
42
|
+
add_scaffold('employee', 'first_name', 'last_name', 'address:text', 'email', 'password', 'tenant:references', 'role:references')
|
43
|
+
add_scaffold('project', 'name', 'status', 'budget:decimal', 'country', 'progress:integer', 'tenant:references')
|
44
|
+
add_scaffold('article', 'title', 'body:text', 'is_featured:boolean', 'employee:references', 'tenant:references')
|
45
|
+
add_scaffold('video', 'title', 'youtube_id', '', 'article:references')
|
46
|
+
end
|
47
|
+
|
48
|
+
def setup_customizations
|
49
|
+
route("root 'home#index'")
|
50
|
+
|
51
|
+
force_copy
|
52
|
+
|
53
|
+
add_controller('home', 'index', 'reseed')
|
54
|
+
|
55
|
+
directory "app/controllers"
|
56
|
+
directory "app/models"
|
57
|
+
directory "app/views"
|
58
|
+
template 'app/views/layouts/application.html.erb' , 'app/views/layouts/application.html.erb'
|
59
|
+
directory "app/services"
|
60
|
+
copy_file 'factories.rb'
|
61
|
+
end
|
62
|
+
|
63
|
+
def create_db
|
64
|
+
# uncomment this if you need custom configuration in database.yml
|
65
|
+
# gsub_file('config/database.yml', ' encoding: unicode', db_development_settings)
|
66
|
+
db(create: true)
|
67
|
+
end
|
68
|
+
|
69
|
+
def migrate_db
|
70
|
+
template 'db/seeds.rb' , 'db/seeds.rb'
|
71
|
+
|
72
|
+
db(migrate: true, seed: true)
|
73
|
+
end
|
74
|
+
|
75
|
+
def db_development_settings
|
76
|
+
<<-'RUBY'
|
77
|
+
encoding: unicode
|
78
|
+
host: 127.0.0.1
|
79
|
+
username: printspeak
|
80
|
+
password: printspeak
|
81
|
+
RUBY
|
82
|
+
end
|
@@ -0,0 +1,35 @@
|
|
1
|
+
class SeedService
|
2
|
+
class << self
|
3
|
+
def seed(variant: :reset)
|
4
|
+
service = SeedService.new
|
5
|
+
service.call(variant: variant)
|
6
|
+
end
|
7
|
+
end
|
8
|
+
|
9
|
+
def call(variant: :reset)
|
10
|
+
reset if variant == :reset
|
11
|
+
refresh if variant == :refresh
|
12
|
+
create
|
13
|
+
end
|
14
|
+
|
15
|
+
private
|
16
|
+
|
17
|
+
def reset
|
18
|
+
Article.delete_all
|
19
|
+
Project.delete_all
|
20
|
+
Employee.delete_all
|
21
|
+
Tenant.delete_all
|
22
|
+
App.delete_all
|
23
|
+
end
|
24
|
+
|
25
|
+
def refresh
|
26
|
+
end
|
27
|
+
|
28
|
+
def create
|
29
|
+
app = FactoryBot.create(:app)
|
30
|
+
tenants = FactoryBot.create_list(:tenant, rand(10..20), app: app)
|
31
|
+
employees = FactoryBot.create_list(:employee, rand(10..20), tenant: tenants.sample)
|
32
|
+
_articles = FactoryBot.create_list(:article, rand(10..20), tenant: tenants.sample, employee: employees.sample)
|
33
|
+
_projects = FactoryBot.create_list(:project, rand(10..20), tenant: tenants.sample)
|
34
|
+
end
|
35
|
+
end
|
File without changes
|
@@ -0,0 +1,10 @@
|
|
1
|
+
<%= link_to 'Home', root_path %>
|
2
|
+
| <%= link_to 'Apps', apps_path %>
|
3
|
+
| <%= link_to 'Tenants', tenants_path %>
|
4
|
+
| <%= link_to 'Employees', employees_path %>
|
5
|
+
| <%= link_to 'Roles', roles_path %>
|
6
|
+
| <%= link_to 'Projects', projects_path %>
|
7
|
+
| <%= link_to 'Articles', articles_path %>
|
8
|
+
| <%= link_to 'Videos', videos_path %>
|
9
|
+
| <%= link_to 'Re-Seed', home_reseed_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,73 @@
|
|
1
|
+
FactoryBot.define do
|
2
|
+
factory :app do
|
3
|
+
title { Faker::Name.name } # Faker::App.name
|
4
|
+
description { Faker::Lorem.paragraphs(number: rand(4...10)).join("\n") }
|
5
|
+
settings { { 'foo' => 'bar' } }
|
6
|
+
end
|
7
|
+
|
8
|
+
factory :tenant do
|
9
|
+
name { Faker::Name.name }
|
10
|
+
slug { Faker::Internet.slug }
|
11
|
+
active { [true, false].sample }
|
12
|
+
app
|
13
|
+
end
|
14
|
+
|
15
|
+
factory :employee do
|
16
|
+
first_name { Faker::Name.first_name }
|
17
|
+
last_name { Faker::Name.last_name }
|
18
|
+
email { Faker::Internet.email }
|
19
|
+
password { Faker::Internet.password }
|
20
|
+
address { Faker::Address.full_address }
|
21
|
+
end
|
22
|
+
|
23
|
+
factory :article do
|
24
|
+
title { Faker::Quote.famous_last_words }
|
25
|
+
body { Faker::Lorem.paragraphs(number: rand(4...10)).join("\n") }
|
26
|
+
is_featured { [true, false].sample }
|
27
|
+
end
|
28
|
+
|
29
|
+
factory :project do
|
30
|
+
name { Faker::App.name }
|
31
|
+
status { [:closed, :rejected, :failed, :loading, :running, :waiting, :done, :finalized, :archived, :finished].sample }
|
32
|
+
budget { Faker::Number.decimal(l_digits: 4) }
|
33
|
+
country { Faker::Address.country_code }
|
34
|
+
progress { Faker::Number.between(from: 0, to: 100) }
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
def examples
|
39
|
+
Faker::Name.name
|
40
|
+
Faker::Name.unique.name
|
41
|
+
|
42
|
+
Faker::Internet.email
|
43
|
+
|
44
|
+
Faker::Artist.name
|
45
|
+
Faker::Address.city #=> "Imogeneborough"
|
46
|
+
Faker::Address.street_name #=> "Larkin Fork"
|
47
|
+
Faker::Address.street_address #=> "282 Kevin Brook"
|
48
|
+
Faker::Address.secondary_address #=> "Apt. 672"
|
49
|
+
Faker::Address.building_number #=> "7304"
|
50
|
+
Faker::Address.mail_box #=> "PO Box 123"
|
51
|
+
Faker::Address.community #=> "University Crossing"
|
52
|
+
Faker::Address.zip_code #=> "58517" or "23285-4905"
|
53
|
+
Faker::Address.zip #=> "58517" or "66259-8212"
|
54
|
+
Faker::Address.postcode #=> "76032-4907" or "58517"
|
55
|
+
Faker::Address.time_zone #=> "Asia/Yakutsk"
|
56
|
+
Faker::Address.street_suffix #=> "Street"
|
57
|
+
Faker::Address.city_suffix #=> "fort"
|
58
|
+
Faker::Address.city_prefix #=> "Lake"
|
59
|
+
Faker::Address.state #=> "California"
|
60
|
+
Faker::Address.state_abbr #=> "AP"
|
61
|
+
Faker::Address.country #=> "French Guiana"
|
62
|
+
|
63
|
+
# Keyword arguments: code
|
64
|
+
Faker::Address.country_by_code(code: 'NL') #=> "Netherlands"
|
65
|
+
|
66
|
+
# Keyword arguments: name
|
67
|
+
Faker::Address.country_name_to_code(name: 'united_states') #=> "US"
|
68
|
+
Faker::Address.country_code #=> "IT"
|
69
|
+
Faker::Address.country_code_long #=> "ITA"
|
70
|
+
Faker::Address.latitude #=> "-58.17256227443719"
|
71
|
+
Faker::Address.longitude #=> "-156.65548382095133"
|
72
|
+
Faker::Address.full_address #=> "282 Kevin Brook, Imogeneborough, CA 58517"
|
73
|
+
end
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
@@ -0,0 +1,40 @@
|
|
1
|
+
require:
|
2
|
+
- rubocop-rails
|
3
|
+
|
4
|
+
AllCops:
|
5
|
+
NewCops: enable
|
6
|
+
Exclude:
|
7
|
+
- bin/*
|
8
|
+
- db/schema.rb
|
9
|
+
- db/migrate/*
|
10
|
+
- node_modules/**/*
|
11
|
+
|
12
|
+
Naming/AccessorMethodName:
|
13
|
+
Enabled: false
|
14
|
+
|
15
|
+
Metrics/MethodLength:
|
16
|
+
CountAsOne: ['array', 'heredoc']
|
17
|
+
AllowedMethods: ['describe', 'context']
|
18
|
+
|
19
|
+
Metrics/BlockLength:
|
20
|
+
AllowedMethods: ['describe', 'context']
|
21
|
+
Exclude:
|
22
|
+
- config/environments/*.rb
|
23
|
+
- '**/*.rake'
|
24
|
+
|
25
|
+
Layout/LineLength:
|
26
|
+
Max: 120
|
27
|
+
|
28
|
+
Layout/MultilineMethodCallIndentation:
|
29
|
+
EnforcedStyle: indented
|
30
|
+
|
31
|
+
Lint/EmptyBlock:
|
32
|
+
Exclude:
|
33
|
+
- spec/factories/*
|
34
|
+
|
35
|
+
Style/BlockDelimiters:
|
36
|
+
Exclude:
|
37
|
+
- spec/**/*
|
38
|
+
|
39
|
+
Style/Documentation:
|
40
|
+
Enabled: false
|
@@ -14,9 +14,9 @@ after_bundle do
|
|
14
14
|
force_copy
|
15
15
|
create_db
|
16
16
|
scaffolds
|
17
|
+
setup_avo
|
17
18
|
setup_customizations
|
18
19
|
migrate_db
|
19
|
-
setup_avo
|
20
20
|
|
21
21
|
swap1 = ' resources :users'
|
22
22
|
swap2 = " devise_for :users, controllers: { sessions: 'users/sessions', registrations: 'users/registrations' }"
|
@@ -27,6 +27,8 @@ end
|
|
27
27
|
def scaffolds
|
28
28
|
add_scaffold_controller('users', 'name', 'email')
|
29
29
|
|
30
|
+
add_scaffold('booking', 'name', 'state')
|
31
|
+
|
30
32
|
add_scaffold('rails_app', 'name', 'user:references') # name of the rails_app
|
31
33
|
|
32
34
|
# no of records in each table per region
|
@@ -44,6 +46,9 @@ def scaffolds
|
|
44
46
|
# add_scaffold('db_schema_foreign_key', 'left', 'right', 'name', 'on_update', 'on_delete', 'column', 'db_schema_table:references')
|
45
47
|
# add_scaffold('db_schema_index', 'name', 'fields', 'using', 'order:jsonb', 'where', 'unique', 'db_schema_table:references')
|
46
48
|
# add_scaffold('db_schema_view', 'name', 'materialized:boolean', 'sql_definition', 'db_schema_table:references')
|
49
|
+
|
50
|
+
generate('scenic:model rubocop_entry --materialized')
|
51
|
+
generate('scenic:model table_count_entry')
|
47
52
|
end
|
48
53
|
|
49
54
|
def setup_customizations
|
@@ -51,36 +56,50 @@ def setup_customizations
|
|
51
56
|
|
52
57
|
force_copy
|
53
58
|
|
54
|
-
add_controller('home', 'index', 'quick_signin', 'reseed')
|
59
|
+
add_controller('home', 'index', 'quick_signin', 'reseed', 'refresh_material_view')
|
55
60
|
|
56
61
|
directory "app/controllers"
|
57
62
|
directory "app/models"
|
58
63
|
directory "app/views"
|
59
64
|
template 'app/views/layouts/application.html.erb', 'app/views/layouts/application.html.erb'
|
60
65
|
directory "app/queries"
|
66
|
+
directory "app/services"
|
67
|
+
directory "db/views" # takes views from both scaffolds and customizations
|
68
|
+
|
69
|
+
copy_file '.rubocop.yml', '.rubocop.yml'
|
61
70
|
end
|
62
71
|
|
63
72
|
def setup_avo
|
64
|
-
|
73
|
+
generate('avo:resource rails_app')
|
74
|
+
|
75
|
+
generate('avo:resource table_count')
|
76
|
+
generate('avo:resource table_count_entry')
|
77
|
+
generate('avo:filter table_count_tablename_filter')
|
78
|
+
|
79
|
+
generate('avo:resource rubocop')
|
80
|
+
generate('avo:resource_tool rubocop_info')
|
81
|
+
|
82
|
+
generate('avo:resource rubocop_entry')
|
83
|
+
generate('avo:filter rubocop_entry_cop_filter')
|
84
|
+
generate('avo:filter rubocop_entry_filename_filter')
|
85
|
+
generate('avo:filter rubocop_entry_message_filter')
|
86
|
+
generate('avo:filter rubocop_entry_status_filter')
|
87
|
+
|
88
|
+
generate('avo:resource db_schema')
|
89
|
+
generate('avo:resource user')
|
65
90
|
|
66
|
-
generate('avo:resource RailsApp')
|
67
|
-
generate('avo:resource TableCount')
|
68
|
-
generate('avo:resource Rubocop')
|
69
|
-
generate('avo:resource DbSchema')
|
70
|
-
generate('avo:resource User')
|
71
91
|
# generate('avo:dashboard Dashboard')
|
72
92
|
|
73
93
|
directory "app/avo"
|
74
94
|
directory "config/initializers"
|
75
95
|
directory "config/locales"
|
76
|
-
|
77
|
-
# # add devise support
|
78
|
-
# gsub_file 'config/initializers/avo.rb', %(# config.current_user_method = {}), 'config.current_user_method = :current_user'
|
79
96
|
end
|
80
97
|
|
81
98
|
def create_db
|
82
99
|
gsub_file('config/database.yml', ' encoding: unicode', db_development_settings)
|
83
|
-
|
100
|
+
|
101
|
+
db_recreate(environment: :development)
|
102
|
+
db_recreate(environment: :test)
|
84
103
|
end
|
85
104
|
|
86
105
|
def migrate_db
|
@@ -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,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,15 @@
|
|
1
|
+
class RubocopEntryCopFilter < Avo::Filters::MultipleSelectFilter
|
2
|
+
self.name = "Cop"
|
3
|
+
|
4
|
+
def apply(_request, query, values)
|
5
|
+
query.where(cop: values)
|
6
|
+
end
|
7
|
+
|
8
|
+
def options
|
9
|
+
RubocopEntry
|
10
|
+
.select(:cop)
|
11
|
+
.distinct
|
12
|
+
.order(:cop)
|
13
|
+
.map { |entry| [entry.cop, entry.cop] }.to_h
|
14
|
+
end
|
15
|
+
end
|
@@ -0,0 +1,13 @@
|
|
1
|
+
class RubocopEntryFilenameFilter < Avo::Filters::TextFilter
|
2
|
+
self.name = "FileName"
|
3
|
+
|
4
|
+
def apply(_request, query, value)
|
5
|
+
values = value.split(" ")
|
6
|
+
|
7
|
+
values.each do |word|
|
8
|
+
query = query.where("file_name ILIKE ?", "%#{word}%")
|
9
|
+
end
|
10
|
+
|
11
|
+
query
|
12
|
+
end
|
13
|
+
end
|
@@ -0,0 +1,13 @@
|
|
1
|
+
class RubocopEntryMessageFilter < Avo::Filters::TextFilter
|
2
|
+
self.name = "Message"
|
3
|
+
|
4
|
+
def apply(_request, query, value)
|
5
|
+
values = value.split(" ")
|
6
|
+
|
7
|
+
values.each do |word|
|
8
|
+
query = query.where("message ILIKE ?", "%#{word}%")
|
9
|
+
end
|
10
|
+
|
11
|
+
query
|
12
|
+
end
|
13
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
class RubocopEntryStatusFilter < Avo::Filters::SelectFilter
|
2
|
+
self.name = "Status"
|
3
|
+
|
4
|
+
def apply(_request, query, value)
|
5
|
+
query.where(status: value)
|
6
|
+
end
|
7
|
+
|
8
|
+
def options
|
9
|
+
RubocopEntry
|
10
|
+
.select(:status)
|
11
|
+
.distinct
|
12
|
+
.order(:status)
|
13
|
+
.map { |entry| [entry.status, entry.status] }.to_h
|
14
|
+
end
|
15
|
+
end
|
data/after_templates/application/klueless/app/avo/filters/table_count_entry_tablename_filter.rb
ADDED
@@ -0,0 +1,13 @@
|
|
1
|
+
class TableCountEntryTablenameFilter < Avo::Filters::TextFilter
|
2
|
+
self.name = "Table Name"
|
3
|
+
|
4
|
+
def apply(_request, query, value)
|
5
|
+
values = value.split(" ")
|
6
|
+
|
7
|
+
values.each do |word|
|
8
|
+
query = query.where("table_name ILIKE ?", "%#{word}%")
|
9
|
+
end
|
10
|
+
|
11
|
+
query
|
12
|
+
end
|
13
|
+
end
|