command_service_object 0.6.4 → 1.2.1

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