fleiss 0.1.0 → 0.1.1
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/.rubocop.yml +1 -1
- data/.travis.yml +14 -0
- data/Gemfile.lock +14 -10
- data/fleiss.gemspec +3 -1
- data/lib/fleiss/backend/active_record/concern.rb +11 -7
- data/lib/fleiss/worker.rb +12 -19
- data/spec/fleiss/backend/active_record_spec.rb +12 -0
- data/spec/spec_helper.rb +4 -5
- metadata +31 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: e9eb58758de53588746446aedfbd877e9b84d361de7650185265b9973aeff0b3
|
4
|
+
data.tar.gz: d5f1ac77ce8f6dbef855c6a4e0f2eecdad56a7f8a5fc30f5851d95934eb92453
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: c1b97a6658b29170a51a85df91611ff562f319d03f29626bbcf3069858e19cf7cc5aed4cfec7b0508fc90a1899cf325b84fef67e9c270842609acb62cbe0fad7
|
7
|
+
data.tar.gz: 28dccc2dced0062b9355f75da37989f2c008bd3b6d3be0d8cac4c8c3ea637eb41f4b94a747e10abd19ef6f85e51d45f01db62c581f1dee0b98377f6affb6cb3f
|
data/.rubocop.yml
CHANGED
data/.travis.yml
ADDED
@@ -0,0 +1,14 @@
|
|
1
|
+
language: ruby
|
2
|
+
rvm:
|
3
|
+
- 2.5
|
4
|
+
- 2.4
|
5
|
+
before_install:
|
6
|
+
- mysql -e 'CREATE DATABASE fleiss_test;'
|
7
|
+
- psql -c 'CREATE DATABASE fleiss_test;' -U postgres
|
8
|
+
services:
|
9
|
+
- postgresql
|
10
|
+
- mysql
|
11
|
+
env:
|
12
|
+
- DATABASE_URL=sqlite3:///tmp/fleiss_test.sqlite3
|
13
|
+
- DATABASE_URL=mysql2://travis@127.0.0.1/fleiss_test
|
14
|
+
- DATABASE_URL=postgresql://127.0.0.1/fleiss_test
|
data/Gemfile.lock
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
fleiss (0.1.
|
4
|
+
fleiss (0.1.1)
|
5
5
|
activejob (>= 5.0)
|
6
6
|
activerecord (>= 5.0)
|
7
7
|
concurrent-ruby
|
@@ -9,16 +9,16 @@ PATH
|
|
9
9
|
GEM
|
10
10
|
remote: https://rubygems.org/
|
11
11
|
specs:
|
12
|
-
activejob (5.2.
|
13
|
-
activesupport (= 5.2.
|
12
|
+
activejob (5.2.2)
|
13
|
+
activesupport (= 5.2.2)
|
14
14
|
globalid (>= 0.3.6)
|
15
|
-
activemodel (5.2.
|
16
|
-
activesupport (= 5.2.
|
17
|
-
activerecord (5.2.
|
18
|
-
activemodel (= 5.2.
|
19
|
-
activesupport (= 5.2.
|
15
|
+
activemodel (5.2.2)
|
16
|
+
activesupport (= 5.2.2)
|
17
|
+
activerecord (5.2.2)
|
18
|
+
activemodel (= 5.2.2)
|
19
|
+
activesupport (= 5.2.2)
|
20
20
|
arel (>= 9.0)
|
21
|
-
activesupport (5.2.
|
21
|
+
activesupport (5.2.2)
|
22
22
|
concurrent-ruby (~> 1.0, >= 1.0.2)
|
23
23
|
i18n (>= 0.7, < 2)
|
24
24
|
minitest (~> 5.1)
|
@@ -33,9 +33,11 @@ GEM
|
|
33
33
|
concurrent-ruby (~> 1.0)
|
34
34
|
jaro_winkler (1.5.1)
|
35
35
|
minitest (5.11.3)
|
36
|
+
mysql2 (0.5.2)
|
36
37
|
parallel (1.12.1)
|
37
38
|
parser (2.5.3.0)
|
38
39
|
ast (~> 2.4.0)
|
40
|
+
pg (1.1.3)
|
39
41
|
powerpack (0.1.2)
|
40
42
|
rainbow (3.0.0)
|
41
43
|
rake (12.3.1)
|
@@ -52,7 +54,7 @@ GEM
|
|
52
54
|
diff-lcs (>= 1.2.0, < 2.0)
|
53
55
|
rspec-support (~> 3.8.0)
|
54
56
|
rspec-support (3.8.0)
|
55
|
-
rubocop (0.
|
57
|
+
rubocop (0.61.1)
|
56
58
|
jaro_winkler (~> 1.5.1)
|
57
59
|
parallel (~> 1.10)
|
58
60
|
parser (>= 2.5, != 2.5.1.1)
|
@@ -73,6 +75,8 @@ PLATFORMS
|
|
73
75
|
DEPENDENCIES
|
74
76
|
bundler
|
75
77
|
fleiss!
|
78
|
+
mysql2
|
79
|
+
pg
|
76
80
|
rake
|
77
81
|
rspec
|
78
82
|
rubocop
|
data/fleiss.gemspec
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
Gem::Specification.new do |s|
|
2
2
|
s.name = 'fleiss'
|
3
|
-
s.version = '0.1.
|
3
|
+
s.version = '0.1.1'
|
4
4
|
s.authors = ['Black Square Media Ltd']
|
5
5
|
s.email = ['info@blacksquaremedia.com']
|
6
6
|
s.summary = %(Minimialist background jobs backed by ActiveJob and ActiveRecord.)
|
@@ -19,6 +19,8 @@ Gem::Specification.new do |s|
|
|
19
19
|
s.add_dependency 'concurrent-ruby'
|
20
20
|
|
21
21
|
s.add_development_dependency 'bundler'
|
22
|
+
s.add_development_dependency 'mysql2'
|
23
|
+
s.add_development_dependency 'pg'
|
22
24
|
s.add_development_dependency 'rake'
|
23
25
|
s.add_development_dependency 'rspec'
|
24
26
|
s.add_development_dependency 'rubocop'
|
@@ -68,19 +68,23 @@ module Fleiss
|
|
68
68
|
# @param [String] owner
|
69
69
|
# @return [Boolean] true if job was started.
|
70
70
|
def start(owner, now: Time.zone.now)
|
71
|
-
|
72
|
-
|
73
|
-
|
71
|
+
with_lock do
|
72
|
+
self.class.pending(now)
|
73
|
+
.where(id: id)
|
74
|
+
.update_all(started_at: now, owner: owner) == 1
|
75
|
+
end
|
74
76
|
end
|
75
77
|
|
76
78
|
# Marks a job as finished.
|
77
79
|
# @param [String] owner
|
78
80
|
# @return [Boolean] true if successful.
|
79
81
|
def finish(owner, now: Time.zone.now)
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
82
|
+
with_lock do
|
83
|
+
self.class
|
84
|
+
.in_progress(owner)
|
85
|
+
.where(id: id)
|
86
|
+
.update_all(finished_at: now) == 1
|
87
|
+
end
|
84
88
|
end
|
85
89
|
end
|
86
90
|
end
|
data/lib/fleiss/worker.rb
CHANGED
@@ -57,31 +57,24 @@ class Fleiss::Worker
|
|
57
57
|
private
|
58
58
|
|
59
59
|
def run_cycle
|
60
|
-
|
61
|
-
|
62
|
-
|
60
|
+
capacity = @pool.max_length - @pool.scheduled_task_count + @pool.completed_task_count
|
61
|
+
return unless capacity.positive?
|
62
|
+
|
63
|
+
batch = Fleiss.backend
|
64
|
+
.in_queue(queues)
|
65
|
+
.pending
|
66
|
+
.limit(capacity)
|
67
|
+
.to_a
|
68
|
+
|
69
|
+
batch.each do |job|
|
70
|
+
break if @stopped
|
71
|
+
|
63
72
|
@pool.post { perform(job) }
|
64
73
|
end
|
65
74
|
rescue StandardError => e
|
66
75
|
handle_exception e, 'running cycle'
|
67
76
|
end
|
68
77
|
|
69
|
-
def capacity
|
70
|
-
num = @pool.max_length - @pool.scheduled_task_count + @pool.completed_task_count
|
71
|
-
num.positive? ? num : 0
|
72
|
-
end
|
73
|
-
|
74
|
-
def next_batch
|
75
|
-
slots = capacity
|
76
|
-
return [] if slots.zero?
|
77
|
-
|
78
|
-
Fleiss.backend
|
79
|
-
.in_queue(queues)
|
80
|
-
.pending
|
81
|
-
.limit(slots)
|
82
|
-
.to_a
|
83
|
-
end
|
84
|
-
|
85
78
|
def perform(job)
|
86
79
|
return unless job.start(uuid)
|
87
80
|
|
@@ -95,6 +95,18 @@ RSpec.describe Fleiss::Backend::ActiveRecord do
|
|
95
95
|
expect(rec.started_at).to be_within(2.seconds).of(Time.zone.now)
|
96
96
|
end
|
97
97
|
|
98
|
+
it 'should lock atomically' do
|
99
|
+
24.times do
|
100
|
+
TestJob.perform_later
|
101
|
+
end
|
102
|
+
counts = (1..4).map do |n|
|
103
|
+
Thread.new do
|
104
|
+
described_class.pending.to_a.count {|j| j.start "owner-#{n}" }
|
105
|
+
end
|
106
|
+
end.map(&:value)
|
107
|
+
expect(counts.sum).to eq(24)
|
108
|
+
end
|
109
|
+
|
98
110
|
it 'should finish' do
|
99
111
|
job = TestJob.perform_later
|
100
112
|
rec = retrieve(job)
|
data/spec/spec_helper.rb
CHANGED
@@ -12,12 +12,11 @@ ActiveJob::Base.logger = Logger.new(nil)
|
|
12
12
|
|
13
13
|
Time.zone_default = Time.find_zone!('UTC')
|
14
14
|
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
'pool' => 20,
|
19
|
-
}
|
15
|
+
database_url = ENV['DATABASE_URL'] || "sqlite3://#{Tempfile.new(['fleiss-test', '.sqlite3']).path}"
|
16
|
+
ActiveRecord::Base.configurations['test'] = { 'url' => database_url, 'pool' => 20 }
|
17
|
+
|
20
18
|
ActiveRecord::Base.establish_connection :test
|
19
|
+
ActiveRecord::Base.connection.drop_table('fleiss_jobs', if_exists: true)
|
21
20
|
ActiveRecord::Migration.suppress_messages do
|
22
21
|
Fleiss::Backend::ActiveRecord::Migration.migrate(:up)
|
23
22
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: fleiss
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Black Square Media Ltd
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2018-
|
11
|
+
date: 2018-12-06 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activejob
|
@@ -66,6 +66,34 @@ dependencies:
|
|
66
66
|
- - ">="
|
67
67
|
- !ruby/object:Gem::Version
|
68
68
|
version: '0'
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: mysql2
|
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: pg
|
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'
|
69
97
|
- !ruby/object:Gem::Dependency
|
70
98
|
name: rake
|
71
99
|
requirement: !ruby/object:Gem::Requirement
|
@@ -133,6 +161,7 @@ files:
|
|
133
161
|
- ".editorconfig"
|
134
162
|
- ".gitignore"
|
135
163
|
- ".rubocop.yml"
|
164
|
+
- ".travis.yml"
|
136
165
|
- Gemfile
|
137
166
|
- Gemfile.lock
|
138
167
|
- LICENSE
|