talentbox-delayed_job_sequel 4.3.0 → 4.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 +5 -5
- data/README.md +4 -4
- data/lib/delayed/backend/sequel.rb +8 -8
- data/lib/generators/delayed_job/templates/migration.rb +4 -4
- data/spec/delayed/backend/sequel_spec.rb +11 -11
- data/spec/delayed/serialization/sequel_spec.rb +1 -1
- data/spec/spec_helper.rb +51 -16
- metadata +43 -19
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
|
-
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
2
|
+
SHA256:
|
|
3
|
+
metadata.gz: 9df8379a22448df5d83e80a07c9203f4f18a3a92b26b2adbdd58c3b34439edd6
|
|
4
|
+
data.tar.gz: 69c7e61e93e6125950d41839f5547c3bfd9151b41aaa4500b0efe729bb34d0d7
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 7e561a008f43677037414d62dfb26a258630dc041ede13b3afc08bb4bcda8d756925274995a4af26a42889f598a00bacee543fe28475b839e2fba9fe50576904
|
|
7
|
+
data.tar.gz: 05a2b56eedc5e54c0a56dec32179bc3a5fcbb11d30814d80b87002de8f5c32928c5ceb92f45e7a7f96e49132c8f5be95ba15670841eeb2cbca3d1222adeafb11
|
data/README.md
CHANGED
|
@@ -1,13 +1,12 @@
|
|
|
1
1
|
# DelayedJob Sequel Backend
|
|
2
2
|
|
|
3
|
-
[](https://codeclimate.com/github/TalentBox/delayed_job_sequel)
|
|
3
|
+
[](https://github.com/TalentBox/delayed_job_sequel/actions/workflows/ci.yml)
|
|
5
4
|
|
|
6
5
|
## Compatibility
|
|
7
6
|
|
|
8
|
-
This gem
|
|
7
|
+
This gem is tested to work on `Ruby` (MRI/CRuby) `>= 3.4`, `Sequel` `~> 5.0`, and `DelayedJob` `~> 4.1`.
|
|
9
8
|
|
|
10
|
-
It
|
|
9
|
+
It should work with older Ruby/Sequel/DelayedJob combinations, but we don't test those anymore.
|
|
11
10
|
|
|
12
11
|
## Installation
|
|
13
12
|
|
|
@@ -53,6 +52,7 @@ Improvements has been made by those awesome contributors:
|
|
|
53
52
|
* James Goodhouse (@jamesgoodhouse)
|
|
54
53
|
* Lyle Franklin (@ljfranklin)
|
|
55
54
|
* Florent Piteau (@flop)
|
|
55
|
+
* Pedro Fayolle (@pilaf)
|
|
56
56
|
|
|
57
57
|
## How to contribute
|
|
58
58
|
|
|
@@ -20,10 +20,10 @@ module Delayed
|
|
|
20
20
|
filter do
|
|
21
21
|
(
|
|
22
22
|
(run_at <= db_time_now) &
|
|
23
|
-
::Sequel.expr(:
|
|
23
|
+
::Sequel.expr(locked_at: nil) |
|
|
24
24
|
(::Sequel.expr(:locked_at) < lock_upper_bound) |
|
|
25
|
-
{:
|
|
26
|
-
) & {:
|
|
25
|
+
{locked_by: worker_name}
|
|
26
|
+
) & {failed_at: nil}
|
|
27
27
|
end
|
|
28
28
|
end
|
|
29
29
|
|
|
@@ -41,7 +41,7 @@ module Delayed
|
|
|
41
41
|
|
|
42
42
|
# When a worker is exiting, make sure we don't have any locked jobs.
|
|
43
43
|
def self.clear_locks!(worker_name)
|
|
44
|
-
filter(:
|
|
44
|
+
filter(locked_by: worker_name).update(locked_by: nil, locked_at: nil)
|
|
45
45
|
end
|
|
46
46
|
|
|
47
47
|
# adapted from
|
|
@@ -51,7 +51,7 @@ module Delayed
|
|
|
51
51
|
|
|
52
52
|
ds = ds.filter(::Sequel.lit("priority >= ?", Worker.min_priority)) if Worker.min_priority
|
|
53
53
|
ds = ds.filter(::Sequel.lit("priority <= ?", Worker.max_priority)) if Worker.max_priority
|
|
54
|
-
ds = ds.filter(:
|
|
54
|
+
ds = ds.filter(queue: Worker.queues) if Worker.queues.any?
|
|
55
55
|
ds = ds.by_priority
|
|
56
56
|
|
|
57
57
|
case ::Sequel::Model.db.database_type
|
|
@@ -70,7 +70,7 @@ module Delayed
|
|
|
70
70
|
if job = ds.first
|
|
71
71
|
job.locked_at = self.db_time_now
|
|
72
72
|
job.locked_by = worker.name
|
|
73
|
-
job.save(:
|
|
73
|
+
job.save(raise_on_failure: true)
|
|
74
74
|
job
|
|
75
75
|
end
|
|
76
76
|
end
|
|
@@ -108,7 +108,7 @@ module Delayed
|
|
|
108
108
|
end
|
|
109
109
|
|
|
110
110
|
def save!
|
|
111
|
-
save :
|
|
111
|
+
save raise_on_failure: true
|
|
112
112
|
end
|
|
113
113
|
|
|
114
114
|
def update_attributes(attrs)
|
|
@@ -116,7 +116,7 @@ module Delayed
|
|
|
116
116
|
end
|
|
117
117
|
|
|
118
118
|
def self.create!(attrs)
|
|
119
|
-
new(attrs).save :
|
|
119
|
+
new(attrs).save raise_on_failure: true
|
|
120
120
|
end
|
|
121
121
|
|
|
122
122
|
def self.silence_log(&block)
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
class CreateDelayedJobs < ActiveRecord::Migration
|
|
2
2
|
def self.up
|
|
3
|
-
create_table :delayed_jobs, :
|
|
4
|
-
table.integer :priority, :
|
|
5
|
-
table.integer :attempts, :
|
|
3
|
+
create_table :delayed_jobs, force: true do |table|
|
|
4
|
+
table.integer :priority, default: 0 # Allows some jobs to jump to the front of the queue
|
|
5
|
+
table.integer :attempts, default: 0 # Provides for retries, but still fail eventually.
|
|
6
6
|
table.text :handler # YAML-encoded string of the object that will do work
|
|
7
7
|
table.text :last_error # reason for last failure (See Note below)
|
|
8
8
|
table.datetime :run_at # When to run. Could be Time.zone.now for immediately, or sometime in the future.
|
|
@@ -13,7 +13,7 @@ class CreateDelayedJobs < ActiveRecord::Migration
|
|
|
13
13
|
table.timestamps
|
|
14
14
|
end
|
|
15
15
|
|
|
16
|
-
add_index :delayed_jobs, [:priority, :run_at], :
|
|
16
|
+
add_index :delayed_jobs, [:priority, :run_at], name: 'delayed_jobs_priority'
|
|
17
17
|
end
|
|
18
18
|
|
|
19
19
|
def self.down
|
|
@@ -49,10 +49,10 @@ describe Delayed::Backend::Sequel::Job do
|
|
|
49
49
|
described_class.create(failed_at: Time.now)
|
|
50
50
|
expect do
|
|
51
51
|
expect(
|
|
52
|
-
Delayed::Job.count(:
|
|
52
|
+
Delayed::Job.count(conditions: "failed_at is not NULL")
|
|
53
53
|
).to eq 1
|
|
54
54
|
expect(
|
|
55
|
-
Delayed::Job.count(:
|
|
55
|
+
Delayed::Job.count(conditions: "locked_by is not NULL")
|
|
56
56
|
).to eq 0
|
|
57
57
|
end.to_not raise_error
|
|
58
58
|
end
|
|
@@ -62,10 +62,10 @@ describe Delayed::Backend::Sequel::Job do
|
|
|
62
62
|
described_class.create(queue: "important", priority: 1)
|
|
63
63
|
expect do
|
|
64
64
|
expect(
|
|
65
|
-
Delayed::Job.count(:
|
|
65
|
+
Delayed::Job.count(group: "queue", conditions: ['run_at < ? and failed_at is NULL', Time.now])
|
|
66
66
|
).to match_array [["slow", 1], ["important", 1]]
|
|
67
67
|
expect(
|
|
68
|
-
Delayed::Job.count(:
|
|
68
|
+
Delayed::Job.count(group: "priority", conditions: ['run_at < ? and failed_at is NULL', Time.now])
|
|
69
69
|
).to match_array [[1, 1], [2, 1]]
|
|
70
70
|
end.to_not raise_error
|
|
71
71
|
end
|
|
@@ -107,7 +107,7 @@ describe Delayed::Backend::Sequel::Job do
|
|
|
107
107
|
describe "enqueue" do
|
|
108
108
|
it "should allow enqueue hook to modify job at DB level" do
|
|
109
109
|
later = described_class.db_time_now + 20.minutes
|
|
110
|
-
job = Delayed::Backend::Sequel::Job.enqueue :
|
|
110
|
+
job = Delayed::Backend::Sequel::Job.enqueue payload_object: EnqueueJobMod.new
|
|
111
111
|
expect(
|
|
112
112
|
Delayed::Backend::Sequel::Job[job.id].run_at
|
|
113
113
|
).to be_within(1).of(later)
|
|
@@ -115,16 +115,16 @@ describe Delayed::Backend::Sequel::Job do
|
|
|
115
115
|
end
|
|
116
116
|
end
|
|
117
117
|
|
|
118
|
-
describe Delayed::Backend::Sequel::Job, "override table name" do
|
|
118
|
+
describe Delayed::Backend::Sequel::Job, "override table name", :postgres do
|
|
119
119
|
it "allows to override the table name" do
|
|
120
|
-
::Sequel::Model.db.transaction :
|
|
120
|
+
::Sequel::Model.db.transaction rollback: :always do
|
|
121
121
|
begin
|
|
122
122
|
DB.create_table :another_delayed_jobs do
|
|
123
123
|
primary_key :id
|
|
124
|
-
Integer :priority, :
|
|
125
|
-
Integer :attempts, :
|
|
126
|
-
String :handler, :
|
|
127
|
-
String :last_error, :
|
|
124
|
+
Integer :priority, default: 0
|
|
125
|
+
Integer :attempts, default: 0
|
|
126
|
+
String :handler, text: true
|
|
127
|
+
String :last_error, text: true
|
|
128
128
|
Time :run_at
|
|
129
129
|
Time :locked_at
|
|
130
130
|
Time :failed_at
|
data/spec/spec_helper.rb
CHANGED
|
@@ -11,28 +11,59 @@ def jruby?
|
|
|
11
11
|
(defined?(RUBY_ENGINE) && RUBY_ENGINE=="jruby") || defined?(JRUBY_VERSION)
|
|
12
12
|
end
|
|
13
13
|
|
|
14
|
-
|
|
15
|
-
|
|
14
|
+
rspec_exclusions = {}
|
|
15
|
+
rspec_exclusions[:skip_jdbc] = !jruby?
|
|
16
|
+
rspec_exclusions[:postgres] = ENV['TEST_ADAPTER'] != 'postgresql'
|
|
17
|
+
rspec_exclusions[:mysql] = !%w[mysql mysql2].include?(ENV['TEST_ADAPTER'])
|
|
18
|
+
rspec_exclusions[:sqlite] = ENV['TEST_ADAPTER'] != 'sqlite3'
|
|
19
|
+
|
|
20
|
+
RSpec.configure do |config|
|
|
21
|
+
config.filter_run_excluding rspec_exclusions
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
db_host = ENV.fetch("TEST_DATABASE_HOST", "127.0.0.1")
|
|
25
|
+
db_name = ENV.fetch("TEST_DATABASE", "delayed_jobs_test")
|
|
26
|
+
|
|
27
|
+
DB = case ENV["TEST_ADAPTER"]
|
|
28
|
+
when /mysql/
|
|
29
|
+
db_port = ENV.fetch("TEST_DATABASE_PORT", 3306)
|
|
30
|
+
opts = {test: true, encoding: ENV.fetch("TEST_ENCODING", "utf8")}
|
|
16
31
|
begin
|
|
17
32
|
if jruby?
|
|
18
|
-
Sequel.connect "jdbc:mysql
|
|
33
|
+
Sequel.connect "jdbc:mysql://#{db_host}:#{db_port}/#{db_name}", opts
|
|
19
34
|
else
|
|
20
|
-
|
|
35
|
+
opts.merge!({database: db_name, host: db_host, port: db_port})
|
|
36
|
+
opts[:user] = ENV["TEST_USERNAME"] if ENV.key?("TEST_USERNAME")
|
|
37
|
+
opts[:password] = ENV["TEST_PASSWORD"] if ENV.key?("TEST_PASSWORD")
|
|
38
|
+
Sequel.connect({adapter: "mysql2"}.merge(opts))
|
|
21
39
|
end
|
|
22
40
|
rescue Sequel::DatabaseConnectionError
|
|
23
|
-
|
|
24
|
-
|
|
41
|
+
if ENV.key? "CI"
|
|
42
|
+
raise
|
|
43
|
+
else
|
|
44
|
+
system "mysql -e 'CREATE DATABASE IF NOT EXISTS `#{db_name}` DEFAULT CHARACTER SET utf8 DEFAULT COLLATE utf8_unicode_ci'"
|
|
45
|
+
retry
|
|
46
|
+
end
|
|
25
47
|
end
|
|
26
|
-
when
|
|
48
|
+
when /postgres/
|
|
49
|
+
db_port = ENV.fetch("TEST_DATABASE_PORT", 5432)
|
|
50
|
+
opts = {test: true, encoding: ENV.fetch("TEST_ENCODING", nil)}
|
|
27
51
|
begin
|
|
28
52
|
if jruby?
|
|
29
|
-
Sequel.connect "jdbc:postgresql
|
|
53
|
+
Sequel.connect "jdbc:postgresql://#{db_host}:#{db_port}/#{db_name}", opts
|
|
30
54
|
else
|
|
31
|
-
|
|
55
|
+
opts.merge!({database: db_name, host: db_host, port: db_port})
|
|
56
|
+
opts[:user] = ENV["TEST_USERNAME"] if ENV.key?("TEST_USERNAME")
|
|
57
|
+
opts[:password] = ENV["TEST_PASSWORD"] if ENV.key?("TEST_PASSWORD")
|
|
58
|
+
Sequel.connect({adapter: "postgres"}.merge(opts))
|
|
32
59
|
end
|
|
33
60
|
rescue Sequel::DatabaseConnectionError
|
|
34
|
-
|
|
35
|
-
|
|
61
|
+
if ENV.key? "CI"
|
|
62
|
+
raise
|
|
63
|
+
else
|
|
64
|
+
system "createdb --encoding=UTF8 #{db_name}"
|
|
65
|
+
retry
|
|
66
|
+
end
|
|
36
67
|
end
|
|
37
68
|
else
|
|
38
69
|
if jruby?
|
|
@@ -43,14 +74,15 @@ else
|
|
|
43
74
|
end
|
|
44
75
|
|
|
45
76
|
DB.drop_table :delayed_jobs rescue Sequel::DatabaseError
|
|
77
|
+
DB.drop_table :another_delayed_jobs rescue Sequel::DatabaseError
|
|
46
78
|
DB.drop_table :stories rescue Sequel::DatabaseError
|
|
47
79
|
|
|
48
80
|
DB.create_table :delayed_jobs do
|
|
49
81
|
primary_key :id
|
|
50
|
-
Integer :priority, :
|
|
51
|
-
Integer :attempts, :
|
|
52
|
-
String :handler, :
|
|
53
|
-
String :last_error, :
|
|
82
|
+
Integer :priority, default: 0
|
|
83
|
+
Integer :attempts, default: 0
|
|
84
|
+
String :handler, text: true
|
|
85
|
+
String :last_error, text: true
|
|
54
86
|
Time :run_at
|
|
55
87
|
Time :locked_at
|
|
56
88
|
Time :failed_at
|
|
@@ -63,7 +95,7 @@ end
|
|
|
63
95
|
DB.create_table :stories do
|
|
64
96
|
primary_key :story_id
|
|
65
97
|
String :text
|
|
66
|
-
TrueClass :scoped, :
|
|
98
|
+
TrueClass :scoped, default: true
|
|
67
99
|
end
|
|
68
100
|
|
|
69
101
|
require "delayed_job_sequel"
|
|
@@ -83,4 +115,7 @@ class Story < Sequel::Model
|
|
|
83
115
|
end
|
|
84
116
|
handle_asynchronously :whatever
|
|
85
117
|
alias_method :persisted?, :exists?
|
|
118
|
+
def save!
|
|
119
|
+
save(raise_on_failure: true)
|
|
120
|
+
end
|
|
86
121
|
end
|
metadata
CHANGED
|
@@ -1,14 +1,13 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: talentbox-delayed_job_sequel
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 4.
|
|
4
|
+
version: 4.4.0
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Jonathan Tron
|
|
8
|
-
autorequire:
|
|
9
8
|
bindir: bin
|
|
10
9
|
cert_chain: []
|
|
11
|
-
date:
|
|
10
|
+
date: 1980-01-02 00:00:00.000000000 Z
|
|
12
11
|
dependencies:
|
|
13
12
|
- !ruby/object:Gem::Dependency
|
|
14
13
|
name: sequel
|
|
@@ -16,7 +15,7 @@ dependencies:
|
|
|
16
15
|
requirements:
|
|
17
16
|
- - ">="
|
|
18
17
|
- !ruby/object:Gem::Version
|
|
19
|
-
version: '
|
|
18
|
+
version: '5.0'
|
|
20
19
|
- - "<"
|
|
21
20
|
- !ruby/object:Gem::Version
|
|
22
21
|
version: '6.0'
|
|
@@ -26,7 +25,7 @@ dependencies:
|
|
|
26
25
|
requirements:
|
|
27
26
|
- - ">="
|
|
28
27
|
- !ruby/object:Gem::Version
|
|
29
|
-
version: '
|
|
28
|
+
version: '5.0'
|
|
30
29
|
- - "<"
|
|
31
30
|
- !ruby/object:Gem::Version
|
|
32
31
|
version: '6.0'
|
|
@@ -36,22 +35,22 @@ dependencies:
|
|
|
36
35
|
requirements:
|
|
37
36
|
- - "~>"
|
|
38
37
|
- !ruby/object:Gem::Version
|
|
39
|
-
version: 4.1
|
|
38
|
+
version: '4.1'
|
|
40
39
|
type: :runtime
|
|
41
40
|
prerelease: false
|
|
42
41
|
version_requirements: !ruby/object:Gem::Requirement
|
|
43
42
|
requirements:
|
|
44
43
|
- - "~>"
|
|
45
44
|
- !ruby/object:Gem::Version
|
|
46
|
-
version: 4.1
|
|
45
|
+
version: '4.1'
|
|
47
46
|
- !ruby/object:Gem::Dependency
|
|
48
|
-
name:
|
|
47
|
+
name: rspec
|
|
49
48
|
requirement: !ruby/object:Gem::Requirement
|
|
50
49
|
requirements:
|
|
51
50
|
- - ">="
|
|
52
51
|
- !ruby/object:Gem::Version
|
|
53
52
|
version: '0'
|
|
54
|
-
type: :
|
|
53
|
+
type: :development
|
|
55
54
|
prerelease: false
|
|
56
55
|
version_requirements: !ruby/object:Gem::Requirement
|
|
57
56
|
requirements:
|
|
@@ -59,21 +58,49 @@ dependencies:
|
|
|
59
58
|
- !ruby/object:Gem::Version
|
|
60
59
|
version: '0'
|
|
61
60
|
- !ruby/object:Gem::Dependency
|
|
62
|
-
name:
|
|
61
|
+
name: rake
|
|
63
62
|
requirement: !ruby/object:Gem::Requirement
|
|
64
63
|
requirements:
|
|
65
|
-
- - "
|
|
64
|
+
- - ">="
|
|
66
65
|
- !ruby/object:Gem::Version
|
|
67
|
-
version:
|
|
66
|
+
version: '0'
|
|
68
67
|
type: :development
|
|
69
68
|
prerelease: false
|
|
70
69
|
version_requirements: !ruby/object:Gem::Requirement
|
|
71
70
|
requirements:
|
|
72
|
-
- - "
|
|
71
|
+
- - ">="
|
|
73
72
|
- !ruby/object:Gem::Version
|
|
74
|
-
version:
|
|
73
|
+
version: '0'
|
|
75
74
|
- !ruby/object:Gem::Dependency
|
|
76
|
-
name:
|
|
75
|
+
name: rubocop
|
|
76
|
+
requirement: !ruby/object:Gem::Requirement
|
|
77
|
+
requirements:
|
|
78
|
+
- - ">="
|
|
79
|
+
- !ruby/object:Gem::Version
|
|
80
|
+
version: '0'
|
|
81
|
+
type: :development
|
|
82
|
+
prerelease: false
|
|
83
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
84
|
+
requirements:
|
|
85
|
+
- - ">="
|
|
86
|
+
- !ruby/object:Gem::Version
|
|
87
|
+
version: '0'
|
|
88
|
+
- !ruby/object:Gem::Dependency
|
|
89
|
+
name: rubocop-rake
|
|
90
|
+
requirement: !ruby/object:Gem::Requirement
|
|
91
|
+
requirements:
|
|
92
|
+
- - ">="
|
|
93
|
+
- !ruby/object:Gem::Version
|
|
94
|
+
version: '0'
|
|
95
|
+
type: :development
|
|
96
|
+
prerelease: false
|
|
97
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
98
|
+
requirements:
|
|
99
|
+
- - ">="
|
|
100
|
+
- !ruby/object:Gem::Version
|
|
101
|
+
version: '0'
|
|
102
|
+
- !ruby/object:Gem::Dependency
|
|
103
|
+
name: rubocop-rspec
|
|
77
104
|
requirement: !ruby/object:Gem::Requirement
|
|
78
105
|
requirements:
|
|
79
106
|
- - ">="
|
|
@@ -107,7 +134,6 @@ files:
|
|
|
107
134
|
homepage: http://github.com/TalentBox/delayed_job_sequel
|
|
108
135
|
licenses: []
|
|
109
136
|
metadata: {}
|
|
110
|
-
post_install_message:
|
|
111
137
|
rdoc_options:
|
|
112
138
|
- "--main"
|
|
113
139
|
- README.md
|
|
@@ -126,9 +152,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
|
126
152
|
- !ruby/object:Gem::Version
|
|
127
153
|
version: '0'
|
|
128
154
|
requirements: []
|
|
129
|
-
|
|
130
|
-
rubygems_version: 2.5.2
|
|
131
|
-
signing_key:
|
|
155
|
+
rubygems_version: 4.0.3
|
|
132
156
|
specification_version: 4
|
|
133
157
|
summary: Sequel backend for DelayedJob
|
|
134
158
|
test_files:
|