servitium 1.2.20 → 1.2.28

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: 583d111f0348dae63479a5dbb6d1dea714e17592eb03c9a8a0a07c84874af455
4
- data.tar.gz: 259ab3b3110de03c89a3b50e95aa983433a6267aae0e2ee7ddaf093314dd3f1f
3
+ metadata.gz: e0a8f171a635f84398216e84753b75e7fac5621e98117dc20e34ffa993c04a51
4
+ data.tar.gz: 65dcc5f9bf2ca80a71e0cfee97810675f8b1c9d03a356e7efb5938174ecfb988
5
5
  SHA512:
6
- metadata.gz: e240db38b1ba8c97a2fe898d77546d13474781ff8d5d2e1780eb75279bb5e45ed5afe2e4597de5e38526180a812a9eb1c7cfee90a9b923f9c994bf3dbb301f36
7
- data.tar.gz: 700799659b4f0ae4106a8e22c5b9bcbacc93e01f119351fa19f5bbae9bd4af4e018185963e2451f092dd4a5f92d39e6ef2f706927f375b82721d8035a3b314b6
6
+ metadata.gz: ccb720b4f4a65da86634892109d6cb3b17d4985273dca859ccfdc0cfe3ea7cb5b0a3d1e3e0f45ae118d7c0fa7b93b1bdbdf82c91a653f045439b7bbe25f0379d
7
+ data.tar.gz: 2cf688da9a6693fb69e5645ea7a33c9613777cd539424b6c75d1e30873b4e6566db141c829512b0a5b7c1bc5541627cc37275e4f2f385c3fdafa7f188a9302f8
@@ -0,0 +1,11 @@
1
+ name: Rubygem Push
2
+ on:
3
+ push:
4
+ tags:
5
+ - '*'
6
+ jobs:
7
+ build:
8
+ uses: entdec/_workflows/.github/workflows/gem-push.yml@main
9
+ with:
10
+ public: true
11
+ secrets: inherit
data/README.md CHANGED
@@ -48,7 +48,69 @@ Or install it yourself as:
48
48
 
49
49
  ## Usage
50
50
 
51
- See tests for usage examples.
51
+ You define a context for the service, which describes what goes in and out
52
+ ```ruby
53
+ class ExampleContext < ApplicationContext
54
+ attribute :some, type: String, default: "new"
55
+
56
+ validates :some, presence: true
57
+ end
58
+ ```
59
+
60
+ You can be very explicit in what goes in our out:
61
+ ```ruby
62
+ class ExampleContext < ApplicationContext
63
+ input do
64
+ attribute :some, type: String, default: "new"
65
+ validates :some, presence: true
66
+ end
67
+ output do
68
+ attribute :some, type: String, default: "new"
69
+ end
70
+ end
71
+ ```
72
+
73
+ And you define the service itself:
74
+ ```ruby
75
+ class ExampleService < ApplicationService
76
+ def perform
77
+ context.some.reverse!
78
+ end
79
+ end
80
+ ```
81
+
82
+ You can also include the context in the service, for less complicated services:
83
+
84
+ ```ruby
85
+ class ExampleService < ApplicationService
86
+ context do
87
+ attribute :some, type: :string, default: "new"
88
+ end
89
+ def perform
90
+ context.some.reverse!
91
+ end
92
+ end
93
+ ```
94
+
95
+ Next you use it as follows:
96
+ ```ruby
97
+ ExampleService.perform(some: 'test').some # => tset
98
+ ```
99
+ A service always returns it context
100
+
101
+ Services can also run in the background:
102
+ ```ruby
103
+ ExampleService.perform_later(some: 'test') # => #<ExampleContext>
104
+ ```
105
+
106
+ You can use the generator to generate service code:
107
+ ```
108
+ ❯ rails g servitium:service Example
109
+
110
+ create app/services/example_service.rb
111
+ create app/services/example_context.rb
112
+ create test/services/example_service_test.rb
113
+ ```
52
114
 
53
115
  ## License
54
116
 
@@ -1,7 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  class <%= name %>Context < ApplicationContext
4
- attribute :some, type: :string, default: 'new'
4
+ attribute :some, type: String, default: 'new'
5
5
 
6
6
  validates :some, presence: true
7
7
 
@@ -0,0 +1,20 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Servitium
4
+ class Configuration
5
+ attr_accessor :bg_jobs_platform
6
+ attr_writer :logger,
7
+
8
+ def initialize
9
+ @logger = Logger.new(STDOUT)
10
+ @logger.level = Logger::INFO
11
+
12
+ @bg_jobs_platform = :active_job
13
+ end
14
+
15
+ # logger [Object].
16
+ def logger
17
+ @logger.is_a?(Proc) ? instance_exec(&@logger) : @logger
18
+ end
19
+ end
20
+ end
@@ -121,6 +121,14 @@ module Servitium
121
121
  end
122
122
 
123
123
  class << self
124
+ def perform_async(*args)
125
+ perform_later(*args)
126
+ end
127
+
128
+ def perform_sync(*args)
129
+ perform(*args)
130
+ end
131
+
124
132
  # Main point of entry for services, will raise in case of errors
125
133
  def perform!(*args)
126
134
  inst = new(*args)
@@ -147,10 +155,8 @@ module Servitium
147
155
  # Call the service returning the service instance
148
156
  def call(*args)
149
157
  inst = new(*args)
150
-
151
158
  valid_in = inst.context.valid?
152
159
  valid_in &&= inst.context.valid?(:in) if inst.context.class.inbound_scope_used
153
-
154
160
  if valid_in
155
161
  inst.context.instance_variable_set(:@called, true)
156
162
  inst.send(:call)
@@ -166,18 +172,53 @@ module Servitium
166
172
  # Perform this service async
167
173
  def perform_later(*args)
168
174
  inst = new(*args)
169
-
170
175
  valid_in = inst.context.valid?
171
176
  valid_in &&= inst.context.valid?(:in) if inst.context.class.inbound_scope_used
172
177
 
173
178
  if valid_in
174
179
  inst.context.instance_variable_set(:@called, true)
175
- Servitium::ServiceJob.perform_later(name, inst.context.attributes_hash)
180
+
181
+ if Servitium.config.bg_jobs_platform == :sidekiq
182
+ formatted_args = JSON.load(JSON.dump(format_args(inst.context.attributes_hash)))
183
+ Servitium::ServiceSidekiqJob.set(queue: name.constantize.queue_name).perform_async(name, formatted_args)
184
+ else
185
+ Servitium::ServiceActiveJob.set(queue: name.constantize.queue_name).perform_later(name, inst.context.attributes_hash)
186
+ end
176
187
  end
177
188
 
178
189
  inst.context
179
190
  end
180
191
 
192
+ def format_args(hash)
193
+ hash.transform_values! do |v|
194
+ case v
195
+ when ActiveRecord::Base
196
+ v.id
197
+ when Hash
198
+ format_args(v)
199
+ when Array
200
+ format_array(v)
201
+ else
202
+ v
203
+ end
204
+ end
205
+ end
206
+
207
+ def format_array(array)
208
+ array.map do |ele|
209
+ case ele
210
+ when ActiveRecord::Base
211
+ ele.id
212
+ when Hash
213
+ format_args(ele)
214
+ when Array
215
+ format_array(ele)
216
+ else
217
+ ele
218
+ end
219
+ end
220
+ end
221
+
181
222
  def queue_name
182
223
  'default'
183
224
  end
@@ -1,9 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Servitium
4
- class ServiceJob < ActiveJob::Base
5
- queue_as { queue_name }
6
-
4
+ class ServiceActiveJob < ActiveJob::Base
7
5
  def perform(class_name, *args)
8
6
  service = class_name.constantize.call(*args)
9
7
 
@@ -13,9 +11,5 @@ module Servitium
13
11
  service.send(:async_failure)
14
12
  end
15
13
  end
16
-
17
- def queue_name
18
- arguments.first.constantize.queue_name
19
- end
20
14
  end
21
15
  end
@@ -0,0 +1,16 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Servitium
4
+ class ServiceSidekiqJob
5
+ include Sidekiq::Job
6
+ def perform(class_name, *args)
7
+ service = class_name.constantize.call(*args)
8
+
9
+ if service.context.success?
10
+ service.send(:async_success)
11
+ else
12
+ service.send(:async_failure)
13
+ end
14
+ end
15
+ end
16
+ end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Servitium
4
- VERSION = "1.2.20"
4
+ VERSION = "1.2.28"
5
5
  end
data/lib/servitium.rb CHANGED
@@ -5,6 +5,7 @@ require 'active_attr'
5
5
  require 'active_support'
6
6
  require 'action_controller'
7
7
  require 'active_job'
8
+ require 'sidekiq'
8
9
 
9
10
  require 'servitium/error'
10
11
  require 'servitium/context_failure'
@@ -13,8 +14,24 @@ require 'servitium/sub_contexts'
13
14
  require 'servitium/scoped_attributes'
14
15
  require 'servitium/context_model'
15
16
  require 'servitium/context'
16
- require 'servitium/service_job'
17
+ require 'servitium/service_active_job'
18
+ require 'servitium/service_sidekiq_job'
17
19
  require 'servitium/service'
18
20
  require 'servitium/version'
21
+ require 'servitium/configuration'
19
22
 
20
23
  require 'servitium/rails' if defined?(::Rails)
24
+
25
+
26
+ module Servitium
27
+ class << self
28
+ def setup
29
+ @config = Configuration.new
30
+ yield config
31
+ end
32
+
33
+ def config
34
+ @config ||= Configuration.new
35
+ end
36
+ end
37
+ end
data/servitium.gemspec CHANGED
@@ -42,4 +42,5 @@ Gem::Specification.new do |spec|
42
42
  spec.add_development_dependency 'rake', '~> 12.0'
43
43
  spec.add_development_dependency 'rubocop', '~> 0.79'
44
44
  spec.add_development_dependency 'sqlite3', '~> 1.4'
45
+ spec.add_development_dependency 'sidekiq', '~> 7'
45
46
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: servitium
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.2.20
4
+ version: 1.2.28
5
5
  platform: ruby
6
6
  authors:
7
7
  - Tom de Grunt
8
- autorequire:
8
+ autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2022-11-07 00:00:00.000000000 Z
11
+ date: 2024-03-21 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: active_attr
@@ -220,6 +220,20 @@ dependencies:
220
220
  - - "~>"
221
221
  - !ruby/object:Gem::Version
222
222
  version: '1.4'
223
+ - !ruby/object:Gem::Dependency
224
+ name: sidekiq
225
+ requirement: !ruby/object:Gem::Requirement
226
+ requirements:
227
+ - - "~>"
228
+ - !ruby/object:Gem::Version
229
+ version: '7'
230
+ type: :development
231
+ prerelease: false
232
+ version_requirements: !ruby/object:Gem::Requirement
233
+ requirements:
234
+ - - "~>"
235
+ - !ruby/object:Gem::Version
236
+ version: '7'
223
237
  description: An implementation of the command pattern for Ruby
224
238
  email:
225
239
  - tom@degrunt.nl
@@ -227,6 +241,7 @@ executables: []
227
241
  extensions: []
228
242
  extra_rdoc_files: []
229
243
  files:
244
+ - ".github/workflows/gem-push.yml"
230
245
  - ".gitignore"
231
246
  - ".travis.yml"
232
247
  - CODE_OF_CONDUCT.md
@@ -243,6 +258,7 @@ files:
243
258
  - lib/generators/servitium/templates/service_test.rb
244
259
  - lib/servitium.rb
245
260
  - lib/servitium/capture_exceptions_mixin.rb
261
+ - lib/servitium/configuration.rb
246
262
  - lib/servitium/context.rb
247
263
  - lib/servitium/context_failure.rb
248
264
  - lib/servitium/context_model.rb
@@ -252,7 +268,8 @@ files:
252
268
  - lib/servitium/rails/railtie.rb
253
269
  - lib/servitium/scoped_attributes.rb
254
270
  - lib/servitium/service.rb
255
- - lib/servitium/service_job.rb
271
+ - lib/servitium/service_active_job.rb
272
+ - lib/servitium/service_sidekiq_job.rb
256
273
  - lib/servitium/sub_contexts.rb
257
274
  - lib/servitium/transactional_mixin.rb
258
275
  - lib/servitium/version.rb
@@ -264,7 +281,7 @@ licenses:
264
281
  metadata:
265
282
  homepage_uri: https://entropydecelerator.com/components/servitium
266
283
  source_code_uri: https://code.entropydecelerator.com/components/servitium
267
- post_install_message:
284
+ post_install_message:
268
285
  rdoc_options: []
269
286
  require_paths:
270
287
  - lib
@@ -279,8 +296,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
279
296
  - !ruby/object:Gem::Version
280
297
  version: '0'
281
298
  requirements: []
282
- rubygems_version: 3.3.7
283
- signing_key:
299
+ rubygems_version: 3.4.10
300
+ signing_key:
284
301
  specification_version: 4
285
302
  summary: Service objects
286
303
  test_files: []