afterparty 0.1.0 → 0.1.1

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  !binary "U0hBMQ==":
3
- metadata.gz: 5d17a9d413c53f3fbac4701c2c6b3019141b94f3
4
- data.tar.gz: de82e598bc016faa80d7fa4879ca0084f372588c
3
+ metadata.gz: 1cd702bf393ba9846ebeea3e8195dd7f76914488
4
+ data.tar.gz: a7f24532f757b22660d31720ccd0bec948ba7545
5
5
  !binary "U0hBNTEy":
6
- metadata.gz: abb7fba4469a92003e3a439ae9514088e5f9312547216a75386856af95cd3e6ecda7d7e0b4259556fb778bc67a4d3db0b10618a3c01a13dcd15545901ac49472
7
- data.tar.gz: 7d475a34daa110341d5401cb08a6f1186add9a584aaffe4f0551e5337d8633e4431aca2c9b66d2c91d45e87827975d9e6f9712aa7c2ba64038925f2fbfd5b45a
6
+ metadata.gz: 86e634284043827e87dcdc3fce39e5be359a3592077dca1427041faa9f1fd147e9d1ed374b6241643836617b5393da9822fca6d985db39d5c6431fa53d5667b1
7
+ data.tar.gz: c49dbbed658e44ab6a7eb1cc55d0528621a6eb17612744e7f733a00cf91770d0c398d360f1628b7c20cf44310f1657f515c41b773d6f61263479470698493ec2
@@ -2,7 +2,5 @@ language: ruby
2
2
  rvm:
3
3
  - 1.9.3
4
4
  - 2.0.0
5
- services:
6
- - redis-server
7
5
  env:
8
6
  - AFTERPARTY_JOB_TIME=15 AFTERPARTY_SLOW_TIME=50
data/README.md CHANGED
@@ -57,11 +57,13 @@ mailer_job.execute_at = Time.now + 20.minutes
57
57
  Rails.configuration.queue << mailer_job
58
58
 
59
59
  job = Afterparty::BasicJob.new @user, :reset_password
60
- Rails.configuration.queue << mailer_job
60
+ Rails.configuration.queue << job
61
61
  ~~~
62
62
 
63
63
  ### Dashboard
64
64
 
65
+ ![dashboard screenshot](https://raw.github.com/hstove/afterparty/master/docs/dashboard.png)
66
+
65
67
  This gem provides a handy dashboard for inspecting, debugging, and re-running jobs.
66
68
 
67
69
  Visit [http://localhost:3000/afterparty/](http://localhost:3000/afterparty/) and login with
@@ -90,6 +92,10 @@ before_fork do |server, worker|
90
92
 
91
93
  This has the advantage of, for example, staying within Heroku's free tier by not running a worker dyno.
92
94
 
95
+ ## TODO
96
+
97
+ * Finish namespacing support by adding documentation and allowing a worker rake task to pull jobs from a custom (or all) queues.
98
+
93
99
  ## Contributing
94
100
 
95
101
  1. Fork it
Binary file
Binary file
@@ -5,6 +5,7 @@ class AfterpartyJob < ::ActiveRecord::Base
5
5
 
6
6
  validates_presence_of :job_dump, :execute_at, :queue
7
7
 
8
+ scope :namespaced, lambda { |name| where(queue: name) }
8
9
  scope :incomplete, -> { where(completed: false).order("execute_at") }
9
10
  scope :valid, -> { incomplete.where(execute_at: 10.years.ago..DateTime.now) }
10
11
  scope :completed, -> { where(completed: true).order("execute_at desc") }
@@ -28,4 +29,13 @@ class AfterpartyJob < ::ActiveRecord::Base
28
29
  j.run
29
30
  end
30
31
  end
32
+
33
+ # def self.namespaced name
34
+ # where(queue: name)
35
+ # end
36
+
37
+ # def namespaced name
38
+ # where(queue: name)
39
+ # end
40
+
31
41
  end
@@ -3,16 +3,6 @@ module Afterparty
3
3
  attr_accessor :options, :temp_namespace, :login_block
4
4
  include Afterparty::QueueHelpers
5
5
 
6
- def initialize options={}, consumer_options={}
7
- # @consumer = ThreadedQueueConsumer.new(self, consumer_options).start
8
- @options = options
9
- @options[:namespace] ||= "default"
10
- # Afterparty.add_queue @options[:namespace]
11
- @options[:sleep] ||= 5
12
- @mutex = Mutex.new
13
- @options[:logger] ||= Logger.new($stderr)
14
- end
15
-
16
6
  def push job
17
7
  # @mutex.synchronize do
18
8
  return nil if job.nil?
@@ -27,8 +17,6 @@ module Afterparty
27
17
  # @mutex.synchronize do
28
18
  while true do
29
19
  unless (_job = AfterpartyJob.valid.first).nil?
30
- ap "poppin job"
31
- _job.completed = true
32
20
  _job.save
33
21
  return _job
34
22
  end
@@ -41,7 +29,7 @@ module Afterparty
41
29
  class TestQueue < Queue
42
30
  attr_accessor :completed_jobs
43
31
 
44
- def initialize opts={}, consumer_opts={}
32
+ def initialize opts={}
45
33
  super
46
34
  @completed_jobs = []
47
35
  @exceptions = []
@@ -1,36 +1,25 @@
1
1
  module Afterparty
2
2
  module QueueHelpers
3
- def [] namespace
4
- @temp_namespace = namespace
3
+
4
+ def initialize options = {}
5
+ @options = options
6
+ @options[:namespace] ||= :default
7
+ @options[:sleep] ||= 10
8
+ @options[:logger] ||= Logger.new($stderr)
9
+ self
5
10
  end
6
11
 
7
- def redis_queue_name
8
- puts (a = Afterparty.redis_queue_name(@temp_namespace || @options[:namespace]))
9
- a
12
+ def [] namespace
13
+ @temp_namespace = namespace
10
14
  end
11
15
 
12
16
  def clear
13
17
  # redis_call :del
14
- AfterpartyJob.destroy_all
15
- end
16
-
17
- def redis_call command, *args
18
- result = Afterparty.redis_call (@temp_namespace || @options[:namespace]), command, *args
19
- @temp_namespace = nil
20
- result
21
- end
22
-
23
- def async_redis_call &block
24
- Afterparty.redis.pipelined &block
18
+ AfterpartyJob.namespaced(@options[:namespace]).destroy_all
25
19
  end
26
20
 
27
21
  def jobs
28
- # _jobs = redis_call(:zrange, 0, -1)
29
- # _jobs.each_with_index do |job, i|
30
- # _jobs[i] = Marshal.load(job)
31
- # end
32
- # _jobs
33
- AfterpartyJob.incomplete
22
+ AfterpartyJob.namespaced(@options[:namespace]).incomplete
34
23
  end
35
24
 
36
25
  def jobs_with_scores
@@ -38,41 +27,27 @@ module Afterparty
38
27
  end
39
28
 
40
29
  def valid_jobs
41
- # redis_call :zrangebyscore, 0, Time.now.to_i
42
- AfterpartyJob.valid
30
+ AfterpartyJob.namespaced(@options[:namespace]).valid
43
31
  end
44
32
 
45
33
  def next_valid_job
46
- # valid_jobs.first
47
- AfterpartyJob.valid.first
34
+ AfterpartyJob.namespaced(@options[:namespace]).valid.first
48
35
  end
49
36
 
50
37
  def jobs_empty?
51
- # count = total_jobs_count
52
- # # ap count
53
- # count == 0
54
- AfterpartyJob.valid.empty?
38
+ AfterpartyJob.namespaced(@options[:namespace]).valid.empty?
55
39
  end
56
40
 
57
41
  def total_jobs_count
58
- # redis_call(:zcount, "-inf", "+inf")
59
- AfterpartyJob.incomplete.count
60
- end
61
-
62
- def redis
63
- @@redis
42
+ AfterpartyJob.namespaced(@options[:namespace]).incomplete.count
64
43
  end
65
44
 
66
45
  def last_completed
67
- # @temp_namespace = "completed"
68
- # redis_call(:zrange, -1, -1).first
69
- AfterpartyJob.completed.first
46
+ AfterpartyJob.namespaced(@options[:namespace]).completed.first
70
47
  end
71
48
 
72
49
  def completed
73
- # @temp_namespace = "completed"
74
- # redis_call(:zrange, -20, -1).reverse
75
- AfterpartyJob.completed
50
+ AfterpartyJob.namespaced(@options[:namespace]).completed
76
51
  end
77
52
 
78
53
  def completed_with_scores
@@ -121,14 +96,6 @@ module Afterparty
121
96
 
122
97
  private
123
98
 
124
- def hash_from_scores raw
125
- arr = []
126
- raw.each do |group|
127
- arr << Afterparty::JobContainer.new(group[0], group[1])
128
- end
129
- arr
130
- end
131
-
132
99
  # returns true if job has an :execute_at value
133
100
  def job_valid? job
134
101
  job.respond_to?(:execute_at) && !job.execute_at.nil?
@@ -1,3 +1,3 @@
1
1
  module Afterparty
2
- VERSION = "0.1.0"
2
+ VERSION = "0.1.1"
3
3
  end
@@ -2,15 +2,6 @@ module Afterparty
2
2
  class Worker
3
3
  include QueueHelpers
4
4
 
5
- def initialize options = {}
6
- @options = options
7
- @options[:adapter] ||= :redis
8
- @options[:namespace] ||= :default
9
- @options[:sleep] ||= 10
10
- @options[:logger] ||= Logger.new($stderr)
11
- self
12
- end
13
-
14
5
  def consume
15
6
  @stopped = false
16
7
  # puts "starting worker with namespace [#{@options[:namespace]}]."
@@ -10,8 +10,8 @@ describe AfterpartyJob do
10
10
  job = AfterpartyJob.make_with_job tester
11
11
  job.reload
12
12
  (reloaded = job.reify).class.should == tester.class
13
- reloaded.execute_at.should == tester.execute_at
14
- job.execute_at.should == reloaded.execute_at
13
+ reloaded.execute_at.utc.to_i.should == tester.execute_at.utc.to_i
14
+ job.execute_at.utc.to_i.should == reloaded.execute_at.utc.to_i
15
15
  end
16
16
 
17
17
  end
@@ -16,7 +16,7 @@ module Afterparty
16
16
  end
17
17
 
18
18
  class TestJob
19
- attr_accessor :execute_at
19
+ attr_accessor :execute_at, :name
20
20
 
21
21
  def initialize &block
22
22
  @block = block
@@ -1,11 +1,7 @@
1
1
  require 'spec_helper'
2
2
  describe Afterparty::Queue do
3
3
  before do
4
- # require 'open-uri'
5
- # uri = URI.parse("redis://localhost:6379")
6
- # redis = Redis.new(:host => uri.host, :port => uri.port, :password => uri.password)
7
- # Afterparty.redis = redis
8
- @q = Afterparty::TestQueue.new({sleep: 0.5, namespace: "master_test"})
4
+ @q = Afterparty::Queue.new({sleep: 0.5})
9
5
  end
10
6
 
11
7
  after do
@@ -14,7 +10,6 @@ describe Afterparty::Queue do
14
10
 
15
11
  before :each do
16
12
  @worker = Afterparty::Worker.new({sleep: 0.5})
17
- # @worker.consume
18
13
  @q.clear
19
14
  @job_time = (ENV['AFTERPARTY_JOB_TIME'] || 5).to_i
20
15
  @slow_job_time = (ENV['AFTERPARTY_SLOW_TIME'] || 7).to_i
@@ -54,7 +49,6 @@ describe Afterparty::Queue do
54
49
  lambda {
55
50
  @worker.consume_next
56
51
  }.should change{ @q.total_jobs_count }.by(0)
57
- # @q.jobs.size.should eq(1)
58
52
  end
59
53
 
60
54
  it "waits the correct amount of time to execute a job" do
@@ -0,0 +1,49 @@
1
+ require 'spec_helper'
2
+ describe Afterparty::Queue do
3
+ before do
4
+ @q = Afterparty::Queue.new
5
+ end
6
+
7
+ before :each do
8
+ @q.clear
9
+ end
10
+
11
+ it "should make a wrapper job when a job is pushed" do
12
+ job = nil
13
+ tester = test_job
14
+ time = tester.execute_at = Time.now + 10.seconds
15
+ -> {
16
+ job = @q.push tester
17
+ }.should change{ AfterpartyJob.count }.by(1)
18
+ job.execute_at.utc.to_i.should == tester.execute_at.utc.to_i
19
+ end
20
+
21
+ it "should return a wrapper job for #push" do
22
+ @q.push(test_job).class.should == AfterpartyJob
23
+ end
24
+
25
+ it "only returns valid jobs for #pop" do
26
+ tester = test_job(60)
27
+ @q.push tester
28
+ tester2 = test_job
29
+ tester2.name = "testable"
30
+ @q.push tester2
31
+ wrapper = @q.pop
32
+ popped_job = wrapper.reify
33
+ popped_job.name.should == tester2.name
34
+ popped_job.execute_at.should == nil
35
+ end
36
+
37
+ it "supports namespacing" do
38
+ queue = Afterparty::Queue.new namespace: "tester"
39
+ queue.clear
40
+ @q.clear
41
+ tester = test_job
42
+ tester.name = 'testy'
43
+ job = queue.push(tester)
44
+ job.queue.should == "tester"
45
+ wrapper = queue.pop
46
+ (inner = wrapper.reify).name.should == "testy"
47
+ wrapper.queue.should == "tester"
48
+ end
49
+ end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: afterparty
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.1.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Hank Stoever
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2013-05-20 00:00:00.000000000 Z
11
+ date: 2013-05-21 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: redis
@@ -88,6 +88,7 @@ files:
88
88
  - app/controllers/afterparty/dashboard_controller.rb
89
89
  - app/views/afterparty/dashboard/index.html.haml
90
90
  - config/routes.rb
91
+ - docs/dashboard.png
91
92
  - dump.rdb
92
93
  - lib/afterparty.rb
93
94
  - lib/afterparty/afterparty_job.rb
@@ -109,6 +110,7 @@ files:
109
110
  - spec/helpers.rb
110
111
  - spec/queue_functional_spec.rb
111
112
  - spec/queue_helpers_spec.rb
113
+ - spec/queue_spec.rb
112
114
  - spec/schema.rb
113
115
  - spec/spec_helper.rb
114
116
  homepage: ''
@@ -142,6 +144,7 @@ test_files:
142
144
  - spec/helpers.rb
143
145
  - spec/queue_functional_spec.rb
144
146
  - spec/queue_helpers_spec.rb
147
+ - spec/queue_spec.rb
145
148
  - spec/schema.rb
146
149
  - spec/spec_helper.rb
147
150
  has_rdoc: