trailblazer_scaffold 0.0.2
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 +7 -0
- data/lib/generators/trailblazer_scaffold/generate_generator.rb +14 -0
- data/lib/trailblazer_scaffold/contract/generate.rb +57 -0
- data/lib/trailblazer_scaffold/get_actions.rb +15 -0
- data/lib/trailblazer_scaffold/operation/generate.rb +61 -0
- data/lib/trailblazer_scaffold.rb +18 -0
- metadata +92 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: f9b3fd37ecc1e8eeb68b4739716f63921e6ba7c138dbf4761214b8da594f86ac
|
4
|
+
data.tar.gz: d45796dd7ff26ef025fe3380ed88c13c9f31c8b0b9f4ff7df517afdb6154b0b6
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: df7e15c9cc15835f9186f64044ea3eff4c55eaf3b395d25dfb621d6d5f01877d909c34071058fb74578fe2654946e51c81b91e1235c966ce3d2e57880c4781a5
|
7
|
+
data.tar.gz: 7345c2e5300e7549ce01b154636383c8b6363b4dac9575ee4ab33d4ea25d94a35c6ac9fcc6adbd2591f567554a82add3a761f23939a78d1b6c7e7e686646a5c1
|
@@ -0,0 +1,14 @@
|
|
1
|
+
require 'rails/generators'
|
2
|
+
module TrailblazerScaffold
|
3
|
+
class GenerateGenerator < Rails::Generators::Base
|
4
|
+
|
5
|
+
model_name = ARGV[0]
|
6
|
+
actions = TrailblazerScaffold::Generate.new.call(model_name)
|
7
|
+
result_text = if actions.present?
|
8
|
+
"operations and contract for #{actions.join(', ')} has been generated"
|
9
|
+
else
|
10
|
+
'there was no action for model to create the contract and operaitons for'
|
11
|
+
end
|
12
|
+
p result_text
|
13
|
+
end
|
14
|
+
end
|
@@ -0,0 +1,57 @@
|
|
1
|
+
module TrailblazerScaffold::Contract
|
2
|
+
class Generate
|
3
|
+
|
4
|
+
BLACKLIST_COLUMNS = %w(id created_at updated_at)
|
5
|
+
|
6
|
+
PROPERTY_TYPES = %i(integer float boolean)
|
7
|
+
|
8
|
+
def call(model)
|
9
|
+
model_path = model.to_s.downcase.split('::').join('/')
|
10
|
+
dir_path = Rails.root.join('app/concepts', model_path, 'contract')
|
11
|
+
FileUtils.mkdir_p(dir_path) unless File.directory?(dir_path)
|
12
|
+
file_name = 'base.rb'
|
13
|
+
File.write((dir_path + file_name), generate_class_text(model))
|
14
|
+
end
|
15
|
+
|
16
|
+
def generate_class_text(model)
|
17
|
+
klass_text = "class #{model}\n class Contract::Base < Reform::Form\n"
|
18
|
+
properties = get_properties(model)
|
19
|
+
properties.each do |property|
|
20
|
+
klass_text += " property :#{property[:name]}#{validation(property)}\n"
|
21
|
+
end
|
22
|
+
klass_text += " end\nend\n"
|
23
|
+
end
|
24
|
+
|
25
|
+
def get_properties(model)
|
26
|
+
model.columns.map do |column|
|
27
|
+
next if BLACKLIST_COLUMNS.include? column.name
|
28
|
+
{ name: column.name, allow_null: column.default || column.null, type: column.type }
|
29
|
+
end.compact
|
30
|
+
end
|
31
|
+
|
32
|
+
def validation(property)
|
33
|
+
presence_validation = validate_presence(property[:allow_null])
|
34
|
+
type_validation = validation_type(property[:type])
|
35
|
+
return unless presence_validation || type_validation
|
36
|
+
", validates: {#{[presence_validation, type_validation].compact.join(',')} }"
|
37
|
+
end
|
38
|
+
|
39
|
+
def validation_type(type)
|
40
|
+
return unless PROPERTY_TYPES.include?(type)
|
41
|
+
case type
|
42
|
+
when :integer
|
43
|
+
' numericality: { only_integer: true }'
|
44
|
+
when :float
|
45
|
+
' numericality: { only_float: true }'
|
46
|
+
when :boolean
|
47
|
+
' inclusion: { in: [true, false] }'
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
def validate_presence(allow_null)
|
52
|
+
return if allow_null
|
53
|
+
' presence: true'
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
require 'active_support/core_ext/string'
|
2
|
+
module TrailblazerScaffold
|
3
|
+
class GetActions
|
4
|
+
|
5
|
+
ALLOWED_ACTIONS = %w(create update destroy).freeze
|
6
|
+
|
7
|
+
def call(model_name)
|
8
|
+
klass = (model_name.pluralize + '_controller').classify.safe_constantize
|
9
|
+
klass = (model_name + 'Controller').safe_constantize unless klass.is_a?(Class)
|
10
|
+
return unless klass.is_a?(Class)
|
11
|
+
|
12
|
+
klass.action_methods.select { |action| ALLOWED_ACTIONS.include?(action) }
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
@@ -0,0 +1,61 @@
|
|
1
|
+
module TrailblazerScaffold::Operation
|
2
|
+
class Generate
|
3
|
+
|
4
|
+
def call(model, actions)
|
5
|
+
model_path = model.to_s.downcase.split('::').join('/')
|
6
|
+
dir_path = Rails.root.join('app/concepts', model_path, 'operation')
|
7
|
+
FileUtils.mkdir_p(dir_path) unless File.directory?(dir_path)
|
8
|
+
actions.each do |action|
|
9
|
+
send("generate_#{action}_operaton_class", model, dir_path)
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
def generate_create_operaton_class(model, dir_path)
|
14
|
+
class_text = <<~EOF
|
15
|
+
module #{model}
|
16
|
+
class Operaton::Create < Trailblazer::Operation
|
17
|
+
step Model(#{model}, :new)
|
18
|
+
step self::Contract::Build(constant: #{model}::Contract::Base)
|
19
|
+
step self::Contract::Validate()
|
20
|
+
step self::Contract::Persist()
|
21
|
+
end
|
22
|
+
end
|
23
|
+
EOF
|
24
|
+
|
25
|
+
File.write((dir_path + 'create.rb'), class_text)
|
26
|
+
end
|
27
|
+
|
28
|
+
def generate_update_operaton_class(model, dir_path)
|
29
|
+
class_text = <<~EOF
|
30
|
+
module #{model}
|
31
|
+
class Operaton::Update < Trailblazer::Operation
|
32
|
+
step Model(#{model}, :find)
|
33
|
+
step self::Contract::Build(constant: #{model}::Contract::Base)
|
34
|
+
step self::Contract::Validate()
|
35
|
+
step self::Contract::Persist()
|
36
|
+
end
|
37
|
+
end
|
38
|
+
EOF
|
39
|
+
|
40
|
+
File.write((dir_path + 'update.rb'), class_text)
|
41
|
+
end
|
42
|
+
|
43
|
+
def generate_destroy_operaton_class(model, dir_path)
|
44
|
+
class_text = <<~EOF
|
45
|
+
module #{model}
|
46
|
+
class Operaton::Destroy < Trailblazer::Operation
|
47
|
+
step Model(#{model}, :find)
|
48
|
+
step :destroy
|
49
|
+
|
50
|
+
def destroy(_options, model:, **)
|
51
|
+
model.destroy
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
55
|
+
EOF
|
56
|
+
|
57
|
+
File.write((dir_path + 'destroy.rb'), class_text)
|
58
|
+
end
|
59
|
+
|
60
|
+
end
|
61
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
require 'trailblazer_scaffold/get_actions.rb'
|
2
|
+
require 'trailblazer_scaffold/contract/generate.rb'
|
3
|
+
require 'trailblazer_scaffold/operation/generate.rb'
|
4
|
+
module TrailblazerScaffold
|
5
|
+
class Generate
|
6
|
+
|
7
|
+
def call(model_name)
|
8
|
+
unless (model = model_name.safe_constantize) && model.ancestors.include?(ActiveRecord::Base)
|
9
|
+
return puts 'model does not exists'
|
10
|
+
end
|
11
|
+
actions = GetActions.new.call(model_name)
|
12
|
+
TrailblazerScaffold::Contract::Generate.new.call(model)
|
13
|
+
return unless actions.present?
|
14
|
+
TrailblazerScaffold::Operation::Generate.new.call(model, actions)
|
15
|
+
end
|
16
|
+
|
17
|
+
end
|
18
|
+
end
|
metadata
ADDED
@@ -0,0 +1,92 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: trailblazer_scaffold
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.2
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Mehrnoush Akbari
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2020-04-15 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: trailblazer
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - "~>"
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '2.0'
|
20
|
+
- - ">="
|
21
|
+
- !ruby/object:Gem::Version
|
22
|
+
version: 2.0.7
|
23
|
+
type: :runtime
|
24
|
+
prerelease: false
|
25
|
+
version_requirements: !ruby/object:Gem::Requirement
|
26
|
+
requirements:
|
27
|
+
- - "~>"
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
version: '2.0'
|
30
|
+
- - ">="
|
31
|
+
- !ruby/object:Gem::Version
|
32
|
+
version: 2.0.7
|
33
|
+
- !ruby/object:Gem::Dependency
|
34
|
+
name: trailblazer-rails
|
35
|
+
requirement: !ruby/object:Gem::Requirement
|
36
|
+
requirements:
|
37
|
+
- - "~>"
|
38
|
+
- !ruby/object:Gem::Version
|
39
|
+
version: '2.1'
|
40
|
+
- - ">="
|
41
|
+
- !ruby/object:Gem::Version
|
42
|
+
version: 2.1.7
|
43
|
+
type: :runtime
|
44
|
+
prerelease: false
|
45
|
+
version_requirements: !ruby/object:Gem::Requirement
|
46
|
+
requirements:
|
47
|
+
- - "~>"
|
48
|
+
- !ruby/object:Gem::Version
|
49
|
+
version: '2.1'
|
50
|
+
- - ">="
|
51
|
+
- !ruby/object:Gem::Version
|
52
|
+
version: 2.1.7
|
53
|
+
description: 'To create file run `rails g trailblazer_scaffold:generate ClassName`,
|
54
|
+
if you have nested class just type the whole path for example for shop/product.rb
|
55
|
+
`rails g trailblazer_scaffold:generate Shop::Product` '
|
56
|
+
email:
|
57
|
+
executables: []
|
58
|
+
extensions: []
|
59
|
+
extra_rdoc_files: []
|
60
|
+
files:
|
61
|
+
- lib/generators/trailblazer_scaffold/generate_generator.rb
|
62
|
+
- lib/trailblazer_scaffold.rb
|
63
|
+
- lib/trailblazer_scaffold/contract/generate.rb
|
64
|
+
- lib/trailblazer_scaffold/get_actions.rb
|
65
|
+
- lib/trailblazer_scaffold/operation/generate.rb
|
66
|
+
homepage: https://gitlab.com/mehrnoush10352/trailblazer_scaffold
|
67
|
+
licenses:
|
68
|
+
- MIT
|
69
|
+
metadata:
|
70
|
+
documentation_uri: https://gitlab.com/mehrnoush10352/trailblazer_scaffold
|
71
|
+
homepage_uri: https://gitlab.com/mehrnoush10352/trailblazer_scaffold
|
72
|
+
source_code_uri: https://gitlab.com/mehrnoush10352/trailblazer_scaffold
|
73
|
+
post_install_message:
|
74
|
+
rdoc_options: []
|
75
|
+
require_paths:
|
76
|
+
- lib
|
77
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
78
|
+
requirements:
|
79
|
+
- - ">="
|
80
|
+
- !ruby/object:Gem::Version
|
81
|
+
version: 2.1.0
|
82
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
83
|
+
requirements:
|
84
|
+
- - ">="
|
85
|
+
- !ruby/object:Gem::Version
|
86
|
+
version: '0'
|
87
|
+
requirements: []
|
88
|
+
rubygems_version: 3.1.2
|
89
|
+
signing_key:
|
90
|
+
specification_version: 4
|
91
|
+
summary: generate operations and contracts based on model and actions
|
92
|
+
test_files: []
|