trailblazer_scaffold 0.0.2

Sign up to get free protection for your applications and to get access to all the features.
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: []