workhorse 0.1.0 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 720021fa190163c2d0d37f76b6bd0589698a7f3e
4
- data.tar.gz: 817a622805d27e32a9e733c7a74e42ae9b7d2ce7
3
+ metadata.gz: 0cf16c2d211462d7875c56595c5d624ff30b8cfe
4
+ data.tar.gz: 4772dce847b5b7aa51f1931baa7a878d34bc0e06
5
5
  SHA512:
6
- metadata.gz: 38e10cf259f6d02fd07f0ef2a568c69a913dcab9a0b720ec8db2730ebb03f3161ede58467c2f11c88106c5bd688f33d18e0c87294060e62833c3880b6e6e22cd
7
- data.tar.gz: 86b461b572b35b5f6345b5026cadcbe6a01eadcb99befb7d51d10b118889254e88daf883aa57754ebf85a90382b7df8cced56167b971ca273845f169b42e7d52
6
+ metadata.gz: ca5aec71e437a2e151fa0b3356185c44bc12cb60cf09d817097e15307320247083eab40553da836e3dff911cfb98747c1a991755a72d30bb84f7bbd714544a55
7
+ data.tar.gz: 1dcfe3bda9f7c1a6d7dac78bf6a795cadb0a59248ec1da72e3a0fba89b91745b7053938f0f2a4570bf48155ae233968399b01a48e6620a53927f59b54444add2
data/CHANGELOG.md CHANGED
@@ -1,5 +1,9 @@
1
1
  # Workhorse Change log
2
2
 
3
- ## 0.1.0 - 2017-12-08
3
+ ## 0.2.0 - 2017-12-19
4
+
5
+ * Adds support for job-level priorities
6
+
7
+ ## 0.1.0 - 2017-12-18
4
8
 
5
9
  * First feature-complete production release
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
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
 
@@ -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
@@ -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
@@ -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
@@ -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
@@ -9,7 +9,7 @@ class BasicJob
9
9
 
10
10
  def perform
11
11
  results << @some_param
12
- sleep @sleep_time
12
+ sleep @sleep_time if @sleep_time > 0
13
13
  end
14
14
  end
15
15
 
@@ -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
- sleep time
21
- w.shutdown
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
- 5.times do
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 5, DbConnectionTestJob.db_connections.count
16
- assert_equal 5, DbConnectionTestJob.db_connections.uniq.count
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
- w = Workhorse::Worker.new(pool_size: 5, polling_interval: 1)
6
- w.start
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
- Workhorse.enqueue BasicJob.new(sleep_time: 0.5)
8
+ sleep 0.5
9
+ Workhorse.enqueue BasicJob.new(sleep_time: 1)
10
10
 
11
- sleep 0.1
12
- assert_equal 4, w.idle
11
+ sleep 1
12
+ assert_equal 4, w.idle
13
13
 
14
- sleep 0.5
15
- assert_equal 5, w.idle
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
- w = Workhorse::Worker.new
22
- w.start
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
- w.shutdown
30
- w.shutdown # Should be ignored
23
+ assert_raises RuntimeError do
24
+ w.start
25
+ end
31
26
 
32
- Workhorse.enqueue BasicJob.new
27
+ w.shutdown
28
+ w.shutdown # Should be ignored
29
+ end
33
30
  end
34
31
 
35
32
  def test_perform
36
- w = Workhorse::Worker.new polling_interval: 1
37
- Workhorse.enqueue BasicJob.new(sleep_time: 0.1)
38
- assert_equal 'waiting', Workhorse::DbJob.first.state
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
- w.start
41
- sleep 1
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
- w = Workhorse::Worker.new polling_interval: 1
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
- w = Workhorse::Worker.new
64
- w.start
65
- Process.kill 'TERM', Process.pid
66
- sleep 1
67
- w.assert_state! :shutdown
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
- w = Workhorse::Worker.new
73
- w.start
74
- Process.kill 'INT', Process.pid
75
- sleep 1
76
- w.assert_state! :shutdown
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.1.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.authors = ["Sitrox"]
9
- s.date = "2017-12-18"
10
- s.files = [".gitignore", ".releaser_config", ".rubocop.yml", ".travis.yml", "CHANGELOG.md", "FAQ.md", "Gemfile", "LICENSE", "README.md", "RUBY_VERSION", "Rakefile", "VERSION", "bin/rubocop", "lib/generators/workhorse/install_generator.rb", "lib/generators/workhorse/templates/bin/workhorse.rb", "lib/generators/workhorse/templates/config/initializers/workhorse.rb", "lib/generators/workhorse/templates/create_table_jobs.rb", "lib/workhorse.rb", "lib/workhorse/daemon.rb", "lib/workhorse/daemon/shell_handler.rb", "lib/workhorse/db_job.rb", "lib/workhorse/enqueuer.rb", "lib/workhorse/jobs/run_rails_op.rb", "lib/workhorse/performer.rb", "lib/workhorse/poller.rb", "lib/workhorse/pool.rb", "lib/workhorse/worker.rb", "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", "workhorse.gemspec"]
11
- s.require_paths = ["lib"]
12
- s.rubygems_version = "2.0.14.1"
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>, ["~> 1.3"])
21
- s.add_development_dependency(%q<rake>, [">= 0"])
22
- s.add_development_dependency(%q<rubocop>, ["= 0.51.0"])
23
- s.add_development_dependency(%q<minitest>, [">= 0"])
24
- s.add_development_dependency(%q<mysql2>, ["~> 0.3.13"])
25
- s.add_development_dependency(%q<benchmark-ips>, [">= 0"])
26
- s.add_runtime_dependency(%q<activesupport>, [">= 0"])
27
- s.add_runtime_dependency(%q<activerecord>, [">= 0"])
28
- s.add_runtime_dependency(%q<schemacop>, ["~> 2.0"])
29
- s.add_runtime_dependency(%q<concurrent-ruby>, [">= 0"])
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>, ["~> 1.3"])
32
- s.add_dependency(%q<rake>, [">= 0"])
33
- s.add_dependency(%q<rubocop>, ["= 0.51.0"])
34
- s.add_dependency(%q<minitest>, [">= 0"])
35
- s.add_dependency(%q<mysql2>, ["~> 0.3.13"])
36
- s.add_dependency(%q<benchmark-ips>, [">= 0"])
37
- s.add_dependency(%q<activesupport>, [">= 0"])
38
- s.add_dependency(%q<activerecord>, [">= 0"])
39
- s.add_dependency(%q<schemacop>, ["~> 2.0"])
40
- s.add_dependency(%q<concurrent-ruby>, [">= 0"])
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>, ["~> 1.3"])
44
- s.add_dependency(%q<rake>, [">= 0"])
45
- s.add_dependency(%q<rubocop>, ["= 0.51.0"])
46
- s.add_dependency(%q<minitest>, [">= 0"])
47
- s.add_dependency(%q<mysql2>, ["~> 0.3.13"])
48
- s.add_dependency(%q<benchmark-ips>, [">= 0"])
49
- s.add_dependency(%q<activesupport>, [">= 0"])
50
- s.add_dependency(%q<activerecord>, [">= 0"])
51
- s.add_dependency(%q<schemacop>, ["~> 2.0"])
52
- s.add_dependency(%q<concurrent-ruby>, [">= 0"])
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.1.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-18 00:00:00.000000000 Z
11
+ date: 2017-12-19 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler