opee 0.0.3 → 0.0.4
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/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.
|