sklaventreiber 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
data/.DS_Store ADDED
Binary file
data/.gitignore ADDED
@@ -0,0 +1,21 @@
1
+ *.gem
2
+ *.rbc
3
+ .bundle
4
+ .config
5
+ coverage
6
+ InstalledFiles
7
+ lib/bundler/man
8
+ pkg
9
+ rdoc
10
+ spec/reports
11
+ test/tmp
12
+ test/version_tmp
13
+ tmp
14
+
15
+ # environment files
16
+ *.env
17
+
18
+ # YARD artifacts
19
+ .yardoc
20
+ _yardoc
21
+ doc/
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in sklaventreiber.gemspec
4
+ gemspec
data/Gemfile.lock ADDED
@@ -0,0 +1,30 @@
1
+ PATH
2
+ remote: .
3
+ specs:
4
+ sklaventreiber (0.0.1)
5
+ heroku-api
6
+ sequel
7
+
8
+ GEM
9
+ remote: https://rubygems.org/
10
+ specs:
11
+ excon (0.16.10)
12
+ foreman (0.60.2)
13
+ thor (>= 0.13.6)
14
+ heroku-api (0.3.7)
15
+ excon (~> 0.16.10)
16
+ navvy (0.3.2)
17
+ pg (0.14.1)
18
+ rake (0.9.2.2)
19
+ sequel (3.42.0)
20
+ thor (0.16.0)
21
+
22
+ PLATFORMS
23
+ ruby
24
+
25
+ DEPENDENCIES
26
+ foreman
27
+ navvy
28
+ pg
29
+ rake
30
+ sklaventreiber!
data/LICENSE ADDED
@@ -0,0 +1,22 @@
1
+ Copyright (c) 2013 Nikolaus Piccolotto
2
+
3
+ MIT License
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining
6
+ a copy of this software and associated documentation files (the
7
+ "Software"), to deal in the Software without restriction, including
8
+ without limitation the rights to use, copy, modify, merge, publish,
9
+ distribute, sublicense, and/or sell copies of the Software, and to
10
+ permit persons to whom the Software is furnished to do so, subject to
11
+ the following conditions:
12
+
13
+ The above copyright notice and this permission notice shall be
14
+ included in all copies or substantial portions of the Software.
15
+
16
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/Procfile ADDED
@@ -0,0 +1,2 @@
1
+ navvy: bundle exec rake navvy:work --trace
2
+ test: bundle exec rake test --trace
data/README.md ADDED
@@ -0,0 +1,88 @@
1
+ # Sklaventreiber
2
+
3
+ Sklaventreiber is a Ruby gem that manages your worker when you're using [Navvy](https://github.com/jeffkreeftmeijer/navvy) and [Sequel](http://sequel.rubyforge.org/) with [Heroku](http://heroku.com). It hires one if there are jobs to be done and fires him if not.
4
+
5
+ Slaventreiber can either be used as a [Sequel plugin](http://sequel.rubyforge.org/rdoc/files/doc/model_hooks_rdoc.html) or as a worker process.
6
+
7
+ *Sklaventreiber*, der (eng.: slave driver): German expression for a overly demanding boss that ignores his employees' health and happiness.
8
+
9
+ ## Installation
10
+
11
+ Sklaventreiber is **NOT** usable as of now, because it still requires a custom version of Navvy. This is going to change.
12
+
13
+ ### Plugin
14
+
15
+ Add this line to your application's Gemfile:
16
+
17
+ gem 'sklaventreiber'
18
+
19
+ And then execute:
20
+
21
+ $ bundle
22
+
23
+ Or install it yourself as:
24
+
25
+ $ gem install sklaventreiber
26
+
27
+ ### Worker
28
+
29
+ Add these lines to your Rakefile:
30
+
31
+ require "sklaventreiber"
32
+ require "sklaventreiber/tasks"
33
+
34
+ ## Usage
35
+
36
+ Sklaventreiber expects a few environment variables to be set.
37
+
38
+ # either this
39
+ HEROKU_API_KEY=< your heroku api key >
40
+ # or this
41
+ HEROKU_USERNAME=< your heroku username >
42
+ HEROKU_PASSWORD=< your heroku password >
43
+ # but always this
44
+ HEROKU_APP=< your heroku app name >
45
+
46
+ You can use either the API key or the username/password combination. Sklaventreiber will try to connect via the API key and fall back to username/password if it's not possible.
47
+
48
+ Sklaventreiber logs to standard output via ``puts``. If you don't like that you can turn it off.
49
+
50
+ SKLAVENTREIBER_LOG="false"
51
+
52
+ ### Plugin
53
+
54
+ There is nothing to be done other than adding Sklaventreiber to your Gemfile. It hooks automatically into ``Navvy::Job``. Just make sure you require it after Navvy and Sequel.
55
+
56
+ require "sequel"
57
+ require "navvy"
58
+ require "navvy/job/sequelhook"
59
+ require "sklaventreiber"
60
+
61
+ ### Worker
62
+
63
+ Execute the following to start Sklaventreiber as a worker:
64
+
65
+ rake sklaventreiber:work
66
+
67
+ Sklaventreiber checks every 10 seconds if it needs to scale your Heroku worker. For a custom interval set
68
+
69
+ SKLAVENTREIBER_SLEEPTIME=< your custom interval in seconds >
70
+
71
+ ## Contributing
72
+
73
+ For development you should also set these environment variables:
74
+
75
+ SKLAVENTREIBER_MOCK=< if heroku-api should run in mock mode >
76
+ DATABASE_URL=< database://user:password@host:port/database_name >
77
+
78
+ Then:
79
+
80
+ 1. Fork it
81
+ 2. Create your feature branch (`git checkout -b my-new-feature`)
82
+ 3. Commit your changes (`git commit -am 'Added some feature'`)
83
+ 4. Push to the branch (`git push origin my-new-feature`)
84
+ 5. Create new Pull Request
85
+
86
+ ## Testing the worker
87
+
88
+ I tried to start all three necessary processes (Navvy, Sklaventreiber, test code) using ``foreman``. Because my test code contained a few ``sleep`` statements to wait for Navvy and Sklaventreiber, foreman halted all three processes instead of only the test code. I honestly have no idea why. Testing the worker was then done using three different terminals for the processes and looking if they behave as expected.
data/Rakefile ADDED
@@ -0,0 +1,20 @@
1
+ #!/usr/bin/env rake
2
+ require "bundler/gem_tasks"
3
+ require 'rake/testtask'
4
+
5
+ Rake::TestTask.new do |t|
6
+ t.libs << 'test'
7
+ end
8
+
9
+
10
+ require "sequel"
11
+
12
+ Sequel::Model.db = Sequel.connect( ENV['DATABASE_URL'] )
13
+
14
+ require "navvy"
15
+ require "navvy/job/sequel"
16
+ require "navvy/tasks"
17
+
18
+ require "sklaventreiber/worker"
19
+ require "sklaventreiber/tasks"
20
+ require "sklaventreiber/mock"
data/lib/.DS_Store ADDED
Binary file
@@ -0,0 +1,15 @@
1
+ require "sklaventreiber/workerplugin"
2
+
3
+ if Sklaventreiber::Config::SKLAVENTREIBER_LOG
4
+ puts "Sklaventreiber tries to hook into Navvy::Job."
5
+ end
6
+
7
+ begin
8
+ Navvy::Job.plugin( Sklaventreiber::WorkerPlugin )
9
+ rescue StandardError => e
10
+ # Sklaventreiber shall be a worker
11
+ if Sklaventreiber::Config::SKLAVENTREIBER_LOG
12
+ puts e.to_s
13
+ puts "Sklaventreiber was unsuccessful, expects to be used as a worker instead."
14
+ end
15
+ end
Binary file
@@ -0,0 +1,11 @@
1
+ module Sklaventreiber
2
+ class Config
3
+ HEROKU_USERNAME = ENV['HEROKU_USERNAME']
4
+ HEROKU_PASSWORD = ENV['HEROKU_PASSWORD']
5
+ HEROKU_API_KEY = ENV['HEROKU_API_KEY']
6
+ HEROKU_APP = ENV['HEROKU_APP']
7
+ SKLAVENTREIBER_SLEEPTIME = ENV['SKLAVENTREIBER_SLEEPTIME'] == nil ? 10 : Integer( ENV['SKLAVENTREIBER_SLEEPTIME'] )
8
+ SKLAVENTREIBER_MOCK = ENV['SKLAVENTREIBER_MOCK'] == "true"
9
+ SKLAVENTREIBER_LOG = ENV['SKLAVENTREIBER_LOG'] == "true"
10
+ end
11
+ end
@@ -0,0 +1,62 @@
1
+ require "sklaventreiber/config"
2
+ require "heroku-api"
3
+
4
+ module Sklaventreiber
5
+ class HerokuConnection
6
+ @@api = nil
7
+ @@worker = 0
8
+
9
+ # singleton for api connection
10
+ def self.init
11
+ # if there is no api connection yet
12
+ if @@api == nil
13
+ # then init api connection
14
+ if Sklaventreiber::Config::HEROKU_API_KEY != nil
15
+ @@api = Heroku::API.new( :api_key => Sklaventreiber::Config::HEROKU_API_KEY, :mock => Sklaventreiber::Config::SKLAVENTREIBER_MOCK )
16
+ else
17
+ @@api = Heroku::API.new( :username => Sklaventreiber::Config::HEROKU_USERNAME, :password => Sklaventreiber::Config::HEROKU_PASSWORD, :mock => Sklaventreiber::Config::SKLAVENTREIBER_MOCK )
18
+ end
19
+
20
+ # then init worker count
21
+ @@worker = 0
22
+ response = @@api.get_ps( Sklaventreiber::Config::HEROKU_APP )
23
+ if ( response.status == 200 )
24
+ processes = response.body
25
+ processes.each do |proc|
26
+ if ( proc["process"].start_with?( "worker") )
27
+ @@worker = @@worker + 1
28
+ end
29
+ end
30
+ end
31
+ if Sklaventreiber::Config::SKLAVENTREIBER_LOG
32
+ puts "Sklaventreiber: Worker count at start = " + @@worker.to_s
33
+ end
34
+ end
35
+ end
36
+
37
+ def self.hire_worker
38
+ @@worker = 1
39
+ @@api.post_ps_scale( Sklaventreiber::Config::HEROKU_APP, "worker", @@worker.to_s )
40
+ if Sklaventreiber::Config::SKLAVENTREIBER_LOG
41
+ puts "Sklaventreiber hired a worker."
42
+ end
43
+ end
44
+
45
+ def self.fire_worker
46
+ @@worker = 0
47
+ @@api.post_ps_scale( Sklaventreiber::Config::HEROKU_APP, "worker", @@worker.to_s )
48
+ if Sklaventreiber::Config::SKLAVENTREIBER_LOG
49
+ puts "Sklaventreiber fired the worker."
50
+ end
51
+ end
52
+
53
+ def self.is_fired?
54
+ return @@worker == 0
55
+ end
56
+
57
+ def self.is_hired?
58
+ return @@worker == 1
59
+ end
60
+
61
+ end
62
+ end
@@ -0,0 +1,17 @@
1
+ module Sklaventreiber
2
+
3
+ class Mock
4
+
5
+ def initialize()
6
+ puts "mock created"
7
+ end
8
+
9
+ def self.mock_method( sleeping_time )
10
+ puts "mock doing work for " + sleeping_time.to_s + " seconds"
11
+ sleep( sleeping_time )
12
+ puts "work finished"
13
+ end
14
+
15
+ end
16
+
17
+ end
@@ -0,0 +1,11 @@
1
+ task :environment
2
+
3
+ namespace :sklaventreiber do
4
+ desc "Start a Sklaventreiber"
5
+ task :work => :environment do
6
+ Sklaventreiber::Worker.start()
7
+ end
8
+ end
9
+
10
+ # heroku
11
+ task "jobs:work" => "sklaventreiber:work"
@@ -0,0 +1,3 @@
1
+ module Sklaventreiber
2
+ VERSION = "0.0.1"
3
+ end
@@ -0,0 +1,78 @@
1
+ require "sklaventreiber/config"
2
+ require "sklaventreiber/herokuconnection"
3
+ require "navvy"
4
+ require "navvy/job/sequel"
5
+
6
+ module Sklaventreiber
7
+
8
+ class Worker
9
+
10
+ ##
11
+ # Start Sklaventreiber
12
+ def self.start
13
+
14
+ if Sklaventreiber::Config::SKLAVENTREIBER_LOG
15
+ puts "Sklaventreiber goes to work."
16
+ end
17
+
18
+ trap('TERM') {
19
+ if Sklaventreiber::Config::SKLAVENTREIBER_LOG
20
+ puts "Sklaventreiber was interrupted."
21
+ end
22
+ $exit = true;
23
+ }
24
+ trap( 'INT') {
25
+ if Sklaventreiber::Config::SKLAVENTREIBER_LOG
26
+ puts "Sklaventreiber was interrupted."
27
+ end
28
+ $exit = true;
29
+ }
30
+
31
+ Sklaventreiber::HerokuConnection.init()
32
+
33
+ loop do
34
+ check_and_hire()
35
+
36
+ if ( $exit )
37
+ if Sklaventreiber::Config::SKLAVENTREIBER_LOG
38
+ puts "Sklaventreiber leaves work."
39
+ end
40
+ break;
41
+ end
42
+
43
+ if Sklaventreiber::Config::SKLAVENTREIBER_LOG
44
+ puts "Sklaventreiber takes a nap."
45
+ end
46
+ sleep( Sklaventreiber::Config::SKLAVENTREIBER_SLEEPTIME )
47
+ end
48
+ end
49
+
50
+ ##
51
+ # Check if there are jobs and act accordingly
52
+ def self.check_and_hire
53
+ if Sklaventreiber::Config::SKLAVENTREIBER_LOG
54
+ puts "Sklaventreiber checks the situation."
55
+ end
56
+ # if there are uncompleted jobs
57
+ if ( Navvy::Job.filter( :failed_at => nil, :completed_at => nil ).count > 0 )
58
+ # then hire worker if necessary
59
+ if ( Sklaventreiber::HerokuConnection.is_fired?() )
60
+ Sklaventreiber::HerokuConnection.hire_worker()
61
+ else
62
+ if Sklaventreiber::Config::SKLAVENTREIBER_LOG
63
+ puts "Sklaventreiber is happy."
64
+ end
65
+ end
66
+ else
67
+ # else fire worker if necessary
68
+ if ( Sklaventreiber::HerokuConnection.is_hired?() )
69
+ Sklaventreiber::HerokuConnection.fire_worker()
70
+ else
71
+ if Sklaventreiber::Config::SKLAVENTREIBER_LOG
72
+ puts "Sklaventreiber is happy."
73
+ end
74
+ end
75
+ end
76
+ end
77
+ end
78
+ end
@@ -0,0 +1,58 @@
1
+ require "sklaventreiber/version"
2
+ require "sklaventreiber/config"
3
+ require "sklaventreiber/herokuconnection"
4
+
5
+ module Sklaventreiber
6
+
7
+ module WorkerPlugin
8
+
9
+ module InstanceMethods
10
+
11
+ def before_create
12
+ if Sklaventreiber::Config::SKLAVENTREIBER_LOG
13
+ puts "Sklaventreiber: Job created."
14
+ end
15
+ Sklaventreiber::HerokuConnection.init()
16
+ # if there is no worker hired
17
+ if ( Sklaventreiber::HerokuConnection.is_fired?() )
18
+ # then hire one
19
+ Sklaventreiber::HerokuConnection.hire_worker()
20
+ end
21
+ super
22
+ end
23
+
24
+ def after_destroy
25
+ super
26
+ if Sklaventreiber::Config::SKLAVENTREIBER_LOG
27
+ puts "Sklaventreiber: Job #{self.id} destroyed."
28
+ end
29
+ Sklaventreiber::HerokuConnection.init()
30
+ # if there are no more jobs to work on
31
+ if ( Navvy::Job.filter( :failed_at => nil, :completed_at => nil ).count == 0 )
32
+ # then fire worker
33
+ Sklaventreiber::HerokuConnection.fire_worker()
34
+ end
35
+ end
36
+
37
+ def after_update
38
+ super
39
+
40
+ if Sklaventreiber::Config::SKLAVENTREIBER_LOG
41
+ puts "Sklaventreiber: Job #{self.id} updated."
42
+ end
43
+ Sklaventreiber::HerokuConnection.init()
44
+
45
+ # check if failed
46
+ if ( self.failed? == true )
47
+ # check if there are uncompleted jobs left
48
+ if ( Job.filter( :failed_at => nil, :completed_at => nil ).count == 0 )
49
+ # then fire worker
50
+ Sklaventreiber::HerokuConnection.fire_worker()
51
+ end
52
+ end
53
+ end
54
+
55
+ end
56
+ end
57
+
58
+ end
data/navvy.proc ADDED
@@ -0,0 +1 @@
1
+ navvy: bundle exec rake navvy:work --trace
@@ -0,0 +1,26 @@
1
+ # -*- encoding: utf-8 -*-
2
+ require File.expand_path('../lib/sklaventreiber/version', __FILE__)
3
+
4
+ Gem::Specification.new do |gem|
5
+ gem.authors = ["Nikolaus Piccolotto"]
6
+ gem.email = ["prayerslayer@gmail.com"]
7
+ gem.description = %q{Hire and fire a Navvy worker on Heroku as needed.}
8
+ gem.summary = %q{Navvy delayed job manager for Heroku}
9
+ gem.homepage = ""
10
+
11
+ gem.files = `git ls-files`.split($\)
12
+ gem.executables = gem.files.grep(%r{^bin/}).map{ |f| File.basename(f) }
13
+ gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
14
+ gem.name = "sklaventreiber"
15
+ gem.require_paths = ["lib"]
16
+ gem.version = Sklaventreiber::VERSION
17
+
18
+ gem.add_dependency "sequel"
19
+ gem.add_dependency "heroku-api"
20
+
21
+ gem.add_development_dependency "pg"
22
+ gem.add_development_dependency "rake"
23
+ gem.add_development_dependency "foreman"
24
+ gem.add_development_dependency "navvy"
25
+
26
+ end
data/test.proc ADDED
@@ -0,0 +1 @@
1
+ test: bundle exec rake test --trace
data/test/.DS_Store ADDED
Binary file
data/test/job.rb ADDED
@@ -0,0 +1,21 @@
1
+ require "sequel"
2
+
3
+ Sequel::Model.db=Sequel.postgres(
4
+ :host => ENV['DATABASE_HOST'],
5
+ :user => ENV['DATABASE_USER'],
6
+ :password => ENV['DATABASE_PWD'],
7
+ :database => ENV['DATABASE_NAME'],
8
+ :port => ENV['DATABASE_PORT']
9
+ )
10
+
11
+ class Job < Sequel::Model
12
+ def before_create
13
+ puts "job creation is awesome"
14
+ super
15
+ end
16
+
17
+ def after_destroy
18
+ super
19
+ puts "job destruction is not"
20
+ end
21
+ end
@@ -0,0 +1,132 @@
1
+ require "test/unit"
2
+ require "sequel"
3
+
4
+ Sequel::Model.db=Sequel.connect( ENV['DATABASE_URL'] )
5
+
6
+ # require "job.rb"
7
+
8
+ require "navvy"
9
+ require "navvy/job/sequel"
10
+
11
+ require "sklaventreiber"
12
+ require "sklaventreiber/mock"
13
+
14
+
15
+ class SklaventreiberPluginTest < Test::Unit::TestCase
16
+
17
+ $stdout.sync = true
18
+
19
+ def test_environment
20
+ assert_not_nil Sklaventreiber::Config::HEROKU_USERNAME
21
+ assert_not_nil Sklaventreiber::Config::HEROKU_PASSWORD
22
+ assert_not_nil Sklaventreiber::Config::HEROKU_API_KEY
23
+ assert_not_nil Sklaventreiber::Config::HEROKU_APP
24
+ end
25
+
26
+ def test_app_available
27
+ api = Heroku::API.new( :api_key => ENV['HEROKU_API_KEY'], :mock => Sklaventreiber::Config::SKLAVENTREIBER_MOCK )
28
+ response = api.get_apps()
29
+ assert_not_nil response
30
+ assert_equal 200, response.status
31
+ puts response.status
32
+ assert_not_nil response.body
33
+ assert_operator response.body.length, :>, 0
34
+ app_found = false
35
+ apps = response.body
36
+ apps.each do |app|
37
+ puts app["name"]
38
+ if ( app["name"] == ENV['HEROKU_APP'] )
39
+ app_found = true
40
+ end
41
+ end
42
+ assert_equal true, app_found
43
+ end
44
+
45
+ def get_remote_worker
46
+ test_worker = 0
47
+ api = Heroku::API.new( :api_key => ENV['HEROKU_API_KEY'], :mock => Sklaventreiber::Config::SKLAVENTREIBER_MOCK )
48
+ response = api.get_ps( ENV['HEROKU_APP'] )
49
+ assert_equal 200, response.status
50
+
51
+ test_worker = 0
52
+ processes = response.body
53
+ processes.each do |proc|
54
+ puts proc.to_s
55
+ if ( proc["process"].start_with?( "worker" ) )
56
+ test_worker = test_worker + 1
57
+ end
58
+ end
59
+ return test_worker
60
+ end
61
+
62
+ def test_hiring
63
+ Sklaventreiber::HerokuConnection.init()
64
+ Sklaventreiber::HerokuConnection.hire_worker()
65
+
66
+ # wait
67
+ sleep( 5 )
68
+
69
+ # test local worker count
70
+ assert_equal true, Sklaventreiber::HerokuConnection.is_hired?()
71
+
72
+ # test remote worker count
73
+ assert_equal 1, get_remote_worker()
74
+ end
75
+
76
+ def test_firing
77
+ Sklaventreiber::HerokuConnection.init()
78
+ Sklaventreiber::HerokuConnection.fire_worker()
79
+
80
+ # wait
81
+ sleep( 5 )
82
+
83
+ # test local worker count
84
+ assert_equal true, Sklaventreiber::HerokuConnection.is_fired?()
85
+
86
+ # test remote worker count
87
+ assert_equal 0, get_remote_worker()
88
+ end
89
+
90
+ def test_create_job
91
+ # insert job
92
+ job = Navvy::Job.create()
93
+
94
+ # check if there is anything
95
+ assert_not_nil job
96
+
97
+ # wait
98
+ sleep( 10 )
99
+
100
+ # test if worker is hired
101
+ assert_equal true, Sklaventreiber::HerokuConnection.is_hired?()
102
+
103
+ end
104
+
105
+ def test_destroy_job
106
+ # destroy all jobs
107
+ Navvy::Job.destroy()
108
+
109
+ # check if they are gone
110
+ assert_equal 0, Navvy::Job.all.length
111
+
112
+ # wait
113
+ sleep( 10 )
114
+
115
+ # test if worker is fired
116
+ assert_equal true, Sklaventreiber::HerokuConnection.is_fired?()
117
+ end
118
+
119
+ def test_queue
120
+ job = Navvy::Job.enqueue( Sklaventreiber::Mock, :mock_method, 15 )
121
+
122
+ puts Navvy::Job.all.count.to_s + " jobs in queue"
123
+
124
+ sleep( 7 )
125
+
126
+ assert_equal true, Sklaventreiber::HerokuConnection.is_hired?()
127
+
128
+ sleep( 15 )
129
+
130
+ assert_equal true, Sklaventreiber::HerokuConnection.is_fired?()
131
+ end
132
+ end
metadata ADDED
@@ -0,0 +1,145 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: sklaventreiber
3
+ version: !ruby/object:Gem::Version
4
+ prerelease:
5
+ version: 0.0.1
6
+ platform: ruby
7
+ authors:
8
+ - Nikolaus Piccolotto
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+
13
+ date: 2013-01-23 00:00:00 Z
14
+ dependencies:
15
+ - !ruby/object:Gem::Dependency
16
+ name: sequel
17
+ prerelease: false
18
+ requirement: &id001 !ruby/object:Gem::Requirement
19
+ none: false
20
+ requirements:
21
+ - - ">="
22
+ - !ruby/object:Gem::Version
23
+ version: "0"
24
+ type: :runtime
25
+ version_requirements: *id001
26
+ - !ruby/object:Gem::Dependency
27
+ name: heroku-api
28
+ prerelease: false
29
+ requirement: &id002 !ruby/object:Gem::Requirement
30
+ none: false
31
+ requirements:
32
+ - - ">="
33
+ - !ruby/object:Gem::Version
34
+ version: "0"
35
+ type: :runtime
36
+ version_requirements: *id002
37
+ - !ruby/object:Gem::Dependency
38
+ name: pg
39
+ prerelease: false
40
+ requirement: &id003 !ruby/object:Gem::Requirement
41
+ none: false
42
+ requirements:
43
+ - - ">="
44
+ - !ruby/object:Gem::Version
45
+ version: "0"
46
+ type: :development
47
+ version_requirements: *id003
48
+ - !ruby/object:Gem::Dependency
49
+ name: rake
50
+ prerelease: false
51
+ requirement: &id004 !ruby/object:Gem::Requirement
52
+ none: false
53
+ requirements:
54
+ - - ">="
55
+ - !ruby/object:Gem::Version
56
+ version: "0"
57
+ type: :development
58
+ version_requirements: *id004
59
+ - !ruby/object:Gem::Dependency
60
+ name: foreman
61
+ prerelease: false
62
+ requirement: &id005 !ruby/object:Gem::Requirement
63
+ none: false
64
+ requirements:
65
+ - - ">="
66
+ - !ruby/object:Gem::Version
67
+ version: "0"
68
+ type: :development
69
+ version_requirements: *id005
70
+ - !ruby/object:Gem::Dependency
71
+ name: navvy
72
+ prerelease: false
73
+ requirement: &id006 !ruby/object:Gem::Requirement
74
+ none: false
75
+ requirements:
76
+ - - ">="
77
+ - !ruby/object:Gem::Version
78
+ version: "0"
79
+ type: :development
80
+ version_requirements: *id006
81
+ description: Hire and fire a Navvy worker on Heroku as needed.
82
+ email:
83
+ - prayerslayer@gmail.com
84
+ executables: []
85
+
86
+ extensions: []
87
+
88
+ extra_rdoc_files: []
89
+
90
+ files:
91
+ - .DS_Store
92
+ - .gitignore
93
+ - Gemfile
94
+ - Gemfile.lock
95
+ - LICENSE
96
+ - Procfile
97
+ - README.md
98
+ - Rakefile
99
+ - lib/.DS_Store
100
+ - lib/sklaventreiber.rb
101
+ - lib/sklaventreiber/.DS_Store
102
+ - lib/sklaventreiber/config.rb
103
+ - lib/sklaventreiber/herokuconnection.rb
104
+ - lib/sklaventreiber/mock.rb
105
+ - lib/sklaventreiber/tasks.rb
106
+ - lib/sklaventreiber/version.rb
107
+ - lib/sklaventreiber/worker.rb
108
+ - lib/sklaventreiber/workerplugin.rb
109
+ - navvy.proc
110
+ - sklaventreiber.gemspec
111
+ - test.proc
112
+ - test/.DS_Store
113
+ - test/job.rb
114
+ - test/test_sklaventreiber_plugin.rb
115
+ homepage: ""
116
+ licenses: []
117
+
118
+ post_install_message:
119
+ rdoc_options: []
120
+
121
+ require_paths:
122
+ - lib
123
+ required_ruby_version: !ruby/object:Gem::Requirement
124
+ none: false
125
+ requirements:
126
+ - - ">="
127
+ - !ruby/object:Gem::Version
128
+ version: "0"
129
+ required_rubygems_version: !ruby/object:Gem::Requirement
130
+ none: false
131
+ requirements:
132
+ - - ">="
133
+ - !ruby/object:Gem::Version
134
+ version: "0"
135
+ requirements: []
136
+
137
+ rubyforge_project:
138
+ rubygems_version: 1.8.24
139
+ signing_key:
140
+ specification_version: 3
141
+ summary: Navvy delayed job manager for Heroku
142
+ test_files:
143
+ - test/.DS_Store
144
+ - test/job.rb
145
+ - test/test_sklaventreiber_plugin.rb