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 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
- ## <a name="release">Release Notes</a>
15
+ Any comments, thoughts, or suggestions are welcome.
16
16
 
17
- ### Release 0.0.3
17
+ ## <a name="release">Release Notes</a>
18
18
 
19
- - Filled out Env and Actor tests.
19
+ ### Release 0.0.4
20
20
 
21
- - Fixed ordering problem with method execution.
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
- - Log
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
- - checkers
43
- - process some kind of file
44
- - process random numbers to produce something
45
- - life
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
 
@@ -5,3 +5,4 @@ end # Opee
5
5
  require 'opee/env'
6
6
  require 'opee/actor'
7
7
  require 'opee/log'
8
+ require 'opee/workqueue'
@@ -83,6 +83,7 @@ module Opee
83
83
  end
84
84
 
85
85
  def method_missing(m, *args, &blk)
86
+ raise NoMethodError.new("undefine method '#{m}' for #{self.class}", m, args) unless respond_to?(m, true)
86
87
  ask(m, *args)
87
88
  end
88
89
 
@@ -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()
@@ -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
- # use ask() to invoke private methods
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
- @logger = Logger.new(STDOUT)
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
- # TBD options for setting a file, severity, max_file_size, max_file_count, formatter
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 log(severity, message)
39
- @logger.add(severity, message)
87
+ def formatter=(proc)
88
+ @logger.formatter = proc
40
89
  end
41
90
 
42
91
  end # Log
@@ -1,5 +1,5 @@
1
1
 
2
2
  module Opee
3
3
  # Current version of the module.
4
- VERSION = '0.0.3'
4
+ VERSION = '0.0.4'
5
5
  end
@@ -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
@@ -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()
@@ -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
- #::Opee::Env.logger.ask(:severity=, Logger::INFO)
15
- ::Opee::Env.logger.severity= Logger::INFO
16
- ::Opee::Env.log(Logger::INFO, "hello")
17
- ::Opee::Env.each_actor { |a| puts a.to_s }
18
- sleep(0.2)
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.3
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-04-30 00:00:00.000000000 Z
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.11
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.