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 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.