work_smarter 1.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.
data/.DS_Store ADDED
Binary file
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source "http://rubygems.org"
2
+
3
+ # Specify your gem's dependencies in work_smarter.gemspec
4
+ gemspec
data/Gemfile.lock ADDED
@@ -0,0 +1,26 @@
1
+ PATH
2
+ remote: .
3
+ specs:
4
+ work_smarter (1.0)
5
+ delayed_job (~> 3.0.3)
6
+ heroku-api (~> 0.3.4)
7
+
8
+ GEM
9
+ remote: http://rubygems.org/
10
+ specs:
11
+ activesupport (3.2.8)
12
+ i18n (~> 0.6)
13
+ multi_json (~> 1.0)
14
+ delayed_job (3.0.3)
15
+ activesupport (~> 3.0)
16
+ excon (0.16.2)
17
+ heroku-api (0.3.4)
18
+ excon (~> 0.16.1)
19
+ i18n (0.6.0)
20
+ multi_json (1.3.6)
21
+
22
+ PLATFORMS
23
+ ruby
24
+
25
+ DEPENDENCIES
26
+ work_smarter!
data/LICENSE ADDED
@@ -0,0 +1,19 @@
1
+ Copyright (c) 2012, Deniz Okcu
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining a copy
4
+ of this software and associated documentation files (the "Software"), to deal
5
+ in the Software without restriction, including without limitation the rights
6
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
7
+ copies of the Software, and to permit persons to whom the Software is
8
+ furnished to do so, subject to the following conditions:
9
+
10
+ The above copyright notice and this permission notice shall be included in
11
+ all copies or substantial portions of the Software.
12
+
13
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
14
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
15
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
16
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
17
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
18
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
19
+ THE SOFTWARE.
data/README.markdown ADDED
@@ -0,0 +1,52 @@
1
+ # Work_smarter
2
+
3
+ Work_smarter is a simple wrapper for Delayed::Job that helps you autoscale workers when deployed on [Heroku](http://www.heroku.com). It came about for an upcoming project of [ours](http://www.involved.com.au), which only required the occasional background worker.
4
+
5
+ __Please note:__ This is still very early days for Work_smarter, there's very little (read: zero) test coverage - and we've yet to even put it into production.
6
+
7
+ # Configuration
8
+
9
+ Setup delayed_job as per [the instructions](http://docs.heroku.com/delayed-job) on Heroku.
10
+
11
+ Add Work_smarter to your Gemfile:
12
+
13
+ gem "work_smarter"
14
+
15
+ Add a `/config/work_smarter.yml` file to your Rails 3 project directory and add the following:
16
+
17
+ defaults: &defaults
18
+ max_workers: 1
19
+ min_workers: 0
20
+ application_name: my_heroku_application
21
+ api_key: your_api_key
22
+ backgroundjob_name: worker #default should be 'worker'
23
+
24
+ development:
25
+ <<: *defaults
26
+
27
+ test:
28
+ <<: *defaults
29
+
30
+ production:
31
+ <<: *defaults
32
+
33
+ # Usage
34
+
35
+ Work_smarter is set up to (try and) be as abstract as possible. Queuing a function works similar to delayed_job, just call:
36
+
37
+ Work_smarter.queue object, :function, [arg1, arg2]
38
+
39
+ For example:
40
+
41
+ Work_smarter.queue @image, :resize, {:width => 900, :height => 450}
42
+ # -- or --
43
+ Work_smarter.queue UserMailer.send_registration_notification(@user), :deliver
44
+
45
+ Work_smarter will automatically add and remove workers as the queue fills up and empties, respectively.
46
+
47
+ # Notes
48
+
49
+ This is a modified version of the Komodo gem. I changed some behaviour because the Komodo gem used deprecated Heroku commands.
50
+ I renamed and created this gem because i had namespace issues with a fork of the Komodo gem.
51
+
52
+ As stated above, this is really a pre-alpha of Work_smarter, as such the scaling is very basic; Work_smarter just ramps straight up to the user-configured maximum.
data/Rakefile ADDED
@@ -0,0 +1,2 @@
1
+ require 'bundler'
2
+ Bundler::GemHelper.install_tasks
@@ -0,0 +1,34 @@
1
+ class Work_smarter < Struct.new(:obj, :func, :args)
2
+ # delayed_job wrapper, creates a new monitored job and queues it
3
+ def self.queue(obj, func, args = [])
4
+ Work_smarter.configure unless defined?(@@config)
5
+ Delayed::Job.enqueue Work_smarter.new(obj, func, args)
6
+ end
7
+
8
+ # nothing of note here
9
+ def perform
10
+ obj.send(func, args)
11
+ end
12
+
13
+ protected
14
+ # adds a heroku worker, if required
15
+ def enqueue(job)
16
+ if Rails.env == "production" && Delayed::Job.count == 0
17
+ heroku = Heroku::API.new(:api_key => @@config['api_key'])
18
+ heroku.post_ps_scale(@@config['application_name'], @@config['backgroundjob_name'], @@config['max_workers'])
19
+ end
20
+ end
21
+
22
+ # removes heroku workers if queue is empty, or falling below max_workers
23
+ def after(job)
24
+ if Rails.env == "production" && Delayed::Job.count == 0
25
+ heroku = Heroku::API.new(:api_key => @@config['api_key'])
26
+ heroku.post_ps_scale(@@config['application_name'], @@config['backgroundjob_name'], @@config['min_workers'])
27
+ end
28
+ end
29
+
30
+ private
31
+ def self.configure
32
+ @@config = YAML.load_file("#{Rails.root.to_s}/config/work_smarter.yml")[Rails.env]
33
+ end
34
+ end
@@ -0,0 +1,21 @@
1
+ # -*- encoding: utf-8 -*-
2
+ $:.push File.expand_path("../lib", __FILE__)
3
+
4
+ Gem::Specification.new do |s|
5
+ s.name = "work_smarter"
6
+ s.version = "1.0"
7
+ s.platform = Gem::Platform::RUBY
8
+ s.authors = ["Deniz Okcu"]
9
+ s.email = ["deniz@combinio.com"]
10
+ s.homepage = "http://github.com/thetron/komodo"
11
+ s.summary = %q{work_smarter autoscales delayed_job workers on Heroku}
12
+ s.description = %q{work_smarter is a updated/modified version of the Komodo gem. It allows you to scale on-demand the number of delayed_job workers on Heroku, based on the length of your queue.}
13
+
14
+ s.add_dependency 'heroku-api', '~> 0.3.4'
15
+ s.add_dependency 'delayed_job', '~> 3.0.3'
16
+
17
+ s.files = `git ls-files`.split("\n")
18
+ s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
19
+ s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
20
+ s.require_paths = ["lib"]
21
+ end
metadata ADDED
@@ -0,0 +1,87 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: work_smarter
3
+ version: !ruby/object:Gem::Version
4
+ version: '1.0'
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Deniz Okcu
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2012-08-29 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: heroku-api
16
+ requirement: !ruby/object:Gem::Requirement
17
+ none: false
18
+ requirements:
19
+ - - ~>
20
+ - !ruby/object:Gem::Version
21
+ version: 0.3.4
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.3.4
30
+ - !ruby/object:Gem::Dependency
31
+ name: delayed_job
32
+ requirement: !ruby/object:Gem::Requirement
33
+ none: false
34
+ requirements:
35
+ - - ~>
36
+ - !ruby/object:Gem::Version
37
+ version: 3.0.3
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: 3.0.3
46
+ description: work_smarter is a updated/modified version of the Komodo gem. It allows
47
+ you to scale on-demand the number of delayed_job workers on Heroku, based on the
48
+ length of your queue.
49
+ email:
50
+ - deniz@combinio.com
51
+ executables: []
52
+ extensions: []
53
+ extra_rdoc_files: []
54
+ files:
55
+ - .DS_Store
56
+ - Gemfile
57
+ - Gemfile.lock
58
+ - LICENSE
59
+ - README.markdown
60
+ - Rakefile
61
+ - lib/work_smarter.rb
62
+ - work_smarter.gemspec
63
+ homepage: http://github.com/thetron/komodo
64
+ licenses: []
65
+ post_install_message:
66
+ rdoc_options: []
67
+ require_paths:
68
+ - lib
69
+ required_ruby_version: !ruby/object:Gem::Requirement
70
+ none: false
71
+ requirements:
72
+ - - ! '>='
73
+ - !ruby/object:Gem::Version
74
+ version: '0'
75
+ required_rubygems_version: !ruby/object:Gem::Requirement
76
+ none: false
77
+ requirements:
78
+ - - ! '>='
79
+ - !ruby/object:Gem::Version
80
+ version: '0'
81
+ requirements: []
82
+ rubyforge_project:
83
+ rubygems_version: 1.8.24
84
+ signing_key:
85
+ specification_version: 3
86
+ summary: work_smarter autoscales delayed_job workers on Heroku
87
+ test_files: []