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 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: []