sucker_punch 0.2 → 0.3

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/.travis.yml ADDED
@@ -0,0 +1,6 @@
1
+ language: ruby
2
+ rvm:
3
+ - 1.9.3
4
+ - jruby-19mode
5
+ - rbx-19mode
6
+ - 2.0.0
data/CHANGES.md ADDED
File without changes
data/README.md CHANGED
@@ -1,6 +1,11 @@
1
1
  # Sucker Punch
2
2
 
3
- Sucker Punch is a Ruby asynchronous processing using Celluloid, heavily influenced by Sidekiq and girl_friday. With Celluloid's actor pattern, we use do asynchronous processing within a single process. This reduces costs of hosting on a service like Heroku along with the memory footprint of having to maintain additional workers if hosting on a dedicated server.
3
+ [![Build Status](https://travis-ci.org/brandonhilkert/sucker_punch.png?branch=master)](https://travis-ci.org/brandonhilkert/sucker_punch)
4
+ [![Code Climate](https://codeclimate.com/github/brandonhilkert/sucker_punch.png)](https://codeclimate.com/github/brandonhilkert/sucker_punch)
5
+
6
+ Sucker Punch is a single-process Ruby asynchronous processing library. It's [girl_friday](https://github.com/mperham/girl_friday) with syntax from [Sidekiq](https://github.com/mperham/sidekiq) and DSL sugar on top of [Celluloid](https://github.com/celluloid/celluloid/). With Celluloid's actor pattern, we can do asynchronous processing within a single process. This reduces costs of hosting on a service like Heroku along with the memory footprint of having to maintain additional workers if hosting on a dedicated server. All queues can run within a single Rails/Sinatra process.
7
+
8
+ Sucker Punch is perfect for asynchronous processes like emailing, data crunching, or social platform manipulation. No reason to hold up a user when you can do these things in the background within the same process as your web application...
4
9
 
5
10
  ## Installation
6
11
 
@@ -16,11 +21,9 @@ Or install it yourself as:
16
21
 
17
22
  $ gem install sucker_punch
18
23
 
19
- ## Usage
24
+ ## Configuration
20
25
 
21
- Configuration:
22
-
23
- `app/config/sucker_punch.rb`
26
+ `config/initializers/sucker_punch.rb`
24
27
 
25
28
  ```Ruby
26
29
  SuckerPunch.config do
@@ -29,7 +32,7 @@ Configuration:
29
32
  end
30
33
  ```
31
34
 
32
- Workers:
35
+ ## Usage
33
36
 
34
37
  `app/workers/log_worker.rb`
35
38
 
@@ -45,7 +48,7 @@ end
45
48
 
46
49
  All workers should define an instance method `perform`, of which the job being queued will adhere to.
47
50
 
48
- Workers interacting with `ActiveRecord` should take special precaution not to exhause connections in the pool. This can be done with `ActiveRecord::Base.connection_pool.with_connection`, which ensures the connection is returned back to the pool when completed.
51
+ Workers interacting with `ActiveRecord` should take special precaution not to exhaust connections in the pool. This can be done with `ActiveRecord::Base.connection_pool.with_connection`, which ensures the connection is returned back to the pool when completed.
49
52
 
50
53
  `app/workers/awesome_worker.rb`
51
54
 
@@ -62,10 +65,27 @@ class AwesomeWorker
62
65
  end
63
66
  ```
64
67
 
68
+ We can create a job from within another job:
69
+
70
+ ```Ruby
71
+ class AwesomeWorker
72
+ include SuckerPunch::Worker
73
+
74
+ def perform(user_id)
75
+ ActiveRecord::Base.connection_pool.with_connection do
76
+ user = User.find(user_id)
77
+ user.update_attributes(is_awesome: true)
78
+ SuckerPunch::Queue[:log_queue].async.perform("User #{user.id} became awesome!")
79
+ end
80
+ end
81
+ end
82
+ ```
83
+
65
84
  Queues:
66
85
 
67
86
  ```Ruby
68
- SuckerPunch::Queue[:log_queue] # Is just the class LogWorker
87
+ SuckerPunch::Queue[:log_queue] # Just a wrapper for the LogWorker class
88
+ SuckerPunch::Queue.new(:log_queue)
69
89
  ```
70
90
 
71
91
  Synchronous:
@@ -80,9 +100,30 @@ Asynchronous:
80
100
  SuckerPunch::Queue[:log_queue].async.perform("login") # => nil
81
101
  ```
82
102
 
103
+ ## Stats
104
+
105
+ ```Ruby
106
+ SuckerPunch::Queue[:log_queue].size # => 7
107
+ SuckerPunch::Queue[:log_queue].busy_size # => 4
108
+ SuckerPunch::Queue[:log_queue].idle_size # => 3
109
+ ```
110
+
111
+ ## Testing
112
+
113
+ `spec/spec_helper.rb`
114
+ ```Ruby
115
+ require 'sucker_punch/inline'
116
+ ```
117
+
118
+ Requiring this library causes your workers to run everything inline. So a call to the following will actually be SYNCHRONOUS.
119
+
120
+ ```Ruby
121
+ SuckerPunch::Queue[:log_queue].async.perform("login")
122
+ ```
123
+
83
124
  ## Gem Name
84
125
 
85
- With all due respect, [@jmazzi](https://twitter.com/jmazzi) is completely responsible for the name, which is totally awesome. If you're looking for a name for something, he is the one to go to.
126
+ ...is awesome. But I can't take credit for it. Thanks to [@jmazzi](https://twitter.com/jmazzi) for his superior naming skills. If you're looking for a name for something, he is the one to go to.
86
127
 
87
128
  ## Contributing
88
129
 
@@ -91,5 +132,3 @@ With all due respect, [@jmazzi](https://twitter.com/jmazzi) is completely respon
91
132
  3. Commit your changes (`git commit -am 'Add some feature'`)
92
133
  4. Push to the branch (`git push origin my-new-feature`)
93
134
  5. Create new Pull Request
94
-
95
-
@@ -17,5 +17,9 @@ module SuckerPunch
17
17
  klass.send(:pool)
18
18
  end
19
19
  end
20
+
21
+ def method_missing(method_name, *args, &block)
22
+ Celluloid::Actor[name].send(method_name, *args, &block)
23
+ end
20
24
  end
21
25
  end
@@ -0,0 +1,8 @@
1
+ module Celluloid
2
+ class ActorProxy
3
+ def async(method_name = nil, *args, &block)
4
+ self
5
+ end
6
+ end
7
+ end
8
+
@@ -1,3 +1,3 @@
1
1
  module SuckerPunch
2
- VERSION = "0.2"
2
+ VERSION = "0.3"
3
3
  end
data/spec/queue_spec.rb CHANGED
@@ -3,9 +3,6 @@ require 'spec_helper'
3
3
  class FakeWorker
4
4
  include Celluloid
5
5
  end
6
- class FakeOtherWorker
7
- include Celluloid
8
- end
9
6
 
10
7
  describe SuckerPunch::Queue do
11
8
  describe ".[]" do
@@ -22,6 +19,7 @@ describe SuckerPunch::Queue do
22
19
  end
23
20
 
24
21
  it "turns the class into an actor" do
22
+ Celluloid::Actor[:crazy_queue].should be_a(Celluloid)
25
23
  Celluloid::Actor[:crazy_queue].should be_a(FakeWorker)
26
24
  Celluloid::Actor[:crazy_queue].methods.should include(:async)
27
25
  end
@@ -30,4 +28,18 @@ describe SuckerPunch::Queue do
30
28
  Celluloid::Actor[:crazy_queue].size.should == 7
31
29
  end
32
30
  end
31
+
32
+ describe "delegation" do
33
+ let(:queue) { SuckerPunch::Queue.new(:crazy_queue) }
34
+
35
+ before(:each) do
36
+ SuckerPunch::Queue.new(:crazy_queue).register(FakeWorker, 7)
37
+ end
38
+
39
+ it "sends messages to Actor" do
40
+ queue.size.should == 7
41
+ queue.idle_size.should == 7
42
+ queue.busy_size.should == 0
43
+ end
44
+ end
33
45
  end
@@ -0,0 +1,20 @@
1
+ require 'spec_helper'
2
+ require_relative '../lib/sucker_punch/testing'
3
+
4
+ class PatchedWorker
5
+ include SuckerPunch::Worker
6
+
7
+ def perform
8
+ "do stuff"
9
+ end
10
+ end
11
+ SuckerPunch::Queue.new(:patched_queue).register(PatchedWorker, 2)
12
+
13
+ describe "Testing" do
14
+ let(:queue) { SuckerPunch::Queue.new(:patched_queue) }
15
+
16
+ it "processes jobs inline" do
17
+ job = queue.async.perform
18
+ expect(job).to eq "do stuff"
19
+ end
20
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: sucker_punch
3
3
  version: !ruby/object:Gem::Version
4
- version: '0.2'
4
+ version: '0.3'
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2013-01-19 00:00:00.000000000 Z
12
+ date: 2013-03-19 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: rspec
@@ -67,6 +67,8 @@ extensions: []
67
67
  extra_rdoc_files: []
68
68
  files:
69
69
  - .gitignore
70
+ - .travis.yml
71
+ - CHANGES.md
70
72
  - Gemfile
71
73
  - LICENSE.txt
72
74
  - README.md
@@ -74,11 +76,13 @@ files:
74
76
  - lib/sucker_punch.rb
75
77
  - lib/sucker_punch/exceptions.rb
76
78
  - lib/sucker_punch/queue.rb
79
+ - lib/sucker_punch/testing.rb
77
80
  - lib/sucker_punch/version.rb
78
81
  - lib/sucker_punch/worker.rb
79
82
  - spec/queue_spec.rb
80
83
  - spec/spec_helper.rb
81
84
  - spec/sucker_punch_spec.rb
85
+ - spec/testing_spec.rb
82
86
  - spec/worker_spec.rb
83
87
  - sucker_punch.gemspec
84
88
  homepage: https://github.com/brandonhilkert/sucker_punch
@@ -110,4 +114,5 @@ test_files:
110
114
  - spec/queue_spec.rb
111
115
  - spec/spec_helper.rb
112
116
  - spec/sucker_punch_spec.rb
117
+ - spec/testing_spec.rb
113
118
  - spec/worker_spec.rb