pigeon 0.4.4 → 0.4.6

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/VERSION CHANGED
@@ -1 +1 @@
1
- 0.4.4
1
+ 0.4.6
@@ -5,6 +5,8 @@ class Pigeon::Processor
5
5
 
6
6
  # == Properties ===========================================================
7
7
 
8
+ attr_accessor :context
9
+ attr_reader :queue
8
10
  attr_reader :task
9
11
  attr_reader :id
10
12
 
@@ -15,10 +17,11 @@ class Pigeon::Processor
15
17
  # Creates a new processor. An optional queue can be specified in which case
16
18
  # the processor will register itself as an observer of that queue. A block
17
19
  # can be given to filter the tasks contained in the associated queue.
18
- def initialize(queue = nil, &filter)
20
+ def initialize(queue = nil, context = nil, &filter)
19
21
  @id = Pigeon::Support.unique_id
20
22
  @lock = Mutex.new
21
23
  @filter = filter || lambda { |task| true }
24
+ @context = context
22
25
 
23
26
  if (queue)
24
27
  self.queue = queue
@@ -31,24 +34,24 @@ class Pigeon::Processor
31
34
  # then the observer callback for that queue will be removed.
32
35
  def queue=(queue)
33
36
  if (@queue)
34
- @queue.remove_observer(&@claim)
37
+ @queue.remove_processor(self, &@claim)
35
38
  end
36
39
 
37
- @queue = queue
38
-
39
- @claim = lambda do |task|
40
- @lock.synchronize do
41
- if (!@task and @filter.call(task))
42
- @task = queue.claim(task)
40
+ if (@queue = queue)
41
+ @claim = lambda do |task|
42
+ @lock.synchronize do
43
+ if (!@task and @filter.call(task))
44
+ @task = queue.claim(task)
43
45
 
44
- @task.run! do
45
- switch_to_next_task!
46
+ @task.run!(self) do
47
+ switch_to_next_task!
48
+ end
46
49
  end
47
50
  end
48
51
  end
52
+
53
+ @queue.add_processor(self, &@claim)
49
54
  end
50
-
51
- @queue.observe(&@claim)
52
55
  end
53
56
 
54
57
  # Returns true if the given task would be accepted by the filter defined
@@ -62,13 +65,17 @@ class Pigeon::Processor
62
65
  !!@task
63
66
  end
64
67
 
68
+ def inspect
69
+ "<#{self.class}\##{@id} queue=#{@queue.inspect} task=#{@task} context=#{@context}>"
70
+ end
71
+
65
72
  protected
66
73
  def switch_to_next_task!
67
74
  @lock.synchronize do
68
75
  @task = nil
69
76
 
70
77
  if (@task = @queue.pop(&@filter))
71
- @task.run! do
78
+ @task.run!(self) do
72
79
  switch_to_next_task!
73
80
  end
74
81
  end
data/lib/pigeon/queue.rb CHANGED
@@ -17,15 +17,9 @@ class Pigeon::Queue
17
17
  alias_method :to_s, :inspect
18
18
  end
19
19
 
20
- # == Extensions ===========================================================
21
-
22
- # == Relationships ========================================================
23
-
24
- # == Scopes ===============================================================
25
-
26
- # == Callbacks ============================================================
27
-
28
- # == Validations ==========================================================
20
+ # == Properties ===========================================================
21
+
22
+ attr_reader :processors
29
23
 
30
24
  # == Class Methods ========================================================
31
25
 
@@ -56,6 +50,7 @@ class Pigeon::Queue
56
50
  @claimable_task = { }
57
51
  @filters = self.class.filters.dup
58
52
  @observers = { }
53
+ @processors = [ ]
59
54
  @next_task = { }
60
55
  @insert_backlog = [ ]
61
56
 
@@ -107,6 +102,24 @@ class Pigeon::Queue
107
102
  end
108
103
  end
109
104
 
105
+ # Adds a processor to the queue and adds an observer claim method.
106
+ def add_processor(processor, &claim)
107
+ @observer_lock.synchronize do
108
+ @processors << processor
109
+ end
110
+
111
+ observe(&claim) if (claim)
112
+ end
113
+
114
+ # Removes a processor from the queue and removes an observer claim method.
115
+ def remove_processor(processor, &claim)
116
+ @observer_lock.synchronize do
117
+ @processors.delete(processor)
118
+ end
119
+
120
+ remove_observer(&claim) if (claim)
121
+ end
122
+
110
123
  # Creates a named filter for the queue using the provided block to select
111
124
  # the tasks which should match.
112
125
  def filter(filter_name, &block)
data/lib/pigeon/task.rb CHANGED
@@ -38,14 +38,16 @@ class Pigeon::Task
38
38
  after_initialized
39
39
  end
40
40
 
41
- # Kicks off the task. An optional callback is executed just before each
41
+ # Kicks off the task. The processor execurting the task should be supplied
42
+ # as the first argument. An optional callback is executed just before each
42
43
  # state is excuted and is passed the state name as a symbol.
43
- def run!(initial_state = nil, &callback)
44
+ def run!(processor = nil, initial_state = nil, &callback)
44
45
  @callback = callback if (block_given?)
45
46
 
46
47
  @state = initial_state || self.class.initial_state
47
48
  @started_at = Time.now
48
49
 
50
+ @processor = processor
49
51
  run_state!(@state)
50
52
  end
51
53
 
data/pigeon.gemspec CHANGED
@@ -5,11 +5,11 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = %q{pigeon}
8
- s.version = "0.4.4"
8
+ s.version = "0.4.6"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["tadman"]
12
- s.date = %q{2010-12-15}
12
+ s.date = %q{2010-12-17}
13
13
  s.default_executable = %q{launcher.example}
14
14
  s.description = %q{Pigeon is a simple way to get started building an EventMachine engine that's intended to run as a background job.}
15
15
  s.email = %q{github@tadman.ca}
@@ -110,6 +110,19 @@ class PigeonProcessorTest < Test::Unit::TestCase
110
110
 
111
111
  assert_equal false, task_c.finished?
112
112
  end
113
+
114
+ def test_can_unassign_queue_from_processor
115
+ queue = Pigeon::Queue.new
116
+ processor = Pigeon::Processor.new(queue)
117
+
118
+ assert_equal queue, processor.queue
119
+ assert_equal [ processor ], queue.processors
120
+
121
+ processor.queue = nil
122
+
123
+ assert_equal nil, processor.queue
124
+ assert_equal [ ], queue.processors
125
+ end
113
126
 
114
127
  def test_multiple_processors
115
128
  queue = Pigeon::Queue.new
@@ -31,6 +31,8 @@ class PigeonQueueTest < Test::Unit::TestCase
31
31
  assert_equal true, queue.empty?
32
32
 
33
33
  assert_equal nil, queue.pop
34
+
35
+ assert_equal [ ], queue.processors
34
36
  end
35
37
 
36
38
  def test_cycling
@@ -140,7 +140,7 @@ class PigeonTaskTest < Test::Unit::TestCase
140
140
  assert task.exception?
141
141
  end
142
142
 
143
- def test_arbitrary_options
143
+ def test_with_context
144
144
  options = {
145
145
  :example => 'example1',
146
146
  :optional => 1
@@ -149,6 +149,10 @@ class PigeonTaskTest < Test::Unit::TestCase
149
149
  task = Pigeon::Task.new(options)
150
150
 
151
151
  assert_equal options, task.context
152
+
153
+ task.context = 'test'
154
+
155
+ assert_equal 'test', task.context
152
156
  end
153
157
 
154
158
  def test_block_notification
metadata CHANGED
@@ -5,8 +5,8 @@ version: !ruby/object:Gem::Version
5
5
  segments:
6
6
  - 0
7
7
  - 4
8
- - 4
9
- version: 0.4.4
8
+ - 6
9
+ version: 0.4.6
10
10
  platform: ruby
11
11
  authors:
12
12
  - tadman
@@ -14,7 +14,7 @@ autorequire:
14
14
  bindir: bin
15
15
  cert_chain: []
16
16
 
17
- date: 2010-12-15 00:00:00 -05:00
17
+ date: 2010-12-17 00:00:00 -05:00
18
18
  default_executable: launcher.example
19
19
  dependencies:
20
20
  - !ruby/object:Gem::Dependency