command_service_object 0.3.0 → 0.3.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.
- checksums.yaml +4 -4
- data/lib/command_service_object/version.rb +1 -1
- data/lib/generators/service/service_generator.rb +61 -12
- data/lib/generators/service/templates/base/application_service.rb +9 -0
- data/lib/generators/service/templates/base/service_base.rb +15 -0
- data/lib/generators/service/templates/base/service_result.rb +64 -0
- data/lib/generators/service/templates/command.rb.erb +1 -1
- data/lib/generators/service/templates/error.rb.erb +1 -1
- data/lib/generators/service/templates/minitest.rb.erb +1 -0
- data/lib/generators/service/templates/rspec.rb.erb +1 -0
- data/lib/generators/service/templates/usecase.rb.erb +9 -2
- metadata +6 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 4039a3dbbda00504a1bcecf192eeadbc2d713421a1a3abcbea48b42776a1c556
|
4
|
+
data.tar.gz: eb5e934d9f3ec8ef0d292d7f82b8330c334e6f595da77eee4519e9295b320786
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 946455406a4ce0008936b985daa3d7c586bf5aa34d80ff3d5a19cba568bd2ace83fb2fb3036e3a670491ce4d1a9e345fa262c497f49df4a2109c832fd5b8e1dd
|
7
|
+
data.tar.gz: 891e869e8f625a7d865462d388b4b86fd7d14bac5e6184710bf179dfdfe78234aaa8e39c92e46ab7ceb16584092f97b636f03b2d0120a73c1c7dd67defdc3023
|
@@ -1,5 +1,6 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
+
require 'rubygems'
|
3
4
|
require 'rails/generators/model_helpers'
|
4
5
|
|
5
6
|
class ServiceGenerator < Rails::Generators::NamedBase
|
@@ -8,15 +9,17 @@ class ServiceGenerator < Rails::Generators::NamedBase
|
|
8
9
|
source_root File.expand_path('templates', __dir__)
|
9
10
|
|
10
11
|
argument :usecases, type: :array, default: [], banner: 'usecase usecase'
|
11
|
-
class_option :skip_command, type: :boolean, default: false,
|
12
|
+
class_option :skip_command, type: :boolean, default: false, aliases: '-C',
|
12
13
|
desc: 'skip command file generation'
|
13
|
-
class_option :skip_error, type: :boolean, default: false,
|
14
|
+
class_option :skip_error, type: :boolean, default: false, aliases: '-E',
|
14
15
|
desc: 'skip error file generation'
|
16
|
+
class_option :skip_test, type: :boolean, default: false, aliases: '-T',
|
17
|
+
desc: 'skip test file generation'
|
15
18
|
|
16
19
|
def create_base_dir
|
17
20
|
return if File.exist?('app/services')
|
18
21
|
|
19
|
-
directory '
|
22
|
+
directory 'base', 'app/services'
|
20
23
|
end
|
21
24
|
|
22
25
|
def create_service_dir
|
@@ -28,21 +31,67 @@ class ServiceGenerator < Rails::Generators::NamedBase
|
|
28
31
|
empty_directory("app/services/#{service_name}/errors")
|
29
32
|
end
|
30
33
|
|
31
|
-
def
|
34
|
+
def generate_usecases
|
32
35
|
usecases.each do |usecase|
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
template 'usecase.rb.erb', u_path
|
39
|
-
template 'command.rb.erb', c_path unless options.skip_command?
|
40
|
-
template 'error.rb.erb', e_path unless options.skip_error?
|
36
|
+
generate_usecase(usecase)
|
37
|
+
generate_command(usecase)
|
38
|
+
generate_error(usecase)
|
39
|
+
generate_test(usecase)
|
41
40
|
end
|
42
41
|
end
|
43
42
|
|
44
43
|
private
|
45
44
|
|
45
|
+
def generate_usecase(usecase)
|
46
|
+
@usecase = usecase.classify
|
47
|
+
path = "app/services/#{service_name}/usecases/#{usecase.underscore}.rb"
|
48
|
+
template 'usecase.rb.erb', path
|
49
|
+
end
|
50
|
+
|
51
|
+
def generate_command(command)
|
52
|
+
@command = command.classify
|
53
|
+
path = "app/services/#{service_name}/commands/#{command.underscore}.rb"
|
54
|
+
template 'command.rb.erb', path unless options.skip_command?
|
55
|
+
end
|
56
|
+
|
57
|
+
def generate_error(error)
|
58
|
+
@error = error.classify
|
59
|
+
path = "app/services/#{service_name}/errors/#{error.underscore}.rb"
|
60
|
+
template 'error.rb.erb', path unless options.skip_error?
|
61
|
+
end
|
62
|
+
|
63
|
+
def generate_test(test)
|
64
|
+
return if options.skip_test?
|
65
|
+
|
66
|
+
if defined?(Minitest)
|
67
|
+
empty_directory('test/services')
|
68
|
+
generate_minitest_test_files(test)
|
69
|
+
elsif defined?(RSpec)
|
70
|
+
empty_directory('spec/services')
|
71
|
+
generate_rspec_test_files(test)
|
72
|
+
end
|
73
|
+
end
|
74
|
+
|
75
|
+
def generate_minitest_test_files(test)
|
76
|
+
dir = "test/services/#{service_name}"
|
77
|
+
empty_directory(dir)
|
78
|
+
|
79
|
+
@test = test.classify
|
80
|
+
path = "#{dir}/#{test.underscore}_test.rb"
|
81
|
+
|
82
|
+
template 'minitest.rb.erb', path
|
83
|
+
end
|
84
|
+
|
85
|
+
def generate_rspec_test_files(test)
|
86
|
+
dir = "spec/services/#{service_name}"
|
87
|
+
empty_directory(dir)
|
88
|
+
|
89
|
+
@test = test.classify
|
90
|
+
path = "#{dir}/#{test.underscore}_spec.rb"
|
91
|
+
|
92
|
+
template 'rspec.rb.erb', path
|
93
|
+
end
|
94
|
+
|
46
95
|
def service_name
|
47
96
|
"#{name.underscore}_service"
|
48
97
|
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
class ServiceBase
|
4
|
+
attr_reader :cmd
|
5
|
+
|
6
|
+
def initialize(command)
|
7
|
+
@cmd = command
|
8
|
+
end
|
9
|
+
|
10
|
+
def self.call(command)
|
11
|
+
raise Errors::InvalidCommand, command.class if command.invalid?
|
12
|
+
|
13
|
+
new(command).call
|
14
|
+
end
|
15
|
+
end
|
@@ -0,0 +1,64 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
class ServiceResult
|
4
|
+
attr_reader :error
|
5
|
+
|
6
|
+
def initialize
|
7
|
+
@value = yield
|
8
|
+
@error = nil
|
9
|
+
rescue StandardError => e
|
10
|
+
@error = e
|
11
|
+
end
|
12
|
+
|
13
|
+
def to_s
|
14
|
+
if ok?
|
15
|
+
format('#<Result:0x%x value: %s>', object_id, @value.inspect)
|
16
|
+
else
|
17
|
+
format('#<Result:0x%x error: %s>', object_id, @error.inspect)
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
alias inspect to_s
|
22
|
+
|
23
|
+
def then
|
24
|
+
return self unless ok?
|
25
|
+
|
26
|
+
result = yield(@value)
|
27
|
+
raise TypeError, 'block invoked in Result#then did not return Result' unless result.is_a?(Result)
|
28
|
+
|
29
|
+
result
|
30
|
+
end
|
31
|
+
|
32
|
+
def rescue
|
33
|
+
return self if ok?
|
34
|
+
|
35
|
+
result = yield(@error)
|
36
|
+
raise TypeError, 'block invoked in Result#rescue did not return Result' unless result.is_a?(Result)
|
37
|
+
|
38
|
+
result
|
39
|
+
end
|
40
|
+
|
41
|
+
def value
|
42
|
+
raise ArgumentError, 'must provide a block to Result#value to be invoked in case of error' unless block_given?
|
43
|
+
|
44
|
+
return @value if ok?
|
45
|
+
|
46
|
+
yield(@error)
|
47
|
+
end
|
48
|
+
|
49
|
+
def value!
|
50
|
+
raise @error unless ok?
|
51
|
+
|
52
|
+
@value
|
53
|
+
end
|
54
|
+
|
55
|
+
def ok?
|
56
|
+
!@error
|
57
|
+
end
|
58
|
+
|
59
|
+
def self.error(err)
|
60
|
+
result = allocate
|
61
|
+
result.instance_variable_set(:@error, err)
|
62
|
+
result
|
63
|
+
end
|
64
|
+
end
|
@@ -0,0 +1 @@
|
|
1
|
+
# frozen_string_literal: true
|
@@ -0,0 +1 @@
|
|
1
|
+
# frozen_string_literal: true
|
@@ -1,17 +1,24 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
module <%= service_name.classify %>::Usecases
|
4
|
-
class <%= @usecase
|
4
|
+
class <%= @usecase %> < ServiceBase
|
5
5
|
#
|
6
6
|
# Your business logic goes here, keep [call] method clean by using private
|
7
7
|
# methods for Business logic.
|
8
8
|
#
|
9
9
|
def call
|
10
|
-
|
10
|
+
begin
|
11
|
+
replace_me
|
12
|
+
rescue => e
|
13
|
+
rollback
|
14
|
+
raise e
|
15
|
+
end
|
11
16
|
end
|
12
17
|
|
13
18
|
private
|
14
19
|
|
20
|
+
def rollback;end
|
21
|
+
|
15
22
|
def replace_me
|
16
23
|
# [business logic]
|
17
24
|
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: 0.3.
|
4
|
+
version: 0.3.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Adham EL-Deeb
|
@@ -104,8 +104,13 @@ files:
|
|
104
104
|
- lib/command_service_object/version.rb
|
105
105
|
- lib/generators/service/USAGE
|
106
106
|
- lib/generators/service/service_generator.rb
|
107
|
+
- lib/generators/service/templates/base/application_service.rb
|
108
|
+
- lib/generators/service/templates/base/service_base.rb
|
109
|
+
- lib/generators/service/templates/base/service_result.rb
|
107
110
|
- lib/generators/service/templates/command.rb.erb
|
108
111
|
- lib/generators/service/templates/error.rb.erb
|
112
|
+
- lib/generators/service/templates/minitest.rb.erb
|
113
|
+
- lib/generators/service/templates/rspec.rb.erb
|
109
114
|
- lib/generators/service/templates/usecase.rb.erb
|
110
115
|
homepage: https://github.com/adham90/command_service_object
|
111
116
|
licenses:
|