belated 0.3.3 → 0.4.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 +4 -4
- data/.gitignore +1 -0
- data/CHANGELOG.md +5 -0
- data/Gemfile +3 -0
- data/Gemfile.lock +17 -1
- data/README.md +12 -4
- data/lib/belated.rb +20 -7
- data/lib/belated/client.rb +15 -2
- data/lib/belated/job.rb +1 -0
- data/lib/belated/queue.rb +37 -0
- data/lib/belated/version.rb +1 -1
- data/lib/belated/worker.rb +5 -3
- metadata +4 -2
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 3264ca317aa687386cf4f87b45a358b25197e0a8442d79c28116abbdf373cd5c
|
|
4
|
+
data.tar.gz: fc520d4de51b80b7ec87622f7ef66fd17a60423800a72a402fde7f7361e52a2e
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 5512108388bf979973d471f9107b8f11f1af79320029324053ca748eeac3940635efdbff744410305e185e781de6732fa003ca7251d5d26be1c706e59818f960
|
|
7
|
+
data.tar.gz: 25045c09fbd423b0169cc4eda7a01a4cbf1e93c6a3ee13d0b574f24fabfd3fae9a58768eb6bef962b8613536c3585fb542e02151950eda82d6867c34a0d6e85f
|
data/.gitignore
CHANGED
data/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,10 @@
|
|
|
1
1
|
## [Unreleased]
|
|
2
2
|
|
|
3
|
+
## [0.4.0] - 2021-08-03
|
|
4
|
+
|
|
5
|
+
- Now you can enqueue jobs to be done at a later time. Just pass an `at:` keyword param to the client.
|
|
6
|
+
- Does not save the jobs when you quit.
|
|
7
|
+
|
|
3
8
|
## [0.3.3] - 2021-08-01
|
|
4
9
|
|
|
5
10
|
- Shutdown trapped signal thread, make sure :shutdown is not recorded as a job.
|
data/Gemfile
CHANGED
data/Gemfile.lock
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
PATH
|
|
2
2
|
remote: .
|
|
3
3
|
specs:
|
|
4
|
-
belated (0.
|
|
4
|
+
belated (0.4.0)
|
|
5
5
|
drb
|
|
6
6
|
dry-configurable
|
|
7
7
|
|
|
@@ -72,6 +72,10 @@ GEM
|
|
|
72
72
|
byebug (11.1.3)
|
|
73
73
|
concurrent-ruby (1.1.9)
|
|
74
74
|
crass (1.0.6)
|
|
75
|
+
database_cleaner-active_record (2.0.1)
|
|
76
|
+
activerecord (>= 5.a)
|
|
77
|
+
database_cleaner-core (~> 2.0.0)
|
|
78
|
+
database_cleaner-core (2.0.1)
|
|
75
79
|
diff-lcs (1.4.4)
|
|
76
80
|
drb (2.0.4)
|
|
77
81
|
dry-configurable (0.12.1)
|
|
@@ -145,6 +149,14 @@ GEM
|
|
|
145
149
|
rspec-mocks (3.10.2)
|
|
146
150
|
diff-lcs (>= 1.2.0, < 2.0)
|
|
147
151
|
rspec-support (~> 3.10.0)
|
|
152
|
+
rspec-rails (5.0.1)
|
|
153
|
+
actionpack (>= 5.2)
|
|
154
|
+
activesupport (>= 5.2)
|
|
155
|
+
railties (>= 5.2)
|
|
156
|
+
rspec-core (~> 3.10)
|
|
157
|
+
rspec-expectations (~> 3.10)
|
|
158
|
+
rspec-mocks (~> 3.10)
|
|
159
|
+
rspec-support (~> 3.10)
|
|
148
160
|
rspec-support (3.10.2)
|
|
149
161
|
rubocop (1.18.3)
|
|
150
162
|
parallel (~> 1.10)
|
|
@@ -166,6 +178,7 @@ GEM
|
|
|
166
178
|
activesupport (>= 4.0)
|
|
167
179
|
sprockets (>= 3.0.0)
|
|
168
180
|
sqlite3 (1.4.2)
|
|
181
|
+
stackprof (0.2.16)
|
|
169
182
|
thor (1.1.0)
|
|
170
183
|
tzinfo (2.0.4)
|
|
171
184
|
concurrent-ruby (~> 1.0)
|
|
@@ -181,11 +194,14 @@ PLATFORMS
|
|
|
181
194
|
DEPENDENCIES
|
|
182
195
|
belated!
|
|
183
196
|
byebug
|
|
197
|
+
database_cleaner-active_record
|
|
184
198
|
rails (>= 6.1.3)
|
|
185
199
|
rake (~> 13.0)
|
|
186
200
|
rspec (~> 3.0)
|
|
201
|
+
rspec-rails
|
|
187
202
|
rubocop (~> 1.7)
|
|
188
203
|
sqlite3
|
|
204
|
+
stackprof
|
|
189
205
|
|
|
190
206
|
BUNDLED WITH
|
|
191
207
|
2.2.17
|
data/README.md
CHANGED
|
@@ -13,7 +13,8 @@ TODO LIST:
|
|
|
13
13
|
- Catch SIGTERM and friends
|
|
14
14
|
- Now supports it, partly.
|
|
15
15
|
- Don't crash on errors (Partially done)
|
|
16
|
-
-
|
|
16
|
+
- Save jobs enqueued at a future date too when quitting (now it only saves the jobs in the queue)
|
|
17
|
+
- Have multiple queues?
|
|
17
18
|
- Maybe support ActiveJob?
|
|
18
19
|
- Have a web UI
|
|
19
20
|
- Do some performance testing
|
|
@@ -21,6 +22,7 @@ TODO LIST:
|
|
|
21
22
|
|
|
22
23
|
DONE
|
|
23
24
|
|
|
25
|
+
- ~~Make it possible to schedule jobs~~
|
|
24
26
|
- ~~Marshal the job queue into a file so you don't lose all progress~~
|
|
25
27
|
(Ended up using YAML)
|
|
26
28
|
- ~~Add a logger~~
|
|
@@ -98,6 +100,12 @@ client.perform_belated(job)
|
|
|
98
100
|
|
|
99
101
|
If you want to pass a job to Belated.
|
|
100
102
|
|
|
103
|
+
If you don't want the job to run right away, you can also pass it a keyword param `at:` like so:
|
|
104
|
+
|
|
105
|
+
```ruby
|
|
106
|
+
client.perform_belated(job, Time.now + 1.month)
|
|
107
|
+
```
|
|
108
|
+
|
|
101
109
|
# Settings
|
|
102
110
|
|
|
103
111
|
Configuring Belated:
|
|
@@ -113,15 +121,15 @@ end
|
|
|
113
121
|
|
|
114
122
|
From command line:
|
|
115
123
|
|
|
116
|
-
$ bundle exec belated --rails=true
|
|
124
|
+
$ bundle exec belated --rails=true
|
|
117
125
|
|
|
118
126
|
Use Rails or not.
|
|
119
127
|
|
|
120
|
-
$ bundle exec belated --rails_path=/my_rails_project
|
|
128
|
+
$ bundle exec belated --rails_path=/my_rails_project
|
|
121
129
|
|
|
122
130
|
Path to Rails project.
|
|
123
131
|
|
|
124
|
-
$ bundle exec belated --workers=10
|
|
132
|
+
$ bundle exec belated --workers=10
|
|
125
133
|
|
|
126
134
|
Number of workers.
|
|
127
135
|
|
data/lib/belated.rb
CHANGED
|
@@ -9,6 +9,7 @@ require 'singleton'
|
|
|
9
9
|
require 'dry-configurable'
|
|
10
10
|
require 'belated/client'
|
|
11
11
|
require 'logger'
|
|
12
|
+
require 'belated/queue'
|
|
12
13
|
|
|
13
14
|
# Belated is a pure Ruby job backend.
|
|
14
15
|
# It has limited functionality, as it only accepts
|
|
@@ -22,7 +23,7 @@ class Belated
|
|
|
22
23
|
include Singleton unless $TESTING
|
|
23
24
|
URI = 'druby://localhost:8788'
|
|
24
25
|
FILE_NAME = 'belated_dump'
|
|
25
|
-
@@queue = Queue.new
|
|
26
|
+
@@queue = Belated::Queue.new
|
|
26
27
|
|
|
27
28
|
setting :rails, true
|
|
28
29
|
setting :rails_path, '.'
|
|
@@ -38,15 +39,15 @@ class Belated
|
|
|
38
39
|
def start
|
|
39
40
|
boot_app && load_jobs
|
|
40
41
|
@worker_list = []
|
|
41
|
-
Belated.config.workers.times do |
|
|
42
|
-
@worker_list << Thread.new { Worker.new }
|
|
42
|
+
Belated.config.workers.times do |i|
|
|
43
|
+
@worker_list << Thread.new { Worker.new(number: i.next) }
|
|
43
44
|
end
|
|
44
45
|
return unless Belated.config.connect
|
|
45
46
|
|
|
46
47
|
connect!
|
|
47
48
|
banner_and_info
|
|
48
49
|
trap_signals
|
|
49
|
-
|
|
50
|
+
enqueue_future_jobs
|
|
50
51
|
end
|
|
51
52
|
alias initialize start
|
|
52
53
|
|
|
@@ -55,7 +56,6 @@ class Belated
|
|
|
55
56
|
DRb.start_service(URI, @@queue, verbose: true)
|
|
56
57
|
rescue DRb::DRbConnError, Errno::EADDRINUSE
|
|
57
58
|
Belated.logger.error 'Could not connect to DRb server.'
|
|
58
|
-
retry
|
|
59
59
|
end
|
|
60
60
|
|
|
61
61
|
def trap_signals
|
|
@@ -65,7 +65,7 @@ class Belated
|
|
|
65
65
|
@@queue.push(:shutdown)
|
|
66
66
|
end
|
|
67
67
|
Thread.new { stop_workers }
|
|
68
|
-
sleep 0.1 until @@queue.empty?
|
|
68
|
+
sleep 0.1 until @@queue.empty? || $TESTING
|
|
69
69
|
exit
|
|
70
70
|
end
|
|
71
71
|
end
|
|
@@ -84,6 +84,19 @@ class Belated
|
|
|
84
84
|
Belated.config.rails
|
|
85
85
|
end
|
|
86
86
|
|
|
87
|
+
def enqueue_future_jobs
|
|
88
|
+
log 'starting future jobs thread'
|
|
89
|
+
loop do
|
|
90
|
+
@@queue.future_jobs.each_with_index do |job, i|
|
|
91
|
+
if job[:at] <= Time.now.utc
|
|
92
|
+
log @@queue.future_jobs.delete_at(i)
|
|
93
|
+
@@queue.push(job[:klass])
|
|
94
|
+
end
|
|
95
|
+
end
|
|
96
|
+
sleep 0.01
|
|
97
|
+
end
|
|
98
|
+
end
|
|
99
|
+
|
|
87
100
|
def load_jobs
|
|
88
101
|
log "reloading... if file exists #{File.exist?(Belated::FILE_NAME)}"
|
|
89
102
|
return unless File.exist?(Belated::FILE_NAME)
|
|
@@ -106,7 +119,7 @@ class Belated
|
|
|
106
119
|
Thread.kill(worker)
|
|
107
120
|
end
|
|
108
121
|
class_array = []
|
|
109
|
-
@@queue.
|
|
122
|
+
@@queue.length.times do |_i|
|
|
110
123
|
unless (klass = @@queue.pop).instance_of?(Proc) || klass == :shutdown
|
|
111
124
|
class_array << klass
|
|
112
125
|
end
|
data/lib/belated/client.rb
CHANGED
|
@@ -1,7 +1,16 @@
|
|
|
1
1
|
class Belated
|
|
2
|
+
# The client class is responsible for managing the connection to the
|
|
3
|
+
# DRb server.
|
|
4
|
+
# You can enqueue jobs to be processed by the server.
|
|
5
|
+
# Example:
|
|
6
|
+
# client = Belated::Client.new
|
|
7
|
+
# client.enqueue(JubJub.new, at: Time.now + 5.seconds)
|
|
2
8
|
class Client
|
|
3
9
|
attr_accessor :queue
|
|
4
10
|
|
|
11
|
+
# Starts up the client.
|
|
12
|
+
# Connects to the queue through DRb.
|
|
13
|
+
# @return [void]
|
|
5
14
|
def initialize
|
|
6
15
|
server_uri = Belated::URI
|
|
7
16
|
# @bank =
|
|
@@ -9,8 +18,12 @@ class Belated
|
|
|
9
18
|
self.queue = DRbObject.new_with_uri(server_uri)
|
|
10
19
|
end
|
|
11
20
|
|
|
12
|
-
|
|
13
|
-
|
|
21
|
+
# The method that pushes the jobs to the queue.
|
|
22
|
+
# @param job [Object] - The the job to be pushed.
|
|
23
|
+
# @param at [Date] - The time at which the job should be executed.
|
|
24
|
+
# @return [Object] - The job that was pushed.
|
|
25
|
+
def perform(job, at: nil)
|
|
26
|
+
queue.push(job, at: at)
|
|
14
27
|
end
|
|
15
28
|
alias perform_belated perform
|
|
16
29
|
alias perform_later perform
|
data/lib/belated/job.rb
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
Job = Struct.new(:klass, :at)
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
require 'belated/job'
|
|
2
|
+
|
|
3
|
+
class Belated
|
|
4
|
+
class Queue
|
|
5
|
+
attr_accessor :future_jobs
|
|
6
|
+
|
|
7
|
+
def initialize(queue: Thread::Queue.new, future_jobs: [])
|
|
8
|
+
@queue = queue
|
|
9
|
+
self.future_jobs = future_jobs
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
def push(job, at: nil)
|
|
13
|
+
if at.nil?
|
|
14
|
+
@queue.push(job)
|
|
15
|
+
else
|
|
16
|
+
@future_jobs << Job.new(job, at)
|
|
17
|
+
end
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
def pop
|
|
21
|
+
@queue.pop
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
def clear
|
|
25
|
+
@queue.clear
|
|
26
|
+
self.future_jobs = []
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
def empty?
|
|
30
|
+
@queue.empty?
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
def length
|
|
34
|
+
@queue.length
|
|
35
|
+
end
|
|
36
|
+
end
|
|
37
|
+
end
|
data/lib/belated/version.rb
CHANGED
data/lib/belated/worker.rb
CHANGED
|
@@ -1,22 +1,24 @@
|
|
|
1
1
|
require_relative 'logging'
|
|
2
2
|
class Belated
|
|
3
3
|
# The worker class that actually gets the jobs from the queue
|
|
4
|
-
# and calls them. Expects the jobs to be procs
|
|
4
|
+
# and calls them. Expects the jobs to be procs or
|
|
5
|
+
# classes that have a perform method.
|
|
5
6
|
class Worker
|
|
6
7
|
include Logging
|
|
7
8
|
|
|
8
|
-
def initialize
|
|
9
|
+
def initialize(number: 1)
|
|
10
|
+
@number = number
|
|
9
11
|
start_working
|
|
10
12
|
end
|
|
11
13
|
|
|
12
14
|
def start_working
|
|
13
15
|
loop do
|
|
16
|
+
log "Worker #{@number} fetching jobs!"
|
|
14
17
|
next unless (job = Belated.fetch_job)
|
|
15
18
|
|
|
16
19
|
break if job == :shutdown
|
|
17
20
|
|
|
18
21
|
log call_job(job)
|
|
19
|
-
log 'fetching jobs...'
|
|
20
22
|
end
|
|
21
23
|
end
|
|
22
24
|
|
metadata
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: belated
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 0.
|
|
4
|
+
version: 0.4.0
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Sampo Kuokkanen
|
|
8
8
|
autorequire:
|
|
9
9
|
bindir: bin
|
|
10
10
|
cert_chain: []
|
|
11
|
-
date: 2021-08-
|
|
11
|
+
date: 2021-08-03 00:00:00.000000000 Z
|
|
12
12
|
dependencies:
|
|
13
13
|
- !ruby/object:Gem::Dependency
|
|
14
14
|
name: drb
|
|
@@ -80,7 +80,9 @@ files:
|
|
|
80
80
|
- bin/setup
|
|
81
81
|
- lib/belated.rb
|
|
82
82
|
- lib/belated/client.rb
|
|
83
|
+
- lib/belated/job.rb
|
|
83
84
|
- lib/belated/logging.rb
|
|
85
|
+
- lib/belated/queue.rb
|
|
84
86
|
- lib/belated/rails.rb
|
|
85
87
|
- lib/belated/version.rb
|
|
86
88
|
- lib/belated/worker.rb
|