command_service_object 1.0.0 → 1.4.0

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 (27) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile.lock +61 -61
  3. data/README.md +4 -3
  4. data/command_service_object.gemspec +2 -2
  5. data/lib/command_service_object.rb +1 -0
  6. data/lib/command_service_object/helpers/check_helper.rb +9 -0
  7. data/lib/command_service_object/hooks.rb +4 -2
  8. data/lib/command_service_object/version.rb +1 -1
  9. data/lib/generators/service/command/command_generator.rb +13 -5
  10. data/lib/generators/service/entity/entity_generator.rb +11 -6
  11. data/lib/generators/service/external/external_generator.rb +12 -5
  12. data/lib/generators/service/helper.rb +23 -0
  13. data/lib/generators/service/install/templates/services/application_service.rb +29 -19
  14. data/lib/generators/service/install/templates/services/case_base.rb +1 -0
  15. data/lib/generators/service/install/templates/services/value_object_base.rb +4 -0
  16. data/lib/generators/service/listener/listener_generator.rb +11 -6
  17. data/lib/generators/service/micro/micro_generator.rb +11 -6
  18. data/lib/generators/service/query/query_generator.rb +11 -6
  19. data/lib/generators/service/service_generator.rb +15 -10
  20. data/lib/generators/service/setup/setup_generator.rb +18 -14
  21. data/lib/generators/service/usecase/templates/usecase.rb.erb +5 -1
  22. data/lib/generators/service/usecase/usecase_generator.rb +13 -6
  23. data/lib/generators/service/value_object/templates/value_object.rb.erb +17 -0
  24. data/lib/generators/service/value_object/value_object_generator.rb +38 -0
  25. metadata +11 -8
  26. data/lib/generators/service/getter/getter_generator.rb +0 -30
  27. 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: 4f7f0b0d9360f1cd9db2ce8bbab1f35f44f0d4d631f7ff356607509237807dbc
4
- data.tar.gz: badfbd6e44876729b1dde74a4dabedd77e11a0b8e0decc333fbe4b43ab9a3e2f
3
+ metadata.gz: 36d2b1f785b76803f0333bb3747c5e0fe01f6670573afb93305df3136f00ab46
4
+ data.tar.gz: e37a9faf02baef49903868a63a0fe5912f8a6e3b01272ccdd90d51d3826b2ec7
5
5
  SHA512:
6
- metadata.gz: e65c2c56b4d32992a78753248012787b888aeaf099d5d8a4bf93e4a1b1efbb0a6c271ed83b79785a66748e0606175231c02ecef3bb1b267da9fee1d8f4cb4c69
7
- data.tar.gz: 9c93b24c8f6831dab02c1a603474821ae37de77b5f3ede2ca3bdb8f91a48a2c68228285ca0fb1b8cae624658d7256827e31439b49e8d92a15501f221786491e8
6
+ metadata.gz: 0ea1e2f5b1ea28fdf19f63a6f3ed068d7f6eeb193c0dd3e815af26181740462aae1310ae3d472a161ebf737c02980e9b255c68d323bb08e56c28df797610fb2e
7
+ data.tar.gz: 8188249f9cfcff0deb07d00bc46da92b7afa5fbc6f2108927f2573fd0a9fda7f67d9988f75757a84a47150d22306dab2fd673642b70123c83c8a6914669621f2
@@ -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.1.0)
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)
67
- crass (1.0.4)
66
+ concurrent-ruby (1.1.7)
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,73 +76,73 @@ 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
82
  json (2.3.1)
83
- loofah (2.2.3)
83
+ loofah (2.7.0)
84
84
  crass (~> 1.0.2)
85
85
  nokogiri (>= 1.5.9)
86
86
  mail (2.7.1)
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)
97
- nokogiri (1.10.4)
96
+ nio4r (2.5.4)
97
+ nokogiri (1.10.10)
98
98
  mini_portile2 (~> 2.4.0)
99
- rack (2.0.7)
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
- rake (10.5.0)
127
- sprockets (3.7.2)
126
+ rake (13.0.1)
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
- websocket-extensions (0.1.3)
145
+ websocket-extensions (0.1.5)
146
146
 
147
147
  PLATFORMS
148
148
  ruby
@@ -153,7 +153,7 @@ DEPENDENCIES
153
153
  command_service_object!
154
154
  minitest (~> 5.11, >= 5.11.3)
155
155
  rails (~> 5.0)
156
- rake (~> 10.0)
156
+ rake (~> 13.0)
157
157
  thor (~> 0.20.3)
158
158
 
159
159
  BUNDLED WITH
data/README.md CHANGED
@@ -18,13 +18,14 @@ Service consists of several objects { `Command Object` `Usecase Object` And `Err
18
18
  - **Listeners:** An event listener that waits for an event outside the service to occur.
19
19
  - **Entities:** Many objects are not fundamentally defined by their attributes, but rather by a thread of continuity and identity.
20
20
 
21
- #### Result Object
21
+ ### Result Object
22
22
 
23
23
  In case of successful or failure `ApplicationService` the responsible object for all services will return `service_result` object this object contain `value!` method containing successful call result, and `errors` method containing failure `errors` objects.
24
24
 
25
- #### Business Logic Failures
25
+ ### Helpers:
26
26
 
27
- To raise bussiness logic failures you can use `fail!` helper method with `message: String, extra_data: Hash` arguments.
27
+ - Fail: You can use `fail!` helper to raise business logic failures, ex: `fail!('user should not have any active cards')`.
28
+ - Check: To do business logic validations you can use `check!` helper ex: `check!('user should not have any active cards') { user.active_cards.empty? }`, if the given block returns false then it will raise fail! with the given message.
28
29
 
29
30
  > You can check if the result successful or not by using `ok?` method.
30
31
 
@@ -36,9 +36,9 @@ Gem::Specification.new do |spec|
36
36
  spec.add_development_dependency 'byebug', '~> 9.0.6'
37
37
  spec.add_development_dependency 'minitest', '~> 5.11', '>= 5.11.3'
38
38
  spec.add_development_dependency 'rails', '~> 5.0'
39
- spec.add_development_dependency 'rake', '~> 10.0'
39
+ spec.add_development_dependency 'rake', '~> 13.0'
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
@@ -4,6 +4,7 @@ require 'command_service_object/failure'
4
4
  require 'command_service_object/helpers/model_helper'
5
5
  require 'command_service_object/helpers/controller_helper'
6
6
  require 'command_service_object/helpers/failure_helper'
7
+ require 'command_service_object/helpers/check_helper'
7
8
  require 'command_service_object/hooks'
8
9
  require 'virtus'
9
10
 
@@ -0,0 +1,9 @@
1
+ module CommandServiceObject
2
+ module CheckHelper
3
+ def check!(message, &block)
4
+ raise "No block given" unless block_given?
5
+
6
+ fail!(message) if block.call
7
+ end
8
+ end
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.0.0'.freeze
2
+ VERSION = '1.4.0'.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
@@ -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
@@ -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
@@ -17,12 +17,10 @@ class ApplicationService
17
17
  rollback if result.error.present?
18
18
  end
19
19
 
20
+ log_command
20
21
  result
21
22
  rescue StandardError => e
22
- log_errors(e)
23
- ServiceResult.new { raise e }
24
- ensure
25
- log_command
23
+ ServiceResult.new { raise e }
26
24
  end
27
25
 
28
26
  def rollback
@@ -33,26 +31,38 @@ class ApplicationService
33
31
 
34
32
  private
35
33
 
36
- def log_errors(err)
37
- return if err.class.is_a?(CommandServiceObject::Failure)
38
- # Add your logging logic
39
- # ex:
40
- # Rollbar.error(err)
41
- end
42
-
43
34
  def log_command
44
- service_logger = ActiveSupport::TaggedLogging.new(ActiveSupport::Logger.new(Rails.root.join('log', 'services.log').to_s))
45
- status = result.ok? ? 'success' : 'faild'
35
+ service_logger = ActiveSupport::Logger.new(Rails.root.join('log', 'services.log').to_s)
36
+ service_logger.formatter = proc do |severity, datetime, progname, msg|
37
+ "[#{msg['usecase']}] [#{msg['status']}] [#{datetime.to_s(:db)} ##{Process.pid}] -- #{msg['body']}\n"
38
+ end
39
+ log_body = result.ok? ? success_log : failure_log
46
40
 
47
- service_logger.tagged(service_name, usecase_name, status) do
48
- service_logger.info(
49
- {
41
+ service_logger.info(log_body)
42
+ end
43
+
44
+ def success_log
45
+ {
46
+ usecase: "#{service_name}::#{usecase_name}",
47
+ status: 'success',
48
+ body: {
50
49
  cmd: cmd.as_json,
51
50
  result: result.value!.as_json,
52
51
  benchmark: bm.as_json
53
- }.as_json
54
- )
55
- end
52
+ }
53
+ }.as_json
54
+ end
55
+
56
+ def failure_log
57
+ {
58
+ usecase: "#{service_name}::#{usecase_name}",
59
+ status: 'faild',
60
+ body: {
61
+ cmd: cmd.as_json,
62
+ error: result.error.to_s,
63
+ benchmark: bm.as_json
64
+ }
65
+ }.as_json
56
66
  end
57
67
 
58
68
  def usecase_class
@@ -5,6 +5,7 @@ require 'hutch'
5
5
  class CaseBase
6
6
  include CommandServiceObject::Hooks
7
7
  include CommandServiceObject::FailureHelper
8
+ include CommandServiceObject::CheckHelper
8
9
 
9
10
  attr_reader :cmd, :issuer, :right_name
10
11
  alias_attribute :payload, :cmd
@@ -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
@@ -7,6 +7,10 @@ module <%= service_name.classify %>::Usecases
7
7
  # methods for Business logic.
8
8
  #
9
9
  def call
10
+ # Use check! for business logic validation,
11
+ # If the given block returns false then it will raise a business logic failure with the given message.
12
+ # Ex: check!("user should not have any active cards") { cmd.issuer.active_cards.empty? }
13
+
10
14
  replace_me
11
15
 
12
16
  output
@@ -31,7 +35,7 @@ module <%= service_name.classify %>::Usecases
31
35
  end
32
36
 
33
37
  def broadcast
34
- Hutch.publish('<%= "#{service_name}_#{@usecase.underscore}" %>', subject: {}, action: '<%= "#{@usecase.underscore}" %>')
38
+ Hutch.publish('<%= service_name %>', action: '<%= "#{@usecase.underscore}" %>', subject: {})
35
39
  end
36
40
 
37
41
  private
@@ -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.0.0
4
+ version: 1.4.0
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-09-23 00:00:00.000000000 Z
12
+ date: 2020-10-24 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: bundler
@@ -79,14 +79,14 @@ dependencies:
79
79
  requirements:
80
80
  - - "~>"
81
81
  - !ruby/object:Gem::Version
82
- version: '10.0'
82
+ version: '13.0'
83
83
  type: :development
84
84
  prerelease: false
85
85
  version_requirements: !ruby/object:Gem::Requirement
86
86
  requirements:
87
87
  - - "~>"
88
88
  - !ruby/object:Gem::Version
89
- version: '10.0'
89
+ version: '13.0'
90
90
  - !ruby/object:Gem::Dependency
91
91
  name: thor
92
92
  requirement: !ruby/object:Gem::Requirement
@@ -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
@@ -162,6 +162,7 @@ files:
162
162
  - lib/command_service_object.rb
163
163
  - lib/command_service_object/configuration.rb
164
164
  - lib/command_service_object/failure.rb
165
+ - lib/command_service_object/helpers/check_helper.rb
165
166
  - lib/command_service_object/helpers/controller_helper.rb
166
167
  - lib/command_service_object/helpers/failure_helper.rb
167
168
  - lib/command_service_object/helpers/model_helper.rb
@@ -180,8 +181,7 @@ files:
180
181
  - lib/generators/service/external/templates/external.rb.erb
181
182
  - lib/generators/service/external/templates/external_spec.rb.erb
182
183
  - lib/generators/service/external/templates/external_test.rb.erb
183
- - lib/generators/service/getter/getter_generator.rb
184
- - lib/generators/service/getter/templates/getter.rb.erb
184
+ - lib/generators/service/helper.rb
185
185
  - lib/generators/service/install/install_generator.rb
186
186
  - lib/generators/service/install/templates/initializer.rb
187
187
  - lib/generators/service/install/templates/services/application_service.rb
@@ -190,6 +190,7 @@ files:
190
190
  - lib/generators/service/install/templates/services/listener_base.rb
191
191
  - lib/generators/service/install/templates/services/query_base.rb
192
192
  - lib/generators/service/install/templates/services/service_result.rb
193
+ - lib/generators/service/install/templates/services/value_object_base.rb
193
194
  - lib/generators/service/listener/listener_generator.rb
194
195
  - lib/generators/service/listener/templates/listener.rb.erb
195
196
  - lib/generators/service/micro/micro_generator.rb
@@ -204,6 +205,8 @@ files:
204
205
  - lib/generators/service/usecase/templates/usecase.rb.erb
205
206
  - lib/generators/service/usecase/templates/usecase_spec.rb.erb
206
207
  - lib/generators/service/usecase/usecase_generator.rb
208
+ - lib/generators/service/value_object/templates/value_object.rb.erb
209
+ - lib/generators/service/value_object/value_object_generator.rb
207
210
  homepage: https://github.com/adham90/command_service_object
208
211
  licenses:
209
212
  - MIT
@@ -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