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