rider-kick 0.0.1 → 0.0.3
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 +4 -4
- data/README.md +34 -9
- data/lib/generators/rider_kick/USAGE +12 -0
- data/lib/generators/rider_kick/clean_arch_generator.rb +160 -0
- data/lib/generators/rider_kick/init_generator.rb +15 -0
- data/lib/generators/rider_kick/scaffold_generator.rb +125 -0
- data/lib/generators/rider_kick/structure_generator.rb +77 -0
- data/lib/generators/rider_kick/templates/.gitignore +57 -0
- data/lib/generators/rider_kick/templates/.rspec +5 -0
- data/lib/generators/rider_kick/templates/.rubocop.yml +1141 -0
- data/lib/generators/rider_kick/templates/README.md +69 -0
- data/lib/generators/rider_kick/templates/config/database.yml +21 -0
- data/lib/generators/rider_kick/templates/config/initializers/clean_archithecture.rb.tt +10 -0
- data/lib/generators/rider_kick/templates/config/initializers/generators.rb.tt +14 -0
- data/lib/generators/rider_kick/templates/config/initializers/hashie.rb.tt +16 -0
- data/lib/generators/rider_kick/templates/config/initializers/pagy.rb.tt +13 -0
- data/lib/generators/rider_kick/templates/config/initializers/rider_kick.rb +3 -0
- data/lib/generators/rider_kick/templates/config/initializers/version.rb.tt +6 -0
- data/lib/generators/rider_kick/templates/config/initializers/zeitwerk.rb.tt +3 -0
- data/lib/generators/rider_kick/templates/db/migrate/20220613145533_init_database.rb +5 -0
- data/lib/generators/rider_kick/templates/db/structures/example.yaml.tt +96 -0
- data/lib/generators/rider_kick/templates/domains/core/builders/builder.rb.tt +14 -0
- data/lib/generators/rider_kick/templates/domains/core/builders/error.rb.tt +5 -0
- data/lib/generators/rider_kick/templates/domains/core/builders/pagination.rb.tt +14 -0
- data/lib/generators/rider_kick/templates/domains/core/entities/entity.rb.tt +9 -0
- data/lib/generators/rider_kick/templates/domains/core/entities/error.rb.tt +7 -0
- data/lib/generators/rider_kick/templates/domains/core/entities/pagination.rb.tt +8 -0
- data/lib/generators/rider_kick/templates/domains/core/repositories/abstract_repository.rb.tt +51 -0
- data/lib/generators/rider_kick/templates/domains/core/repositories/create.rb.tt +15 -0
- data/lib/generators/rider_kick/templates/domains/core/repositories/destroy.rb.tt +16 -0
- data/lib/generators/rider_kick/templates/domains/core/repositories/fetch_by_id.rb.tt +13 -0
- data/lib/generators/rider_kick/templates/domains/core/repositories/list.rb.tt +19 -0
- data/lib/generators/rider_kick/templates/domains/core/repositories/update.rb.tt +23 -0
- data/lib/generators/rider_kick/templates/domains/core/use_cases/contract/default.rb.tt +17 -0
- data/lib/generators/rider_kick/templates/domains/core/use_cases/contract/pagination.rb.tt +15 -0
- data/lib/generators/rider_kick/templates/domains/core/use_cases/create.rb.tt +18 -0
- data/lib/generators/rider_kick/templates/domains/core/use_cases/destroy.rb.tt +18 -0
- data/lib/generators/rider_kick/templates/domains/core/use_cases/fetch_by_id.rb.tt +18 -0
- data/lib/generators/rider_kick/templates/domains/core/use_cases/get_version.rb.tt +17 -0
- data/lib/generators/rider_kick/templates/domains/core/use_cases/list.rb.tt +18 -0
- data/lib/generators/rider_kick/templates/domains/core/use_cases/update.rb.tt +18 -0
- data/lib/generators/rider_kick/templates/domains/core/utils/request_methods.rb.tt +81 -0
- data/lib/generators/rider_kick/templates/env.development +14 -0
- data/lib/generators/rider_kick/templates/env.production +14 -0
- data/lib/generators/rider_kick/templates/env.test +14 -0
- data/lib/generators/rider_kick/templates/spec/fixtures/sample.pdf +5 -0
- data/lib/generators/rider_kick/templates/spec/rails_helper.rb +87 -0
- data/lib/generators/rider_kick/templates/spec/support/file_stuber.rb +13 -0
- data/lib/generators/rider_kick/templates/spec/support/repository_stubber.rb +10 -0
- data/lib/rider-kick.rb +3 -3
- data/lib/rider_kick/builders/abstract_active_record_entity_builder.rb +23 -21
- data/lib/rider_kick/builders/abstract_active_record_entity_builder_spec.rb +116 -0
- data/lib/rider_kick/configuration.rb +29 -0
- data/lib/rider_kick/matchers/use_case_result_spec.rb +1 -0
- data/lib/rider_kick/types.rb +0 -3
- data/lib/rider_kick/version.rb +1 -1
- metadata +52 -4
- data/sig/rider_kick.rbs +0 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: d52c99f6ea8176455670ca8ea5cc9a9c22f43b593023e2403608f414b3e2c715
|
4
|
+
data.tar.gz: 7b53c42cc3739cba6e29c1fe831454f22bc52feca1942a14212e8d48d3107193
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: df231703733194422cee357e0563ab18f48820d7650ef850f5e7f575164622e6e61e8614936f0e02dfa2b49729732a93d2aa0b78987ee1dcde63b89c09750c1e
|
7
|
+
data.tar.gz: da23c273017a080b6b55fd48078e1df07410788f6e90730d02dd9025904823425f95d0067822cd2e90282bab3a10b00112a8ebe88fba63795b36a0ae6271bdfa
|
data/README.md
CHANGED
@@ -12,9 +12,29 @@ gem 'rider-kick'
|
|
12
12
|
```
|
13
13
|
|
14
14
|
And then execute:
|
15
|
-
|
15
|
+
$ rails new kotaro_minami -d=postgresql -T --skip-javascript --skip-asset-pipeline
|
16
16
|
$ bundle install
|
17
|
-
$
|
17
|
+
$ rails generate rider_kick:init
|
18
|
+
$ rails generate rider_kick:clean_arch --setup
|
19
|
+
$ rails db:drop db:create db:migrate db:seed
|
20
|
+
|
21
|
+
## Usage
|
22
|
+
```bash
|
23
|
+
Description:
|
24
|
+
Clean Architecture generator
|
25
|
+
rails new kotaro_minami -d=postgresql -T --skip-javascript --skip-asset-pipeline
|
26
|
+
|
27
|
+
Example:
|
28
|
+
To Generate Init:
|
29
|
+
bin/rails generate rider_kick:init
|
30
|
+
|
31
|
+
To Generate Pattern:
|
32
|
+
bin/rails generate rider_kick:clean_arch --setup
|
33
|
+
|
34
|
+
To Generate scaffold:
|
35
|
+
bin/rails generate rider_kick:scaffold Models::Contact actor:user
|
36
|
+
|
37
|
+
```
|
18
38
|
|
19
39
|
## Philosophy
|
20
40
|
|
@@ -26,20 +46,25 @@ This structure provides helper interfaces and classes to assist in the construct
|
|
26
46
|
|
27
47
|
```
|
28
48
|
- app
|
29
|
-
-
|
30
|
-
-
|
49
|
+
- models
|
50
|
+
- models
|
31
51
|
- ...
|
32
52
|
- domains
|
33
|
-
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
53
|
+
- core
|
54
|
+
...
|
55
|
+
- entities (Contract Response)
|
56
|
+
- builder
|
57
|
+
- repositories (Business logic)
|
58
|
+
- use_cases (Just Usecase)
|
59
|
+
- utils (Class Reusable)
|
38
60
|
```
|
39
61
|
## Screaming architecture - use cases as an organisational principle
|
40
62
|
Uncle Bob suggests that your source code organisation should allow developers to easily find a listing of all use cases your application provides. Here's an example of how this might look in a this application.
|
41
63
|
```
|
42
64
|
- app
|
65
|
+
- models
|
66
|
+
- models
|
67
|
+
- ...
|
43
68
|
- domains
|
44
69
|
- core
|
45
70
|
...
|
@@ -0,0 +1,12 @@
|
|
1
|
+
Description:
|
2
|
+
Clean Architecture generator
|
3
|
+
|
4
|
+
Example:
|
5
|
+
To Generate Init:
|
6
|
+
bin/rails generate rider_kick:init
|
7
|
+
|
8
|
+
To Generate Pattern:
|
9
|
+
bin/rails generate rider_kick:clean_arch --setup
|
10
|
+
|
11
|
+
To Generate scaffold:
|
12
|
+
bin/rails generate rider_kick:scaffold Models::Contact actor:user
|
@@ -0,0 +1,160 @@
|
|
1
|
+
module RiderKick
|
2
|
+
class CleanArchGenerator < Rails::Generators::Base
|
3
|
+
source_root File.expand_path('templates', __dir__)
|
4
|
+
|
5
|
+
class_option :setup, type: :boolean, default: false, desc: 'Setup domain structure'
|
6
|
+
|
7
|
+
def validate_setup_option
|
8
|
+
raise Thor::Error, 'The --setup option must be specified to create the domain structure.' unless options.setup
|
9
|
+
validation!
|
10
|
+
end
|
11
|
+
|
12
|
+
def create_gem_dependencies
|
13
|
+
append_to_file('Gemfile', gem_dependencies)
|
14
|
+
say 'Gems added to Gemfile', :green
|
15
|
+
end
|
16
|
+
|
17
|
+
def setup_configuration
|
18
|
+
setup_domain_structure
|
19
|
+
|
20
|
+
setup_initializers
|
21
|
+
setup_dotenv
|
22
|
+
setup_gitignore
|
23
|
+
setup_rubocop
|
24
|
+
setup_init_migration
|
25
|
+
setup_active_storage
|
26
|
+
setup_rspec
|
27
|
+
setup_readme
|
28
|
+
end
|
29
|
+
|
30
|
+
private
|
31
|
+
|
32
|
+
def setup_active_storage
|
33
|
+
run 'rails active_storage:install'
|
34
|
+
run 'rails db:migrate'
|
35
|
+
end
|
36
|
+
|
37
|
+
def validation!
|
38
|
+
unless File.exist?('config/initializers/rider_kick.rb')
|
39
|
+
say 'Error must create init configuration for rider_kick!'
|
40
|
+
raise Thor::Error, 'run: bin/rails generate rider_kick:init'
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
def setup_domain_structure
|
45
|
+
empty_directory File.join("#{path_app}/domains/core/use_cases/contract")
|
46
|
+
empty_directory File.join("#{path_app}/domains/core/repositories")
|
47
|
+
empty_directory File.join("#{path_app}/domains/core/builders")
|
48
|
+
empty_directory File.join("#{path_app}/domains/core/entities")
|
49
|
+
empty_directory File.join("#{path_app}/domains/core/utils")
|
50
|
+
|
51
|
+
# then
|
52
|
+
copy_domain_file
|
53
|
+
end
|
54
|
+
|
55
|
+
def copy_domain_file
|
56
|
+
template 'domains/core/use_cases/contract/pagination.rb.tt', File.join("#{path_app}/domains/core/use_cases/contract", 'pagination.rb')
|
57
|
+
template 'domains/core/use_cases/contract/default.rb.tt', File.join("#{path_app}/domains/core/use_cases/contract", 'default.rb')
|
58
|
+
template 'domains/core/use_cases/get_version.rb.tt', File.join("#{path_app}/domains/core/use_cases", 'get_version.rb')
|
59
|
+
|
60
|
+
template 'domains/core/builders/error.rb.tt', File.join("#{path_app}/domains/core/builders", 'error.rb')
|
61
|
+
template 'domains/core/builders/pagination.rb.tt', File.join("#{path_app}/domains/core/builders", 'pagination.rb')
|
62
|
+
|
63
|
+
template 'domains/core/entities/error.rb.tt', File.join("#{path_app}/domains/core/entities", 'error.rb')
|
64
|
+
template 'domains/core/entities/pagination.rb.tt', File.join("#{path_app}/domains/core/entities", 'pagination.rb')
|
65
|
+
|
66
|
+
template 'domains/core/repositories/abstract_repository.rb.tt', File.join("#{path_app}/domains/core/repositories", 'abstract_repository.rb')
|
67
|
+
template 'domains/core/utils/request_methods.rb.tt', File.join("#{path_app}/domains/core/utils", 'request_methods.rb')
|
68
|
+
end
|
69
|
+
|
70
|
+
def setup_initializers
|
71
|
+
copy_initializer('clean_archithecture')
|
72
|
+
copy_initializer('generators')
|
73
|
+
copy_initializer('hashie')
|
74
|
+
copy_initializer('version')
|
75
|
+
copy_initializer('zeitwerk')
|
76
|
+
copy_initializer('pagy')
|
77
|
+
end
|
78
|
+
|
79
|
+
def setup_dotenv
|
80
|
+
copy_database_config
|
81
|
+
copy_env_development
|
82
|
+
end
|
83
|
+
|
84
|
+
def setup_gitignore
|
85
|
+
template '.gitignore', File.join('.gitignore')
|
86
|
+
end
|
87
|
+
|
88
|
+
def setup_rubocop
|
89
|
+
template '.rubocop.yml', File.join('.rubocop.yml')
|
90
|
+
end
|
91
|
+
|
92
|
+
def setup_readme
|
93
|
+
template 'README.md', File.join('README.md')
|
94
|
+
end
|
95
|
+
|
96
|
+
def setup_init_migration
|
97
|
+
template 'db/migrate/20220613145533_init_database.rb', File.join('db/migrate/20220613145533_init_database.rb')
|
98
|
+
end
|
99
|
+
|
100
|
+
# Helper untuk menyalin initializers
|
101
|
+
def copy_initializer(file_name)
|
102
|
+
template "config/initializers/#{file_name}.rb.tt", File.join("config/initializers/#{file_name}.rb")
|
103
|
+
end
|
104
|
+
|
105
|
+
def copy_database_config
|
106
|
+
template 'config/database.yml', File.join('config/database.yml')
|
107
|
+
end
|
108
|
+
|
109
|
+
def copy_env_development
|
110
|
+
template 'env.production', File.join('.env.production')
|
111
|
+
template 'env.development', File.join('.env.development')
|
112
|
+
template 'env.test', File.join('.env.test')
|
113
|
+
template 'env.test', File.join('env.example')
|
114
|
+
end
|
115
|
+
|
116
|
+
def gem_dependencies
|
117
|
+
inject_into_file 'Gemfile', after: "group :development, :test do\n" do
|
118
|
+
<<-CONFIG
|
119
|
+
|
120
|
+
gem "byebug"
|
121
|
+
gem "rspec-rails"
|
122
|
+
gem "factory_bot_rails"
|
123
|
+
gem "shoulda-matchers"
|
124
|
+
CONFIG
|
125
|
+
end
|
126
|
+
|
127
|
+
<<~RUBY
|
128
|
+
|
129
|
+
# Env Variables
|
130
|
+
gem 'dotenv-rails'
|
131
|
+
|
132
|
+
# Objectable
|
133
|
+
gem 'hashie'
|
134
|
+
|
135
|
+
# uploading
|
136
|
+
gem 'image_processing', '>= 1.2'
|
137
|
+
gem 'ruby-vips'
|
138
|
+
|
139
|
+
# pagination
|
140
|
+
gem 'pagy', '~> 9.2'
|
141
|
+
RUBY
|
142
|
+
end
|
143
|
+
|
144
|
+
def setup_rspec
|
145
|
+
say 'Menjalankan bundle install...'
|
146
|
+
run 'bundle install'
|
147
|
+
say 'Menginisialisasi RSpec...'
|
148
|
+
run 'rails generate rspec:install'
|
149
|
+
template '.rspec', File.join('.rspec')
|
150
|
+
template 'spec/support/repository_stubber.rb', File.join('spec/support/repository_stubber.rb')
|
151
|
+
template 'spec/support/file_stuber.rb', File.join('spec/support/file_stuber.rb')
|
152
|
+
say 'Mengonfigurasi FactoryBot...'
|
153
|
+
template 'spec/rails_helper.rb', File.join('spec/rails_helper.rb')
|
154
|
+
end
|
155
|
+
|
156
|
+
def path_app
|
157
|
+
'app'
|
158
|
+
end
|
159
|
+
end
|
160
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
module RiderKick
|
2
|
+
class InitGenerator < Rails::Generators::Base
|
3
|
+
source_root File.expand_path('templates', __dir__)
|
4
|
+
|
5
|
+
def setup_configuration
|
6
|
+
copy_initializer('rider_kick')
|
7
|
+
end
|
8
|
+
|
9
|
+
private
|
10
|
+
|
11
|
+
def copy_initializer(file_name)
|
12
|
+
template "config/initializers/#{file_name}.rb", File.join("config/initializers/#{file_name}.rb")
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
@@ -0,0 +1,125 @@
|
|
1
|
+
require 'yaml'
|
2
|
+
module RiderKick
|
3
|
+
class ScaffoldGenerator < Rails::Generators::Base
|
4
|
+
source_root File.expand_path('templates', __dir__)
|
5
|
+
|
6
|
+
argument :arg_structure, type: :string, default: '', banner: ''
|
7
|
+
|
8
|
+
def generate_use_case
|
9
|
+
validation!
|
10
|
+
setup_variables
|
11
|
+
|
12
|
+
generate_files('create')
|
13
|
+
generate_files('update')
|
14
|
+
generate_files('list')
|
15
|
+
generate_files('destroy')
|
16
|
+
generate_files('fetch', '_by_id')
|
17
|
+
|
18
|
+
copy_builder_and_entity_files
|
19
|
+
end
|
20
|
+
|
21
|
+
private
|
22
|
+
|
23
|
+
def validation!
|
24
|
+
unless File.exist?('config/initializers/rider_kick.rb')
|
25
|
+
say 'Error must create init configuration for rider_kick!'
|
26
|
+
raise Thor::Error, 'run: bin/rails generate rider_kick:init'
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
def setup_variables
|
31
|
+
config = YAML.load_file("db/structures/#{arg_structure}_structure.yaml")
|
32
|
+
@structure = Hashie::Mash.new(config)
|
33
|
+
|
34
|
+
# Mengambil detail konfigurasi
|
35
|
+
model_name = @structure.model
|
36
|
+
resource_name = @structure.resource_name.singularize.underscore.downcase
|
37
|
+
entity = @structure.entity || {}
|
38
|
+
|
39
|
+
@actor = @structure.actor
|
40
|
+
@uploaders = @structure.uploaders || []
|
41
|
+
@search_able = @structure.search_able || []
|
42
|
+
@services = @structure.domains || {}
|
43
|
+
@contract_list = @services.action_list.use_case.contract || []
|
44
|
+
@contract_fetch_by_id = @services.action_fetch_by_id.use_case.contract || []
|
45
|
+
@contract_create = @services.action_create.use_case.contract || []
|
46
|
+
@contract_update = @services.action_update.use_case.contract || []
|
47
|
+
@contract_destroy = @services.action_destroy.use_case.contract || []
|
48
|
+
@skipped_fields = entity.skipped_fields || []
|
49
|
+
@custom_fields = entity.custom_fields || []
|
50
|
+
|
51
|
+
@variable_subject = model_name.split('::').last.underscore.downcase
|
52
|
+
@scope_path = resource_name.pluralize.underscore.downcase
|
53
|
+
@scope_class = @scope_path.camelize
|
54
|
+
@model_class = model_name.camelize.constantize
|
55
|
+
@subject_class = resource_name.camelize
|
56
|
+
@fields = contract_fields
|
57
|
+
@route_scope_path = @structure.controllers.route_scope.downcase rescue ''
|
58
|
+
@route_scope_class = @route_scope_path.camelize rescue ''
|
59
|
+
|
60
|
+
@type_mapping = {
|
61
|
+
'uuid' => ':string',
|
62
|
+
'string' => ':string',
|
63
|
+
'text' => ':string',
|
64
|
+
'integer' => ':integer',
|
65
|
+
'boolean' => ':bool',
|
66
|
+
'float' => ':float',
|
67
|
+
'decimal' => ':float',
|
68
|
+
'date' => ':date',
|
69
|
+
'upload' => 'Types::File',
|
70
|
+
'datetime' => ':string'
|
71
|
+
}
|
72
|
+
@entity_type_mapping = {
|
73
|
+
'uuid' => 'Types::Strict::String',
|
74
|
+
'string' => 'Types::Strict::String',
|
75
|
+
'text' => 'Types::Strict::String',
|
76
|
+
'integer' => 'Types::Strict::Integer',
|
77
|
+
'boolean' => 'Types::Strict::Bool',
|
78
|
+
'float' => 'Types::Strict::Float',
|
79
|
+
'decimal' => 'Types::Strict::Decimal',
|
80
|
+
'date' => 'Types::Strict::Date',
|
81
|
+
'datetime' => 'Types::Strict::Time'
|
82
|
+
}
|
83
|
+
end
|
84
|
+
|
85
|
+
def generate_files(action, suffix = '')
|
86
|
+
use_case_filename = build_usecase_filename(action, suffix)
|
87
|
+
repository_filename = build_repository_filename(action, suffix)
|
88
|
+
|
89
|
+
@use_case_class = use_case_filename.camelize
|
90
|
+
@repository_class = repository_filename.camelize
|
91
|
+
|
92
|
+
template "domains/core/use_cases/#{action + suffix}.rb.tt", File.join("#{root_path_app}/domains/core/use_cases/", @route_scope_path.to_s, @scope_path.to_s, "#{use_case_filename}.rb")
|
93
|
+
template "domains/core/repositories/#{action + suffix}.rb.tt", File.join("#{root_path_app}/domains/core/repositories/#{@scope_path}", "#{repository_filename}.rb")
|
94
|
+
end
|
95
|
+
|
96
|
+
def copy_builder_and_entity_files
|
97
|
+
template 'domains/core/builders/builder.rb.tt', File.join("#{root_path_app}/domains/core/builders", "#{@variable_subject}.rb")
|
98
|
+
template 'domains/core/entities/entity.rb.tt', File.join("#{root_path_app}/domains/core/entities", "#{@variable_subject}.rb")
|
99
|
+
end
|
100
|
+
|
101
|
+
def contract_fields
|
102
|
+
skip_contract_fields = @skipped_fields.map(&:strip).uniq
|
103
|
+
if RiderKick.scope_owner_column.present?
|
104
|
+
skip_contract_fields << RiderKick.scope_owner_column.to_s
|
105
|
+
end
|
106
|
+
@model_class.columns.reject { |column| skip_contract_fields.include?(column.name.to_s) }.map(&:name).map(&:to_s)
|
107
|
+
end
|
108
|
+
|
109
|
+
def get_column_type(field)
|
110
|
+
@uploaders.include?(field) ? 'upload' : @model_class.columns_hash[field.to_s].type
|
111
|
+
end
|
112
|
+
|
113
|
+
def root_path_app
|
114
|
+
'app'
|
115
|
+
end
|
116
|
+
|
117
|
+
def build_usecase_filename(action, suffix = '')
|
118
|
+
"#{@actor}_#{action}_#{@variable_subject}#{suffix}"
|
119
|
+
end
|
120
|
+
|
121
|
+
def build_repository_filename(action, suffix = '')
|
122
|
+
"#{action}_#{@variable_subject}#{suffix}"
|
123
|
+
end
|
124
|
+
end
|
125
|
+
end
|
@@ -0,0 +1,77 @@
|
|
1
|
+
module RiderKick
|
2
|
+
class Structure < Rails::Generators::Base
|
3
|
+
source_root File.expand_path('templates', __dir__)
|
4
|
+
|
5
|
+
argument :arg_model_name, type: :string, default: '', banner: 'Models::Name'
|
6
|
+
argument :arg_settings, type: :hash, default: '', banner: 'route_scope:dashboard actor:user uploader_filed:assets,images,picture,document'
|
7
|
+
|
8
|
+
def generate_use_case
|
9
|
+
validation!
|
10
|
+
setup_variables
|
11
|
+
generate_files(@scope_path)
|
12
|
+
end
|
13
|
+
|
14
|
+
private
|
15
|
+
|
16
|
+
def validation!
|
17
|
+
unless File.exist?('config/initializers/rider_kick.rb')
|
18
|
+
say 'Error must create init configuration for rider_kick!'
|
19
|
+
raise Thor::Error, 'run: bin/rails generate rider_kick:init'
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
def setup_variables
|
24
|
+
@variable_subject = arg_model_name.split('::').last.underscore.downcase
|
25
|
+
@model_class = arg_model_name.camelize.constantize
|
26
|
+
@subject_class = arg_model_name.split('::').last
|
27
|
+
@scope_path = @subject_class.pluralize.underscore.downcase
|
28
|
+
@scope_class = @scope_path.camelize
|
29
|
+
@fields = contract_fields
|
30
|
+
@uploaders = uploaders
|
31
|
+
@actor = arg_settings['actor'].downcase
|
32
|
+
@route_scope_path = arg_settings['route_scope'].downcase
|
33
|
+
@route_scope_class = @route_scope_path.camelize
|
34
|
+
|
35
|
+
@type_mapping = {
|
36
|
+
'uuid' => ':string',
|
37
|
+
'string' => ':string',
|
38
|
+
'text' => ':string',
|
39
|
+
'integer' => ':integer',
|
40
|
+
'boolean' => ':bool',
|
41
|
+
'float' => ':float',
|
42
|
+
'decimal' => ':float',
|
43
|
+
'date' => ':date',
|
44
|
+
'upload' => 'Types::File',
|
45
|
+
'datetime' => ':string'
|
46
|
+
}
|
47
|
+
@entity_type_mapping = {
|
48
|
+
'uuid' => 'Types::Strict::String',
|
49
|
+
'string' => 'Types::Strict::String',
|
50
|
+
'text' => 'Types::Strict::String',
|
51
|
+
'integer' => 'Types::Strict::Integer',
|
52
|
+
'boolean' => 'Types::Strict::Bool',
|
53
|
+
'float' => 'Types::Strict::Float',
|
54
|
+
'decimal' => 'Types::Strict::Decimal',
|
55
|
+
'date' => 'Types::Strict::Date',
|
56
|
+
'datetime' => 'Types::Strict::Time'
|
57
|
+
}
|
58
|
+
end
|
59
|
+
|
60
|
+
def generate_files(action)
|
61
|
+
template 'db/structures/example.yaml.tt', File.join("db/structures/#{action}_structure.yaml")
|
62
|
+
end
|
63
|
+
|
64
|
+
def contract_fields
|
65
|
+
@model_class.columns.reject { |column| (['id', 'created_at', 'updated_at', 'type'] + [RiderKick.scope_owner_column.to_s]).include?(column.name.to_s) }.map(&:name).map(&:to_s)
|
66
|
+
end
|
67
|
+
|
68
|
+
def get_column_type(field)
|
69
|
+
uploaders.include?(field) ? 'upload' : @model_class.columns_hash[field].type
|
70
|
+
end
|
71
|
+
|
72
|
+
def uploaders
|
73
|
+
return [] unless arg_settings['uploader_filed'].present?
|
74
|
+
arg_settings['uploader_filed'].split(',').map(&:strip)
|
75
|
+
end
|
76
|
+
end
|
77
|
+
end
|
@@ -0,0 +1,57 @@
|
|
1
|
+
# See https://help.github.com/articles/ignoring-files for more about ignoring files.
|
2
|
+
#
|
3
|
+
# If you find yourself ignoring temporary files generated by your text editor
|
4
|
+
# or operating system, you probably want to add a global ignore instead:
|
5
|
+
# git config --global core.excludesfile '~/.gitignore_global'
|
6
|
+
|
7
|
+
# Ignore bundler config.
|
8
|
+
/.bundle
|
9
|
+
|
10
|
+
# Ignore all logfiles and tempfiles.
|
11
|
+
/log/*
|
12
|
+
/tmp/*
|
13
|
+
!/log/.keep
|
14
|
+
!/tmp/.keep
|
15
|
+
|
16
|
+
# Ignore pidfiles, but keep the directory.
|
17
|
+
/tmp/pids/*
|
18
|
+
!/tmp/pids/
|
19
|
+
!/tmp/pids/.keep
|
20
|
+
|
21
|
+
# Ignore uploaded files in development.
|
22
|
+
/storage/*
|
23
|
+
!/storage/.keep
|
24
|
+
/tmp/storage/*
|
25
|
+
!/tmp/storage/
|
26
|
+
!/tmp/storage/.keep
|
27
|
+
|
28
|
+
/public/assets
|
29
|
+
|
30
|
+
# Ignore master key for decrypting credentials and more.
|
31
|
+
/config/master.key
|
32
|
+
|
33
|
+
# editor
|
34
|
+
.DS_Store
|
35
|
+
.idea
|
36
|
+
.env.*
|
37
|
+
Procfile
|
38
|
+
.ruby-gemset
|
39
|
+
.irb-history
|
40
|
+
.pry_history
|
41
|
+
.byebug_history
|
42
|
+
|
43
|
+
/app/assets/builds/*
|
44
|
+
!/app/assets/builds/.keep
|
45
|
+
|
46
|
+
/node_modules
|
47
|
+
|
48
|
+
# Vite Ruby
|
49
|
+
/public/vite*
|
50
|
+
node_modules
|
51
|
+
# Vite uses dotenv and suggests to ignore local-only env files. See
|
52
|
+
# https://vitejs.dev/guide/env-and-mode.html#env-files
|
53
|
+
*.local
|
54
|
+
data
|
55
|
+
volumes
|
56
|
+
vendor/bundle/ruby/*
|
57
|
+
ssl
|