aeden-refinery 0.9.0 → 0.9.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (45) hide show
  1. data/.autotest +10 -0
  2. data/.gitignore +5 -0
  3. data/Rakefile +17 -1
  4. data/VERSION +1 -0
  5. data/config/config.example.yml +18 -0
  6. data/lib/refinery.rb +74 -0
  7. data/lib/refinery/config.rb +48 -0
  8. data/lib/refinery/configurable.rb +15 -0
  9. data/lib/refinery/daemon.rb +124 -0
  10. data/lib/refinery/event_publisher.rb +120 -0
  11. data/lib/refinery/heartbeat.rb +30 -0
  12. data/lib/refinery/loggable.rb +9 -0
  13. data/lib/refinery/monitor.rb +116 -0
  14. data/lib/refinery/publisher.rb +24 -0
  15. data/lib/refinery/queueable.rb +20 -0
  16. data/lib/refinery/server.rb +86 -0
  17. data/lib/refinery/statistics.rb +61 -0
  18. data/lib/refinery/stats_server.rb +134 -0
  19. data/lib/refinery/utilities.rb +33 -0
  20. data/lib/refinery/validations.rb +48 -0
  21. data/lib/refinery/worker.rb +65 -0
  22. data/logs/README +1 -0
  23. data/publishers/error.rb +8 -0
  24. data/publishers/sample.rb +8 -0
  25. data/publishers/sleep.rb +7 -0
  26. data/refinery.gemspec +105 -0
  27. data/test/config.yml +10 -0
  28. data/test/test_helper.rb +21 -0
  29. data/test/unit/config_test.rb +42 -0
  30. data/test/unit/configurable_test.rb +11 -0
  31. data/test/unit/daemon_test.rb +37 -0
  32. data/test/unit/event_publisher_test.rb +11 -0
  33. data/test/unit/heartbeat_test.rb +22 -0
  34. data/test/unit/loggable_test.rb +11 -0
  35. data/test/unit/publisher_test.rb +13 -0
  36. data/test/unit/queueable_test.rb +24 -0
  37. data/test/unit/server_test.rb +39 -0
  38. data/test/unit/statistics_test.rb +41 -0
  39. data/test/unit/utilities_test.rb +25 -0
  40. data/test/unit/validations_test.rb +37 -0
  41. data/test/unit/worker_test.rb +44 -0
  42. data/workers/error.rb +8 -0
  43. data/workers/sample.rb +8 -0
  44. data/workers/sleep.rb +7 -0
  45. metadata +74 -16
@@ -0,0 +1,11 @@
1
+ require File.dirname(__FILE__) + '/../test_helper'
2
+ class LogMe
3
+ include Refinery::Loggable
4
+ end
5
+ class LoggableTest < Test::Unit::TestCase
6
+ context "a class with Loggable mixed in" do
7
+ should "have a logger" do
8
+ assert_not_nil LogMe.new.logger
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,13 @@
1
+ require File.dirname(__FILE__) + '/../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
@@ -0,0 +1,24 @@
1
+ require File.dirname(__FILE__) + '/../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
+ queue_provider = stub('queue provider')
15
+ queue_provider.expects(:queue).with('a_queue').returns(queue)
16
+ RightAws::SqsGen2.expects(:new).with(
17
+ 'aki', 'sak', {:multi_thread => true}
18
+ ).returns(queue_provider)
19
+
20
+ queueable = QueueMe.new
21
+ assert_not_nil queueable.queue('a_queue')
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,39 @@
1
+ require File.dirname(__FILE__) + '/../test_helper'
2
+ class ServerTest < Test::Unit::TestCase
3
+ context "the server class" do
4
+ should "provide a logger" do
5
+ assert_not_nil Refinery::Server.logger
6
+ end
7
+ context "logger" do
8
+ should "default to WARN level" do
9
+ assert_equal Logger::WARN, Refinery::Server.logger.level
10
+ end
11
+ end
12
+ end
13
+ context "a server instance" do
14
+ setup do
15
+ @server = Refinery::Server.new
16
+ end
17
+ should "have a config" do
18
+ assert_not_nil @server.config
19
+ end
20
+ should "be runnable" do
21
+ setup_default_config
22
+
23
+ heartbeat_queue = stub('heartbeat queue')
24
+ heartbeat_queue.stubs(:send_message)
25
+ queue_provider = stub('queue provider')
26
+ queue_provider.expects(:queue).with('heartbeat').returns(heartbeat_queue)
27
+ RightAws::SqsGen2.expects(:new).with(
28
+ 'aki', 'sak', {:multi_thread => true}
29
+ ).returns(queue_provider)
30
+
31
+ assert_nothing_raised do
32
+ thread = Thread.new do
33
+ @server.run
34
+ end
35
+ @server.stop
36
+ end
37
+ end
38
+ end
39
+ end
@@ -0,0 +1,41 @@
1
+ require File.dirname(__FILE__) + '/../test_helper'
2
+
3
+ class StatisticsTest < Test::Unit::TestCase
4
+ context "a statistics instance" do
5
+ should "record a done message" do
6
+ dataset = stub('dataset')
7
+ dataset.expects(:<<) # TODO: improve this expectation
8
+
9
+ db = stub('db')
10
+ db.stubs(:table_exists?).returns(true)
11
+ db.stubs(:[]).with(:completed_jobs).returns(dataset)
12
+
13
+ Sequel.expects(:connect).with('sqlite://stats.db').returns(db)
14
+
15
+ message = {
16
+ 'host_info' => {'hostname' => 'test', 'pid' => 1},
17
+ 'run_time' => 1,
18
+ 'original' => ''
19
+ }
20
+ Refinery::Statistics.new.record_done(message)
21
+ end
22
+
23
+ should "record an error message" do
24
+ dataset = stub('dataset')
25
+ dataset.expects(:<<) # TODO: improve this expectation
26
+
27
+ db = stub('db')
28
+ db.stubs(:table_exists?).returns(true)
29
+ db.stubs(:[]).with(:errors).returns(dataset)
30
+
31
+ Sequel.expects(:connect).with('sqlite://stats.db').returns(db)
32
+
33
+ message = {
34
+ 'host_info' => {'hostname' => 'test', 'pid' => 1},
35
+ 'error' => {'class' => 'Error', 'message' => 'An error occurred.'},
36
+ 'original' => ''
37
+ }
38
+ Refinery::Statistics.new.record_error(message)
39
+ end
40
+ end
41
+ end
@@ -0,0 +1,25 @@
1
+ require File.dirname(__FILE__) + '/../test_helper'
2
+
3
+ class UtilitiesIncluded
4
+ include Refinery::Utilities
5
+ end
6
+
7
+ class UtilitiesTest < Test::Unit::TestCase
8
+ context "a class with utilities included" do
9
+ setup do
10
+ @o = UtilitiesIncluded.new
11
+ end
12
+ should "camelize a word" do
13
+
14
+ assert_equal 'ClassName', @o.camelize('class_name')
15
+ end
16
+ should "encode and decode message" do
17
+ message = {'some' => 'message'}
18
+ assert_equal message, @o.decode_message(@o.encode_message(message))
19
+ end
20
+ should "provide host info" do
21
+ assert_not_nil @o.host_info['pid']
22
+ assert_not_nil @o.host_info['hostname']
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,37 @@
1
+ require File.dirname(__FILE__) + '/../test_helper'
2
+
3
+ class ValidatedWorker < Refinery::Worker
4
+ include Refinery::Validations
5
+ validate_with do |message|
6
+ raise Refinery::InvalidMessageError, "A message is required" unless message
7
+ end
8
+ validates_key_exists :test
9
+
10
+ def execute(message)
11
+ end
12
+ end
13
+ class ValidationsTest < Test::Unit::TestCase
14
+ context "a validated worker" do
15
+ setup do
16
+ daemon = stub('daemon')
17
+ @worker = ValidatedWorker.new(daemon)
18
+ end
19
+ should "raise a validation error if the key does not exist" do
20
+ message = {}
21
+ assert_raise Refinery::InvalidMessageError do
22
+ @worker.run(message)
23
+ end
24
+ end
25
+ should "not raise a validation error if the key does exist" do
26
+ message = {:test => 'ding!'}
27
+ assert_nothing_raised do
28
+ @worker.run(message)
29
+ end
30
+ end
31
+ should "raise a validation error if the message is nil" do
32
+ assert_raise Refinery::InvalidMessageError do
33
+ @worker.run(nil)
34
+ end
35
+ end
36
+ end
37
+ end
@@ -0,0 +1,44 @@
1
+ require File.dirname(__FILE__) + '/../test_helper'
2
+
3
+ class SampleWorker < Refinery::Worker
4
+ attr_reader :message
5
+ def execute(message)
6
+ @message = message
7
+ end
8
+ end
9
+
10
+ class WorkerTest < Test::Unit::TestCase
11
+ context "a worker" do
12
+ setup do
13
+ daemon = stub('daemon')
14
+ @worker = SampleWorker.new(daemon)
15
+ @message = {'test' => 'value'}
16
+ end
17
+ should "run" do
18
+ @worker.run(@message)
19
+ assert_equal @message, @worker.message
20
+ end
21
+ should "provide a data store" do
22
+ options = {:bucket => 'bucket'}
23
+
24
+ data_store = stub('data store')
25
+
26
+ Moneta::S3.expects(:new).with(
27
+ :access_key_id => 'aki',
28
+ :secret_access_key => 'sak',
29
+ :bucket => options[:bucket],
30
+ :multi_thread => true
31
+ ).returns(data_store)
32
+
33
+ setup_default_config
34
+ assert_not_nil @worker.data_store(options)
35
+ end
36
+ should "provide a queue" do
37
+ queue = stub('queue')
38
+ queue_provider = stub('queue provider')
39
+ queue_provider.expects(:queue).with('a_queue').returns(queue)
40
+ @worker.expects(:queue_provider).returns(queue_provider)
41
+ assert_not_nil @worker.queue('a_queue')
42
+ end
43
+ end
44
+ end
data/workers/error.rb ADDED
@@ -0,0 +1,8 @@
1
+ # This is an example worker that raises an error.
2
+ class Error < Refinery::Worker
3
+ # Execute the work once.
4
+ def execute(message)
5
+ logger.info "received message: #{message.inspect}"
6
+ raise RuntimeError, "processing failure example"
7
+ end
8
+ end
data/workers/sample.rb ADDED
@@ -0,0 +1,8 @@
1
+ # This is a sample worker.
2
+ class Sample < Refinery::Worker
3
+ # Execute the work once.
4
+ def execute(message)
5
+ logger.info "received message: #{message.inspect}"
6
+ return true
7
+ end
8
+ end
data/workers/sleep.rb ADDED
@@ -0,0 +1,7 @@
1
+ class Sleep < Refinery::Worker
2
+ def execute(message)
3
+ logger.info "received message: #{message.inspect}"
4
+ sleep(message['seconds'])
5
+ return true
6
+ end
7
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: aeden-refinery
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.9.0
4
+ version: 0.9.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Anthony Eden
@@ -9,36 +9,81 @@ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
11
 
12
- date: 2009-05-16 00:00:00 -07:00
12
+ date: 2009-06-01 00:00:00 -07:00
13
13
  default_executable:
14
14
  dependencies: []
15
15
 
16
16
  description: Process data in a distributed fashion.
17
17
  email: anthonyeden@gmail.com
18
18
  executables:
19
- - refinery
20
19
  - epub
21
- - pubnow
22
20
  - monitor
21
+ - pubnow
22
+ - refinery
23
23
  extensions: []
24
24
 
25
- extra_rdoc_files: []
26
-
27
- files:
28
- - logs
29
- - publishers
30
- - Rakefile
25
+ extra_rdoc_files:
26
+ - LICENSE
31
27
  - README.rdoc
32
28
  - README.textile
33
- - LICENSE
29
+ files:
30
+ - .autotest
31
+ - .gitignore
34
32
  - CHANGELOG
35
- - workers
33
+ - LICENSE
34
+ - README.rdoc
35
+ - README.textile
36
+ - Rakefile
37
+ - VERSION
38
+ - bin/epub
39
+ - bin/monitor
40
+ - bin/pubnow
41
+ - bin/refinery
42
+ - config/config.example.yml
43
+ - lib/refinery.rb
44
+ - lib/refinery/config.rb
45
+ - lib/refinery/configurable.rb
46
+ - lib/refinery/daemon.rb
47
+ - lib/refinery/event_publisher.rb
48
+ - lib/refinery/heartbeat.rb
49
+ - lib/refinery/loggable.rb
50
+ - lib/refinery/monitor.rb
51
+ - lib/refinery/publisher.rb
52
+ - lib/refinery/queueable.rb
53
+ - lib/refinery/server.rb
54
+ - lib/refinery/statistics.rb
55
+ - lib/refinery/stats_server.rb
56
+ - lib/refinery/utilities.rb
57
+ - lib/refinery/validations.rb
58
+ - lib/refinery/worker.rb
59
+ - logs/README
60
+ - publishers/error.rb
61
+ - publishers/sample.rb
62
+ - publishers/sleep.rb
63
+ - refinery.gemspec
64
+ - test/config.yml
65
+ - test/test_helper.rb
66
+ - test/unit/config_test.rb
67
+ - test/unit/configurable_test.rb
68
+ - test/unit/daemon_test.rb
69
+ - test/unit/event_publisher_test.rb
70
+ - test/unit/heartbeat_test.rb
71
+ - test/unit/loggable_test.rb
72
+ - test/unit/publisher_test.rb
73
+ - test/unit/queueable_test.rb
74
+ - test/unit/server_test.rb
75
+ - test/unit/statistics_test.rb
76
+ - test/unit/utilities_test.rb
77
+ - test/unit/validations_test.rb
78
+ - test/unit/worker_test.rb
79
+ - workers/error.rb
80
+ - workers/sample.rb
81
+ - workers/sleep.rb
36
82
  has_rdoc: true
37
83
  homepage: http://github.com/aeden/refinery
38
84
  post_install_message:
39
85
  rdoc_options:
40
- - --title
41
- - Refinery - Distributed Processing
86
+ - --charset=UTF-8
42
87
  require_paths:
43
88
  - lib
44
89
  required_ruby_version: !ruby/object:Gem::Requirement
@@ -60,5 +105,18 @@ rubygems_version: 1.2.0
60
105
  signing_key:
61
106
  specification_version: 2
62
107
  summary: Refinery processes data in a distributed environment.
63
- test_files: []
64
-
108
+ test_files:
109
+ - test/test_helper.rb
110
+ - test/unit/config_test.rb
111
+ - test/unit/configurable_test.rb
112
+ - test/unit/daemon_test.rb
113
+ - test/unit/event_publisher_test.rb
114
+ - test/unit/heartbeat_test.rb
115
+ - test/unit/loggable_test.rb
116
+ - test/unit/publisher_test.rb
117
+ - test/unit/queueable_test.rb
118
+ - test/unit/server_test.rb
119
+ - test/unit/statistics_test.rb
120
+ - test/unit/utilities_test.rb
121
+ - test/unit/validations_test.rb
122
+ - test/unit/worker_test.rb