opee 0.0.3 → 0.0.4
Sign up to get free protection for your applications and to get access to all the features.
- data/README.md +19 -22
- data/lib/opee.rb +1 -0
- data/lib/opee/actor.rb +1 -0
- data/lib/opee/env.rb +28 -0
- data/lib/opee/log.rb +54 -5
- data/lib/opee/version.rb +1 -1
- data/lib/opee/workqueue.rb +41 -0
- data/test/tc_opee_actor.rb +6 -0
- data/test/tc_opee_log.rb +42 -5
- metadata +4 -3
data/README.md
CHANGED
@@ -12,37 +12,34 @@ be written to improve performance.
|
|
12
12
|
|
13
13
|
This is no where close to being ready for prime time.
|
14
14
|
|
15
|
-
|
15
|
+
Any comments, thoughts, or suggestions are welcome.
|
16
16
|
|
17
|
-
|
17
|
+
## <a name="release">Release Notes</a>
|
18
18
|
|
19
|
-
|
19
|
+
### Release 0.0.4
|
20
20
|
|
21
|
-
-
|
21
|
+
- Filling in the Log class and unit tests for it.
|
22
22
|
|
23
|
+
- Added WorkQueue but have not tested it yet.
|
23
24
|
|
24
25
|
# Plans and Notes
|
25
26
|
|
26
|
-
-
|
27
|
-
- allow forward attribute to be set that forwards messages to another Actor
|
28
|
-
- turn output off (useful when there is a forward actor)
|
29
|
-
- test
|
30
|
-
- set formatter and stringio and test env methods
|
31
|
-
- test forwarding
|
32
|
-
|
33
|
-
- Env
|
34
|
-
- Actor
|
35
|
-
|
36
|
-
- implement a design pattern for a shared work queue
|
37
|
-
- queue is an actor
|
38
|
-
- place items on queue either as normal ask sequence or special mutex protected queue
|
39
|
-
- if normal then wait for a request for a job and send a job to requestor
|
27
|
+
- WorkQueue test tc_opee_workqueue
|
40
28
|
|
41
29
|
- pick a problem to test against
|
42
|
-
-
|
43
|
-
|
44
|
-
|
45
|
-
|
30
|
+
- file density distribution
|
31
|
+
- find all files under a directory
|
32
|
+
- detemine if the file is a text or bin file and only keep text files
|
33
|
+
- read in the text file and on work queue
|
34
|
+
- worker determines density of file (non-white/total)
|
35
|
+
- pass on to summary actor
|
36
|
+
- wait_finish
|
37
|
+
- ask to print or write report
|
38
|
+
|
39
|
+
- implement Actor max_queue_count limiter
|
40
|
+
- test with actor that reports queue size and pauses for 0.1 seconds
|
41
|
+
- try to send too many requests at it so it has to report busy
|
42
|
+
|
46
43
|
|
47
44
|
- describe patterns for use
|
48
45
|
|
data/lib/opee.rb
CHANGED
data/lib/opee/actor.rb
CHANGED
data/lib/opee/env.rb
CHANGED
@@ -27,6 +27,7 @@ module Opee
|
|
27
27
|
a = @@actors.pop()
|
28
28
|
a.close()
|
29
29
|
end
|
30
|
+
@@log = nil
|
30
31
|
end
|
31
32
|
|
32
33
|
def self.log(severity, message)
|
@@ -34,6 +35,26 @@ module Opee
|
|
34
35
|
@@log.ask(:log, severity, message)
|
35
36
|
end
|
36
37
|
|
38
|
+
def self.debug(message)
|
39
|
+
log(Logger::Severity::DEBUG, message)
|
40
|
+
end
|
41
|
+
|
42
|
+
def self.info(message)
|
43
|
+
log(Logger::Severity::INFO, message)
|
44
|
+
end
|
45
|
+
|
46
|
+
def self.warn(message)
|
47
|
+
log(Logger::Severity::WARN, message)
|
48
|
+
end
|
49
|
+
|
50
|
+
def self.error(message)
|
51
|
+
log(Logger::Severity::ERROR, message)
|
52
|
+
end
|
53
|
+
|
54
|
+
def self.fatal(message)
|
55
|
+
log(Logger::Severity::FATAL, message)
|
56
|
+
end
|
57
|
+
|
37
58
|
def self.log_rescue(ex)
|
38
59
|
@@log = Log.new() if @@log.nil?
|
39
60
|
return unless Logger::Severity::ERROR >= @@log.level
|
@@ -49,6 +70,12 @@ module Opee
|
|
49
70
|
@@log
|
50
71
|
end
|
51
72
|
|
73
|
+
def self.logger=(log_actor)
|
74
|
+
@@log.close() unless @@log.nil?
|
75
|
+
@@log = log_actor
|
76
|
+
@@log
|
77
|
+
end
|
78
|
+
|
52
79
|
def self.queue_count()
|
53
80
|
cnt = 0
|
54
81
|
@@actors.each { |a| cnt += a.queue_count() }
|
@@ -83,6 +110,7 @@ module Opee
|
|
83
110
|
break if 0 == queue_count()
|
84
111
|
start()
|
85
112
|
end
|
113
|
+
@@log = nil
|
86
114
|
until @@actors.empty?
|
87
115
|
a = @@actors.pop()
|
88
116
|
a.close()
|
data/lib/opee/log.rb
CHANGED
@@ -5,17 +5,66 @@ module Opee
|
|
5
5
|
class Log < Actor
|
6
6
|
|
7
7
|
def initialize(options={})
|
8
|
+
@logger = nil
|
9
|
+
@forward = nil
|
8
10
|
super(options)
|
9
11
|
end
|
10
12
|
|
13
|
+
def level()
|
14
|
+
@logger.level
|
15
|
+
end
|
16
|
+
|
17
|
+
def formatter()
|
18
|
+
@logger.formatter
|
19
|
+
end
|
20
|
+
|
21
|
+
def forward()
|
22
|
+
@forward
|
23
|
+
end
|
24
|
+
|
11
25
|
private
|
12
|
-
#
|
26
|
+
# Use ask() to invoke private methods. If called directly they will be
|
27
|
+
# picked up by the Actor method_missing() method.
|
13
28
|
|
14
29
|
def set_options(options)
|
15
|
-
|
30
|
+
if !(filename = options[:filename]).nil?
|
31
|
+
max_file_size = options.fetch(:max_file_size, options.fetch(:shift_size, 1048576))
|
32
|
+
max_file_count = options.fetch(:max_file_count, options.fetch(:shift_age, 7))
|
33
|
+
@logger = Logger.new(filename, max_file_count, max_file_size)
|
34
|
+
elsif !(stream = options[:stream]).nil?
|
35
|
+
@logger = Logger.new(stream)
|
36
|
+
else
|
37
|
+
@logger = Logger.new(STDOUT)
|
38
|
+
end
|
16
39
|
severity = options[:severity] if options.has_key?(:severity)
|
40
|
+
formatter = options[:formatter] if options.has_key?(:formatter)
|
41
|
+
end
|
42
|
+
|
43
|
+
def log(severity, message)
|
44
|
+
@logger.add(severity, message)
|
45
|
+
@forward.log(severity, message) unless @forward.nil?
|
46
|
+
end
|
47
|
+
|
48
|
+
def stream=(stream)
|
49
|
+
logger = Logger.new(stream)
|
50
|
+
logger.level = @logger.level
|
51
|
+
logger.formatter = @logger.formatter
|
52
|
+
@logger = logger
|
53
|
+
end
|
54
|
+
|
55
|
+
def set_filename(filename, shift_age=7, shift_size=1048576)
|
56
|
+
logger = Logger.new(filename, shift_age, shift_size)
|
57
|
+
logger.level = @logger.level
|
58
|
+
logger.formatter = @logger.formatter
|
59
|
+
@logger = logger
|
60
|
+
end
|
61
|
+
|
62
|
+
def logger=(logger)
|
63
|
+
@logger = logger
|
64
|
+
end
|
17
65
|
|
18
|
-
|
66
|
+
def forward=(forward_actor)
|
67
|
+
@forward = forward_actor
|
19
68
|
end
|
20
69
|
|
21
70
|
def severity=(level)
|
@@ -35,8 +84,8 @@ module Opee
|
|
35
84
|
@logger.level = level
|
36
85
|
end
|
37
86
|
|
38
|
-
def
|
39
|
-
@logger.
|
87
|
+
def formatter=(proc)
|
88
|
+
@logger.formatter = proc
|
40
89
|
end
|
41
90
|
|
42
91
|
end # Log
|
data/lib/opee/version.rb
CHANGED
@@ -0,0 +1,41 @@
|
|
1
|
+
|
2
|
+
module Opee
|
3
|
+
class WorkQueue < Actor
|
4
|
+
|
5
|
+
def initialize(options={})
|
6
|
+
@workers = []
|
7
|
+
@work_queue = []
|
8
|
+
@method = nil
|
9
|
+
super(options)
|
10
|
+
end
|
11
|
+
|
12
|
+
def work_queue_size()
|
13
|
+
@work_queue.size
|
14
|
+
end
|
15
|
+
|
16
|
+
private
|
17
|
+
|
18
|
+
def set_options(options)
|
19
|
+
raise "A method for for processing jobs must be specified" if (@method = options[:method]).nil?
|
20
|
+
end
|
21
|
+
|
22
|
+
def add(job)
|
23
|
+
if @workers.empty?
|
24
|
+
@work_queue.insert(0, job)
|
25
|
+
else
|
26
|
+
worker = @workers.pop()
|
27
|
+
worker.ask(@method, job)
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
def ready(worker)
|
32
|
+
if @work_queue.empty?
|
33
|
+
@workers.insert(0, worker) unless @workers.include?(worker)
|
34
|
+
else
|
35
|
+
job = @work_queue.pop()
|
36
|
+
worker.ask(@method, job)
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
end # WorkQueue
|
41
|
+
end # Opee
|
data/test/tc_opee_actor.rb
CHANGED
@@ -38,6 +38,12 @@ class OpeeTest < ::Test::Unit::TestCase
|
|
38
38
|
a.close()
|
39
39
|
end
|
40
40
|
|
41
|
+
def test_opee_actor_really_missing
|
42
|
+
a = ::Relay.new()
|
43
|
+
assert_raise(NoMethodError) { a.xray(7) }
|
44
|
+
a.close()
|
45
|
+
end
|
46
|
+
|
41
47
|
def test_opee_actor_raise_after_close
|
42
48
|
a = ::Relay.new()
|
43
49
|
a.close()
|
data/test/tc_opee_log.rb
CHANGED
@@ -6,16 +6,53 @@
|
|
6
6
|
].each { |path| $: << path unless $:.include?(path) }
|
7
7
|
|
8
8
|
require 'test/unit'
|
9
|
+
require 'stringio'
|
9
10
|
require 'opee'
|
10
11
|
|
11
12
|
class OpeeTest < ::Test::Unit::TestCase
|
12
13
|
|
13
14
|
def test_opee_log_log
|
14
|
-
|
15
|
-
::Opee::Env.logger
|
16
|
-
::Opee::Env.
|
17
|
-
::Opee::Env.
|
18
|
-
|
15
|
+
stream = StringIO.new()
|
16
|
+
::Opee::Env.logger = ::Opee::Log.new(:stream => stream)
|
17
|
+
::Opee::Env.logger.severity = Logger::INFO
|
18
|
+
::Opee::Env.logger.formatter = proc { |sev, time, prog, msg| "#{sev}: #{msg}\n" }
|
19
|
+
::Opee::Env.log(Logger::FATAL, "dead")
|
20
|
+
::Opee::Env.log(Logger::ERROR, "oops")
|
21
|
+
::Opee::Env.log(Logger::WARN, "duck")
|
22
|
+
::Opee::Env.log(Logger::INFO, "something")
|
23
|
+
::Opee::Env.log(Logger::DEBUG, "bugs")
|
24
|
+
::Opee::Env.wait_close()
|
25
|
+
assert_equal(%{FATAL: dead
|
26
|
+
ERROR: oops
|
27
|
+
WARN: duck
|
28
|
+
INFO: something
|
29
|
+
}, stream.string)
|
30
|
+
end
|
31
|
+
|
32
|
+
def test_opee_log_filename
|
33
|
+
filename = 'filename_test.log'
|
34
|
+
%x{rm -f #{filename}}
|
35
|
+
::Opee::Env.logger = ::Opee::Log.new(:filename => filename)
|
36
|
+
::Opee::Env.logger.severity = Logger::INFO
|
37
|
+
::Opee::Env.logger.formatter = proc { |sev, time, prog, msg| "#{sev}: #{msg}\n" }
|
38
|
+
::Opee::Env.info("first entry")
|
39
|
+
::Opee::Env.wait_close()
|
40
|
+
output = File.read(filename).split("\n")[1..-1]
|
41
|
+
assert_equal(['INFO: first entry'], output)
|
42
|
+
%x{rm #{filename}}
|
43
|
+
end
|
44
|
+
|
45
|
+
def test_opee_log_set_filename
|
46
|
+
filename = 'set_filename_test.log'
|
47
|
+
%x{rm -f #{filename}}
|
48
|
+
::Opee::Env.logger.severity = Logger::INFO
|
49
|
+
::Opee::Env.logger.formatter = proc { |sev, time, prog, msg| "#{sev}: #{msg}\n" }
|
50
|
+
::Opee::Env.logger.set_filename(filename, 2, 1000)
|
51
|
+
::Opee::Env.info("first entry")
|
52
|
+
::Opee::Env.wait_close()
|
53
|
+
output = File.read(filename).split("\n")[1..-1]
|
54
|
+
assert_equal(['INFO: first entry'], output)
|
55
|
+
%x{rm #{filename}}
|
19
56
|
end
|
20
57
|
|
21
58
|
end # OpeeTest
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: opee
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.4
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2012-
|
12
|
+
date: 2012-05-01 00:00:00.000000000 Z
|
13
13
|
dependencies: []
|
14
14
|
description: ! 'An experimental Object-base Parallel Evaluation Environment. '
|
15
15
|
email: peter@ohler.com
|
@@ -22,6 +22,7 @@ files:
|
|
22
22
|
- lib/opee/env.rb
|
23
23
|
- lib/opee/log.rb
|
24
24
|
- lib/opee/version.rb
|
25
|
+
- lib/opee/workqueue.rb
|
25
26
|
- lib/opee.rb
|
26
27
|
- test/relay.rb
|
27
28
|
- test/tc_opee_actor.rb
|
@@ -53,7 +54,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
53
54
|
version: '0'
|
54
55
|
requirements: []
|
55
56
|
rubyforge_project: opee
|
56
|
-
rubygems_version: 1.8.
|
57
|
+
rubygems_version: 1.8.21
|
57
58
|
signing_key:
|
58
59
|
specification_version: 3
|
59
60
|
summary: An experimental Object-base Parallel Evaluation Environment.
|