workhorse 0.1.0 → 0.2.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/CHANGELOG.md +5 -1
- data/FAQ.md +12 -0
- data/README.md +8 -7
- data/VERSION +1 -1
- data/lib/generators/workhorse/templates/create_table_jobs.rb +3 -1
- data/lib/workhorse/enqueuer.rb +3 -2
- data/lib/workhorse/poller.rb +2 -2
- data/lib/workhorse/worker.rb +8 -0
- data/test/lib/db_schema.rb +4 -2
- data/test/lib/jobs.rb +1 -1
- data/test/lib/test_helper.rb +11 -2
- data/test/workhorse/enqueuer_test.rb +6 -0
- data/test/workhorse/performer_test.rb +3 -3
- data/test/workhorse/worker_test.rb +47 -42
- data/workhorse.gemspec +41 -40
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 0cf16c2d211462d7875c56595c5d624ff30b8cfe
|
4
|
+
data.tar.gz: 4772dce847b5b7aa51f1931baa7a878d34bc0e06
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: ca5aec71e437a2e151fa0b3356185c44bc12cb60cf09d817097e15307320247083eab40553da836e3dff911cfb98747c1a991755a72d30bb84f7bbd714544a55
|
7
|
+
data.tar.gz: 1dcfe3bda9f7c1a6d7dac78bf6a795cadb0a59248ec1da72e3a0fba89b91745b7053938f0f2a4570bf48155ae233968399b01a48e6620a53927f59b54444add2
|
data/CHANGELOG.md
CHANGED
data/FAQ.md
CHANGED
@@ -57,3 +57,15 @@ Workhorse::Worker.start_and_wait(pool_size: 5)
|
|
57
57
|
```
|
58
58
|
|
59
59
|
This can then be started and "daemonized" using standard linux tools.
|
60
|
+
|
61
|
+
## I'm getting random autoloading exeptions
|
62
|
+
|
63
|
+
Make sure to always start the worker in *production mode*, i.e.:
|
64
|
+
|
65
|
+
```bash
|
66
|
+
RAILS_ENV=production bin/workhorse.rb start
|
67
|
+
```
|
68
|
+
|
69
|
+
## Why does workhorse not support timeouts?
|
70
|
+
|
71
|
+
Generic timeout implementations are [a dangerous thing](http://www.mikeperham.com/2015/05/08/timeout-rubys-most-dangerous-api/) in Ruby. This is why we decided against providing this feature in Workhorse and recommend to implement the timeouts inside of your jobs - i.e. via network timeouts.
|
data/README.md
CHANGED
@@ -15,6 +15,8 @@ How it works:
|
|
15
15
|
* Each worker is configurable as to which queue(s) it processes. Jobs in the
|
16
16
|
same queue never run simultaneously. Jobs with no queue can always run in
|
17
17
|
parallel.
|
18
|
+
* Each job has a priority, the default being 0. Jobs with higher priorities
|
19
|
+
(lower is higher, 0 the highest) get processed first.
|
18
20
|
* Each worker polls the database and spawns a number of threads to execute jobs
|
19
21
|
of different queues simultaneously.
|
20
22
|
|
@@ -66,7 +68,7 @@ What it does not do:
|
|
66
68
|
|
67
69
|
Workhorse can handle any jobs that support the `perform` method and are
|
68
70
|
serializable. To queue a basic job, use the static method `Workhorse.enqueue`.
|
69
|
-
You can optionally pass a queue name.
|
71
|
+
You can optionally pass a queue name and a priority.
|
70
72
|
|
71
73
|
```ruby
|
72
74
|
class MyJob
|
@@ -79,7 +81,7 @@ class MyJob
|
|
79
81
|
end
|
80
82
|
end
|
81
83
|
|
82
|
-
Workhorse.enqueue MyJob.new('John'), queue: :test
|
84
|
+
Workhorse.enqueue MyJob.new('John'), queue: :test, priority: 2
|
83
85
|
```
|
84
86
|
|
85
87
|
### RailsOps operations
|
@@ -89,7 +91,7 @@ Workhorse allows you to easily queue
|
|
89
91
|
method `Workhorse.enqueue_op`:
|
90
92
|
|
91
93
|
```ruby
|
92
|
-
Workhorse.enqueue_op Operations::Jobs::CleanUpDatabase, { quiet: true }, queue: :maintenance
|
94
|
+
Workhorse.enqueue_op Operations::Jobs::CleanUpDatabase, { quiet: true }, queue: :maintenance, priority: 2
|
93
95
|
```
|
94
96
|
|
95
97
|
Params passed using the second argument will be used for operation instantiation
|
@@ -98,7 +100,8 @@ at job execution.
|
|
98
100
|
If you do not want to pass any params to the operation, just omit the second hash:
|
99
101
|
|
100
102
|
```ruby
|
101
|
-
Workhorse.enqueue_op Operations::Jobs::CleanUpDatabase, queue: :maintenance
|
103
|
+
Workhorse.enqueue_op Operations::Jobs::CleanUpDatabase, queue: :maintenance,
|
104
|
+
priority: 2
|
102
105
|
```
|
103
106
|
|
104
107
|
## Configuring and starting workers
|
@@ -140,7 +143,7 @@ For this case, the workhorse install routine automatically creates the file
|
|
140
143
|
The script can be called as follows:
|
141
144
|
|
142
145
|
```bash
|
143
|
-
bin/workhorse.rb start|stop|status|watch|restart|usage
|
146
|
+
RAILS_ENV=production bin/workhorse.rb start|stop|status|watch|restart|usage
|
144
147
|
```
|
145
148
|
|
146
149
|
#### Background and customization
|
@@ -163,8 +166,6 @@ Please consult the [FAQ](FAQ.md).
|
|
163
166
|
## Roadmap
|
164
167
|
|
165
168
|
* [ ] ActiveJob integration for Rails
|
166
|
-
* [ ] Job timeouts
|
167
|
-
* [ ] Job priorities
|
168
169
|
|
169
170
|
## Copyright
|
170
171
|
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.
|
1
|
+
0.2.0
|
@@ -1,4 +1,4 @@
|
|
1
|
-
class CreateTableJobs < ActiveRecord::Migration
|
1
|
+
class CreateTableJobs < ActiveRecord::Migration[4.2]
|
2
2
|
def change
|
3
3
|
create_table :jobs, force: true do |t|
|
4
4
|
t.string :state, null: false, default: 'waiting'
|
@@ -14,6 +14,8 @@ class CreateTableJobs < ActiveRecord::Migration
|
|
14
14
|
t.datetime :failed_at
|
15
15
|
t.text :last_error, limit: 4_294_967_295
|
16
16
|
|
17
|
+
t.integer :priority, null: false
|
18
|
+
|
17
19
|
t.timestamps null: false
|
18
20
|
end
|
19
21
|
|
data/lib/workhorse/enqueuer.rb
CHANGED
@@ -1,16 +1,17 @@
|
|
1
1
|
module Workhorse
|
2
2
|
module Enqueuer
|
3
3
|
# Enqueue any object that is serializable and has a `perform` method
|
4
|
-
def enqueue(job, queue: nil)
|
4
|
+
def enqueue(job, queue: nil, priority: 0)
|
5
5
|
return DbJob.create!(
|
6
6
|
queue: queue,
|
7
|
+
priority: priority,
|
7
8
|
handler: Marshal.dump(job)
|
8
9
|
)
|
9
10
|
end
|
10
11
|
|
11
12
|
# Enqueue an ActiveJob job
|
12
13
|
def enqueue_active_job(job)
|
13
|
-
enqueue job, queue: job.queue_name
|
14
|
+
enqueue job, queue: job.queue_name, priority: job.priority
|
14
15
|
end
|
15
16
|
|
16
17
|
# Enqueue the execution of an operation by its class and params
|
data/lib/workhorse/poller.rb
CHANGED
@@ -18,8 +18,8 @@ module Workhorse
|
|
18
18
|
@thread = Thread.new do
|
19
19
|
begin
|
20
20
|
loop do
|
21
|
-
poll
|
22
21
|
break unless running?
|
22
|
+
poll
|
23
23
|
sleep
|
24
24
|
end
|
25
25
|
rescue => e
|
@@ -113,7 +113,7 @@ module Workhorse
|
|
113
113
|
end
|
114
114
|
|
115
115
|
# Order by creation date
|
116
|
-
select = select.order(table[:created_at].asc)
|
116
|
+
select = select.order(table[:priority].asc).order(table[:created_at].asc)
|
117
117
|
|
118
118
|
# Limit number of records
|
119
119
|
if is_oracle
|
data/lib/workhorse/worker.rb
CHANGED
@@ -52,6 +52,8 @@ module Workhorse
|
|
52
52
|
@logger = logger
|
53
53
|
|
54
54
|
fail 'Polling interval must be an integer.' unless @polling_interval.is_a?(Integer)
|
55
|
+
|
56
|
+
check_rails_env if defined?(Rails)
|
55
57
|
end
|
56
58
|
|
57
59
|
def log(text, level = :info)
|
@@ -134,6 +136,12 @@ module Workhorse
|
|
134
136
|
|
135
137
|
private
|
136
138
|
|
139
|
+
def check_rails_env
|
140
|
+
unless Rails.env.production?
|
141
|
+
warn 'WARNING: Always run workhorse workers in production environment. Other environments can lead to unexpected behavior.'
|
142
|
+
end
|
143
|
+
end
|
144
|
+
|
137
145
|
def trap_termination
|
138
146
|
SHUTDOWN_SIGNALS.each do |signal|
|
139
147
|
Signal.trap(signal) do
|
data/test/lib/db_schema.rb
CHANGED
@@ -4,7 +4,7 @@ ActiveRecord::Schema.define do
|
|
4
4
|
create_table :jobs, force: true do |t|
|
5
5
|
t.string :state, null: false, default: 'waiting'
|
6
6
|
t.string :queue, null: true
|
7
|
-
t.text :handler, null: false
|
7
|
+
t.text :handler, null: false, limit: 4_294_967_295
|
8
8
|
|
9
9
|
t.string :locked_by
|
10
10
|
t.datetime :locked_at
|
@@ -13,7 +13,9 @@ ActiveRecord::Schema.define do
|
|
13
13
|
|
14
14
|
t.datetime :succeeded_at
|
15
15
|
t.datetime :failed_at
|
16
|
-
t.text :last_error
|
16
|
+
t.text :last_error, limit: 4_294_967_295
|
17
|
+
|
18
|
+
t.integer :priority, null: false
|
17
19
|
|
18
20
|
t.timestamps null: false
|
19
21
|
end
|
data/test/lib/jobs.rb
CHANGED
data/test/lib/test_helper.rb
CHANGED
@@ -15,10 +15,19 @@ class WorkhorseTest < ActiveSupport::TestCase
|
|
15
15
|
options[:pool_size] ||= 5
|
16
16
|
options[:polling_interval] ||= 1
|
17
17
|
|
18
|
+
with_worker(options) do
|
19
|
+
sleep time
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
def with_worker(options = {})
|
18
24
|
w = Workhorse::Worker.new(options)
|
19
25
|
w.start
|
20
|
-
|
21
|
-
|
26
|
+
begin
|
27
|
+
yield(w)
|
28
|
+
ensure
|
29
|
+
w.shutdown
|
30
|
+
end
|
22
31
|
end
|
23
32
|
end
|
24
33
|
|
@@ -25,6 +25,12 @@ class Workhorse::EnqueuerTest < WorkhorseTest
|
|
25
25
|
|
26
26
|
db_job = Workhorse::DbJob.first
|
27
27
|
assert_equal 'q1', db_job.queue
|
28
|
+
assert_equal 0, db_job.priority
|
29
|
+
end
|
30
|
+
|
31
|
+
def test_with_priority
|
32
|
+
Workhorse.enqueue BasicJob.new, priority: 1
|
33
|
+
assert_equal 1, Workhorse::DbJob.first.priority
|
28
34
|
end
|
29
35
|
|
30
36
|
def test_op
|
@@ -5,14 +5,14 @@ class Workhorse::WorkerTest < WorkhorseTest
|
|
5
5
|
# connections.
|
6
6
|
def test_db_connections
|
7
7
|
w = Workhorse::Worker.new polling_interval: 1, pool_size: 5
|
8
|
-
|
8
|
+
2.times do
|
9
9
|
Workhorse.enqueue DbConnectionTestJob.new
|
10
10
|
end
|
11
11
|
w.start
|
12
12
|
sleep 1
|
13
13
|
w.shutdown
|
14
14
|
|
15
|
-
assert_equal
|
16
|
-
assert_equal
|
15
|
+
assert_equal 2, DbConnectionTestJob.db_connections.count
|
16
|
+
assert_equal 2, DbConnectionTestJob.db_connections.uniq.count
|
17
17
|
end
|
18
18
|
end
|
@@ -2,44 +2,41 @@ require 'test_helper'
|
|
2
2
|
|
3
3
|
class Workhorse::WorkerTest < WorkhorseTest
|
4
4
|
def test_idle
|
5
|
-
|
6
|
-
|
7
|
-
assert_equal 5, w.idle
|
5
|
+
with_worker(pool_size: 5, polling_interval: 1) do |w|
|
6
|
+
assert_equal 5, w.idle
|
8
7
|
|
9
|
-
|
8
|
+
sleep 0.5
|
9
|
+
Workhorse.enqueue BasicJob.new(sleep_time: 1)
|
10
10
|
|
11
|
-
|
12
|
-
|
11
|
+
sleep 1
|
12
|
+
assert_equal 4, w.idle
|
13
13
|
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
w.shutdown
|
14
|
+
sleep 1
|
15
|
+
assert_equal 5, w.idle
|
16
|
+
end
|
18
17
|
end
|
19
18
|
|
20
19
|
def test_start_and_shutdown
|
21
|
-
|
22
|
-
|
23
|
-
w.assert_state! :running
|
24
|
-
|
25
|
-
assert_raises RuntimeError do
|
26
|
-
w.start
|
27
|
-
end
|
20
|
+
with_worker do |w|
|
21
|
+
w.assert_state! :running
|
28
22
|
|
29
|
-
|
30
|
-
|
23
|
+
assert_raises RuntimeError do
|
24
|
+
w.start
|
25
|
+
end
|
31
26
|
|
32
|
-
|
27
|
+
w.shutdown
|
28
|
+
w.shutdown # Should be ignored
|
29
|
+
end
|
33
30
|
end
|
34
31
|
|
35
32
|
def test_perform
|
36
|
-
|
37
|
-
|
38
|
-
|
33
|
+
with_worker(polling_interval: 1) do
|
34
|
+
sleep 0.1
|
35
|
+
Workhorse.enqueue BasicJob.new(sleep_time: 0.1)
|
36
|
+
assert_equal 'waiting', Workhorse::DbJob.first.state
|
39
37
|
|
40
|
-
|
41
|
-
|
42
|
-
w.shutdown
|
38
|
+
sleep 1
|
39
|
+
end
|
43
40
|
|
44
41
|
assert_equal 'succeeded', Workhorse::DbJob.first.state
|
45
42
|
end
|
@@ -48,10 +45,7 @@ class Workhorse::WorkerTest < WorkhorseTest
|
|
48
45
|
BasicJob.results.clear
|
49
46
|
|
50
47
|
Workhorse.enqueue BasicJob.new(some_param: 5, sleep_time: 0)
|
51
|
-
|
52
|
-
w.start
|
53
|
-
sleep 0.5
|
54
|
-
w.shutdown
|
48
|
+
work 0.5
|
55
49
|
|
56
50
|
assert_equal 'succeeded', Workhorse::DbJob.first.state
|
57
51
|
|
@@ -60,21 +54,19 @@ class Workhorse::WorkerTest < WorkhorseTest
|
|
60
54
|
end
|
61
55
|
|
62
56
|
def test_term
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
w.shutdown
|
57
|
+
with_worker do |w|
|
58
|
+
Process.kill 'TERM', Process.pid
|
59
|
+
sleep 1
|
60
|
+
w.assert_state! :shutdown
|
61
|
+
end
|
69
62
|
end
|
70
63
|
|
71
64
|
def test_int
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
w.shutdown
|
65
|
+
with_worker do |w|
|
66
|
+
Process.kill 'INT', Process.pid
|
67
|
+
sleep 1
|
68
|
+
w.assert_state! :shutdown
|
69
|
+
end
|
78
70
|
end
|
79
71
|
|
80
72
|
def test_no_queues
|
@@ -117,6 +109,19 @@ class Workhorse::WorkerTest < WorkhorseTest
|
|
117
109
|
assert_equal 'succeeded', jobs[2].state
|
118
110
|
end
|
119
111
|
|
112
|
+
def test_order_with_priorities
|
113
|
+
Workhorse.enqueue BasicJob.new(some_param: 6, sleep_time: 0), priority: 4
|
114
|
+
Workhorse.enqueue BasicJob.new(some_param: 4, sleep_time: 0), priority: 3
|
115
|
+
Workhorse.enqueue BasicJob.new(some_param: 5, sleep_time: 0), priority: 3
|
116
|
+
Workhorse.enqueue BasicJob.new(some_param: 3, sleep_time: 0), priority: 2
|
117
|
+
Workhorse.enqueue BasicJob.new(some_param: 2, sleep_time: 0), priority: 1
|
118
|
+
Workhorse.enqueue BasicJob.new(some_param: 1, sleep_time: 0), priority: 0
|
119
|
+
|
120
|
+
BasicJob.results.clear
|
121
|
+
work 6.5, pool_size: 1
|
122
|
+
assert_equal (1..6).to_a, BasicJob.results
|
123
|
+
end
|
124
|
+
|
120
125
|
private
|
121
126
|
|
122
127
|
def enqueue_in_multiple_queues
|
data/workhorse.gemspec
CHANGED
@@ -1,54 +1,55 @@
|
|
1
1
|
# -*- encoding: utf-8 -*-
|
2
|
+
# stub: workhorse 0.2.0 ruby lib
|
2
3
|
|
3
4
|
Gem::Specification.new do |s|
|
4
|
-
s.name = "workhorse"
|
5
|
-
s.version = "0.
|
5
|
+
s.name = "workhorse".freeze
|
6
|
+
s.version = "0.2.0"
|
6
7
|
|
7
|
-
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
8
|
-
s.
|
9
|
-
s.
|
10
|
-
s.
|
11
|
-
s.
|
12
|
-
s.rubygems_version = "2.
|
13
|
-
s.summary = "Multi-threaded job backend with database queuing for ruby."
|
14
|
-
s.test_files = ["test/lib/db_schema.rb", "test/lib/jobs.rb", "test/lib/test_helper.rb", "test/workhorse/enqueuer_test.rb", "test/workhorse/performer_test.rb", "test/workhorse/poller_test.rb", "test/workhorse/pool_test.rb", "test/workhorse/worker_test.rb"]
|
8
|
+
s.required_rubygems_version = Gem::Requirement.new(">= 0".freeze) if s.respond_to? :required_rubygems_version=
|
9
|
+
s.require_paths = ["lib".freeze]
|
10
|
+
s.authors = ["Sitrox".freeze]
|
11
|
+
s.date = "2017-12-19"
|
12
|
+
s.files = [".gitignore".freeze, ".releaser_config".freeze, ".rubocop.yml".freeze, ".travis.yml".freeze, "CHANGELOG.md".freeze, "FAQ.md".freeze, "Gemfile".freeze, "LICENSE".freeze, "README.md".freeze, "RUBY_VERSION".freeze, "Rakefile".freeze, "VERSION".freeze, "bin/rubocop".freeze, "lib/generators/workhorse/install_generator.rb".freeze, "lib/generators/workhorse/templates/bin/workhorse.rb".freeze, "lib/generators/workhorse/templates/config/initializers/workhorse.rb".freeze, "lib/generators/workhorse/templates/create_table_jobs.rb".freeze, "lib/workhorse.rb".freeze, "lib/workhorse/daemon.rb".freeze, "lib/workhorse/daemon/shell_handler.rb".freeze, "lib/workhorse/db_job.rb".freeze, "lib/workhorse/enqueuer.rb".freeze, "lib/workhorse/jobs/run_rails_op.rb".freeze, "lib/workhorse/performer.rb".freeze, "lib/workhorse/poller.rb".freeze, "lib/workhorse/pool.rb".freeze, "lib/workhorse/worker.rb".freeze, "test/lib/db_schema.rb".freeze, "test/lib/jobs.rb".freeze, "test/lib/test_helper.rb".freeze, "test/workhorse/enqueuer_test.rb".freeze, "test/workhorse/performer_test.rb".freeze, "test/workhorse/poller_test.rb".freeze, "test/workhorse/pool_test.rb".freeze, "test/workhorse/worker_test.rb".freeze, "workhorse.gemspec".freeze]
|
13
|
+
s.rubygems_version = "2.6.14".freeze
|
14
|
+
s.summary = "Multi-threaded job backend with database queuing for ruby.".freeze
|
15
|
+
s.test_files = ["test/lib/db_schema.rb".freeze, "test/lib/jobs.rb".freeze, "test/lib/test_helper.rb".freeze, "test/workhorse/enqueuer_test.rb".freeze, "test/workhorse/performer_test.rb".freeze, "test/workhorse/poller_test.rb".freeze, "test/workhorse/pool_test.rb".freeze, "test/workhorse/worker_test.rb".freeze]
|
15
16
|
|
16
17
|
if s.respond_to? :specification_version then
|
17
18
|
s.specification_version = 4
|
18
19
|
|
19
20
|
if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
|
20
|
-
s.add_development_dependency(%q<bundler
|
21
|
-
s.add_development_dependency(%q<rake
|
22
|
-
s.add_development_dependency(%q<rubocop
|
23
|
-
s.add_development_dependency(%q<minitest
|
24
|
-
s.add_development_dependency(%q<mysql2
|
25
|
-
s.add_development_dependency(%q<benchmark-ips
|
26
|
-
s.add_runtime_dependency(%q<activesupport
|
27
|
-
s.add_runtime_dependency(%q<activerecord
|
28
|
-
s.add_runtime_dependency(%q<schemacop
|
29
|
-
s.add_runtime_dependency(%q<concurrent-ruby
|
21
|
+
s.add_development_dependency(%q<bundler>.freeze, ["~> 1.3"])
|
22
|
+
s.add_development_dependency(%q<rake>.freeze, [">= 0"])
|
23
|
+
s.add_development_dependency(%q<rubocop>.freeze, ["= 0.51.0"])
|
24
|
+
s.add_development_dependency(%q<minitest>.freeze, [">= 0"])
|
25
|
+
s.add_development_dependency(%q<mysql2>.freeze, ["~> 0.3.13"])
|
26
|
+
s.add_development_dependency(%q<benchmark-ips>.freeze, [">= 0"])
|
27
|
+
s.add_runtime_dependency(%q<activesupport>.freeze, [">= 0"])
|
28
|
+
s.add_runtime_dependency(%q<activerecord>.freeze, [">= 0"])
|
29
|
+
s.add_runtime_dependency(%q<schemacop>.freeze, ["~> 2.0"])
|
30
|
+
s.add_runtime_dependency(%q<concurrent-ruby>.freeze, [">= 0"])
|
30
31
|
else
|
31
|
-
s.add_dependency(%q<bundler
|
32
|
-
s.add_dependency(%q<rake
|
33
|
-
s.add_dependency(%q<rubocop
|
34
|
-
s.add_dependency(%q<minitest
|
35
|
-
s.add_dependency(%q<mysql2
|
36
|
-
s.add_dependency(%q<benchmark-ips
|
37
|
-
s.add_dependency(%q<activesupport
|
38
|
-
s.add_dependency(%q<activerecord
|
39
|
-
s.add_dependency(%q<schemacop
|
40
|
-
s.add_dependency(%q<concurrent-ruby
|
32
|
+
s.add_dependency(%q<bundler>.freeze, ["~> 1.3"])
|
33
|
+
s.add_dependency(%q<rake>.freeze, [">= 0"])
|
34
|
+
s.add_dependency(%q<rubocop>.freeze, ["= 0.51.0"])
|
35
|
+
s.add_dependency(%q<minitest>.freeze, [">= 0"])
|
36
|
+
s.add_dependency(%q<mysql2>.freeze, ["~> 0.3.13"])
|
37
|
+
s.add_dependency(%q<benchmark-ips>.freeze, [">= 0"])
|
38
|
+
s.add_dependency(%q<activesupport>.freeze, [">= 0"])
|
39
|
+
s.add_dependency(%q<activerecord>.freeze, [">= 0"])
|
40
|
+
s.add_dependency(%q<schemacop>.freeze, ["~> 2.0"])
|
41
|
+
s.add_dependency(%q<concurrent-ruby>.freeze, [">= 0"])
|
41
42
|
end
|
42
43
|
else
|
43
|
-
s.add_dependency(%q<bundler
|
44
|
-
s.add_dependency(%q<rake
|
45
|
-
s.add_dependency(%q<rubocop
|
46
|
-
s.add_dependency(%q<minitest
|
47
|
-
s.add_dependency(%q<mysql2
|
48
|
-
s.add_dependency(%q<benchmark-ips
|
49
|
-
s.add_dependency(%q<activesupport
|
50
|
-
s.add_dependency(%q<activerecord
|
51
|
-
s.add_dependency(%q<schemacop
|
52
|
-
s.add_dependency(%q<concurrent-ruby
|
44
|
+
s.add_dependency(%q<bundler>.freeze, ["~> 1.3"])
|
45
|
+
s.add_dependency(%q<rake>.freeze, [">= 0"])
|
46
|
+
s.add_dependency(%q<rubocop>.freeze, ["= 0.51.0"])
|
47
|
+
s.add_dependency(%q<minitest>.freeze, [">= 0"])
|
48
|
+
s.add_dependency(%q<mysql2>.freeze, ["~> 0.3.13"])
|
49
|
+
s.add_dependency(%q<benchmark-ips>.freeze, [">= 0"])
|
50
|
+
s.add_dependency(%q<activesupport>.freeze, [">= 0"])
|
51
|
+
s.add_dependency(%q<activerecord>.freeze, [">= 0"])
|
52
|
+
s.add_dependency(%q<schemacop>.freeze, ["~> 2.0"])
|
53
|
+
s.add_dependency(%q<concurrent-ruby>.freeze, [">= 0"])
|
53
54
|
end
|
54
55
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: workhorse
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Sitrox
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2017-12-
|
11
|
+
date: 2017-12-19 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|