worker-army 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
data/.document ADDED
@@ -0,0 +1,5 @@
1
+ lib/**/*.rb
2
+ bin/*
3
+ -
4
+ features/**/*.feature
5
+ LICENSE.txt
data/Gemfile ADDED
@@ -0,0 +1,18 @@
1
+ source 'https://rubygems.org'
2
+ ruby '1.9.3'
3
+
4
+ gem "redis"
5
+ gem "multi_json"
6
+ gem "sinatra"
7
+ gem "sinatra-contrib"
8
+ gem "rest-client"
9
+ gem "rake"
10
+ gem 'unicorn'
11
+ gem "foreman"
12
+
13
+ # Add dependencies to develop your gem here.
14
+ # Include everything needed to run rake, tests, features, etc.
15
+ group :development do
16
+ gem "bundler", "~> 1.3.5"
17
+ gem "jeweler", "~> 1.8.4"
18
+ end
data/Gemfile.lock ADDED
@@ -0,0 +1,93 @@
1
+ GEM
2
+ remote: https://rubygems.org/
3
+ specs:
4
+ addressable (2.3.5)
5
+ backports (3.3.3)
6
+ builder (3.2.2)
7
+ dotenv (0.9.0)
8
+ eventmachine (1.0.3)
9
+ faraday (0.8.8)
10
+ multipart-post (~> 1.2.0)
11
+ foreman (0.63.0)
12
+ dotenv (>= 0.7)
13
+ thor (>= 0.13.6)
14
+ git (1.2.5)
15
+ github_api (0.10.1)
16
+ addressable
17
+ faraday (~> 0.8.1)
18
+ hashie (>= 1.2)
19
+ multi_json (~> 1.4)
20
+ nokogiri (~> 1.5.2)
21
+ oauth2
22
+ hashie (2.0.5)
23
+ highline (1.6.19)
24
+ httpauth (0.2.0)
25
+ jeweler (1.8.6)
26
+ builder
27
+ bundler (~> 1.0)
28
+ git (>= 1.2.5)
29
+ github_api (= 0.10.1)
30
+ highline (>= 1.6.15)
31
+ nokogiri (= 1.5.10)
32
+ rake
33
+ rdoc
34
+ json (1.8.0)
35
+ jwt (0.1.8)
36
+ multi_json (>= 1.5)
37
+ kgio (2.8.0)
38
+ mime-types (1.23)
39
+ multi_json (1.7.8)
40
+ multi_xml (0.5.5)
41
+ multipart-post (1.2.0)
42
+ nokogiri (1.5.10)
43
+ oauth2 (0.9.2)
44
+ faraday (~> 0.8)
45
+ httpauth (~> 0.2)
46
+ jwt (~> 0.1.4)
47
+ multi_json (~> 1.0)
48
+ multi_xml (~> 0.5)
49
+ rack (~> 1.2)
50
+ rack (1.5.2)
51
+ rack-protection (1.5.0)
52
+ rack
53
+ rack-test (0.6.2)
54
+ rack (>= 1.0)
55
+ raindrops (0.11.0)
56
+ rake (10.1.0)
57
+ rdoc (4.0.1)
58
+ json (~> 1.4)
59
+ redis (3.0.4)
60
+ rest-client (1.6.7)
61
+ mime-types (>= 1.16)
62
+ sinatra (1.4.3)
63
+ rack (~> 1.4)
64
+ rack-protection (~> 1.4)
65
+ tilt (~> 1.3, >= 1.3.4)
66
+ sinatra-contrib (1.4.0)
67
+ backports (>= 2.0)
68
+ eventmachine
69
+ rack-protection
70
+ rack-test
71
+ sinatra (~> 1.4.2)
72
+ tilt (~> 1.3)
73
+ thor (0.18.1)
74
+ tilt (1.4.1)
75
+ unicorn (4.6.3)
76
+ kgio (~> 2.6)
77
+ rack
78
+ raindrops (~> 0.7)
79
+
80
+ PLATFORMS
81
+ ruby
82
+
83
+ DEPENDENCIES
84
+ bundler (~> 1.3.5)
85
+ foreman
86
+ jeweler (~> 1.8.4)
87
+ multi_json
88
+ rake
89
+ redis
90
+ rest-client
91
+ sinatra
92
+ sinatra-contrib
93
+ unicorn
data/LICENSE.txt ADDED
@@ -0,0 +1,20 @@
1
+ Copyright (c) 2013 Oliver Kiessler
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining
4
+ a copy of this software and associated documentation files (the
5
+ "Software"), to deal in the Software without restriction, including
6
+ without limitation the rights to use, copy, modify, merge, publish,
7
+ distribute, sublicense, and/or sell copies of the Software, and to
8
+ permit persons to whom the Software is furnished to do so, subject to
9
+ the following conditions:
10
+
11
+ The above copyright notice and this permission notice shall be
12
+ included in all copies or substantial portions of the Software.
13
+
14
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
18
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
19
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/Procfile ADDED
@@ -0,0 +1 @@
1
+ web: bundle exec unicorn -p $PORT -c ./unicorn.rb
data/README.rdoc ADDED
@@ -0,0 +1,19 @@
1
+ = worker-army
2
+
3
+ Description goes here.
4
+
5
+ == Contributing to worker-army
6
+
7
+ * Check out the latest master to make sure the feature hasn't been implemented or the bug hasn't been fixed yet.
8
+ * Check out the issue tracker to make sure someone already hasn't requested it and/or contributed it.
9
+ * Fork the project.
10
+ * Start a feature/bugfix branch.
11
+ * Commit and push until you are happy with your contribution.
12
+ * Make sure to add tests for it. This is important so I don't break it in a future version unintentionally.
13
+ * Please try not to mess with the Rakefile, version, or history. If you want to have your own version, or is otherwise necessary, that is fine, but please isolate to its own commit so I can cherry-pick around it.
14
+
15
+ == Copyright
16
+
17
+ Copyright (c) 2013 Oliver Kiessler. See LICENSE.txt for
18
+ further details.
19
+
data/Rakefile ADDED
@@ -0,0 +1,66 @@
1
+ # encoding: utf-8
2
+
3
+ require 'rubygems'
4
+ require 'bundler'
5
+ begin
6
+ Bundler.setup(:default, :development)
7
+ rescue Bundler::BundlerError => e
8
+ $stderr.puts e.message
9
+ $stderr.puts "Run `bundle install` to install missing gems"
10
+ exit e.status_code
11
+ end
12
+ require 'rake'
13
+
14
+ require 'jeweler'
15
+ Jeweler::Tasks.new do |gem|
16
+ # gem is a Gem::Specification... see http://docs.rubygems.org/read/chapter/20 for more options
17
+ gem.name = "worker-army"
18
+ gem.homepage = "http://github.com/okiess/worker-army"
19
+ gem.license = "MIT"
20
+ gem.summary = %Q{Simple worker queue}
21
+ gem.description = %Q{Simple redis based worker queue with a HTTP/Rest interface}
22
+ gem.email = "kiessler@inceedo.com"
23
+ gem.authors = ["Oliver Kiessler"]
24
+ gem.add_runtime_dependency 'sinatra'
25
+ gem.add_runtime_dependency 'sinatra-contrib'
26
+ gem.add_runtime_dependency 'rest-client'
27
+ gem.add_runtime_dependency 'redis'
28
+ gem.add_runtime_dependency 'json'
29
+ gem.add_runtime_dependency 'multi_json'
30
+ gem.add_runtime_dependency 'rake'
31
+ end
32
+ Jeweler::RubygemsDotOrgTasks.new
33
+
34
+ require 'rake/testtask'
35
+ Rake::TestTask.new(:test) do |test|
36
+ test.libs << 'lib' << 'test'
37
+ test.pattern = 'test/**/test_*.rb'
38
+ test.verbose = true
39
+ end
40
+
41
+ task :default => :test
42
+
43
+ require 'rdoc/task'
44
+ Rake::RDocTask.new do |rdoc|
45
+ version = File.exist?('VERSION') ? File.read('VERSION') : ""
46
+ rdoc.rdoc_dir = 'rdoc'
47
+ rdoc.title = "worker-army #{version}"
48
+ rdoc.rdoc_files.include('README*')
49
+ rdoc.rdoc_files.include('lib/**/*.rb')
50
+ end
51
+
52
+ require File.dirname(__FILE__) + '/lib/worker-army'
53
+ task 'start_example_worker' do
54
+ worker = WorkerArmy::Worker.new
55
+ worker.job = ExampleJob.new
56
+ worker.process_queue
57
+ end
58
+
59
+ task :start_worker, :job_class do |t, args|
60
+ if args[:job_class]
61
+ worker = WorkerArmy::Worker.new
62
+ clazz = Object.const_get(args[:job_class].to_s)
63
+ worker.job = clazz.new
64
+ worker.process_queue
65
+ end
66
+ end
data/VERSION ADDED
@@ -0,0 +1 @@
1
+ 0.2.0
data/bin/worker_army ADDED
@@ -0,0 +1,2 @@
1
+ #!/bin/bash
2
+ rackup ../config.ru
data/config.ru ADDED
@@ -0,0 +1,5 @@
1
+ require 'rubygems'
2
+ require 'sinatra'
3
+ require File.expand_path '../lib/worker_army/web', __FILE__
4
+
5
+ run Sinatra::Application
@@ -0,0 +1,6 @@
1
+ require "redis"
2
+
3
+ require File.dirname(__FILE__) + '/worker_army/queue'
4
+ require File.dirname(__FILE__) + '/worker_army/worker'
5
+ require File.dirname(__FILE__) + '/worker_army/client'
6
+ require File.dirname(__FILE__) + '/worker_army/example_job'
@@ -0,0 +1,35 @@
1
+ require "rest-client"
2
+ require "json"
3
+ require "multi_json"
4
+
5
+ module WorkerArmy
6
+ class Client
7
+ def self.push_job(job_class, data = {}, callback_url = nil, queue_name = 'queue')
8
+ raise "No data" unless data
9
+ raise "No job class provided" unless job_class
10
+
11
+ if ENV['worker_army_endpoint']
12
+ puts "Using environment variables for config..."
13
+ @config = { endpoint: ENV['worker_army_endpoint'] }
14
+ else
15
+ begin
16
+ puts "Using config in your home directory"
17
+ @config = YAML.load(File.read("#{ENV['HOME']}/.worker_army.yml"))
18
+ rescue Errno::ENOENT
19
+ raise "worker_army.yml expected in ~/.worker_army.yml"
20
+ end
21
+ end
22
+
23
+ worker_army_base_url = @config['endpoint']
24
+ callback_url = "#{worker_army_base_url}/generic_callback" unless callback_url
25
+ response = RestClient.post "#{worker_army_base_url}/jobs",
26
+ data.merge(
27
+ job_class: job_class,
28
+ callback_url: "#{worker_army_base_url}/callback?callback_url=#{callback_url}",
29
+ queue_name: queue_name
30
+ ).to_json,
31
+ :content_type => :json, :accept => :json
32
+ response.code == 200
33
+ end
34
+ end
35
+ end
@@ -0,0 +1,8 @@
1
+ class ExampleJob
2
+ def perform(data = {})
3
+ response_data = {foo: 'bar'}
4
+ puts "in example worker with data: #{data}"
5
+ sleep 2
6
+ response_data
7
+ end
8
+ end
@@ -0,0 +1,85 @@
1
+ require "redis"
2
+ require "rest-client"
3
+ require "json"
4
+ require "multi_json"
5
+ require "yaml"
6
+
7
+ module WorkerArmy
8
+ class Queue
9
+ attr_accessor :config
10
+
11
+ def initialize
12
+ @config = Queue.config
13
+ # puts "Config: #{@config}"
14
+ Queue.redis_instance
15
+ end
16
+
17
+ def self.config
18
+ if ENV['worker_army_redis_host'] and ENV['worker_army_redis_port']
19
+ config = { 'redis_host' => ENV['worker_army_redis_host'], 'redis_port' => ENV['worker_army_redis_port'] }
20
+ if ENV['worker_army_redis_auth']
21
+ config['redis_auth'] = ENV['worker_army_redis_auth']
22
+ end
23
+ else
24
+ begin
25
+ # puts "Using config in your home directory"
26
+ config = YAML.load(File.read("#{ENV['HOME']}/.worker_army.yml"))
27
+ rescue Errno::ENOENT
28
+ raise "worker_army.yml expected in ~/.worker_army.yml"
29
+ end
30
+ end
31
+ config
32
+ end
33
+
34
+ def self.redis_instance
35
+ $config = Queue.config unless $config
36
+ unless $redis
37
+ $redis = Redis.new(host: $config['redis_host'], port: $config['redis_port'])
38
+ end
39
+ $redis.auth($config['redis_auth']) if $config['redis_auth']
40
+ $redis
41
+ end
42
+
43
+ def self.close_redis_connection
44
+ $redis.quit if $redis
45
+ $redis = nil
46
+ end
47
+
48
+ def push(data, queue_name = "queue")
49
+ if Queue.redis_instance and data
50
+ job_count = Queue.redis_instance.incr("#{queue_name}_counter")
51
+ queue_name = data['queue_name'] if data['queue_name']
52
+ queue_name = "#{queue_name}_#{data['job_class']}"
53
+ Queue.redis_instance.rpush queue_name, data.merge(job_count: job_count).to_json
54
+ end
55
+ raise "No data" unless data
56
+ raise "No redis connection!" unless Queue.redis_instance
57
+ end
58
+
59
+ def pop(job_class_name, queue_name = "queue")
60
+ raise "No redis connection!" unless Queue.redis_instance
61
+ return Queue.redis_instance.blpop("#{queue_name}_#{job_class_name}")
62
+ end
63
+
64
+ def save_result(data)
65
+ if data
66
+ job_count = data['job_count']
67
+ callback_url = data['callback_url']
68
+ Queue.redis_instance["job_#{job_count}"] = data
69
+ if callback_url
70
+ data.delete("callback_url")
71
+ begin
72
+ response = RestClient.post callback_url.split("?callback_url=").last,
73
+ data.to_json, :content_type => :json, :accept => :json
74
+ rescue => e
75
+ puts e
76
+ end
77
+ end
78
+ end
79
+ end
80
+
81
+ def get_job_count(queue_name = "queue")
82
+ Queue.redis_instance["#{queue_name}_counter"]
83
+ end
84
+ end
85
+ end
@@ -0,0 +1,31 @@
1
+ require "json"
2
+ require "multi_json"
3
+ require "sinatra"
4
+ require "sinatra/json"
5
+ require File.dirname(__FILE__) + '/queue'
6
+
7
+ queue = WorkerArmy::Queue.new
8
+
9
+ get '/' do
10
+ job_count = queue.get_job_count || 0
11
+ data = { :job_count => job_count }
12
+ json data
13
+ end
14
+
15
+ post '/jobs' do
16
+ data = JSON.parse(request.body.read)
17
+ queue.push data if data
18
+ json data
19
+ end
20
+
21
+ post '/callback' do
22
+ data = JSON.parse(request.body.read)
23
+ queue.save_result(data) if data
24
+ json data
25
+ end
26
+
27
+ post '/generic_callback' do
28
+ data = JSON.parse(request.body.read)
29
+ status = { :status => 'ok' }
30
+ json status
31
+ end
@@ -0,0 +1,49 @@
1
+ require "rest-client"
2
+ require "json"
3
+ require "multi_json"
4
+ require 'socket'
5
+
6
+ module WorkerArmy
7
+ class Worker
8
+ attr_accessor :queue, :job, :worker_name
9
+ def initialize(worker_name = nil)
10
+ @queue = WorkerArmy::Queue.new
11
+ @worker_name = worker_name
12
+ @host_name = Socket.gethostname
13
+ end
14
+
15
+ def process_queue
16
+ raise "No job class set!" unless @job
17
+ list, element = @queue.pop(@job.class.name)
18
+ if list and element
19
+ puts "List: #{list} => #{element}"
20
+ response_data = {}
21
+ job_count = 0
22
+ begin
23
+ data = JSON.parse(element)
24
+ job_count = data['job_count']
25
+ callback_url = data['callback_url']
26
+ if @job and @job.class.name == data['job_class']
27
+ response_data = @job.perform(data)
28
+ response_data.merge!(job_count: job_count, callback_url: callback_url,
29
+ finished_at: Time.now.utc.to_i, host_name: @host_name)
30
+ if @worker_name
31
+ response_data.merge!(worker_name: @worker_name)
32
+ end
33
+ end
34
+ rescue => e
35
+ puts e
36
+ end
37
+ if response_data
38
+ begin
39
+ response = RestClient.post data['callback_url'],
40
+ response_data.to_json, :content_type => :json, :accept => :json
41
+ rescue => e
42
+ puts e
43
+ end
44
+ end
45
+ self.process_queue
46
+ end
47
+ end
48
+ end
49
+ end
data/public/index.html ADDED
@@ -0,0 +1 @@
1
+ <html></html>
data/test/helper.rb ADDED
@@ -0,0 +1,18 @@
1
+ require 'rubygems'
2
+ require 'bundler'
3
+ begin
4
+ Bundler.setup(:default, :development)
5
+ rescue Bundler::BundlerError => e
6
+ $stderr.puts e.message
7
+ $stderr.puts "Run `bundle install` to install missing gems"
8
+ exit e.status_code
9
+ end
10
+ require 'test/unit'
11
+ require 'shoulda'
12
+
13
+ $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
14
+ $LOAD_PATH.unshift(File.dirname(__FILE__))
15
+ require 'worker-army'
16
+
17
+ class Test::Unit::TestCase
18
+ end
@@ -0,0 +1,7 @@
1
+ require 'helper'
2
+
3
+ class TestWorkerArmy < Test::Unit::TestCase
4
+ should "probably rename this file and start testing for real" do
5
+ flunk "hey buddy, you should probably rename this file and start testing for real"
6
+ end
7
+ end
data/unicorn.rb ADDED
@@ -0,0 +1,11 @@
1
+ worker_processes 3
2
+ timeout 30
3
+ preload_app true
4
+
5
+ before_fork do |server, worker|
6
+ WorkerArmy::Queue.close_redis_connection
7
+ end
8
+
9
+ after_fork do |server, worker|
10
+ WorkerArmy::Queue.redis_instance
11
+ end
@@ -0,0 +1,4 @@
1
+ endpoint: "http://localhost:9292"
2
+ redis_host: "localhost"
3
+ redis_port: 6379
4
+ redis_auth: "YOUR_PASS"
metadata ADDED
@@ -0,0 +1,344 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: worker-army
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.2.0
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Oliver Kiessler
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2013-10-27 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: redis
16
+ requirement: !ruby/object:Gem::Requirement
17
+ none: false
18
+ requirements:
19
+ - - ! '>='
20
+ - !ruby/object:Gem::Version
21
+ version: '0'
22
+ type: :runtime
23
+ prerelease: false
24
+ version_requirements: !ruby/object:Gem::Requirement
25
+ none: false
26
+ requirements:
27
+ - - ! '>='
28
+ - !ruby/object:Gem::Version
29
+ version: '0'
30
+ - !ruby/object:Gem::Dependency
31
+ name: multi_json
32
+ requirement: !ruby/object:Gem::Requirement
33
+ none: false
34
+ requirements:
35
+ - - ! '>='
36
+ - !ruby/object:Gem::Version
37
+ version: '0'
38
+ type: :runtime
39
+ prerelease: false
40
+ version_requirements: !ruby/object:Gem::Requirement
41
+ none: false
42
+ requirements:
43
+ - - ! '>='
44
+ - !ruby/object:Gem::Version
45
+ version: '0'
46
+ - !ruby/object:Gem::Dependency
47
+ name: sinatra
48
+ requirement: !ruby/object:Gem::Requirement
49
+ none: false
50
+ requirements:
51
+ - - ! '>='
52
+ - !ruby/object:Gem::Version
53
+ version: '0'
54
+ type: :runtime
55
+ prerelease: false
56
+ version_requirements: !ruby/object:Gem::Requirement
57
+ none: false
58
+ requirements:
59
+ - - ! '>='
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ - !ruby/object:Gem::Dependency
63
+ name: sinatra-contrib
64
+ requirement: !ruby/object:Gem::Requirement
65
+ none: false
66
+ requirements:
67
+ - - ! '>='
68
+ - !ruby/object:Gem::Version
69
+ version: '0'
70
+ type: :runtime
71
+ prerelease: false
72
+ version_requirements: !ruby/object:Gem::Requirement
73
+ none: false
74
+ requirements:
75
+ - - ! '>='
76
+ - !ruby/object:Gem::Version
77
+ version: '0'
78
+ - !ruby/object:Gem::Dependency
79
+ name: rest-client
80
+ requirement: !ruby/object:Gem::Requirement
81
+ none: false
82
+ requirements:
83
+ - - ! '>='
84
+ - !ruby/object:Gem::Version
85
+ version: '0'
86
+ type: :runtime
87
+ prerelease: false
88
+ version_requirements: !ruby/object:Gem::Requirement
89
+ none: false
90
+ requirements:
91
+ - - ! '>='
92
+ - !ruby/object:Gem::Version
93
+ version: '0'
94
+ - !ruby/object:Gem::Dependency
95
+ name: rake
96
+ requirement: !ruby/object:Gem::Requirement
97
+ none: false
98
+ requirements:
99
+ - - ! '>='
100
+ - !ruby/object:Gem::Version
101
+ version: '0'
102
+ type: :runtime
103
+ prerelease: false
104
+ version_requirements: !ruby/object:Gem::Requirement
105
+ none: false
106
+ requirements:
107
+ - - ! '>='
108
+ - !ruby/object:Gem::Version
109
+ version: '0'
110
+ - !ruby/object:Gem::Dependency
111
+ name: unicorn
112
+ requirement: !ruby/object:Gem::Requirement
113
+ none: false
114
+ requirements:
115
+ - - ! '>='
116
+ - !ruby/object:Gem::Version
117
+ version: '0'
118
+ type: :runtime
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ none: false
122
+ requirements:
123
+ - - ! '>='
124
+ - !ruby/object:Gem::Version
125
+ version: '0'
126
+ - !ruby/object:Gem::Dependency
127
+ name: foreman
128
+ requirement: !ruby/object:Gem::Requirement
129
+ none: false
130
+ requirements:
131
+ - - ! '>='
132
+ - !ruby/object:Gem::Version
133
+ version: '0'
134
+ type: :runtime
135
+ prerelease: false
136
+ version_requirements: !ruby/object:Gem::Requirement
137
+ none: false
138
+ requirements:
139
+ - - ! '>='
140
+ - !ruby/object:Gem::Version
141
+ version: '0'
142
+ - !ruby/object:Gem::Dependency
143
+ name: bundler
144
+ requirement: !ruby/object:Gem::Requirement
145
+ none: false
146
+ requirements:
147
+ - - ~>
148
+ - !ruby/object:Gem::Version
149
+ version: 1.3.5
150
+ type: :development
151
+ prerelease: false
152
+ version_requirements: !ruby/object:Gem::Requirement
153
+ none: false
154
+ requirements:
155
+ - - ~>
156
+ - !ruby/object:Gem::Version
157
+ version: 1.3.5
158
+ - !ruby/object:Gem::Dependency
159
+ name: jeweler
160
+ requirement: !ruby/object:Gem::Requirement
161
+ none: false
162
+ requirements:
163
+ - - ~>
164
+ - !ruby/object:Gem::Version
165
+ version: 1.8.4
166
+ type: :development
167
+ prerelease: false
168
+ version_requirements: !ruby/object:Gem::Requirement
169
+ none: false
170
+ requirements:
171
+ - - ~>
172
+ - !ruby/object:Gem::Version
173
+ version: 1.8.4
174
+ - !ruby/object:Gem::Dependency
175
+ name: sinatra
176
+ requirement: !ruby/object:Gem::Requirement
177
+ none: false
178
+ requirements:
179
+ - - ! '>='
180
+ - !ruby/object:Gem::Version
181
+ version: '0'
182
+ type: :runtime
183
+ prerelease: false
184
+ version_requirements: !ruby/object:Gem::Requirement
185
+ none: false
186
+ requirements:
187
+ - - ! '>='
188
+ - !ruby/object:Gem::Version
189
+ version: '0'
190
+ - !ruby/object:Gem::Dependency
191
+ name: sinatra-contrib
192
+ requirement: !ruby/object:Gem::Requirement
193
+ none: false
194
+ requirements:
195
+ - - ! '>='
196
+ - !ruby/object:Gem::Version
197
+ version: '0'
198
+ type: :runtime
199
+ prerelease: false
200
+ version_requirements: !ruby/object:Gem::Requirement
201
+ none: false
202
+ requirements:
203
+ - - ! '>='
204
+ - !ruby/object:Gem::Version
205
+ version: '0'
206
+ - !ruby/object:Gem::Dependency
207
+ name: rest-client
208
+ requirement: !ruby/object:Gem::Requirement
209
+ none: false
210
+ requirements:
211
+ - - ! '>='
212
+ - !ruby/object:Gem::Version
213
+ version: '0'
214
+ type: :runtime
215
+ prerelease: false
216
+ version_requirements: !ruby/object:Gem::Requirement
217
+ none: false
218
+ requirements:
219
+ - - ! '>='
220
+ - !ruby/object:Gem::Version
221
+ version: '0'
222
+ - !ruby/object:Gem::Dependency
223
+ name: redis
224
+ requirement: !ruby/object:Gem::Requirement
225
+ none: false
226
+ requirements:
227
+ - - ! '>='
228
+ - !ruby/object:Gem::Version
229
+ version: '0'
230
+ type: :runtime
231
+ prerelease: false
232
+ version_requirements: !ruby/object:Gem::Requirement
233
+ none: false
234
+ requirements:
235
+ - - ! '>='
236
+ - !ruby/object:Gem::Version
237
+ version: '0'
238
+ - !ruby/object:Gem::Dependency
239
+ name: json
240
+ requirement: !ruby/object:Gem::Requirement
241
+ none: false
242
+ requirements:
243
+ - - ! '>='
244
+ - !ruby/object:Gem::Version
245
+ version: '0'
246
+ type: :runtime
247
+ prerelease: false
248
+ version_requirements: !ruby/object:Gem::Requirement
249
+ none: false
250
+ requirements:
251
+ - - ! '>='
252
+ - !ruby/object:Gem::Version
253
+ version: '0'
254
+ - !ruby/object:Gem::Dependency
255
+ name: multi_json
256
+ requirement: !ruby/object:Gem::Requirement
257
+ none: false
258
+ requirements:
259
+ - - ! '>='
260
+ - !ruby/object:Gem::Version
261
+ version: '0'
262
+ type: :runtime
263
+ prerelease: false
264
+ version_requirements: !ruby/object:Gem::Requirement
265
+ none: false
266
+ requirements:
267
+ - - ! '>='
268
+ - !ruby/object:Gem::Version
269
+ version: '0'
270
+ - !ruby/object:Gem::Dependency
271
+ name: rake
272
+ requirement: !ruby/object:Gem::Requirement
273
+ none: false
274
+ requirements:
275
+ - - ! '>='
276
+ - !ruby/object:Gem::Version
277
+ version: '0'
278
+ type: :runtime
279
+ prerelease: false
280
+ version_requirements: !ruby/object:Gem::Requirement
281
+ none: false
282
+ requirements:
283
+ - - ! '>='
284
+ - !ruby/object:Gem::Version
285
+ version: '0'
286
+ description: Simple redis based worker queue with a HTTP/Rest interface
287
+ email: kiessler@inceedo.com
288
+ executables:
289
+ - worker_army
290
+ extensions: []
291
+ extra_rdoc_files:
292
+ - LICENSE.txt
293
+ - README.rdoc
294
+ files:
295
+ - .document
296
+ - Gemfile
297
+ - Gemfile.lock
298
+ - LICENSE.txt
299
+ - Procfile
300
+ - README.rdoc
301
+ - Rakefile
302
+ - VERSION
303
+ - bin/worker_army
304
+ - config.ru
305
+ - lib/worker-army.rb
306
+ - lib/worker_army/client.rb
307
+ - lib/worker_army/example_job.rb
308
+ - lib/worker_army/queue.rb
309
+ - lib/worker_army/web.rb
310
+ - lib/worker_army/worker.rb
311
+ - public/index.html
312
+ - test/helper.rb
313
+ - test/test_worker-army.rb
314
+ - unicorn.rb
315
+ - worker-army.yml.sample
316
+ homepage: http://github.com/okiess/worker-army
317
+ licenses:
318
+ - MIT
319
+ post_install_message:
320
+ rdoc_options: []
321
+ require_paths:
322
+ - lib
323
+ required_ruby_version: !ruby/object:Gem::Requirement
324
+ none: false
325
+ requirements:
326
+ - - ! '>='
327
+ - !ruby/object:Gem::Version
328
+ version: '0'
329
+ segments:
330
+ - 0
331
+ hash: -2511990235631195321
332
+ required_rubygems_version: !ruby/object:Gem::Requirement
333
+ none: false
334
+ requirements:
335
+ - - ! '>='
336
+ - !ruby/object:Gem::Version
337
+ version: '0'
338
+ requirements: []
339
+ rubyforge_project:
340
+ rubygems_version: 1.8.25
341
+ signing_key:
342
+ specification_version: 3
343
+ summary: Simple worker queue
344
+ test_files: []