command_service_object 1.1.0 → 1.4.1

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.
Files changed (29) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile.lock +55 -55
  3. data/command_service_object.gemspec +1 -1
  4. data/lib/command_service_object/helpers/check_helper.rb +1 -1
  5. data/lib/command_service_object/hooks.rb +4 -2
  6. data/lib/command_service_object/version.rb +1 -1
  7. data/lib/generators/service/command/command_generator.rb +13 -5
  8. data/lib/generators/service/command/templates/command_spec.rb.erb +3 -3
  9. data/lib/generators/service/entity/entity_generator.rb +11 -6
  10. data/lib/generators/service/external/external_generator.rb +12 -5
  11. data/lib/generators/service/external/templates/external_spec.rb.erb +1 -1
  12. data/lib/generators/service/helper.rb +23 -0
  13. data/lib/generators/service/install/templates/services/application_service.rb +24 -10
  14. data/lib/generators/service/install/templates/services/command_base.rb +2 -2
  15. data/lib/generators/service/install/templates/services/issuer.rb +10 -0
  16. data/lib/generators/service/install/templates/services/util/json.rb +7 -0
  17. data/lib/generators/service/install/templates/services/value_object_base.rb +4 -0
  18. data/lib/generators/service/listener/listener_generator.rb +11 -6
  19. data/lib/generators/service/micro/micro_generator.rb +11 -6
  20. data/lib/generators/service/query/query_generator.rb +11 -6
  21. data/lib/generators/service/service_generator.rb +15 -10
  22. data/lib/generators/service/setup/setup_generator.rb +18 -14
  23. data/lib/generators/service/usecase/templates/usecase_spec.rb.erb +4 -4
  24. data/lib/generators/service/usecase/usecase_generator.rb +13 -6
  25. data/lib/generators/service/value_object/templates/value_object.rb.erb +17 -0
  26. data/lib/generators/service/value_object/value_object_generator.rb +38 -0
  27. metadata +11 -7
  28. data/lib/generators/service/getter/getter_generator.rb +0 -30
  29. data/lib/generators/service/getter/templates/getter.rb.erb +0 -8
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 378dc78b1fdeb1e415506b8edacb761ee0a0d78c90b5b1cf90c081a506cf6183
4
- data.tar.gz: 26395c6559e2f8124583c5002a519f39f32b781dfee944218a894bd6570f1715
3
+ metadata.gz: e58280d4d7d95c07974d99a7a0b9fdee2ba1b0dff5e3c757c82082a0be4d0384
4
+ data.tar.gz: 71d0e82c16cca76ed43149651c638cba4952ac4aa8265fd989f469c9920bee35
5
5
  SHA512:
6
- metadata.gz: 446882a4a2a56924868783acffa56fdf54b0f61eedb48e1c58846f3de7795f32d7afde0b74fb02425530590324bc240eaf9befedc8b0cb306f52f1cb75e1cde4
7
- data.tar.gz: 49e3cb994a9304e5b34d88d5abef25e4c79cbb751c1f466b8d232735534205e6092bb74219f4b05e4a46ec8e8cc295730c29b8b656e3ebcef612b98a9a0996f5
6
+ metadata.gz: d97e57b73f54c8d9b759f8917693d8b96cc22aec18f93d6f19f4e05cc0e5d8145d56ae180a6381ec3343c87ea6e14ad0d1d131e1277c3188a107ef6025113b5a
7
+ data.tar.gz: 5c2aff6a34ea6fdc6e42670afaba56096189fc968e2a8f2a20a131a98039792d4751480ba704d5bb3b15b00e209e7ee203616fe9abc4c912a7f77efd06a450e6
@@ -1,50 +1,50 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- command_service_object (0.6.5)
5
- hutch (= 1.0)
4
+ command_service_object (1.4.1)
5
+ hutch (~> 1.0)
6
6
  virtus (~> 1.0, >= 1.0.5)
7
7
 
8
8
  GEM
9
9
  remote: https://rubygems.org/
10
10
  specs:
11
- actioncable (5.2.3)
12
- actionpack (= 5.2.3)
11
+ actioncable (5.2.4.4)
12
+ actionpack (= 5.2.4.4)
13
13
  nio4r (~> 2.0)
14
14
  websocket-driver (>= 0.6.1)
15
- actionmailer (5.2.3)
16
- actionpack (= 5.2.3)
17
- actionview (= 5.2.3)
18
- activejob (= 5.2.3)
15
+ actionmailer (5.2.4.4)
16
+ actionpack (= 5.2.4.4)
17
+ actionview (= 5.2.4.4)
18
+ activejob (= 5.2.4.4)
19
19
  mail (~> 2.5, >= 2.5.4)
20
20
  rails-dom-testing (~> 2.0)
21
- actionpack (5.2.3)
22
- actionview (= 5.2.3)
23
- activesupport (= 5.2.3)
24
- rack (~> 2.0)
21
+ actionpack (5.2.4.4)
22
+ actionview (= 5.2.4.4)
23
+ activesupport (= 5.2.4.4)
24
+ rack (~> 2.0, >= 2.0.8)
25
25
  rack-test (>= 0.6.3)
26
26
  rails-dom-testing (~> 2.0)
27
27
  rails-html-sanitizer (~> 1.0, >= 1.0.2)
28
- actionview (5.2.3)
29
- activesupport (= 5.2.3)
28
+ actionview (5.2.4.4)
29
+ activesupport (= 5.2.4.4)
30
30
  builder (~> 3.1)
31
31
  erubi (~> 1.4)
32
32
  rails-dom-testing (~> 2.0)
33
33
  rails-html-sanitizer (~> 1.0, >= 1.0.3)
34
- activejob (5.2.3)
35
- activesupport (= 5.2.3)
34
+ activejob (5.2.4.4)
35
+ activesupport (= 5.2.4.4)
36
36
  globalid (>= 0.3.6)
37
- activemodel (5.2.3)
38
- activesupport (= 5.2.3)
39
- activerecord (5.2.3)
40
- activemodel (= 5.2.3)
41
- activesupport (= 5.2.3)
37
+ activemodel (5.2.4.4)
38
+ activesupport (= 5.2.4.4)
39
+ activerecord (5.2.4.4)
40
+ activemodel (= 5.2.4.4)
41
+ activesupport (= 5.2.4.4)
42
42
  arel (>= 9.0)
43
- activestorage (5.2.3)
44
- actionpack (= 5.2.3)
45
- activerecord (= 5.2.3)
43
+ activestorage (5.2.4.4)
44
+ actionpack (= 5.2.4.4)
45
+ activerecord (= 5.2.4.4)
46
46
  marcel (~> 0.3.1)
47
- activesupport (5.2.3)
47
+ activesupport (5.2.4.4)
48
48
  concurrent-ruby (~> 1.0, >= 1.0.2)
49
49
  i18n (>= 0.7, < 2)
50
50
  minitest (~> 5.1)
@@ -55,7 +55,7 @@ GEM
55
55
  descendants_tracker (~> 0.0.4)
56
56
  ice_nine (~> 0.11.0)
57
57
  thread_safe (~> 0.3, >= 0.3.1)
58
- builder (3.2.3)
58
+ builder (3.2.4)
59
59
  bunny (2.15.0)
60
60
  amq-protocol (~> 2.3, >= 2.3.1)
61
61
  byebug (9.0.6)
@@ -63,12 +63,12 @@ GEM
63
63
  json
64
64
  coercible (1.0.0)
65
65
  descendants_tracker (~> 0.0.1)
66
- concurrent-ruby (1.1.5)
66
+ concurrent-ruby (1.1.7)
67
67
  crass (1.0.6)
68
68
  descendants_tracker (0.0.4)
69
69
  thread_safe (~> 0.3, >= 0.3.1)
70
70
  equalizer (0.0.11)
71
- erubi (1.8.0)
71
+ erubi (1.9.0)
72
72
  globalid (0.4.2)
73
73
  activesupport (>= 4.2.0)
74
74
  hutch (1.0.0)
@@ -76,10 +76,10 @@ GEM
76
76
  bunny (>= 2.15, < 2.16)
77
77
  carrot-top (~> 0.0.7)
78
78
  multi_json (~> 1.14)
79
- i18n (1.6.0)
79
+ i18n (1.8.5)
80
80
  concurrent-ruby (~> 1.0)
81
81
  ice_nine (0.11.2)
82
- json (2.3.1)
82
+ json (2.5.1)
83
83
  loofah (2.7.0)
84
84
  crass (~> 1.0.2)
85
85
  nokogiri (>= 1.5.9)
@@ -87,60 +87,60 @@ GEM
87
87
  mini_mime (>= 0.1.1)
88
88
  marcel (0.3.3)
89
89
  mimemagic (~> 0.3.2)
90
- method_source (0.9.2)
91
- mimemagic (0.3.3)
92
- mini_mime (1.0.1)
90
+ method_source (1.0.0)
91
+ mimemagic (0.3.5)
92
+ mini_mime (1.0.2)
93
93
  mini_portile2 (2.4.0)
94
- minitest (5.11.3)
94
+ minitest (5.14.2)
95
95
  multi_json (1.15.0)
96
- nio4r (2.3.1)
96
+ nio4r (2.5.4)
97
97
  nokogiri (1.10.10)
98
98
  mini_portile2 (~> 2.4.0)
99
99
  rack (2.2.3)
100
100
  rack-test (1.1.0)
101
101
  rack (>= 1.0, < 3)
102
- rails (5.2.3)
103
- actioncable (= 5.2.3)
104
- actionmailer (= 5.2.3)
105
- actionpack (= 5.2.3)
106
- actionview (= 5.2.3)
107
- activejob (= 5.2.3)
108
- activemodel (= 5.2.3)
109
- activerecord (= 5.2.3)
110
- activestorage (= 5.2.3)
111
- activesupport (= 5.2.3)
102
+ rails (5.2.4.4)
103
+ actioncable (= 5.2.4.4)
104
+ actionmailer (= 5.2.4.4)
105
+ actionpack (= 5.2.4.4)
106
+ actionview (= 5.2.4.4)
107
+ activejob (= 5.2.4.4)
108
+ activemodel (= 5.2.4.4)
109
+ activerecord (= 5.2.4.4)
110
+ activestorage (= 5.2.4.4)
111
+ activesupport (= 5.2.4.4)
112
112
  bundler (>= 1.3.0)
113
- railties (= 5.2.3)
113
+ railties (= 5.2.4.4)
114
114
  sprockets-rails (>= 2.0.0)
115
115
  rails-dom-testing (2.0.3)
116
116
  activesupport (>= 4.2.0)
117
117
  nokogiri (>= 1.6)
118
- rails-html-sanitizer (1.0.4)
119
- loofah (~> 2.2, >= 2.2.2)
120
- railties (5.2.3)
121
- actionpack (= 5.2.3)
122
- activesupport (= 5.2.3)
118
+ rails-html-sanitizer (1.3.0)
119
+ loofah (~> 2.3)
120
+ railties (5.2.4.4)
121
+ actionpack (= 5.2.4.4)
122
+ activesupport (= 5.2.4.4)
123
123
  method_source
124
124
  rake (>= 0.8.7)
125
125
  thor (>= 0.19.0, < 2.0)
126
126
  rake (13.0.1)
127
- sprockets (3.7.2)
127
+ sprockets (4.0.2)
128
128
  concurrent-ruby (~> 1.0)
129
129
  rack (> 1, < 3)
130
- sprockets-rails (3.2.1)
130
+ sprockets-rails (3.2.2)
131
131
  actionpack (>= 4.0)
132
132
  activesupport (>= 4.0)
133
133
  sprockets (>= 3.0.0)
134
134
  thor (0.20.3)
135
135
  thread_safe (0.3.6)
136
- tzinfo (1.2.5)
136
+ tzinfo (1.2.7)
137
137
  thread_safe (~> 0.1)
138
138
  virtus (1.0.5)
139
139
  axiom-types (~> 0.1)
140
140
  coercible (~> 1.0)
141
141
  descendants_tracker (~> 0.0, >= 0.0.3)
142
142
  equalizer (~> 0.0, >= 0.0.9)
143
- websocket-driver (0.7.0)
143
+ websocket-driver (0.7.3)
144
144
  websocket-extensions (>= 0.1.0)
145
145
  websocket-extensions (0.1.5)
146
146
 
@@ -40,5 +40,5 @@ Gem::Specification.new do |spec|
40
40
  spec.add_development_dependency 'thor', '~> 0.20.3'
41
41
 
42
42
  spec.add_dependency 'virtus', '~> 1.0', '>= 1.0.5'
43
- spec.add_dependency 'hutch', '1.0'
43
+ spec.add_dependency 'hutch', '~> 1.0'
44
44
  end
@@ -3,7 +3,7 @@ module CommandServiceObject
3
3
  def check!(message, &block)
4
4
  raise "No block given" unless block_given?
5
5
 
6
- fail!(message) unless block.call
6
+ fail!(message) if block.call
7
7
  end
8
8
  end
9
9
  end
@@ -55,10 +55,12 @@ module CommandServiceObject
55
55
  end
56
56
 
57
57
  def micros(*names)
58
- service = to_s.split('::').first
58
+ service = to_s.split('::')
59
+ service.pop
59
60
 
60
61
  names.each do |name|
61
- obj = "#{service}/Usecases/Micros/#{name}".camelize.constantize
62
+ obj = "#{service.join('/')}/micros/#{name}".camelize.constantize
63
+
62
64
  _micros.add(obj)
63
65
  end
64
66
  end
@@ -1,3 +1,3 @@
1
1
  module CommandServiceObject
2
- VERSION = '1.1.0'.freeze
2
+ VERSION = '1.4.1'.freeze
3
3
  end
@@ -1,4 +1,5 @@
1
1
  require_relative '../setup/setup_generator.rb'
2
+ require_relative '../helper'
2
3
 
3
4
  module Service
4
5
  module Generators
@@ -10,7 +11,6 @@ module Service
10
11
  argument :commands, type: :array, default: [], banner: 'command command'
11
12
 
12
13
  def call
13
- invoke Service::Generators::SetupGenerator, [name]
14
14
  @model_attributes = model_attributes
15
15
 
16
16
  commands.each do |c|
@@ -23,17 +23,25 @@ module Service
23
23
  private
24
24
 
25
25
  def create_main(m)
26
- path = "app/services/#{service_name}/commands/#{m.underscore}.rb"
27
- template 'command.rb.erb', path unless options.skip_command?
26
+ path = "#{service_path}/commands/#{m.underscore}.rb"
27
+ template 'command.rb.erb', path
28
28
  end
29
29
 
30
30
  def create_test(m)
31
- path = "spec/services/#{service_name}/commands/#{m.underscore}_spec.rb"
31
+ path = "#{spec_path}/commands/#{m.underscore}_spec.rb"
32
32
  template 'command_spec.rb.erb', path
33
33
  end
34
34
 
35
35
  def service_name
36
- "#{name.underscore}_service"
36
+ Service::Helper.service_name(name)
37
+ end
38
+
39
+ def service_path
40
+ Service::Helper.service_path(name)
41
+ end
42
+
43
+ def spec_path
44
+ Service::Helper.spec_path(name)
37
45
  end
38
46
  end
39
47
  end
@@ -2,12 +2,12 @@
2
2
 
3
3
  require 'rails_helper'
4
4
 
5
- describe <%= service_name.classify %>::Commands::<%= @test %>, type: :model do
5
+ describe <%= service_name.classify %>::Commands::<%= @command %>, type: :model do
6
6
  describe 'attrubites' do
7
- it { expect(subject).to respond_to(:EX) }
7
+ <%# it { expect(subject).to respond_to(:EX) } %>
8
8
  end
9
9
 
10
10
  describe 'validatios' do
11
- it { should validate_presence_of(:EX) }
11
+ <%# it { should validate_presence_of(:EX) } %>
12
12
  end
13
13
  end
@@ -1,4 +1,5 @@
1
1
  require_relative '../setup/setup_generator.rb'
2
+ require_relative '../helper'
2
3
 
3
4
  module Service
4
5
  module Generators
@@ -7,15 +8,11 @@ module Service
7
8
 
8
9
  argument :entities, type: :array, default: [], banner: 'entities entities'
9
10
 
10
- def setup
11
- invoke Service::Generators::SetupGenerator, [name]
12
- end
13
-
14
11
  def create_micros
15
12
  entities.each do |m|
16
13
  @entity = m.classify
17
14
 
18
- path = "app/services/#{service_name}/entities/#{m.underscore}.rb"
15
+ path = "#{service_path}/entities/#{m.underscore}.rb"
19
16
  template 'entity.rb.erb', path
20
17
  end
21
18
  end
@@ -23,7 +20,15 @@ module Service
23
20
  private
24
21
 
25
22
  def service_name
26
- "#{name.underscore}_service"
23
+ Service::Helper.service_name(name)
24
+ end
25
+
26
+ def service_path
27
+ Service::Helper.service_path(name)
28
+ end
29
+
30
+ def spec_path
31
+ Service::Helper.spec_path(name)
27
32
  end
28
33
  end
29
34
  end
@@ -1,4 +1,5 @@
1
1
  require_relative '../setup/setup_generator.rb'
2
+ require_relative '../helper'
2
3
 
3
4
  module Service
4
5
  module Generators
@@ -8,8 +9,6 @@ module Service
8
9
  argument :externals, type: :array, default: [], banner: 'external external'
9
10
 
10
11
  def create_externals
11
- invoke Service::Generators::SetupGenerator, [name]
12
-
13
12
  externals.each do |m|
14
13
  @external = m.classify
15
14
  create_main(m)
@@ -20,17 +19,25 @@ module Service
20
19
  private
21
20
 
22
21
  def create_main(m)
23
- path = "app/services/#{service_name}/externals/#{m.underscore}.rb"
22
+ path = "#{service_path}/externals/#{m.underscore}.rb"
24
23
  template 'external.rb.erb', path
25
24
  end
26
25
 
27
26
  def create_test(m)
28
- path = "spec/services/#{service_name}/externals/#{m.underscore}_spec.rb"
27
+ path = "#{spec_path}/externals/#{m.underscore}_spec.rb"
29
28
  template 'external_spec.rb.erb', path
30
29
  end
31
30
 
32
31
  def service_name
33
- "#{name.underscore}_service"
32
+ Service::Helper.service_name(name)
33
+ end
34
+
35
+ def service_path
36
+ Service::Helper.service_path(name)
37
+ end
38
+
39
+ def spec_path
40
+ Service::Helper.spec_path(name)
34
41
  end
35
42
  end
36
43
  end
@@ -4,7 +4,7 @@ require 'rails_helper'
4
4
 
5
5
  describe <%= service_name.classify %>::Externals::<%= @external %> do
6
6
  # Example
7
- # context "when success" do
7
+ # context 'when success' do
8
8
  # it 'should be okay?' do
9
9
  # expect(subject.[method_name]).to eql([result])
10
10
  # end
@@ -0,0 +1,23 @@
1
+ module Service
2
+ module Helper
3
+ extend self
4
+
5
+ def service_name(arg)
6
+ if arg.include? "/"
7
+ root = arg.split("/").first
8
+ sub_domain = arg.split("/").last
9
+ "#{root.underscore}_service/#{sub_domain}"
10
+ else
11
+ "#{arg.underscore}_service"
12
+ end
13
+ end
14
+
15
+ def service_path(arg)
16
+ "app/services/#{service_name(arg)}"
17
+ end
18
+
19
+ def spec_path(arg)
20
+ "spec/services/#{service_name(arg)}"
21
+ end
22
+ end
23
+ end
@@ -7,33 +7,37 @@ class ApplicationService
7
7
  def call(cmd)
8
8
  @cmd = cmd
9
9
  @bm = Benchmark.measure do
10
- raise Errors::InvalidCommand, cmd.class if cmd.invalid?
10
+ raise Errors::InvalidCommand if cmd.invalid?
11
11
 
12
12
  @usecase = usecase_class.new(cmd)
13
- raise Errors::NotAuthorizedError, cmd.class unless usecase.allowed?
13
+
14
+ raise Errors::NotAuthorizedError unless usecase.allowed?
14
15
 
15
16
  @result = ServiceResult.new { usecase.call }
16
17
 
17
18
  rollback if result.error.present?
19
+ usecase.broadcast if result.ok?
18
20
  end
19
21
 
20
22
  log_command
21
23
  result
22
24
  rescue StandardError => e
23
- ServiceResult.new { raise e }
25
+ ServiceResult.new { raise e }
24
26
  end
25
27
 
26
28
  def rollback
27
29
  usecase.rollback_micros
28
30
  usecase.rollback
29
- log_errors(result.error)
30
31
  end
31
32
 
32
33
  private
33
34
 
34
35
  def log_command
35
- service_logger = ActiveSupport::Logger.new(Rails.root.join('log', 'services.log').to_s)
36
- service_logger.formatter = proc do |severity, datetime, progname, msg|
36
+ FileUtils.mkdir_p 'log/services'
37
+ service_logger = ActiveSupport::Logger.new(
38
+ Rails.root.join('log', 'services', "#{service_name.underscore}.log").to_s, 'daily'
39
+ )
40
+ service_logger.formatter = proc do |_severity, datetime, _progname, msg|
37
41
  "[#{msg['usecase']}] [#{msg['status']}] [#{datetime.to_s(:db)} ##{Process.pid}] -- #{msg['body']}\n"
38
42
  end
39
43
  log_body = result.ok? ? success_log : failure_log
@@ -46,10 +50,10 @@ class ApplicationService
46
50
  usecase: "#{service_name}::#{usecase_name}",
47
51
  status: 'success',
48
52
  body: {
49
- cmd: cmd.as_json,
50
- result: result.value!.as_json,
51
- benchmark: bm.as_json
52
- }
53
+ cmd: cmd.as_json,
54
+ result: result.value!.as_json,
55
+ benchmark: bm.as_json
56
+ }
53
57
  }.as_json
54
58
  end
55
59
 
@@ -78,3 +82,13 @@ class ApplicationService
78
82
  end
79
83
  end
80
84
  end
85
+
86
+ module Errors
87
+ class NotAuthorizedError < StandardError
88
+ def initialize(msg: 'not allowd')
89
+ super(msg)
90
+ end
91
+ end
92
+
93
+ class InvalidCommand < StandardError; end
94
+ end
@@ -2,10 +2,10 @@
2
2
 
3
3
  class CommandBase
4
4
  include ActiveModel::Validations
5
- include Virtus.model(nullify_blank: true)
5
+ include Virtus.model
6
6
 
7
7
  # if you need to enable policies add issuer attribute
8
- attribute :issuer, Object, default: :default_issuer
8
+ attribute :issuer, Issuer, default: :default_issuer
9
9
 
10
10
  private
11
11
 
@@ -0,0 +1,10 @@
1
+ class Issuer
2
+ include ActiveModel::Validations
3
+ include Virtus.model
4
+
5
+ attribute :id, String
6
+ attribute :type, String
7
+ attribute :scope, Array[String], default: []
8
+
9
+ validates :id, :type, presence: true
10
+ end
@@ -0,0 +1,7 @@
1
+ require 'json'
2
+
3
+ class Util::Json < Virtus::Attribute
4
+ def coerce(value)
5
+ value.is_a?(::Hash) ? value : JSON.parse(value)
6
+ end
7
+ end
@@ -0,0 +1,4 @@
1
+ class ValueObjectBase
2
+ include ActiveModel::Validations
3
+ include Virtus.value_object
4
+ end
@@ -1,4 +1,5 @@
1
1
  require_relative '../setup/setup_generator.rb'
2
+ require_relative '../helper'
2
3
 
3
4
  module Service
4
5
  module Generators
@@ -7,15 +8,11 @@ module Service
7
8
 
8
9
  argument :listeners, type: :array, default: [], banner: 'Listener Listener'
9
10
 
10
- def setup
11
- invoke Service::Generators::SetupGenerator, [name]
12
- end
13
-
14
11
  def create_micros
15
12
  listeners.each do |m|
16
13
  @listener = m.classify
17
14
 
18
- path = "app/services/#{service_name}/listeners/#{m.underscore}.rb"
15
+ path = "#{service_path}/listeners/#{m.underscore}.rb"
19
16
  template 'listener.rb.erb', path
20
17
  end
21
18
  end
@@ -23,7 +20,15 @@ module Service
23
20
  private
24
21
 
25
22
  def service_name
26
- "#{name.underscore}_service"
23
+ Service::Helper.service_name(name)
24
+ end
25
+
26
+ def service_path
27
+ Service::Helper.service_path(name)
28
+ end
29
+
30
+ def spec_path
31
+ Service::Helper.spec_path(name)
27
32
  end
28
33
  end
29
34
  end
@@ -1,4 +1,5 @@
1
1
  require_relative '../setup/setup_generator.rb'
2
+ require_relative '../helper'
2
3
 
3
4
  module Service
4
5
  module Generators
@@ -7,15 +8,11 @@ module Service
7
8
 
8
9
  argument :micros, type: :array, default: [], banner: 'micros micros'
9
10
 
10
- def setup
11
- invoke Service::Generators::SetupGenerator, [name]
12
- end
13
-
14
11
  def create_micros
15
12
  micros.each do |m|
16
13
  @micro = m.classify
17
14
 
18
- path = "app/services/#{service_name}/usecases/micros/#{m.underscore}.rb"
15
+ path = "#{service_path}/usecases/micros/#{m.underscore}.rb"
19
16
  template 'micro.rb.erb', path
20
17
  end
21
18
  end
@@ -23,7 +20,15 @@ module Service
23
20
  private
24
21
 
25
22
  def service_name
26
- "#{name.underscore}_service"
23
+ Service::Helper.service_name(name)
24
+ end
25
+
26
+ def service_path
27
+ Service::Helper.service_path(name)
28
+ end
29
+
30
+ def spec_path
31
+ Service::Helper.spec_path(name)
27
32
  end
28
33
  end
29
34
  end
@@ -1,4 +1,5 @@
1
1
  require_relative '../setup/setup_generator.rb'
2
+ require_relative '../helper'
2
3
 
3
4
  module Service
4
5
  module Generators
@@ -7,15 +8,11 @@ module Service
7
8
 
8
9
  argument :queries, type: :array, default: [], banner: 'query query'
9
10
 
10
- def setup
11
- invoke Service::Generators::SetupGenerator, [name]
12
- end
13
-
14
11
  def create_queries
15
12
  queries.each do |m|
16
13
  @query = m.classify
17
14
 
18
- path = "app/services/#{service_name}/queries/#{m.underscore}.rb"
15
+ path = "#{service_path}/queries/#{m.underscore}.rb"
19
16
  template 'query.rb.erb', path
20
17
  end
21
18
  end
@@ -23,7 +20,15 @@ module Service
23
20
  private
24
21
 
25
22
  def service_name
26
- "#{name.underscore}_service"
23
+ Service::Helper.service_name(name)
24
+ end
25
+
26
+ def service_path
27
+ Service::Helper.service_path(name)
28
+ end
29
+
30
+ def spec_path
31
+ Service::Helper.spec_path(name)
27
32
  end
28
33
  end
29
34
  end
@@ -6,18 +6,13 @@ require_relative './usecase/usecase_generator.rb'
6
6
  require_relative './command/command_generator.rb'
7
7
  require 'rails/generators'
8
8
  require 'rails/generators/model_helpers'
9
+ require_relative './helper.rb'
9
10
 
10
11
  module Service
11
12
  module Generators
12
13
  class ServiceGenerator < Rails::Generators::NamedBase
13
14
  argument :usecases, type: :array, default: [], banner: 'usecase usecase'
14
15
 
15
- # Skiping options
16
- class_option :skip_usecase, type: :boolean, default: false, aliases: '-U'
17
- class_option :skip_command, type: :boolean, default: false, aliases: '-C'
18
- class_option :skip_entity, type: :boolean, default: false, aliases: '-E'
19
- class_option :skip_test, type: :boolean, default: false, aliases: '-T'
20
-
21
16
  def install_if_not
22
17
  return if File.exist?('app/services')
23
18
 
@@ -29,16 +24,26 @@ module Service
29
24
  end
30
25
 
31
26
  def generate_usecases
32
- return if options.skip_usecase?
33
-
34
27
  invoke Service::Generators::UsecaseGenerator, [name, usecases]
35
28
  end
36
29
 
37
30
  def generate_commands
38
- return if options.skip_command?
39
-
40
31
  invoke Service::Generators::CommandGenerator, [name, usecases]
41
32
  end
33
+
34
+ private
35
+
36
+ def service_name
37
+ Service::Helper.service_name(name)
38
+ end
39
+
40
+ def service_path
41
+ Service::Helper.service_path(name)
42
+ end
43
+
44
+ def spec_path
45
+ Service::Helper.spec_path(name)
46
+ end
42
47
  end
43
48
  end
44
49
  end
@@ -1,29 +1,33 @@
1
+ require_relative '../helper'
2
+
1
3
  module Service
2
4
  module Generators
3
5
  class SetupGenerator < Rails::Generators::Base
4
6
  source_root File.expand_path('templates', __dir__)
5
7
 
8
+ DIRS = %w(listeners jobs externals queries usecases commands entities usecases/micros)
9
+
6
10
  def setup
7
- return if File.exist?("app/services/#{service_name}")
8
-
9
- empty_directory("app/services/#{service_name}")
10
- empty_directory("app/services/#{service_name}/listeners")
11
- empty_directory("app/services/#{service_name}/jobs")
12
- empty_directory("app/services/#{service_name}/externals")
13
- empty_directory("app/services/#{service_name}/queries")
14
- empty_directory("app/services/#{service_name}/usecases")
15
- empty_directory("app/services/#{service_name}/commands")
16
- empty_directory("app/services/#{service_name}/entities")
17
- empty_directory("app/services/#{service_name}/usecases/micros")
18
-
19
- path = "app/services/#{service_name}/doc.md"
11
+ DIRS.each do |dir|
12
+ empty_directory("#{service_path}/#{dir}")
13
+ end
14
+
15
+ path = "#{service_path}/doc.md"
20
16
  template 'doc.md.erb', path unless File.exist?(path)
21
17
  end
22
18
 
23
19
  private
24
20
 
25
21
  def service_name
26
- "#{args.first.underscore}_service"
22
+ Service::Helper.service_name(args.first)
23
+ end
24
+
25
+ def service_path
26
+ Service::Helper.service_path(args.first)
27
+ end
28
+
29
+ def spec_path
30
+ Service::Helper.spec_path(args.first)
27
31
  end
28
32
  end
29
33
  end
@@ -2,12 +2,12 @@
2
2
 
3
3
  require 'rails_helper'
4
4
 
5
- describe <%= service_name.classify %>::Usecases::<%= @test %> do
6
- let(:cmd) { <%= service_name.classify %>::Commands::<%= @test %>.new(cmd_params) }
5
+ describe <%= service_name.classify %>::Usecases::<%= @usecase %> do
6
+ let(:cmd) { <%= service_name.classify %>::Commands::<%= @usecase %>.new(cmd_params) }
7
7
  let(:cmd_default_params) {{ name: 'test_name' }}
8
8
 
9
- context "when success" do
10
- let(:cmd_params) { cmd_default_params.merge!({ name: 'valid_name' }) }
9
+ context 'when success' do
10
+ let(:cmd_params) { cmd_default_params }
11
11
  let!(:result) { ApplicationService.call(cmd) }
12
12
 
13
13
  it 'should be okay?' do
@@ -1,4 +1,5 @@
1
1
  require_relative '../setup/setup_generator.rb'
2
+ require_relative '../helper'
2
3
 
3
4
  module Service
4
5
  module Generators
@@ -8,8 +9,6 @@ module Service
8
9
  argument :usecases, type: :array, default: [], banner: 'usecase usecase'
9
10
 
10
11
  def call
11
- invoke Service::Generators::SetupGenerator, [name]
12
-
13
12
  usecases.each do |u|
14
13
  @usecase = u.classify
15
14
  create_main(u)
@@ -20,17 +19,25 @@ module Service
20
19
  private
21
20
 
22
21
  def create_main(m)
23
- path = "app/services/#{service_name}/usecases/#{m.underscore}.rb"
24
- template 'usecase.rb.erb', path unless options.skip_command?
22
+ path = "#{service_path}/usecases/#{m.underscore}.rb"
23
+ template 'usecase.rb.erb', path
25
24
  end
26
25
 
27
26
  def create_test(m)
28
- path = "spec/services/#{service_name}/usecases/#{m.underscore}_spec.rb"
27
+ path = "#{spec_path}/usecases/#{m.underscore}_spec.rb"
29
28
  template 'usecase_spec.rb.erb', path
30
29
  end
31
30
 
32
31
  def service_name
33
- "#{name.underscore}_service"
32
+ Service::Helper.service_name(name)
33
+ end
34
+
35
+ def service_path
36
+ Service::Helper.service_path(name)
37
+ end
38
+
39
+ def spec_path
40
+ Service::Helper.spec_path(name)
34
41
  end
35
42
  end
36
43
  end
@@ -0,0 +1,17 @@
1
+ # frozen_string_literal: true
2
+
3
+ module <%= service_name.classify %>::ValueObjects
4
+ class <%= @value_object %> < ValueObjectBase
5
+ # You can read Virtus gem doc for more info.
6
+ # https://github.com/solnic/virtus
7
+
8
+ # Attributes
9
+ # values do
10
+ # attribute :latitude, Float
11
+ # attribute :longitude, Float
12
+ # end
13
+
14
+ # Validations
15
+ # validates :REPLACE_ME, presence: true
16
+ end
17
+ end
@@ -0,0 +1,38 @@
1
+ require_relative '../setup/setup_generator.rb'
2
+ require_relative '../helper'
3
+
4
+ module Service
5
+ module Generators
6
+ class ValueObjectGenerator < Rails::Generators::NamedBase
7
+ source_root File.expand_path('templates', __dir__)
8
+
9
+ argument :value_objects, type: :array, default: [], banner: 'value_object value_object'
10
+
11
+ def call
12
+ value_objects.each do |u|
13
+ @value_object = u.classify
14
+ create_main(u)
15
+ end
16
+ end
17
+
18
+ private
19
+
20
+ def create_main(m)
21
+ path = "#{service_path}/value_objects/#{m.underscore}.rb"
22
+ template 'value_object.rb.erb', path
23
+ end
24
+
25
+ def service_name
26
+ Service::Helper.service_name(name)
27
+ end
28
+
29
+ def service_path
30
+ Service::Helper.service_path(name)
31
+ end
32
+
33
+ def spec_path
34
+ Service::Helper.spec_path(name)
35
+ end
36
+ end
37
+ end
38
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: command_service_object
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.1.0
4
+ version: 1.4.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Adham EL-Deeb
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: exe
11
11
  cert_chain: []
12
- date: 2020-10-05 00:00:00.000000000 Z
12
+ date: 2021-01-19 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: bundler
@@ -125,14 +125,14 @@ dependencies:
125
125
  name: hutch
126
126
  requirement: !ruby/object:Gem::Requirement
127
127
  requirements:
128
- - - '='
128
+ - - "~>"
129
129
  - !ruby/object:Gem::Version
130
130
  version: '1.0'
131
131
  type: :runtime
132
132
  prerelease: false
133
133
  version_requirements: !ruby/object:Gem::Requirement
134
134
  requirements:
135
- - - '='
135
+ - - "~>"
136
136
  - !ruby/object:Gem::Version
137
137
  version: '1.0'
138
138
  description: command_service_object gem helps you to generate service and command
@@ -181,16 +181,18 @@ files:
181
181
  - lib/generators/service/external/templates/external.rb.erb
182
182
  - lib/generators/service/external/templates/external_spec.rb.erb
183
183
  - lib/generators/service/external/templates/external_test.rb.erb
184
- - lib/generators/service/getter/getter_generator.rb
185
- - lib/generators/service/getter/templates/getter.rb.erb
184
+ - lib/generators/service/helper.rb
186
185
  - lib/generators/service/install/install_generator.rb
187
186
  - lib/generators/service/install/templates/initializer.rb
188
187
  - lib/generators/service/install/templates/services/application_service.rb
189
188
  - lib/generators/service/install/templates/services/case_base.rb
190
189
  - lib/generators/service/install/templates/services/command_base.rb
190
+ - lib/generators/service/install/templates/services/issuer.rb
191
191
  - lib/generators/service/install/templates/services/listener_base.rb
192
192
  - lib/generators/service/install/templates/services/query_base.rb
193
193
  - lib/generators/service/install/templates/services/service_result.rb
194
+ - lib/generators/service/install/templates/services/util/json.rb
195
+ - lib/generators/service/install/templates/services/value_object_base.rb
194
196
  - lib/generators/service/listener/listener_generator.rb
195
197
  - lib/generators/service/listener/templates/listener.rb.erb
196
198
  - lib/generators/service/micro/micro_generator.rb
@@ -205,6 +207,8 @@ files:
205
207
  - lib/generators/service/usecase/templates/usecase.rb.erb
206
208
  - lib/generators/service/usecase/templates/usecase_spec.rb.erb
207
209
  - lib/generators/service/usecase/usecase_generator.rb
210
+ - lib/generators/service/value_object/templates/value_object.rb.erb
211
+ - lib/generators/service/value_object/value_object_generator.rb
208
212
  homepage: https://github.com/adham90/command_service_object
209
213
  licenses:
210
214
  - MIT
@@ -228,7 +232,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
228
232
  - !ruby/object:Gem::Version
229
233
  version: '0'
230
234
  requirements: []
231
- rubygems_version: 3.1.2
235
+ rubygems_version: 3.1.4
232
236
  signing_key:
233
237
  specification_version: 4
234
238
  summary: Rails Generator for command service object.
@@ -1,30 +0,0 @@
1
- require_relative '../setup/setup_generator.rb'
2
-
3
- module Service
4
- module Generators
5
- class GetterGenerator < Rails::Generators::NamedBase
6
- source_root File.expand_path('templates', __dir__)
7
-
8
- argument :getters, type: :array, default: [], banner: 'getter getter'
9
-
10
- def setup
11
- invoke Service::Generators::SetupGenerator, [name]
12
- end
13
-
14
- def create_getters
15
- getters.each do |g|
16
- @getter = g.classify
17
-
18
- path = "app/services/#{service_name}/usecases/getters/#{g.underscore}.rb"
19
- template 'getter.rb.erb', path
20
- end
21
- end
22
-
23
- private
24
-
25
- def service_name
26
- "#{name.underscore}_service"
27
- end
28
- end
29
- end
30
- end
@@ -1,8 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module <%= service_name.classify %>::Usecases::Getters
4
- class <%= @getter %>
5
- def call(*args)
6
- end
7
- end
8
- end