service_pattern 1.0.2 → 1.0.6

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 4a0cc423721d1d11a5e300f3719b01dcd3eba89dcad83d97cc168372acc01593
4
- data.tar.gz: de7dcffe6dd6ac6bda7d5195e75622ca1bda3c37b3cca394ca11e2a827445da6
3
+ metadata.gz: 96981ef35e60c1b498368709d6471d5c880538e0acf3eade1b74e533323fb502
4
+ data.tar.gz: 01b10dfe476c603e06a3a17bd5a875d2afbaf536ec4622a4ab885a5a063d5498
5
5
  SHA512:
6
- metadata.gz: c304984c8080f2234c44cb07f96566f8830ca7a17e1564f76f7d5f52183dd0317c4584dc36a990ae6a7a97f77e1719d8fcb3fb36463be9e62c694d6e69521210
7
- data.tar.gz: 0a168abccb3b302f15987e67515214e16565e4ba654f8c7079131eeeb2cbbb2ddeb3976ce4b0645215278df8c0f180feeaba9f36eb511d796624f22823a79eaa
6
+ metadata.gz: 6f7203eed9b42ee98a5cc9712be296da4983cd2aad28cd2dde4b1679cc1d41db4e3406f8f7e63f3f5b9deb2877c27c2f4d543378f552bfc011125f67ef46aefa
7
+ data.tar.gz: 6996d0eb63b2a25ad46f4ca9dad580b2acd750d9f87f98afb0e2123fd76c1e46022095a6e498d3f6867969246cb23ddbaeb93ec6b2fb27b749b335ed3bfbce7e
data/README.md CHANGED
@@ -35,7 +35,7 @@ response = Users::ActivatorService.()
35
35
  if response.success?
36
36
  puts "Result: #{response.result}"
37
37
  else
38
- puts "Errors: #{response.errors.join(". ")}"
38
+ puts "Errors: #{response.error_messages.join(". ")}"
39
39
  end
40
40
  ```
41
41
 
@@ -46,10 +46,17 @@ response = Users::ActivatorService.execute()
46
46
  if response.success?
47
47
  puts "Result: #{response.result}"
48
48
  else
49
- puts "Errors: #{response.errors.join(". ")}"
49
+ puts "Errors: #{response.error_messages.join(". ")}"
50
+ puts "Custom error? #{response.error_type?(:custom_error) ? "Yes" : "No"}"
51
+ puts "Only custom error? #{response.only_error_type?(:custom_error) ? "Yes" : "No"}"
50
52
  end
51
53
  ```
52
54
 
55
+ Raise a normal service error unless error is of a specific type.
56
+ ```ruby
57
+ response.raise_error! unless response.only_error_type?(:custom_error)
58
+ ```
59
+
53
60
  Or raise an error if it fails and return the result directly:
54
61
  ```ruby
55
62
  result = Users::ActivatorService.execute!
@@ -80,5 +87,10 @@ Or with multiple errors:
80
87
  fail! ["Hello world", "Hello again"]
81
88
  ```
82
89
 
90
+ Or with error types:
91
+ ```ruby
92
+ fail! "Hello world", type: :message
93
+ ```
94
+
83
95
  ## License
84
96
  The gem is available as open source under the terms of the [MIT License](http://opensource.org/licenses/MIT).
@@ -1,6 +1,12 @@
1
1
  class ServicePattern::Response
2
2
  attr_reader :errors, :result
3
3
 
4
+ def self.check_response!(service, response)
5
+ return if response.is_a?(ServicePattern::Response)
6
+
7
+ raise ServicePattern::InvalidResponseError, "Expected a ServicePattern::Response from #{service.class.name} but it was instead: #{response.class.name}"
8
+ end
9
+
4
10
  def initialize(errors: [], result: nil)
5
11
  @errors = ServicePattern::Service.convert_errors(errors)
6
12
  @result = result
@@ -15,6 +21,23 @@ class ServicePattern::Response
15
21
  @error_types ||= @errors.map(&:type).reject(&:blank?)
16
22
  end
17
23
 
24
+ def error_type?(type)
25
+ error_types.include?(type)
26
+ end
27
+
28
+ def only_error_type?(type)
29
+ error_types.length == 1 && error_type?(type)
30
+ end
31
+
32
+ def raise_error!
33
+ return if errors.empty?
34
+
35
+ error = ServicePattern::FailedError.new(error_messages.join(". "))
36
+ error.errors = errors
37
+
38
+ raise error
39
+ end
40
+
18
41
  def success?
19
42
  @success
20
43
  end
@@ -1,7 +1,7 @@
1
1
  class ServicePattern::Service
2
2
  # The same as execute but doesn't catch FailedError so they are passed on to the parent service call
3
- def self.chain(*args, &blk)
4
- service = new(*args, &blk)
3
+ def self.chain(*args, **opts, &blk)
4
+ service = new(*args, **opts, &blk)
5
5
 
6
6
  can_execute_response = service.can_execute?
7
7
  ServicePattern::Service.fail!(can_execute_response.errors) unless can_execute_response.success?
@@ -9,16 +9,16 @@ class ServicePattern::Service
9
9
  service.perform
10
10
  end
11
11
 
12
- def self.call(*args, &blk)
13
- execute(*args, &blk)
12
+ def self.call(*args, **opts, &blk)
13
+ execute(*args, **opts, &blk)
14
14
  end
15
15
 
16
- def self.execute(*args, &blk)
17
- new(*args, &blk).execute
16
+ def self.execute(*args, **opts, &blk)
17
+ new(*args, **opts, &blk).execute
18
18
  end
19
19
 
20
- def self.execute!(*args, &blk)
21
- new(*args, &blk).execute!
20
+ def self.execute!(*args, **opts, &blk)
21
+ new(*args, **opts, &blk).execute!
22
22
  end
23
23
 
24
24
  def self.convert_errors(errors)
@@ -47,7 +47,9 @@ class ServicePattern::Service
47
47
  can_execute_response = can_execute?
48
48
  return can_execute_response unless can_execute_response.success?
49
49
 
50
- perform
50
+ response = perform
51
+ ServicePattern::Response.check_response!(self, response)
52
+ response
51
53
  rescue ServicePattern::FailedError => e
52
54
  ServicePattern::Response.new(errors: e.errors)
53
55
  end
@@ -56,6 +58,7 @@ class ServicePattern::Service
56
58
  can_execute_response = can_execute?
57
59
  ServicePattern::Service.fail!(can_execute_response.errors) unless can_execute_response.success?
58
60
  response = perform
61
+ ServicePattern::Response.check_response!(self, response)
59
62
  ServicePattern::Service.fail!(response.errors) unless response.success?
60
63
  response.result
61
64
  end
@@ -1,3 +1,3 @@
1
1
  module ServicePattern
2
- VERSION = "1.0.2".freeze
2
+ VERSION = "1.0.6".freeze
3
3
  end
@@ -1,4 +1,6 @@
1
1
  module ServicePattern
2
+ class InvalidResponseError < RuntimeError; end
3
+
2
4
  path = "#{File.dirname(__FILE__)}/service_pattern"
3
5
 
4
6
  autoload :FailError, "#{path}/fail_error"
metadata CHANGED
@@ -1,15 +1,155 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: service_pattern
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.2
4
+ version: 1.0.6
5
5
  platform: ruby
6
6
  authors:
7
7
  - kaspernj
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2021-10-04 00:00:00.000000000 Z
12
- dependencies: []
11
+ date: 2022-05-01 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: appraisal
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: '0'
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: '0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: best_practice_project
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: pry
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: rails
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ version: 6.0.0
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ version: 6.0.0
69
+ - !ruby/object:Gem::Dependency
70
+ name: rspec-rails
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - ">="
74
+ - !ruby/object:Gem::Version
75
+ version: '0'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - ">="
81
+ - !ruby/object:Gem::Version
82
+ version: '0'
83
+ - !ruby/object:Gem::Dependency
84
+ name: rubocop
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - ">="
88
+ - !ruby/object:Gem::Version
89
+ version: '0'
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - ">="
95
+ - !ruby/object:Gem::Version
96
+ version: '0'
97
+ - !ruby/object:Gem::Dependency
98
+ name: rubocop-performance
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - ">="
102
+ - !ruby/object:Gem::Version
103
+ version: '0'
104
+ type: :development
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - ">="
109
+ - !ruby/object:Gem::Version
110
+ version: '0'
111
+ - !ruby/object:Gem::Dependency
112
+ name: rubocop-rspec
113
+ requirement: !ruby/object:Gem::Requirement
114
+ requirements:
115
+ - - ">="
116
+ - !ruby/object:Gem::Version
117
+ version: '0'
118
+ type: :development
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ requirements:
122
+ - - ">="
123
+ - !ruby/object:Gem::Version
124
+ version: '0'
125
+ - !ruby/object:Gem::Dependency
126
+ name: sqlite3
127
+ requirement: !ruby/object:Gem::Requirement
128
+ requirements:
129
+ - - ">="
130
+ - !ruby/object:Gem::Version
131
+ version: '0'
132
+ type: :development
133
+ prerelease: false
134
+ version_requirements: !ruby/object:Gem::Requirement
135
+ requirements:
136
+ - - ">="
137
+ - !ruby/object:Gem::Version
138
+ version: '0'
139
+ - !ruby/object:Gem::Dependency
140
+ name: tzinfo-data
141
+ requirement: !ruby/object:Gem::Requirement
142
+ requirements:
143
+ - - ">="
144
+ - !ruby/object:Gem::Version
145
+ version: '0'
146
+ type: :development
147
+ prerelease: false
148
+ version_requirements: !ruby/object:Gem::Requirement
149
+ requirements:
150
+ - - ">="
151
+ - !ruby/object:Gem::Version
152
+ version: '0'
13
153
  description: ServicePattern for Ruby on Rails.
14
154
  email:
15
155
  - kaspernj@gmail.com
@@ -39,14 +179,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
39
179
  requirements:
40
180
  - - ">="
41
181
  - !ruby/object:Gem::Version
42
- version: 2.5.0
182
+ version: 2.7.0
43
183
  required_rubygems_version: !ruby/object:Gem::Requirement
44
184
  requirements:
45
185
  - - ">="
46
186
  - !ruby/object:Gem::Version
47
187
  version: '0'
48
188
  requirements: []
49
- rubygems_version: 3.1.6
189
+ rubygems_version: 3.2.32
50
190
  signing_key:
51
191
  specification_version: 4
52
192
  summary: ServicePattern for Ruby on Rails.