refinery 0.12.2 → 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/lib/refinery.rb +1 -99
- data/refinery.gemspec +16 -117
- metadata +39 -118
- data/.gitignore +0 -6
- data/CHANGELOG +0 -2
- data/LICENSE +0 -21
- data/README.rdoc +0 -58
- data/README.textile +0 -58
- data/Rakefile +0 -43
- data/VERSION +0 -1
- data/bin/epub +0 -64
- data/bin/monitor +0 -47
- data/bin/pubnow +0 -61
- data/bin/refinery +0 -64
- data/config/config.example.yml +0 -21
- data/lib/refinery/beanstalk_queue.rb +0 -36
- data/lib/refinery/beanstalk_queue_provider.rb +0 -18
- data/lib/refinery/config.rb +0 -48
- data/lib/refinery/configurable.rb +0 -15
- data/lib/refinery/daemon.rb +0 -148
- data/lib/refinery/event_publisher.rb +0 -131
- data/lib/refinery/heartbeat.rb +0 -33
- data/lib/refinery/loggable.rb +0 -9
- data/lib/refinery/monitor.rb +0 -113
- data/lib/refinery/processor.rb +0 -55
- data/lib/refinery/publisher.rb +0 -42
- data/lib/refinery/queueable.rb +0 -48
- data/lib/refinery/server.rb +0 -88
- data/lib/refinery/statistics.rb +0 -61
- data/lib/refinery/stats_server.rb +0 -135
- data/lib/refinery/utilities.rb +0 -33
- data/lib/refinery/validations.rb +0 -48
- data/lib/refinery/worker.rb +0 -65
- data/logs/README +0 -1
- data/publishers/error.rb +0 -6
- data/publishers/sample.rb +0 -6
- data/publishers/sleep.rb +0 -5
- data/test/config.yml +0 -10
- data/test/test_helper.rb +0 -21
- data/test/unit/config_test.rb +0 -42
- data/test/unit/configurable_test.rb +0 -13
- data/test/unit/daemon_test.rb +0 -63
- data/test/unit/event_publisher_test.rb +0 -12
- data/test/unit/heartbeat_test.rb +0 -25
- data/test/unit/loggable_test.rb +0 -12
- data/test/unit/processor_test.rb +0 -34
- data/test/unit/publisher_test.rb +0 -13
- data/test/unit/queueable_test.rb +0 -26
- data/test/unit/server_test.rb +0 -34
- data/test/unit/statistics_test.rb +0 -44
- data/test/unit/utilities_test.rb +0 -25
- data/test/unit/validations_test.rb +0 -37
- data/test/unit/worker_test.rb +0 -44
- data/workers/error.rb +0 -8
- data/workers/sample.rb +0 -8
- data/workers/sleep.rb +0 -7
data/lib/refinery/validations.rb
DELETED
@@ -1,48 +0,0 @@
|
|
1
|
-
module Refinery #:nodoc:
|
2
|
-
# Error that is raised when a message is invalid.
|
3
|
-
class InvalidMessageError < RuntimeError
|
4
|
-
end
|
5
|
-
|
6
|
-
# Module containing all validations.
|
7
|
-
module Validations
|
8
|
-
def self.included(base) # :nodoc:
|
9
|
-
base.extend(ClassMethods)
|
10
|
-
end
|
11
|
-
|
12
|
-
# Class methods that are added to the worker.
|
13
|
-
module ClassMethods
|
14
|
-
# A list of all of the validators. Validators are lambdas
|
15
|
-
# that will be called with the message as its only arg.
|
16
|
-
# Note that the order of validators is retained.
|
17
|
-
def validators
|
18
|
-
@validators ||= []
|
19
|
-
end
|
20
|
-
|
21
|
-
# Validate with the given block. The block must receive a single
|
22
|
-
# argument that is the message
|
23
|
-
def validate_with(&block)
|
24
|
-
validators << block
|
25
|
-
end
|
26
|
-
alias :validate :validate_with
|
27
|
-
|
28
|
-
# Validate that each of the keys exists in the message.
|
29
|
-
def validate_key_exists(*args)
|
30
|
-
args.each do |key|
|
31
|
-
validators << lambda do |message|
|
32
|
-
raise Refinery::InvalidMessageError, "Key does not exist in message: #{key}" unless message[key]
|
33
|
-
end
|
34
|
-
end
|
35
|
-
end
|
36
|
-
alias :validates_key_exists :validate_key_exists
|
37
|
-
alias :validates_presence_of :validate_key_exists
|
38
|
-
end
|
39
|
-
|
40
|
-
# Validate the given message
|
41
|
-
protected
|
42
|
-
def validate(message)
|
43
|
-
self.class.validators.each do |validator|
|
44
|
-
validator.call(message)
|
45
|
-
end
|
46
|
-
end
|
47
|
-
end
|
48
|
-
end
|
data/lib/refinery/worker.rb
DELETED
@@ -1,65 +0,0 @@
|
|
1
|
-
module Refinery #:nodoc:
|
2
|
-
# Base class for workers. Place subclasses of this in the workers
|
3
|
-
# directory.
|
4
|
-
#
|
5
|
-
# Workers may include validation logic to verify that the message
|
6
|
-
# has the correct keys and values before processing.
|
7
|
-
class Worker
|
8
|
-
include Refinery::Loggable
|
9
|
-
include Refinery::Configurable
|
10
|
-
include Refinery::Utilities
|
11
|
-
include Refinery::Validations
|
12
|
-
include Refinery::Queueable
|
13
|
-
|
14
|
-
# Initialize the worker with the given daemon.
|
15
|
-
def initialize(daemon)
|
16
|
-
@daemon = daemon
|
17
|
-
end
|
18
|
-
|
19
|
-
# Run the worker with the given message. The result from the worker's
|
20
|
-
# <code>execute</code> method is returned along with the run time.
|
21
|
-
#
|
22
|
-
# Validation will occur prior to calling execute.
|
23
|
-
def run(message)
|
24
|
-
result = false
|
25
|
-
|
26
|
-
validate(message)
|
27
|
-
|
28
|
-
logger.debug "Executing worker #{self.class.name}"
|
29
|
-
time = Benchmark.realtime do
|
30
|
-
begin
|
31
|
-
result = execute(message)
|
32
|
-
rescue Exception => e
|
33
|
-
logger.error "Error executing worker #{self.class.name}: #{e.message}"
|
34
|
-
raise e
|
35
|
-
end
|
36
|
-
end
|
37
|
-
logger.debug "Completed worker #{self.class.name} in #{time} seconds"
|
38
|
-
return result, time
|
39
|
-
end
|
40
|
-
|
41
|
-
# Get the data store for the worker.
|
42
|
-
#
|
43
|
-
# The data store is provided through the Moneta interface.
|
44
|
-
#
|
45
|
-
# If the configuration providers a data_store:class option then that class
|
46
|
-
# will be used (the class must be in the Moneta module), otherwise
|
47
|
-
# Moneta::S3 will be used.
|
48
|
-
def data_store(options)
|
49
|
-
class_name = processor_config['workers']['data_store']['class'] rescue 'S3'
|
50
|
-
ds_class = Moneta.const_get(camelize(class_name))
|
51
|
-
(@data_store ||= {})[options] ||= ds_class.new(
|
52
|
-
:access_key_id => config['aws']['credentials']['access_key_id'],
|
53
|
-
:secret_access_key => config['aws']['credentials']['secret_access_key'],
|
54
|
-
:bucket => options[:bucket],
|
55
|
-
:multi_thread => true
|
56
|
-
)
|
57
|
-
end
|
58
|
-
|
59
|
-
protected
|
60
|
-
# Get's the config element starting at the processer
|
61
|
-
def processor_config
|
62
|
-
config['processors'][daemon.name]
|
63
|
-
end
|
64
|
-
end
|
65
|
-
end
|
data/logs/README
DELETED
@@ -1 +0,0 @@
|
|
1
|
-
Log files from Refinery will be written here. Do not remove this directory.
|
data/publishers/error.rb
DELETED
data/publishers/sample.rb
DELETED
data/publishers/sleep.rb
DELETED
data/test/config.yml
DELETED
data/test/test_helper.rb
DELETED
@@ -1,21 +0,0 @@
|
|
1
|
-
require 'test/unit'
|
2
|
-
require 'rubygems'
|
3
|
-
require 'shoulda'
|
4
|
-
require 'mocha'
|
5
|
-
require 'refinery'
|
6
|
-
|
7
|
-
class Test::Unit::TestCase
|
8
|
-
def setup_default_config
|
9
|
-
Refinery::Config.stubs(:default).returns(Refinery::Config.new(
|
10
|
-
{
|
11
|
-
'aws' => {
|
12
|
-
'credentials' => {
|
13
|
-
'access_key_id' => 'aki',
|
14
|
-
'secret_access_key' => 'sak'
|
15
|
-
}
|
16
|
-
},
|
17
|
-
'processors' => []
|
18
|
-
}
|
19
|
-
))
|
20
|
-
end
|
21
|
-
end
|
data/test/unit/config_test.rb
DELETED
@@ -1,42 +0,0 @@
|
|
1
|
-
require 'test_helper'
|
2
|
-
|
3
|
-
class ConfigTest < Test::Unit::TestCase
|
4
|
-
context "the config class" do
|
5
|
-
should "provide a default configuration" do
|
6
|
-
assert_not_nil Refinery::Config.default
|
7
|
-
end
|
8
|
-
|
9
|
-
context "default configuration" do
|
10
|
-
setup do
|
11
|
-
@config = Refinery::Config.default
|
12
|
-
end
|
13
|
-
should "provide an empty aws credentials hash" do
|
14
|
-
assert_equal Hash.new, @config['aws']['credentials']
|
15
|
-
end
|
16
|
-
should "provide an empty processors hash" do
|
17
|
-
assert_equal Hash.new, @config['processors']
|
18
|
-
end
|
19
|
-
end
|
20
|
-
|
21
|
-
context "after loading configuration from a YAML file" do
|
22
|
-
setup do
|
23
|
-
@config_file = File.dirname(__FILE__) + '/../config.yml'
|
24
|
-
@config = Refinery::Config.new
|
25
|
-
@config.load_file(@config_file)
|
26
|
-
end
|
27
|
-
should "have aws credentials" do
|
28
|
-
assert_equal 'aaa', @config['aws']['credentials']['access_key_id']
|
29
|
-
assert_equal 'bbb', @config['aws']['credentials']['secret_access_key']
|
30
|
-
end
|
31
|
-
should "reload the file when changed" do
|
32
|
-
`touch #{@config_file}`
|
33
|
-
YAML.expects(:load_file).once
|
34
|
-
@config.refresh
|
35
|
-
end
|
36
|
-
should "not reload the file when not changed" do
|
37
|
-
YAML.expects(:load_file).never
|
38
|
-
@config.refresh
|
39
|
-
end
|
40
|
-
end
|
41
|
-
end
|
42
|
-
end
|
@@ -1,13 +0,0 @@
|
|
1
|
-
require 'test_helper'
|
2
|
-
|
3
|
-
class ConfigureMe
|
4
|
-
include Refinery::Configurable
|
5
|
-
end
|
6
|
-
|
7
|
-
class ConfigurableTest < Test::Unit::TestCase
|
8
|
-
context "a class with the configurable module" do
|
9
|
-
should "provide a config" do
|
10
|
-
assert_not_nil ConfigureMe.new.config
|
11
|
-
end
|
12
|
-
end
|
13
|
-
end
|
data/test/unit/daemon_test.rb
DELETED
@@ -1,63 +0,0 @@
|
|
1
|
-
require 'test_helper'
|
2
|
-
|
3
|
-
class DaemonTest < Test::Unit::TestCase
|
4
|
-
context "a daemon" do
|
5
|
-
setup do
|
6
|
-
@server = stub('Server')
|
7
|
-
@processor = stub('Processor', :server => @server)
|
8
|
-
|
9
|
-
@waiting_queue = stub('Queue(waiting)')
|
10
|
-
@error_queue = stub('Queue(error)')
|
11
|
-
@done_queue = stub('Queue(done)')
|
12
|
-
|
13
|
-
@provider = stub('QueueProvider')
|
14
|
-
if defined?(Typica)
|
15
|
-
Typica::Sqs::QueueService.stubs(:new).returns(@provider)
|
16
|
-
else
|
17
|
-
RightAws::SqsGen2.stubs(:new).returns(@provider)
|
18
|
-
end
|
19
|
-
@provider.stubs(:queue).with('sample_waiting').returns(@waiting_queue)
|
20
|
-
@provider.stubs(:queue).with('sample_error').returns(@error_queue)
|
21
|
-
@provider.stubs(:queue).with('sample_done').returns(@done_queue)
|
22
|
-
end
|
23
|
-
should "be startable" do
|
24
|
-
@waiting_queue.stubs(:receive)
|
25
|
-
assert_nothing_raised do
|
26
|
-
daemon = Refinery::Daemon.new(@processor, 'sample')
|
27
|
-
end
|
28
|
-
end
|
29
|
-
should "have logging" do
|
30
|
-
@waiting_queue.stubs(:receive)
|
31
|
-
daemon = Refinery::Daemon.new(@processor, 'sample')
|
32
|
-
assert_not_nil daemon.logger
|
33
|
-
end
|
34
|
-
should "allow visibility setting" do
|
35
|
-
@waiting_queue.stubs(:receive).with(600)
|
36
|
-
daemon = Refinery::Daemon.new(@processor, 'sample', '', {'visibility' => 600})
|
37
|
-
end
|
38
|
-
should "have a queue name" do
|
39
|
-
@waiting_queue.stubs(:receive)
|
40
|
-
@provider.stubs(:queue).with(
|
41
|
-
'prefix_sample_waiting').returns(@waiting_queue)
|
42
|
-
daemon = Refinery::Daemon.new(@processor, 'sample', 'prefix_')
|
43
|
-
assert_equal 'prefix_sample', daemon.queue_name
|
44
|
-
end
|
45
|
-
context "that is started" do
|
46
|
-
setup do
|
47
|
-
@waiting_queue.stubs(:receive)
|
48
|
-
@daemon = Refinery::Daemon.new(@processor, 'sample')
|
49
|
-
end
|
50
|
-
should "have a state of running" do
|
51
|
-
assert @daemon.running?
|
52
|
-
end
|
53
|
-
# context "after calling stop" do
|
54
|
-
# setup do
|
55
|
-
# @daemon.stop
|
56
|
-
# end
|
57
|
-
# should "not be running" do
|
58
|
-
# assert !@daemon.running?
|
59
|
-
# end
|
60
|
-
# end
|
61
|
-
end
|
62
|
-
end
|
63
|
-
end
|
@@ -1,12 +0,0 @@
|
|
1
|
-
require 'test_helper'
|
2
|
-
|
3
|
-
class EventPublisherTest < Test::Unit::TestCase
|
4
|
-
context "an event publisher" do
|
5
|
-
should "raise an error if credentials are not set" do
|
6
|
-
publishing_settings = {'sample' => {'delay' => 10}}
|
7
|
-
Refinery::Config.any_instance.stubs(:publishing).returns(publishing_settings)
|
8
|
-
event_publisher = Refinery::EventPublisher.new
|
9
|
-
event_publisher.run
|
10
|
-
end
|
11
|
-
end
|
12
|
-
end
|
data/test/unit/heartbeat_test.rb
DELETED
@@ -1,25 +0,0 @@
|
|
1
|
-
require 'test_helper'
|
2
|
-
|
3
|
-
class HeartbeatTest < Test::Unit::TestCase
|
4
|
-
context "a heartbeat" do
|
5
|
-
setup do
|
6
|
-
setup_default_config
|
7
|
-
|
8
|
-
@server = stub('server')
|
9
|
-
@server.stubs(:daemons).returns([])
|
10
|
-
|
11
|
-
heartbeat_queue = stub('heartbeat queue')
|
12
|
-
heartbeat_queue.stubs(:send_message)
|
13
|
-
provider = stub('queue provider')
|
14
|
-
provider.stubs(:queue).with('heartbeat').returns(heartbeat_queue)
|
15
|
-
if defined?(Typica)
|
16
|
-
Typica::Sqs::QueueService.stubs(:new).returns(provider)
|
17
|
-
else
|
18
|
-
RightAws::SqsGen2.stubs(:new).returns(provider)
|
19
|
-
end
|
20
|
-
end
|
21
|
-
should "be initializable" do
|
22
|
-
Refinery::Heartbeat.new(@server)
|
23
|
-
end
|
24
|
-
end
|
25
|
-
end
|
data/test/unit/loggable_test.rb
DELETED
data/test/unit/processor_test.rb
DELETED
@@ -1,34 +0,0 @@
|
|
1
|
-
require 'test_helper'
|
2
|
-
|
3
|
-
class ProcessorTest < Test::Unit::TestCase
|
4
|
-
context "a processor" do
|
5
|
-
setup do
|
6
|
-
@server = stub('Server')
|
7
|
-
@settings = {
|
8
|
-
'workers' => {
|
9
|
-
'initial' => 1
|
10
|
-
}
|
11
|
-
}
|
12
|
-
|
13
|
-
@waiting_queue = stub('Queue(waiting)')
|
14
|
-
@error_queue = stub('Queue(error)')
|
15
|
-
@done_queue = stub('Queue(done)')
|
16
|
-
|
17
|
-
provider = stub('QueueProvider')
|
18
|
-
if defined?(Typica)
|
19
|
-
Typica::Sqs::QueueService.stubs(:new).returns(provider)
|
20
|
-
else
|
21
|
-
RightAws::SqsGen2.stubs(:new).returns(provider)
|
22
|
-
end
|
23
|
-
provider.stubs(:queue).with('sample_waiting').returns(@waiting_queue)
|
24
|
-
provider.stubs(:queue).with('sample_error').returns(@error_queue)
|
25
|
-
provider.stubs(:queue).with('sample_done').returns(@done_queue)
|
26
|
-
end
|
27
|
-
should "initialize" do
|
28
|
-
assert_nothing_raised do
|
29
|
-
@waiting_queue.stubs(:receive)
|
30
|
-
Refinery::Processor.new(@server, 'sample', @settings)
|
31
|
-
end
|
32
|
-
end
|
33
|
-
end
|
34
|
-
end
|
data/test/unit/publisher_test.rb
DELETED
@@ -1,13 +0,0 @@
|
|
1
|
-
require 'test_helper'
|
2
|
-
|
3
|
-
class SamplePublisher < Refinery::Publisher
|
4
|
-
end
|
5
|
-
|
6
|
-
class PublisherTest < Test::Unit::TestCase
|
7
|
-
context "a publisher" do
|
8
|
-
should "be instantiable" do
|
9
|
-
waiting_queue = stub('waiting queue')
|
10
|
-
SamplePublisher.new(waiting_queue)
|
11
|
-
end
|
12
|
-
end
|
13
|
-
end
|
data/test/unit/queueable_test.rb
DELETED
@@ -1,26 +0,0 @@
|
|
1
|
-
require 'test_helper'
|
2
|
-
|
3
|
-
class QueueMe
|
4
|
-
include Refinery::Configurable
|
5
|
-
include Refinery::Queueable
|
6
|
-
end
|
7
|
-
|
8
|
-
class QueueableTest < Test::Unit::TestCase
|
9
|
-
context "a class with the Queuable module" do
|
10
|
-
should "provide a queue" do
|
11
|
-
setup_default_config
|
12
|
-
|
13
|
-
queue = stub('queue')
|
14
|
-
provider = stub('queue provider')
|
15
|
-
provider.expects(:queue).with('a_queue').returns(queue)
|
16
|
-
if defined?(Typica)
|
17
|
-
Typica::Sqs::QueueService.expects(:new).returns(provider)
|
18
|
-
else
|
19
|
-
RightAws::SqsGen2.expects(:new).with('aki', 'sak', {:multi_thread => true}).returns(provider)
|
20
|
-
end
|
21
|
-
|
22
|
-
queueable = QueueMe.new
|
23
|
-
assert_not_nil queueable.queue('a_queue')
|
24
|
-
end
|
25
|
-
end
|
26
|
-
end
|
data/test/unit/server_test.rb
DELETED
@@ -1,34 +0,0 @@
|
|
1
|
-
require 'test_helper'
|
2
|
-
|
3
|
-
class ServerTest < Test::Unit::TestCase
|
4
|
-
context "the server class" do
|
5
|
-
should "provide a logger" do
|
6
|
-
assert_not_nil Refinery::Server.logger
|
7
|
-
end
|
8
|
-
context "logger" do
|
9
|
-
should "default to WARN level" do
|
10
|
-
assert_equal Logger::WARN, Refinery::Server.logger.level
|
11
|
-
end
|
12
|
-
end
|
13
|
-
end
|
14
|
-
context "a server instance" do
|
15
|
-
setup do
|
16
|
-
@server = Refinery::Server.new
|
17
|
-
end
|
18
|
-
should "have a config" do
|
19
|
-
assert_not_nil @server.config
|
20
|
-
end
|
21
|
-
should "be runnable" do
|
22
|
-
setup_default_config
|
23
|
-
|
24
|
-
#Refinery::Heartbeat.expects(:new)
|
25
|
-
|
26
|
-
assert_nothing_raised do
|
27
|
-
thread = Thread.new do
|
28
|
-
@server.run
|
29
|
-
end
|
30
|
-
@server.stop
|
31
|
-
end
|
32
|
-
end
|
33
|
-
end
|
34
|
-
end
|