command_service_object 0.6.4 → 1.2.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 (41) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile.lock +74 -61
  3. data/README.md +41 -22
  4. data/command_service_object.gemspec +2 -1
  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/version.rb +1 -1
  8. data/lib/generators/.DS_Store +0 -0
  9. data/lib/generators/service/command/command_generator.rb +23 -3
  10. data/lib/generators/service/{test/templates/rspec/command.rb.erb → command/templates/command_spec.rb.erb} +0 -0
  11. data/lib/generators/service/entity/entity_generator.rb +39 -0
  12. data/lib/generators/service/entity/templates/entity.rb.erb +9 -0
  13. data/lib/generators/service/external/external_generator.rb +46 -0
  14. data/lib/generators/service/external/templates/external.rb.erb +16 -0
  15. data/lib/generators/service/external/templates/external_spec.rb.erb +12 -0
  16. data/lib/generators/service/external/templates/external_test.rb.erb +0 -0
  17. data/lib/generators/service/helper.rb +23 -0
  18. data/lib/generators/service/install/templates/initializer.rb +5 -0
  19. data/lib/generators/service/install/templates/services/application_service.rb +57 -16
  20. data/lib/generators/service/install/templates/services/case_base.rb +4 -0
  21. data/lib/generators/service/install/templates/services/listener_base.rb +7 -0
  22. data/lib/generators/service/install/templates/services/query_base.rb +55 -0
  23. data/lib/generators/service/listener/listener_generator.rb +39 -0
  24. data/lib/generators/service/listener/templates/listener.rb.erb +11 -0
  25. data/lib/generators/service/micro/micro_generator.rb +11 -2
  26. data/lib/generators/service/query/USAGE +8 -0
  27. data/lib/generators/service/query/query_generator.rb +39 -0
  28. data/lib/generators/service/query/templates/query.rb.erb +22 -0
  29. data/lib/generators/service/service_generator.rb +13 -4
  30. data/lib/generators/service/setup/setup_generator.rb +20 -6
  31. data/lib/generators/service/setup/templates/doc.md.erb +39 -0
  32. data/lib/generators/service/usecase/templates/usecase.rb.erb +17 -3
  33. data/lib/generators/service/{test/templates/rspec/usecase.rb.erb → usecase/templates/usecase_spec.rb.erb} +0 -0
  34. data/lib/generators/service/usecase/usecase_generator.rb +22 -3
  35. metadata +40 -15
  36. data/lib/generators/service/getter/getter_generator.rb +0 -30
  37. data/lib/generators/service/getter/templates/getter.rb.erb +0 -8
  38. data/lib/generators/service/policies.rb +0 -5
  39. data/lib/generators/service/test/USAGE +0 -8
  40. data/lib/generators/service/test/templates/minitest/usecase.rb.erb +0 -1
  41. data/lib/generators/service/test/test_generator.rb +0 -72
@@ -4,9 +4,9 @@ require 'rubygems'
4
4
  require_relative './setup/setup_generator.rb'
5
5
  require_relative './usecase/usecase_generator.rb'
6
6
  require_relative './command/command_generator.rb'
7
- require_relative './test/test_generator.rb'
8
7
  require 'rails/generators'
9
8
  require 'rails/generators/model_helpers'
9
+ require_relative './helper.rb'
10
10
 
11
11
  module Service
12
12
  module Generators
@@ -16,6 +16,7 @@ module Service
16
16
  # Skiping options
17
17
  class_option :skip_usecase, type: :boolean, default: false, aliases: '-U'
18
18
  class_option :skip_command, type: :boolean, default: false, aliases: '-C'
19
+ class_option :skip_entity, type: :boolean, default: false, aliases: '-E'
19
20
  class_option :skip_test, type: :boolean, default: false, aliases: '-T'
20
21
 
21
22
  def install_if_not
@@ -40,10 +41,18 @@ module Service
40
41
  invoke Service::Generators::CommandGenerator, [name, usecases]
41
42
  end
42
43
 
43
- def generate_tests
44
- return if options.skip_test?
44
+ private
45
45
 
46
- invoke Service::Generators::TestGenerator, [name, usecases]
46
+ def service_name
47
+ Service::Helper.service_name(name)
48
+ end
49
+
50
+ def service_path
51
+ Service::Helper.service_path(name)
52
+ end
53
+
54
+ def spec_path
55
+ Service::Helper.spec_path(name)
47
56
  end
48
57
  end
49
58
  end
@@ -1,19 +1,33 @@
1
+ require_relative '../helper'
2
+
1
3
  module Service
2
4
  module Generators
3
5
  class SetupGenerator < Rails::Generators::Base
6
+ source_root File.expand_path('templates', __dir__)
7
+
8
+ DIRS = %w(listeners jobs externals queries usecases commands entities usecases/micros)
9
+
4
10
  def setup
5
- return if File.exist?("app/services/#{service_name}")
11
+ DIRS.each do |dir|
12
+ empty_directory("#{service_path}/#{dir}")
13
+ end
6
14
 
7
- empty_directory("app/services/#{service_name}")
8
- empty_directory("app/services/#{service_name}/usecases")
9
- empty_directory("app/services/#{service_name}/commands")
10
- empty_directory("app/services/#{service_name}/usecases/micros")
15
+ path = "#{service_path}/doc.md"
16
+ template 'doc.md.erb', path unless File.exist?(path)
11
17
  end
12
18
 
13
19
  private
14
20
 
15
21
  def service_name
16
- "#{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)
17
31
  end
18
32
  end
19
33
  end
@@ -0,0 +1,39 @@
1
+ ## <%= service_name.classify %>
2
+ The authorization system is responsible for identifying a particular user.
3
+
4
+ ### Database Tables
5
+ - users
6
+ - profiles
7
+
8
+ ### Entities:
9
+ ###### *Many objects are not fundamentally defined by their attributes, but rather by a thread of continuity and identity.*
10
+ - User
11
+ - name: string
12
+ - email: string
13
+ - phone: string
14
+ - Profile:
15
+ - address: string
16
+ - foo: boolean
17
+ - bar: int
18
+
19
+ ### Usecases (Processes):
20
+ ###### *Use Cases focus on Users, Actions, and Processes.*
21
+ - **[Login](login-uml-and-full-doc)** - the process for authorization, we write out to the user an authentication key for a month. Only a user with a verified phone and email address can authenticate.
22
+ - **[Logout](logout-uml-and-full-doc)** - After logging out, the user will need to log in again to access the system.
23
+
24
+ ### Queries:
25
+ - FindByEmail(email: string)
26
+ - FindByName(name: string)
27
+
28
+ ### Listeners:
29
+ ###### *An event listener that waits for an event outside the service to occur.*
30
+ - order_status
31
+
32
+ ### Externals:
33
+ ###### *Wrapper for any external interactions.*
34
+ - **UserService**
35
+ - user_info(id: id)
36
+ - **Stripe** - payment gateway wrapper.
37
+ - charge(pid, amount, currency)
38
+ - refund(charge_id)
39
+ - create_customer(email, phone, name)
@@ -7,7 +7,17 @@ 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
15
+
16
+ output
17
+ end
18
+
19
+ def output
20
+ # return entity object
11
21
  end
12
22
 
13
23
  # This method will run if call method raise error
@@ -24,10 +34,14 @@ module <%= service_name.classify %>::Usecases
24
34
  true
25
35
  end
26
36
 
37
+ def broadcast
38
+ Hutch.publish('<%= service_name %>', action: '<%= "#{@usecase.underscore}" %>', subject: {})
39
+ end
40
+
27
41
  private
28
42
 
29
- def replace_me
30
- # [business logic]
31
- end
43
+ def replace_me
44
+ # [business logic]
45
+ end
32
46
  end
33
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
@@ -12,15 +13,33 @@ module Service
12
13
 
13
14
  usecases.each do |u|
14
15
  @usecase = u.classify
15
- path = "app/services/#{service_name}/usecases/#{u.underscore}.rb"
16
- template 'usecase.rb.erb', path
16
+ create_main(u)
17
+ create_test(u)
17
18
  end
18
19
  end
19
20
 
20
21
  private
21
22
 
23
+ def create_main(m)
24
+ path = "#{service_path}/usecases/#{m.underscore}.rb"
25
+ template 'usecase.rb.erb', path unless options.skip_command?
26
+ end
27
+
28
+ def create_test(m)
29
+ path = "#{spec_path}/usecases/#{m.underscore}_spec.rb"
30
+ template 'usecase_spec.rb.erb', path
31
+ end
32
+
22
33
  def service_name
23
- "#{name.underscore}_service"
34
+ Service::Helper.service_name(name)
35
+ end
36
+
37
+ def service_path
38
+ Service::Helper.service_path(name)
39
+ end
40
+
41
+ def spec_path
42
+ Service::Helper.spec_path(name)
24
43
  end
25
44
  end
26
45
  end
metadata CHANGED
@@ -1,15 +1,15 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: command_service_object
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.6.4
4
+ version: 1.2.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Adham EL-Deeb
8
8
  - Mohamed Diaa
9
- autorequire:
9
+ autorequire:
10
10
  bindir: exe
11
11
  cert_chain: []
12
- date: 2019-11-06 00:00:00.000000000 Z
12
+ date: 2020-10-08 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
@@ -121,6 +121,20 @@ dependencies:
121
121
  - - ">="
122
122
  - !ruby/object:Gem::Version
123
123
  version: 1.0.5
124
+ - !ruby/object:Gem::Dependency
125
+ name: hutch
126
+ requirement: !ruby/object:Gem::Requirement
127
+ requirements:
128
+ - - "~>"
129
+ - !ruby/object:Gem::Version
130
+ version: '1.0'
131
+ type: :runtime
132
+ prerelease: false
133
+ version_requirements: !ruby/object:Gem::Requirement
134
+ requirements:
135
+ - - "~>"
136
+ - !ruby/object:Gem::Version
137
+ version: '1.0'
124
138
  description: command_service_object gem helps you to generate service and command
125
139
  objects using rails generator.
126
140
  email:
@@ -148,36 +162,47 @@ files:
148
162
  - lib/command_service_object.rb
149
163
  - lib/command_service_object/configuration.rb
150
164
  - lib/command_service_object/failure.rb
165
+ - lib/command_service_object/helpers/check_helper.rb
151
166
  - lib/command_service_object/helpers/controller_helper.rb
152
167
  - lib/command_service_object/helpers/failure_helper.rb
153
168
  - lib/command_service_object/helpers/model_helper.rb
154
169
  - lib/command_service_object/hooks.rb
155
170
  - lib/command_service_object/railtie.rb
156
171
  - lib/command_service_object/version.rb
172
+ - lib/generators/.DS_Store
157
173
  - lib/generators/service/USAGE
158
174
  - lib/generators/service/command/USAGE
159
175
  - lib/generators/service/command/command_generator.rb
160
176
  - lib/generators/service/command/templates/command.rb.erb
161
- - lib/generators/service/getter/getter_generator.rb
162
- - lib/generators/service/getter/templates/getter.rb.erb
177
+ - lib/generators/service/command/templates/command_spec.rb.erb
178
+ - lib/generators/service/entity/entity_generator.rb
179
+ - lib/generators/service/entity/templates/entity.rb.erb
180
+ - lib/generators/service/external/external_generator.rb
181
+ - lib/generators/service/external/templates/external.rb.erb
182
+ - lib/generators/service/external/templates/external_spec.rb.erb
183
+ - lib/generators/service/external/templates/external_test.rb.erb
184
+ - lib/generators/service/helper.rb
163
185
  - lib/generators/service/install/install_generator.rb
164
186
  - lib/generators/service/install/templates/initializer.rb
165
187
  - lib/generators/service/install/templates/services/application_service.rb
166
188
  - lib/generators/service/install/templates/services/case_base.rb
167
189
  - lib/generators/service/install/templates/services/command_base.rb
190
+ - lib/generators/service/install/templates/services/listener_base.rb
191
+ - lib/generators/service/install/templates/services/query_base.rb
168
192
  - lib/generators/service/install/templates/services/service_result.rb
193
+ - lib/generators/service/listener/listener_generator.rb
194
+ - lib/generators/service/listener/templates/listener.rb.erb
169
195
  - lib/generators/service/micro/micro_generator.rb
170
196
  - lib/generators/service/micro/templates/micro.rb.erb
171
- - lib/generators/service/policies.rb
197
+ - lib/generators/service/query/USAGE
198
+ - lib/generators/service/query/query_generator.rb
199
+ - lib/generators/service/query/templates/query.rb.erb
172
200
  - lib/generators/service/service_generator.rb
173
201
  - lib/generators/service/setup/setup_generator.rb
174
- - lib/generators/service/test/USAGE
175
- - lib/generators/service/test/templates/minitest/usecase.rb.erb
176
- - lib/generators/service/test/templates/rspec/command.rb.erb
177
- - lib/generators/service/test/templates/rspec/usecase.rb.erb
178
- - lib/generators/service/test/test_generator.rb
202
+ - lib/generators/service/setup/templates/doc.md.erb
179
203
  - lib/generators/service/usecase/USAGE
180
204
  - lib/generators/service/usecase/templates/usecase.rb.erb
205
+ - lib/generators/service/usecase/templates/usecase_spec.rb.erb
181
206
  - lib/generators/service/usecase/usecase_generator.rb
182
207
  homepage: https://github.com/adham90/command_service_object
183
208
  licenses:
@@ -202,8 +227,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
202
227
  - !ruby/object:Gem::Version
203
228
  version: '0'
204
229
  requirements: []
205
- rubygems_version: 3.0.3
206
- signing_key:
230
+ rubygems_version: 3.1.2
231
+ signing_key:
207
232
  specification_version: 4
208
233
  summary: Rails Generator for command service object.
209
234
  test_files: []
@@ -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
@@ -1,5 +0,0 @@
1
- class
2
- def initialize(*args)
3
-
4
- end
5
- end
@@ -1,8 +0,0 @@
1
- Description:
2
- Explain the generator
3
-
4
- Example:
5
- rails generate service Thing
6
-
7
- This will create:
8
- what/will/it/create
@@ -1 +0,0 @@
1
- # frozen_string_literal: true
@@ -1,72 +0,0 @@
1
- require_relative '../setup/setup_generator.rb'
2
-
3
- module Service
4
- module Generators
5
- class TestGenerator < Rails::Generators::NamedBase
6
- source_root File.expand_path('templates', __dir__)
7
- argument :tests, type: :array, default: [], banner: 'usecase usecase'
8
-
9
- def generate_test
10
- return if options.skip_test?
11
-
12
- if defined?(Minitest)
13
- minitest_test
14
- elsif defined?(RSpec)
15
- rspec_test
16
- end
17
- end
18
-
19
- private
20
-
21
- def minitest_test
22
- dir = create_test_dir('test')
23
-
24
- tests.each do |t|
25
- @test = t.classify
26
- path = "#{dir}/usecases/#{t.underscore}_test.rb"
27
- template 'minitest/usecase.rb.erb', path
28
- end
29
- end
30
-
31
- def rspec_test
32
- dir = create_test_dir('spec')
33
- create_usecase_test(dir)
34
- create_command_test(dir)
35
- end
36
-
37
- def create_usecase_test(dir)
38
- tests.each do |t|
39
- @test = t.classify
40
- path = "#{dir}/usecases/#{t.underscore}_spec.rb"
41
- template 'rspec/usecase.rb.erb', path
42
- end
43
- end
44
-
45
- def create_command_test(dir)
46
- tests.each do |t|
47
- @test = t.classify
48
- path = "#{dir}/commands/#{t.underscore}_spec.rb"
49
- template 'rspec/command.rb.erb', path
50
- end
51
- end
52
-
53
- def create_test_dir(path)
54
- test_path = "#{path}/services"
55
- service_test = "#{test_path}/#{service_name}"
56
- usecases_path = "#{test_path}/#{service_name}/usecases"
57
- commands_path = "#{test_path}/#{service_name}/commands"
58
-
59
- empty_directory(test_path) unless File.exist?(test_path)
60
- empty_directory(service_test) unless File.exist?(service_test)
61
- empty_directory(usecases_path) unless File.exist?(usecases_path)
62
- empty_directory(commands_path) unless File.exist?(commands_path)
63
-
64
- service_test
65
- end
66
-
67
- def service_name
68
- "#{name.underscore}_service"
69
- end
70
- end
71
- end
72
- end