command_service_object 1.0.0 → 1.4.0

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