async-job-adapter-active_job 0.3.0 → 0.5.0

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 9963783ca059ac1a3572fdbcca27ecfb6b0e2512e8994603ba1e1191d77ece61
4
- data.tar.gz: f4be3f33865cf8a1d5aeec993b518418c9f422090ed0de4c5ff16aef5a02a276
3
+ metadata.gz: f3f95cf52e07f98e11adbedad14d9835f1ba64b6e6a9613b95b638e4d941d7f3
4
+ data.tar.gz: 56e91d6940e972e039a2f2c7b1e7087e88fda0a1d7d3843e02dd76269da05890
5
5
  SHA512:
6
- metadata.gz: bc94ed3bad8be7871793b65a36cec6da478515df5cec6f0c733c842fd9af2f3024174314f7f2bab308d4bb7175dbec65b4c62934dae4578b9c9f97d7021108f7
7
- data.tar.gz: c232453580b7ee21760449b7e31f69b06cc4f7ee862c885a7eb61e0bc90057fd9e27d9c38bd93e00c94af4e7ede932204fb8a3a3804850c61ae3e619bdb25e28
6
+ metadata.gz: e8a839e220fb8275fdec36ce92d1e032d12c9d81f640f43696e616f12bbb1129137e69b3de1b1f72031edf38f7aa97111952233dbe969ba2df6ae1d71f4d3281
7
+ data.tar.gz: ed9c0bc33a45762edaf8744f62148e9d690ef769d88ae18ebac6bc5cc258f1fe6dac8bf9bbee98e4bb175e1ac39c570af6f17be4ad3ffdb28e953d847cd0b2f0
checksums.yaml.gz.sig CHANGED
Binary file
@@ -6,7 +6,7 @@
6
6
  require 'async/job'
7
7
  require 'thread/local'
8
8
 
9
- require_relative 'builder'
9
+ require 'async/job/builder'
10
10
 
11
11
  module Async
12
12
  module Job
@@ -25,6 +25,8 @@ module Async
25
25
  attr :aliases
26
26
 
27
27
  def [](name)
28
+ name = name.to_sym
29
+
28
30
  @pipelines.fetch(name) do
29
31
  backend = @backends.fetch(name)
30
32
  @pipelines[name] = build(backend)
@@ -48,11 +50,16 @@ module Async
48
50
  end
49
51
 
50
52
  private def build(backend)
51
- builder = Builder.new
53
+ builder = Builder.new(Executor::DEFAULT)
52
54
 
53
55
  builder.instance_eval(&backend)
54
56
 
55
- builder.build
57
+ builder.build do |producer|
58
+ # Ensure that the producer is an interface:
59
+ unless producer.is_a?(Interface)
60
+ Interface.new(producer)
61
+ end
62
+ end
56
63
  end
57
64
  end
58
65
  end
@@ -9,17 +9,19 @@ module Async
9
9
  module Job
10
10
  module Adapter
11
11
  module ActiveJob
12
- class QueueHandler
13
- def initialize(coder = JSON)
14
- @coder = coder
12
+ class Executor
13
+ def initialize(delegate = nil)
14
+ @delegate = delegate
15
15
  end
16
16
 
17
17
  def call(job)
18
- job = @coder.load(job)
19
- Console.info(self, "Calling job...", id: job[:job_id])
18
+ Console.info(self, "Executing job...", id: job[:job_id])
20
19
  ::ActiveJob::Base.execute(job)
20
+
21
+ @delegate&.call(job)
21
22
  end
22
23
 
24
+ # The default executor, at the end of the pipeline.
23
25
  DEFAULT = self.new.freeze
24
26
  end
25
27
  end
@@ -0,0 +1,35 @@
1
+ # frozen_string_literal: true
2
+
3
+ # Released under the MIT License.
4
+ # Copyright, 2024, by Samuel Williams.
5
+
6
+ module Async
7
+ module Job
8
+ module Adapter
9
+ module ActiveJob
10
+ class Interface
11
+ def initialize(delegate)
12
+ @delegate = delegate
13
+ end
14
+
15
+ def enqueue(job)
16
+ Console.info(self, "Enqueueing job...", id: job.job_id)
17
+ @delegate.call(serialize(job))
18
+ end
19
+
20
+ def enqueue_at(job, timestamp)
21
+ # We assume the given timestamp is the same as `job.scheduled_at` which is true in every case we've seen so far.
22
+ Console.info(self, "Scheduling job...", id: job.job_id, scheduled_at: job.scheduled_at)
23
+ @delegate.call(serialize(job))
24
+ end
25
+
26
+ protected
27
+
28
+ def serialize(job)
29
+ job.serialize
30
+ end
31
+ end
32
+ end
33
+ end
34
+ end
35
+ end
@@ -17,12 +17,12 @@ module Async
17
17
  module Adapter
18
18
  module ActiveJob
19
19
  class Railtie < ::Rails::Railtie
20
- DEFAULT_REDIS = proc do
21
- queue Async::Job::Backend::Redis
20
+ DEFAULT_PIPELINE = proc do
21
+ queue Async::Job::Backend::Inline
22
22
  end
23
23
 
24
24
  def initialize
25
- @backends = {default: DEFAULT_REDIS}
25
+ @backends = {default: DEFAULT_PIPELINE}
26
26
  @aliases = {}
27
27
  end
28
28
 
@@ -12,16 +12,18 @@ module Async
12
12
  class Service < Async::Service::Generic
13
13
  def self.each
14
14
  yield :service_class, self
15
+ yield :queue_name, :default
15
16
  end
16
17
 
17
18
  def setup(container)
18
19
  container.run(name: self.name, restart: true) do |instance|
19
- require File.expand_path('config/environment', @environment.evaluator.root)
20
+ evaluator = @environment.evaluator
21
+ require File.expand_path('config/environment', evaluator.root)
20
22
 
21
23
  instance.ready!
22
24
 
23
25
  Sync do
24
- Railtie::Dispatcher.instance.start
26
+ Railtie.start(evaluator.queue_name)
25
27
  end
26
28
  end
27
29
  end
@@ -7,7 +7,7 @@ module Async
7
7
  module Job
8
8
  module Adapter
9
9
  module ActiveJob
10
- VERSION = "0.3.0"
10
+ VERSION = "0.5.0"
11
11
  end
12
12
  end
13
13
  end
@@ -4,5 +4,6 @@
4
4
  # Copyright, 2024, by Samuel Williams.
5
5
 
6
6
  require_relative 'active_job/version'
7
- require_relative 'active_job/queue_adapter'
7
+ require_relative 'active_job/interface'
8
+ require_relative 'active_job/executor'
8
9
  require_relative "active_job/railtie" if defined?(Rails::Railtie)
data/readme.md CHANGED
@@ -32,7 +32,7 @@ $ bundle exec ./job-server.rb
32
32
 
33
33
  ### Configuration
34
34
 
35
- ```ruby
35
+ ``` ruby
36
36
  Rails.application.configure do
37
37
  config.async_job.backend_for :default, :critical do
38
38
  queue Async::Job::Backend::Redis, endpoint: Async::IO::Endpoint.tcp('redis.local')
data.tar.gz.sig CHANGED
Binary file
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: async-job-adapter-active_job
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.0
4
+ version: 0.5.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Samuel Williams
@@ -37,22 +37,22 @@ cert_chain:
37
37
  Q2K9NVun/S785AP05vKkXZEFYxqG6EW012U4oLcFl5MySFajYXRYbuUpH6AY+HP8
38
38
  voD0MPg1DssDLKwXyt1eKD/+Fq0bFWhwVM/1XiAXL7lyYUyOq24KHgQ2Csg=
39
39
  -----END CERTIFICATE-----
40
- date: 2024-02-25 00:00:00.000000000 Z
40
+ date: 2024-02-26 00:00:00.000000000 Z
41
41
  dependencies:
42
42
  - !ruby/object:Gem::Dependency
43
43
  name: async-job
44
44
  requirement: !ruby/object:Gem::Requirement
45
45
  requirements:
46
- - - ">="
46
+ - - "~>"
47
47
  - !ruby/object:Gem::Version
48
- version: '0'
48
+ version: 0.4.1
49
49
  type: :runtime
50
50
  prerelease: false
51
51
  version_requirements: !ruby/object:Gem::Requirement
52
52
  requirements:
53
- - - ">="
53
+ - - "~>"
54
54
  - !ruby/object:Gem::Version
55
- version: '0'
55
+ version: 0.4.1
56
56
  - !ruby/object:Gem::Dependency
57
57
  name: thread-local
58
58
  requirement: !ruby/object:Gem::Requirement
@@ -74,10 +74,9 @@ extensions: []
74
74
  extra_rdoc_files: []
75
75
  files:
76
76
  - lib/async/job/adapter/active_job.rb
77
- - lib/async/job/adapter/active_job/builder.rb
78
77
  - lib/async/job/adapter/active_job/dispatcher.rb
79
- - lib/async/job/adapter/active_job/queue_adapter.rb
80
- - lib/async/job/adapter/active_job/queue_handler.rb
78
+ - lib/async/job/adapter/active_job/executor.rb
79
+ - lib/async/job/adapter/active_job/interface.rb
81
80
  - lib/async/job/adapter/active_job/railtie.rb
82
81
  - lib/async/job/adapter/active_job/service.rb
83
82
  - lib/async/job/adapter/active_job/version.rb
metadata.gz.sig CHANGED
Binary file
@@ -1,72 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- # Released under the MIT License.
4
- # Copyright, 2024, by Samuel Williams.
5
-
6
- require_relative 'queue_adapter'
7
- require_relative 'queue_handler'
8
-
9
- module Async
10
- module Job
11
- module Adapter
12
- module ActiveJob
13
- class Builder
14
- Pipeline = Struct.new(:adapter, :queue)
15
-
16
- def initialize
17
- @enqueue = []
18
- @dequeue = []
19
- @handler = QueueHandler::DEFAULT
20
-
21
- @queue = nil
22
- end
23
-
24
- def enqueue(middleware)
25
- @enqueue << middleware
26
- end
27
-
28
- def queue(queue, *arguments, **options)
29
- # The handler is the output side of the queue, e.g. a QueueHandler or similar wrapper.
30
- # The queue itself is instantiated with the handler.
31
- @queue = ->(handler){queue.new(handler, *arguments, **options)}
32
- end
33
-
34
- def dequeue(middleware)
35
- @dequeue << middleware
36
- end
37
-
38
- def handler(handler)
39
- @handler = handler
40
- end
41
-
42
- def build
43
- # To construct the queue, we need the handler.
44
- handler = @handler
45
-
46
- # We then wrap the handler with the middleware in reverse order:
47
- @dequeue.reverse_each do |middleware|
48
- handler = middleware.new(handler)
49
- end
50
-
51
- # We can now construct the queue with the handler:
52
- queue = @queue.call(handler)
53
-
54
- adapter = queue
55
-
56
- # We now construct the queue adapter:
57
- adapter = @enqueue.reverse_each do |middleware|
58
- adapter = middleware.new(queue)
59
- end
60
-
61
- unless adapter.is_a?(QueueAdapter)
62
- adapter = QueueAdapter.new(adapter)
63
- end
64
-
65
- # The adapter is the part we provide to ActiveJob, and the handler is the part that actually executes the job:
66
- return Pipeline.new(adapter, queue)
67
- end
68
- end
69
- end
70
- end
71
- end
72
- end
@@ -1,29 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- # Released under the MIT License.
4
- # Copyright, 2024, by Samuel Williams.
5
-
6
- module Async
7
- module Job
8
- module Adapter
9
- module ActiveJob
10
- class QueueAdapter
11
- def initialize(server, coder = JSON)
12
- @server = server
13
- @coder = coder
14
- end
15
-
16
- def enqueue(job)
17
- Console.info(self, "Enqueueing job...", id: job.job_id)
18
- @server.enqueue(@coder.dump(job.serialize))
19
- end
20
-
21
- def enqueue_at(job, timestamp)
22
- Console.info(self, "Enqueueing job at...", id: job.job_id, timestamp: timestamp)
23
- @server.schedule(@coder.dump(job.serialize), timestamp)
24
- end
25
- end
26
- end
27
- end
28
- end
29
- end