pigeon 1.0.2 → 1.1.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 12d96b87babc1f6813e8ff15527562f5ac0e2dd5
4
- data.tar.gz: 9caccf40e73318db4c32bd07e860463343707c28
3
+ metadata.gz: d553925f3fd1fb650f15aa7c7c060f3a7c43151b
4
+ data.tar.gz: 89d6307360636edbd6af8e5a06b6b3358af63bd7
5
5
  SHA512:
6
- metadata.gz: 2c7a14327b778fe864519f99dc8147e3a06cd3a5b9a4bee703b6d8e247770eb91ebb65418008032dd96d9900b7366dd3518a9dcdc23b2ce7325c8510d7d108d8
7
- data.tar.gz: ba1e0b601da14733fac4d5bb14cfc45701752f172c82eb5fe43c9a01728760c109df4a4574a1258d53c4caefe4f08c3d401b1ac1ad9d085a043638d03a53abbe
6
+ metadata.gz: 82cd662072522d65a24aa4ed0df2709f708d86f2ef2315b3119a45d01f9ac2c2a6135ac2812e9e0b0e39ee495121dcec9cabbbe54a9e0f85c759fe12875418a8
7
+ data.tar.gz: 1267fc9c55dff84fb2ad1dd1bb4da2dcdf400f52e483288403c4f46515209c9affd97d34fc399dcb96dbc0f4bd3e967a9c944ac8ad28ac6b45766f33e84045d5
@@ -2,7 +2,8 @@ language: ruby
2
2
  before_install:
3
3
  - gem install bundler
4
4
  rvm:
5
- - 1.9.3-p551
6
5
  - 2.0.0-p598
7
6
  - 2.1.5
8
7
  - 2.2.0
8
+ - 2.3.3
9
+ - 2.4.2
data/LICENSE CHANGED
@@ -1,4 +1,4 @@
1
- Copyright (c) 2009-2013 Scott Tadman, The Working Group Inc.
1
+ Copyright (c) 2009-2017 Scott Tadman, PostageApp, The Working Group Inc.
2
2
 
3
3
  Permission is hereby granted, free of charge, to any person obtaining
4
4
  a copy of this software and associated documentation files (the
data/Rakefile CHANGED
@@ -9,8 +9,8 @@ begin
9
9
  gem.summary = %Q{Simple daemonized EventMachine engine framework with plug-in support}
10
10
  gem.description = %Q{Pigeon is a simple way to get started building an EventMachine engine that's intended to run as a background job.}
11
11
  gem.email = "github@tadman.ca"
12
- gem.homepage = "http://github.com/twg/pigeon"
13
- gem.authors = %w[ tadman ]
12
+ gem.homepage = "http://github.com/postageapp/pigeon"
13
+ gem.authors = [ 'Scott Tadman' ]
14
14
  gem.executables = [ ]
15
15
  end
16
16
 
data/VERSION CHANGED
@@ -1 +1 @@
1
- 1.0.2
1
+ 1.1.0
@@ -18,8 +18,8 @@ class Pigeon::Engine
18
18
  # == Properties ===========================================================
19
19
 
20
20
  option_accessor :logger
21
- option_accessor :name
22
- option_accessor :pid_file_name
21
+ option_writer :name
22
+ option_writer :pid_file_name
23
23
  option_accessor :foreground,
24
24
  boolean: true
25
25
  option_accessor :debug,
@@ -27,10 +27,13 @@ class Pigeon::Engine
27
27
  option_accessor :log_rotation
28
28
  option_accessor :engine_log_name,
29
29
  default: 'engine.log'
30
- option_accessor :engine_logger
30
+ option_writer :engine_logger,
31
+ on: :class
32
+ option_accessor :engine_logger,
33
+ on: :instance
31
34
  option_accessor :query_log_name,
32
35
  default: 'query.log'
33
- option_accessor :query_logger
36
+ option_writer :query_logger
34
37
  option_accessor :try_pid_dirs,
35
38
  default: %w[
36
39
  /var/run
@@ -69,12 +72,12 @@ class Pigeon::Engine
69
72
  # Returns the human-readable name of this engine. Defaults to the name
70
73
  # of the engine class, but can be replaced to customize a subclass.
71
74
  def self.name
72
- @name or self.to_s.gsub(/::/, ' ')
75
+ @name ||= self.to_s.gsub(/::/, ' ')
73
76
  end
74
77
 
75
78
  # Returns the custom process name for this engine or nil if not assigned.
76
79
  def self.process_name
77
- @process_name
80
+ @process_name ||= nil
78
81
  end
79
82
 
80
83
  # Assigns the process name. This will be applied only when the engine is
@@ -87,7 +90,7 @@ class Pigeon::Engine
87
90
  # user is required. This will be applied after the engine has been started
88
91
  # and the after_start call has been triggered.
89
92
  def self.user
90
- @user
93
+ @user ||= nil
91
94
  end
92
95
 
93
96
  # Assigns the user this process should run as, given a username.
@@ -98,7 +101,7 @@ class Pigeon::Engine
98
101
  # Returns the name of the PID file to use. The full path to the file
99
102
  # is specified elsewhere.
100
103
  def self.pid_file_name
101
- @pid_file_name or self.name.downcase.gsub(/ /, '-') + '.pid'
104
+ @pid_file_name ||= self.name.downcase.gsub(/ /, '-') + '.pid'
102
105
  end
103
106
 
104
107
  # Returns the full path to the PID file that should be used to track
@@ -144,6 +147,14 @@ class Pigeon::Engine
144
147
  end
145
148
 
146
149
  def self.start(options = nil)
150
+ if (self.pid_file.running?)
151
+ if (block_given?)
152
+ yield(self.pid_file.pid, false)
153
+ end
154
+
155
+ return self.pid_file.pid
156
+ end
157
+
147
158
  logger = self.engine_logger
148
159
 
149
160
  pid = Pigeon::Support.daemonize(logger) do
@@ -154,7 +165,7 @@ class Pigeon::Engine
154
165
 
155
166
  pid_file.create!(pid)
156
167
 
157
- yield(pid) if (block_given?)
168
+ yield(pid, true) if (block_given?)
158
169
 
159
170
  pid
160
171
  end
@@ -238,7 +249,9 @@ class Pigeon::Engine
238
249
  # Returns a handle to the engine currently running, or nil if no engine is
239
250
  # currently active.
240
251
  def self.default_engine
241
- @engines and @engines[0]
252
+ @engines ||= [ ]
253
+
254
+ @engines[0]
242
255
  end
243
256
 
244
257
  # Registers the engine as running. The first engine running will show up
@@ -250,6 +263,8 @@ class Pigeon::Engine
250
263
 
251
264
  # Removes the engine from the list of running engines.
252
265
  def self.unregister_engine(engine)
266
+ return unless (defined?(@engines))
267
+
253
268
  @engines.delete(engine)
254
269
  end
255
270
 
@@ -430,10 +445,9 @@ class Pigeon::Engine
430
445
  CHAINS.each do |chain_name|
431
446
  define_method(chain_name) do |&block|
432
447
  chain_iv = :"@_#{chain_name}_chain"
433
- instance_variable_set(chain_iv, [ ]) unless (instance_variable_get(chain_iv))
434
-
435
- chain = instance_variable_get(chain_iv)
436
-
448
+
449
+ chain = instance_variable_defined?(chain_iv) && instance_variable_get(chain_iv)
450
+
437
451
  unless (chain)
438
452
  chain = [ ]
439
453
  instance_variable_set(chain_iv, chain)
@@ -444,18 +458,10 @@ class Pigeon::Engine
444
458
  end
445
459
 
446
460
  def chain_procs(chain_name)
447
- instance_variable_get(:"@_#{chain_name}_chain")
448
- end
449
- end
461
+ chain_iv = :"@_#{chain_name}_chain"
450
462
 
451
- # Returns true if the debug option was set, false otherwise.
452
- def debug?
453
- !!self.debug
454
- end
455
-
456
- # Returns true if running in the foreground, false otherwise.
457
- def foreground?
458
- !!self.foreground
463
+ instance_variable_defined?(chain_iv) and instance_variable_get(chain_iv)
464
+ end
459
465
  end
460
466
 
461
467
  # Registers a task with the engine. The given task will then be included
@@ -3,16 +3,17 @@ require 'optparse'
3
3
  class Pigeon::Launcher
4
4
  # == Class Methods ========================================================
5
5
 
6
- def self.launch(engine = Pigeon::Engine, *arguments)
6
+ def self.launch(engine = Pigeon::Engine, *arguments, logging: true)
7
7
  arguments = %w[ start ] if (arguments.empty?)
8
8
 
9
- new(engine).handle_args(*arguments)
9
+ new(engine, logging: logging).handle_args(*arguments)
10
10
  end
11
11
 
12
12
  # == Instance Methods =====================================================
13
13
 
14
- def initialize(with_engine = Pigeon::Engine)
14
+ def initialize(with_engine = Pigeon::Engine, logging: true)
15
15
  @engine = with_engine
16
+ @logging = !!logging
16
17
 
17
18
  yield(self) if (block_given?)
18
19
  end
@@ -39,9 +40,9 @@ class Pigeon::Launcher
39
40
  begin
40
41
  case (command)
41
42
  when 'start'
42
- @engine.start do |pid|
43
- yield(pid) if (block_given?)
44
- self.start(pid)
43
+ @engine.start do |pid, launched|
44
+ yield(pid, launched) if (block_given?)
45
+ self.start(pid, launched)
45
46
  end
46
47
  when 'stop'
47
48
  @engine.stop do |pid|
@@ -79,8 +80,12 @@ class Pigeon::Launcher
79
80
  log "Use ^C to terminate."
80
81
  end
81
82
 
82
- def start(pid)
83
- log "#{@engine.name} now running. [%d]" % pid
83
+ def start(pid, launched)
84
+ if (launched)
85
+ log "#{@engine.name} now running. [%d]" % pid
86
+ else
87
+ log "#{@engine.name} already running. [%d]" % pid
88
+ end
84
89
  end
85
90
 
86
91
  def stop(pid)
@@ -116,6 +121,8 @@ class Pigeon::Launcher
116
121
  end
117
122
 
118
123
  def log(message)
119
- puts message
124
+ if (@logging)
125
+ puts(message)
126
+ end
120
127
  end
121
128
  end
@@ -5,9 +5,9 @@ module Pigeon::OptionAccessor
5
5
  # but these defaults can be over-ridden in subclasses and instances
6
6
  # without interference. Optional hash at end of list can be used to set:
7
7
  # * :default => Assigns a default value which is otherwise nil
8
- def option_accessor(*args)
9
- option_reader(*args)
10
- option_writer(*args)
8
+ def option_accessor(*args, boolean: false, default: nil, on: [ :class, :instance ])
9
+ option_reader(*args, boolean: boolean, default: default, on: on)
10
+ option_writer(*args, boolean: boolean, on: on)
11
11
  end
12
12
 
13
13
  # Given a list of names, this declares an option reader which works like
@@ -18,44 +18,48 @@ module Pigeon::OptionAccessor
18
18
  # * :default => Assigns a default value which is otherwise nil
19
19
  # * :boolean => If true, creates an additional name? method and will
20
20
  # convert all assigned values to a boolean true/false.
21
- def option_reader(*names)
21
+ def option_reader(*names, boolean: false, default: nil, on: [ :class, :instance ])
22
22
  names = [ names ].flatten.compact
23
- options = names.last.is_a?(Hash) ? names.pop : { }
23
+ on = [ on ].flatten
24
24
 
25
25
  names.each do |name|
26
26
  iv = :"@#{name}"
27
27
 
28
- (class << self; self; end).class_eval do
29
- if (options[:boolean])
30
- define_method(:"#{name}?") do
31
- iv_value = instance_variable_get(iv)
28
+ if (on.include?(:class))
29
+ (class << self; self; end).class_eval do
30
+ if (boolean)
31
+ define_method(:"#{name}?") do
32
+ iv_value = instance_variable_defined?(iv) ? instance_variable_get(iv) : nil
32
33
 
33
- !!(iv_value.nil? ? (self.superclass.respond_to?(name) ? self.superclass.send(name) : nil) : iv_value)
34
+ !!(iv_value.nil? ? (self.superclass.respond_to?(name) ? self.superclass.send(name) : nil) : iv_value)
35
+ end
34
36
  end
35
- end
36
37
 
37
- define_method(name) do
38
- iv_value = instance_variable_get(iv)
39
-
40
- iv_value.nil? ? (self.superclass.respond_to?(name) ? self.superclass.send(name) : nil) : iv_value
38
+ define_method(name) do
39
+ iv_value = instance_variable_defined?(iv) ? instance_variable_get(iv) : nil
40
+
41
+ iv_value.nil? ? (self.superclass.respond_to?(name) ? self.superclass.send(name) : nil) : iv_value
42
+ end
41
43
  end
42
44
  end
43
45
 
44
- define_method(name) do
45
- iv_value = instance_variable_get(iv)
46
+ if (on.include?(:instance))
47
+ define_method(name) do
48
+ iv_value = instance_variable_defined?(iv) ? instance_variable_get(iv) : nil
46
49
 
47
- iv_value.nil? ? self.class.send(name) : iv_value
48
- end
50
+ iv_value.nil? ? self.class.send(name) : iv_value
51
+ end
49
52
 
50
- if (options[:boolean])
51
- define_method(:"#{name}?") do
52
- iv_value = instance_variable_get(iv)
53
+ if (boolean)
54
+ define_method(:"#{name}?") do
55
+ iv_value = instance_variable_defined?(iv) ? instance_variable_get(iv) : nil
53
56
 
54
- !!(iv_value.nil? ? self.class.send(name) : iv_value)
57
+ !!(iv_value.nil? ? self.class.send(name) : iv_value)
58
+ end
55
59
  end
56
60
  end
57
61
 
58
- instance_variable_set(iv, options[:default])
62
+ instance_variable_set(iv, default)
59
63
  end
60
64
  end
61
65
 
@@ -64,15 +68,29 @@ module Pigeon::OptionAccessor
64
68
  # defined for a class will propagate down to the instances and subclasses,
65
69
  # but these defaults can be over-ridden in subclasses and instances
66
70
  # without interference.
67
- def option_writer(*names)
71
+ def option_writer(*names, boolean: false, on: [ :class, :instance ])
68
72
  names = [ names ].flatten.compact
69
- options = names.last.is_a?(Hash) ? names.pop : { }
73
+ on = [ on ].flatten
70
74
 
71
75
  names.each do |name|
72
76
  iv = :"@#{name}"
73
77
 
74
- (class << self; self; end).class_eval do
75
- if (options[:boolean])
78
+ if (on.include?(:class))
79
+ (class << self; self; end).class_eval do
80
+ if (boolean)
81
+ define_method(:"#{name}=") do |value|
82
+ instance_variable_set(iv, value.nil? ? nil : !!value)
83
+ end
84
+ else
85
+ define_method(:"#{name}=") do |value|
86
+ instance_variable_set(iv, value)
87
+ end
88
+ end
89
+ end
90
+ end
91
+
92
+ if (on.include?(:instance))
93
+ if (boolean)
76
94
  define_method(:"#{name}=") do |value|
77
95
  instance_variable_set(iv, value.nil? ? nil : !!value)
78
96
  end
@@ -82,16 +100,6 @@ module Pigeon::OptionAccessor
82
100
  end
83
101
  end
84
102
  end
85
-
86
- if (options[:boolean])
87
- define_method(:"#{name}=") do |value|
88
- instance_variable_set(iv, value.nil? ? nil : !!value)
89
- end
90
- else
91
- define_method(:"#{name}=") do |value|
92
- instance_variable_set(iv, value)
93
- end
94
- end
95
103
  end
96
104
  end
97
105
  end
@@ -20,15 +20,18 @@ class Pigeon::Pidfile
20
20
  end
21
21
 
22
22
  def running
23
- pid = self.saved_pid
23
+ _pid = self.pid
24
24
 
25
- (pid and Process.kill(0, pid)) ? pid : nil
25
+ (_pid and Process.kill(0, _pid)) ? _pid : nil
26
26
  rescue Errno::ESRCH
27
27
  nil
28
28
  end
29
29
 
30
- def saved_pid
31
- File.read(@path).to_i
30
+ def pid
31
+ contents = File.read(@path)
32
+
33
+ contents and contents.to_i
34
+
32
35
  rescue Errno::ENOENT
33
36
  nil
34
37
  end
@@ -21,6 +21,7 @@ class Pigeon::Processor
21
21
  @id = Pigeon::Support.unique_id
22
22
  @filter = filter
23
23
  @context = context
24
+ @task = nil
24
25
 
25
26
  if (queue)
26
27
  self.queue = queue
@@ -32,7 +33,7 @@ class Pigeon::Processor
32
33
  # Assigns this processor to a particular queue. If one is already assigned
33
34
  # then the observer callback for that queue will be removed.
34
35
  def queue=(queue)
35
- if (@queue)
36
+ if (defined?(@queue))
36
37
  @queue.remove_processor(self, &@claim)
37
38
  end
38
39
 
@@ -88,7 +88,7 @@ class Pigeon::Queue
88
88
  set << block
89
89
  end
90
90
 
91
- task = assign_next_task(filter_name)
91
+ assign_next_task(filter_name)
92
92
  end
93
93
 
94
94
  # Removes references to the callback function specified. Note that the same
@@ -198,6 +198,8 @@ class Pigeon::Queue
198
198
 
199
199
  # Iterates over each of the tasks in the queue.
200
200
  def each
201
+ tasks = nil
202
+
201
203
  @filters.synchronize do
202
204
  tasks = @tasks.dup
203
205
  end
@@ -243,9 +245,9 @@ class Pigeon::Queue
243
245
 
244
246
  @tasks -= tasks
245
247
 
246
- @next_task.each do |filter_name, next_task|
247
- if (tasks.include?(@next_task[filter_name]))
248
- @next_task[filter_name] = nil
248
+ @next_task.keys.each do |_filter_name|
249
+ if (tasks.include?(@next_task[_filter_name]))
250
+ @next_task[_filter_name] = nil
249
251
  end
250
252
  end
251
253
 
@@ -276,9 +278,9 @@ class Pigeon::Queue
276
278
  if (task)
277
279
  @tasks.delete(task)
278
280
 
279
- @next_task.each do |filter_name, next_task|
281
+ @next_task.each do |_filter_name, next_task|
280
282
  if (task == next_task)
281
- @next_task[filter_name] = nil
283
+ @next_task[_filter_name] = nil
282
284
  end
283
285
  end
284
286
  end
@@ -91,7 +91,7 @@ class Pigeon::Scheduler
91
91
 
92
92
  # Returns the number of tasks that have been queued up.
93
93
  def queue_length
94
- @queues.inject(0) do |length, (name, queue)|
94
+ @queues.inject(0) do |length, (_, queue)|
95
95
  length + queue.length
96
96
  end
97
97
  end
@@ -49,7 +49,7 @@ module Pigeon::Support
49
49
  relaunch = false
50
50
  end
51
51
 
52
- pid, status = Process.wait2(daemon_pid)
52
+ _, status = Process.wait2(daemon_pid)
53
53
 
54
54
  if (interrupted)
55
55
  logger.info("Supervisor #{Process.pid} received termination signal, shut down child #{daemon_pid}.")
@@ -57,7 +57,7 @@ module Pigeon::Support
57
57
 
58
58
  # A non-zero exit status indicates some sort of error, so the
59
59
  # process will be relaunched after a short delay.
60
- relaunch = ($? != 0)
60
+ relaunch = (status != 0)
61
61
 
62
62
  ensure
63
63
  # Reset Signal handler before forking again
@@ -86,7 +86,7 @@ module Pigeon::Support
86
86
  wfd.close
87
87
  end
88
88
 
89
- pid, status = Process.wait2(forked_pid)
89
+ Process.wait2(forked_pid)
90
90
 
91
91
  daemon_pid = rfd.readline
92
92
  rfd.close
@@ -40,6 +40,7 @@ class Pigeon::Task
40
40
  @context = context
41
41
  @engine = engine || Pigeon::Engine.default_engine
42
42
  @created_at = Time.now
43
+ @state = nil
43
44
 
44
45
  unless (@engine)
45
46
  raise EngineRequired, "Task creation requires an active Pigeon::Engine"
@@ -2,18 +2,18 @@
2
2
  # DO NOT EDIT THIS FILE DIRECTLY
3
3
  # Instead, edit Jeweler::Tasks in Rakefile, and run 'rake gemspec'
4
4
  # -*- encoding: utf-8 -*-
5
- # stub: pigeon 1.0.2 ruby lib
5
+ # stub: pigeon 1.1.0 ruby lib
6
6
 
7
7
  Gem::Specification.new do |s|
8
- s.name = "pigeon"
9
- s.version = "1.0.2"
8
+ s.name = "pigeon".freeze
9
+ s.version = "1.1.0"
10
10
 
11
- s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
12
- s.require_paths = ["lib"]
13
- s.authors = ["tadman"]
14
- s.date = "2015-04-15"
15
- s.description = "Pigeon is a simple way to get started building an EventMachine engine that's intended to run as a background job."
16
- s.email = "github@tadman.ca"
11
+ s.required_rubygems_version = Gem::Requirement.new(">= 0".freeze) if s.respond_to? :required_rubygems_version=
12
+ s.require_paths = ["lib".freeze]
13
+ s.authors = ["Scott Tadman".freeze]
14
+ s.date = "2017-09-22"
15
+ s.description = "Pigeon is a simple way to get started building an EventMachine engine that's intended to run as a background job.".freeze
16
+ s.email = "github@tadman.ca".freeze
17
17
  s.extra_rdoc_files = [
18
18
  "LICENSE",
19
19
  "README.md"
@@ -54,29 +54,29 @@ Gem::Specification.new do |s|
54
54
  "test/unit/pigeon_task_test.rb",
55
55
  "test/unit/pigeon_test.rb"
56
56
  ]
57
- s.homepage = "http://github.com/twg/pigeon"
58
- s.rubygems_version = "2.2.2"
59
- s.summary = "Simple daemonized EventMachine engine framework with plug-in support"
57
+ s.homepage = "http://github.com/postageapp/pigeon".freeze
58
+ s.rubygems_version = "2.5.2".freeze
59
+ s.summary = "Simple daemonized EventMachine engine framework with plug-in support".freeze
60
60
 
61
61
  if s.respond_to? :specification_version then
62
62
  s.specification_version = 4
63
63
 
64
64
  if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
65
- s.add_runtime_dependency(%q<eventmachine>, [">= 0"])
66
- s.add_development_dependency(%q<minitest-reporters>, [">= 0"])
67
- s.add_development_dependency(%q<minitest>, [">= 0"])
68
- s.add_development_dependency(%q<jeweler>, [">= 0"])
65
+ s.add_runtime_dependency(%q<eventmachine>.freeze, [">= 0"])
66
+ s.add_development_dependency(%q<minitest-reporters>.freeze, [">= 0"])
67
+ s.add_development_dependency(%q<minitest>.freeze, [">= 0"])
68
+ s.add_development_dependency(%q<jeweler>.freeze, [">= 0"])
69
69
  else
70
- s.add_dependency(%q<eventmachine>, [">= 0"])
71
- s.add_dependency(%q<minitest-reporters>, [">= 0"])
72
- s.add_dependency(%q<minitest>, [">= 0"])
73
- s.add_dependency(%q<jeweler>, [">= 0"])
70
+ s.add_dependency(%q<eventmachine>.freeze, [">= 0"])
71
+ s.add_dependency(%q<minitest-reporters>.freeze, [">= 0"])
72
+ s.add_dependency(%q<minitest>.freeze, [">= 0"])
73
+ s.add_dependency(%q<jeweler>.freeze, [">= 0"])
74
74
  end
75
75
  else
76
- s.add_dependency(%q<eventmachine>, [">= 0"])
77
- s.add_dependency(%q<minitest-reporters>, [">= 0"])
78
- s.add_dependency(%q<minitest>, [">= 0"])
79
- s.add_dependency(%q<jeweler>, [">= 0"])
76
+ s.add_dependency(%q<eventmachine>.freeze, [">= 0"])
77
+ s.add_dependency(%q<minitest-reporters>.freeze, [">= 0"])
78
+ s.add_dependency(%q<minitest>.freeze, [">= 0"])
79
+ s.add_dependency(%q<jeweler>.freeze, [">= 0"])
80
80
  end
81
81
  end
82
82
 
@@ -8,8 +8,12 @@ module Minitest
8
8
  # status code based on test results is okay for the parent process, but
9
9
  # causes friction when using fork within tests. Here it's disabled unless
10
10
  # the process terminating is the parent.
11
+ class << self
12
+ undef_method(:autorun)
13
+ end
14
+
11
15
  def self.autorun
12
- return if (@at_exit_hook_installed)
16
+ return if (defined?(@at_exit_hook_installed))
13
17
 
14
18
  @at_exit_hook_installed = Process.pid
15
19
 
@@ -51,10 +55,10 @@ class Minitest::Test
51
55
  flunk(message || 'assert_timeout timed out')
52
56
  end
53
57
 
54
- def assert_eventually(time = nil, message = nil, &block)
58
+ def assert_eventually(time = nil, message = nil)
55
59
  start_time = Time.now.to_f
56
60
 
57
- while (!block.call)
61
+ while (!yield)
58
62
  select(nil, nil, nil, 0.1)
59
63
 
60
64
  if (time and (Time.now.to_f - start_time > time))
@@ -64,6 +68,7 @@ class Minitest::Test
64
68
  end
65
69
 
66
70
  def engine
71
+ @engine = nil
67
72
  exception = nil
68
73
  test_thread = nil
69
74
 
@@ -79,7 +84,13 @@ class Minitest::Test
79
84
  @engine = launched
80
85
  end
81
86
 
82
- rescue Object => exception
87
+ rescue Object => e
88
+ # $stderr.puts('[%s] %s' % [ e.class, e ])
89
+ # $stderr.puts(e.backtrace.join("\n"))
90
+
91
+ exception = e
92
+
93
+ Thread.current.kill
83
94
  end
84
95
  end
85
96
 
@@ -90,10 +101,14 @@ class Minitest::Test
90
101
  begin
91
102
  while (!@engine or Pigeon::Engine.default_engine != @engine)
92
103
  # Wait impatiently.
104
+ if (exception)
105
+ Thread.current.kill
106
+ end
93
107
  end
94
108
 
95
109
  yield(@engine)
96
- rescue Object => exception
110
+ rescue Object => e
111
+ exception = e
97
112
  ensure
98
113
  begin
99
114
  if (EventMachine.reactor_running?)
@@ -1,13 +1,13 @@
1
- require File.expand_path(File.join(*%w[ .. helper ]), File.dirname(__FILE__))
1
+ require_relative '../helper'
2
2
 
3
- class PigeonQueueTest < Minitest::Test
3
+ class PigeonBacklogTest < Minitest::Test
4
4
  def test_empty_queue
5
5
  queue = Pigeon::Queue.new
6
6
 
7
7
  assert queue.empty?
8
8
  assert_equal 0, queue.length
9
9
 
10
- assert_equal nil, queue.pop
10
+ assert_nil queue.pop
11
11
  end
12
12
 
13
13
  def test_queue_cycling
@@ -1,4 +1,4 @@
1
- require File.expand_path(File.join(*%w[ .. helper ]), File.dirname(__FILE__))
1
+ require_relative '../helper'
2
2
 
3
3
  class PigeonDispatcherTest < Minitest::Test
4
4
  def test_routine_dispatching
@@ -1,4 +1,4 @@
1
- require File.expand_path(File.join(*%w[ .. helper ]), File.dirname(__FILE__))
1
+ require_relative '../helper'
2
2
 
3
3
  module TestModule
4
4
  def self.included(engine)
@@ -76,7 +76,7 @@ class TestPigeonEngine < Minitest::Test
76
76
  assert TestEngine.engine_logger
77
77
  assert TestEngine.engine_logger.is_a?(Logger)
78
78
 
79
- assert_equal nil, TestEngine.default_engine
79
+ assert_nil TestEngine.default_engine
80
80
  end
81
81
 
82
82
  def test_example_subclass
@@ -104,7 +104,7 @@ class TestPigeonEngine < Minitest::Test
104
104
  end
105
105
 
106
106
  TestEngine.status do |pid|
107
- assert_equal nil, pid
107
+ assert_nil pid
108
108
  end
109
109
  end
110
110
 
@@ -129,7 +129,7 @@ class TestPigeonEngine < Minitest::Test
129
129
 
130
130
  assert_equal engine_pid, TestEngine.stop
131
131
 
132
- assert_equal nil, TestEngine.status
132
+ assert_nil TestEngine.status
133
133
  end
134
134
 
135
135
  def test_callbacks
@@ -158,7 +158,7 @@ class TestPigeonEngine < Minitest::Test
158
158
  end
159
159
 
160
160
  CallbackTestEngine.status do |pid|
161
- assert_equal nil, pid
161
+ assert_nil pid
162
162
  end
163
163
 
164
164
  expected_callbacks = [
@@ -1,14 +1,8 @@
1
- require File.expand_path(File.join(*%w[ .. helper ]), File.dirname(__FILE__))
2
-
3
- class Pigeon::Launcher
4
- def log(*args)
5
- # Disabled for testing.
6
- end
7
- end
1
+ require_relative '../helper'
8
2
 
9
3
  class PigeonLauncherTest < Minitest::Test
10
4
  def test_default_launcher
11
- pid = Pigeon::Launcher.launch
5
+ pid = Pigeon::Launcher.launch(logging: false)
12
6
 
13
7
  assert pid, "PID should be returned from launcher call"
14
8
  assert Pigeon::Engine.running?
@@ -19,7 +13,7 @@ class PigeonLauncherTest < Minitest::Test
19
13
  end
20
14
 
21
15
  def test_triggers
22
- launcher = Pigeon::Launcher.new(Pigeon::Engine)
16
+ launcher = Pigeon::Launcher.new(Pigeon::Engine, logging: false)
23
17
 
24
18
  triggered = Hash.new { |h,k| h[k] = [ ] }
25
19
 
@@ -1,4 +1,4 @@
1
- require File.expand_path(File.join(*%w[ .. helper ]), File.dirname(__FILE__))
1
+ require_relative '../helper'
2
2
 
3
3
  class OptionClass
4
4
  extend Pigeon::OptionAccessor
@@ -57,15 +57,15 @@ class PigeonOptionAccessorTest < Minitest::Test
57
57
  end
58
58
 
59
59
  def test_boolean_option
60
- assert_equal nil, OptionClass.multi1
60
+ assert_nil OptionClass.multi1
61
61
 
62
62
  instance = OptionClass.new
63
63
 
64
64
  instance.multi1 = false
65
65
 
66
66
  assert_equal false, instance.multi1
67
- assert_equal nil, OptionClass.multi1
67
+ assert_nil OptionClass.multi1
68
68
 
69
- assert_equal nil, instance.multi2
69
+ assert_nil instance.multi2
70
70
  end
71
71
  end
@@ -1,4 +1,4 @@
1
- require File.expand_path(File.join(*%w[ .. helper ]), File.dirname(__FILE__))
1
+ require_relative '../helper'
2
2
 
3
3
  class PigeonProcessorTest < Minitest::Test
4
4
  class TaggedTask < Pigeon::Task
@@ -87,6 +87,8 @@ class PigeonProcessorTest < Minitest::Test
87
87
  assert_eventually(5) do
88
88
  queue.empty?
89
89
  end
90
+
91
+ assert !processor.task?
90
92
  end
91
93
  end
92
94
 
@@ -137,7 +139,7 @@ class PigeonProcessorTest < Minitest::Test
137
139
 
138
140
  processor.queue = nil
139
141
 
140
- assert_equal nil, processor.queue
142
+ assert_nil processor.queue
141
143
  assert_equal [ ], queue.processors
142
144
  end
143
145
  end
@@ -1,4 +1,4 @@
1
- require File.expand_path(File.join(*%w[ .. helper ]), File.dirname(__FILE__))
1
+ require_relative '../helper'
2
2
 
3
3
  class PigeonQueueTest < Minitest::Test
4
4
  class TaggedTask < Pigeon::Task
@@ -20,7 +20,7 @@ class PigeonQueueTest < Minitest::Test
20
20
  assert_equal 0, queue.length
21
21
  assert_equal true, queue.empty?
22
22
 
23
- assert_equal nil, queue.pop
23
+ assert_nil queue.pop
24
24
 
25
25
  assert_equal [ ], queue.processors
26
26
  end
@@ -80,6 +80,8 @@ class PigeonQueueTest < Minitest::Test
80
80
  assert_equal 2, queue.length(:over_7)
81
81
 
82
82
  pulled_task = queue.pop(:over_7)
83
+
84
+ assert pulled_task
83
85
 
84
86
  assert_equal 9, queue.length
85
87
 
@@ -88,7 +90,7 @@ class PigeonQueueTest < Minitest::Test
88
90
 
89
91
  queue.pop(:over_7)
90
92
 
91
- assert_equal nil, queue.peek(:over_7)
93
+ assert_nil queue.peek(:over_7)
92
94
  assert_equal 0, queue.length(:over_7)
93
95
  assert_equal true, queue.empty?(:over_7)
94
96
 
@@ -104,7 +106,7 @@ class PigeonQueueTest < Minitest::Test
104
106
 
105
107
  queue.claim(new_task)
106
108
 
107
- assert_equal nil, queue.peek(:over_7)
109
+ assert_nil queue.peek(:over_7)
108
110
  assert_equal 0, queue.length(:over_7)
109
111
  assert_equal true, queue.empty?(:over_7)
110
112
  end
@@ -146,7 +148,7 @@ class PigeonQueueTest < Minitest::Test
146
148
  queue.include?(new_task)
147
149
  end
148
150
 
149
- assert_equal nil, added_odd
151
+ assert_nil added_odd
150
152
 
151
153
  odd_1 = queue << TaggedTask.new(11)
152
154
 
@@ -167,7 +169,7 @@ class PigeonQueueTest < Minitest::Test
167
169
  # Observer callbacks are not triggered on existing data, only on new
168
170
  # insertions.
169
171
  assert_equal false, has_run
170
- assert_equal nil, claimed_task
172
+ assert_nil claimed_task
171
173
  assert_equal 7, queue.length
172
174
  assert_equal 1, queue.length(:odd)
173
175
 
@@ -177,7 +179,7 @@ class PigeonQueueTest < Minitest::Test
177
179
  queue.include?(new_task)
178
180
  end
179
181
 
180
- assert_equal nil, claimed_task
182
+ assert_nil claimed_task
181
183
  assert_equal 8, queue.length
182
184
  assert_equal 1, queue.length(:odd)
183
185
 
@@ -203,7 +205,7 @@ class PigeonQueueTest < Minitest::Test
203
205
  queue.include?(new_task)
204
206
  end
205
207
 
206
- assert_equal nil, claimed_task
208
+ assert_nil claimed_task
207
209
  assert_equal false, has_run
208
210
 
209
211
  odd_2 = queue << TaggedTask.new(15)
@@ -232,7 +234,7 @@ class PigeonQueueTest < Minitest::Test
232
234
  end
233
235
  end
234
236
 
235
- new_task = queue << TaggedTask.new(0)
237
+ queue << TaggedTask.new(0)
236
238
 
237
239
  assert_eventually(2) do
238
240
  queue.peek
@@ -1,4 +1,4 @@
1
- require File.expand_path(File.join(*%w[ .. helper ]), File.dirname(__FILE__))
1
+ require_relative '../helper'
2
2
 
3
3
  class PigeonSchedulerTest < Minitest::Test
4
4
  class TaggedTask < Pigeon::Task
@@ -1,4 +1,4 @@
1
- require File.expand_path(File.join(*%w[ .. helper ]), File.dirname(__FILE__))
1
+ require_relative '../helper'
2
2
 
3
3
  class PigeonSortedArrayTest < Minitest::Test
4
4
  def test_empty_state
@@ -1,4 +1,4 @@
1
- require File.expand_path(File.join(*%w[ .. helper ]), File.dirname(__FILE__))
1
+ require_relative '../helper'
2
2
 
3
3
  class TerminateTask < Pigeon::Task
4
4
  def state_initialized!
@@ -67,7 +67,7 @@ class PigeonTaskTest < Minitest::Test
67
67
  assert_equal 1, reported
68
68
  assert_equal :finished, task.state
69
69
 
70
- assert_equal nil, task.exception
70
+ assert_nil task.exception
71
71
 
72
72
  assert_equal @engine.object_id, task.engine.object_id
73
73
  end
@@ -99,7 +99,7 @@ class PigeonTaskTest < Minitest::Test
99
99
  task.finished?
100
100
  end
101
101
 
102
- assert_equal nil, task.exception
102
+ assert_nil task.exception
103
103
 
104
104
  assert_equal :finished, task.state
105
105
 
@@ -1,4 +1,4 @@
1
- require File.expand_path(File.join(*%w[ .. helper ]), File.dirname(__FILE__))
1
+ require_relative '../helper'
2
2
 
3
3
  class TestPigeon < Minitest::Test
4
4
  def test_load_module
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: pigeon
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.2
4
+ version: 1.1.0
5
5
  platform: ruby
6
6
  authors:
7
- - tadman
7
+ - Scott Tadman
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-04-15 00:00:00.000000000 Z
11
+ date: 2017-09-22 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: eventmachine
@@ -109,7 +109,7 @@ files:
109
109
  - test/unit/pigeon_sorted_array_test.rb
110
110
  - test/unit/pigeon_task_test.rb
111
111
  - test/unit/pigeon_test.rb
112
- homepage: http://github.com/twg/pigeon
112
+ homepage: http://github.com/postageapp/pigeon
113
113
  licenses: []
114
114
  metadata: {}
115
115
  post_install_message:
@@ -128,7 +128,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
128
128
  version: '0'
129
129
  requirements: []
130
130
  rubyforge_project:
131
- rubygems_version: 2.2.2
131
+ rubygems_version: 2.5.2
132
132
  signing_key:
133
133
  specification_version: 4
134
134
  summary: Simple daemonized EventMachine engine framework with plug-in support