cadence 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
data/README.textile ADDED
@@ -0,0 +1,47 @@
1
+ h1. Cadence
2
+
3
+ Track counts and compute rate of iteration. Set up callbacks for various
4
+ intervals such as @every@ n increments or every n @ticks@.
5
+
6
+ h2. Sample
7
+
8
+ <pre>
9
+ require 'lib/cadence'
10
+
11
+ data = (1..100).to_a
12
+
13
+ computer = Cadence::Computer.new do |c|
14
+ c.every 5 do
15
+ p [:every, 5, n]
16
+ end
17
+
18
+ c.for(:tens).every do
19
+ p [:tens, :every, n]
20
+ end
21
+
22
+ c.twenties.every 2 do
23
+ p [:twenties, :every, 2, n]
24
+ end
25
+
26
+ c.ticks 1 do
27
+ p [:tock, n, timestamp]
28
+ end
29
+ end
30
+
31
+ computer.start do |c|
32
+ data.each do |n|
33
+ c.next
34
+ c.tens.next if n % 10 == 0
35
+ p [:n, n]
36
+ sleep 0.02
37
+ end
38
+ end
39
+ </pre>
40
+
41
+ h2. License
42
+
43
+ MIT
44
+
45
+ h2. Copyright
46
+
47
+ Copyright (C) 2010 Matt Todd.
data/Rakefile ADDED
@@ -0,0 +1,5 @@
1
+ task :test do
2
+ require 'test/cadence_test'
3
+ end
4
+
5
+ task :default => :test
@@ -0,0 +1,25 @@
1
+ class Cadence::Computer::Counter
2
+
3
+ attr_accessor :count, :triggers
4
+
5
+ def initialize(count = 0)
6
+ @count = 0
7
+ @triggers = {}
8
+ end
9
+
10
+ def every(n = 1, &block)
11
+ @triggers[n] = block
12
+ end
13
+
14
+ def next
15
+ @count += 1
16
+ @triggers.each do |(n, trigger)|
17
+ instance_eval(&trigger) if @count % n == 0
18
+ end
19
+ end
20
+
21
+ def n
22
+ @count
23
+ end
24
+
25
+ end
@@ -0,0 +1,69 @@
1
+ class Cadence::Computer
2
+
3
+ attr_accessor :started_at, :finished_at, :duration,
4
+ :counter, :counters, :total
5
+
6
+ def initialize
7
+ @counter = Counter.new
8
+ @counters = {}
9
+ @ticks = {}
10
+
11
+ yield self
12
+ end
13
+
14
+ ### Keys
15
+
16
+ def for(key)
17
+ self.counters[key] ||= Counter.new
18
+ end
19
+ def method_missing(method_name, *args, &block)
20
+ self.for(method_name, &block)
21
+ end
22
+
23
+ ### Overall total and count tracking
24
+
25
+ def every(n = 1, &block)
26
+ @counter.every(n, &block)
27
+ end
28
+ def next
29
+ @counter.next
30
+ @ticks.each do |(n, (last, tick))|
31
+ @ticks[n] = [self.duration.to_i, tick]
32
+ instance_eval(&tick) if self.duration.to_i > last.to_i && self.duration.to_i % n == 0
33
+ end
34
+ end
35
+
36
+ ### Timing
37
+
38
+ def ticks(n = 1, &block)
39
+ @ticks[n] ||= [nil, block]
40
+ end
41
+
42
+ ### Runtime
43
+
44
+ def start
45
+ @started_at = self.timestamp
46
+ yield self
47
+ @finished_at = self.timestamp
48
+
49
+ @duration = @finished_at - @started_at
50
+ end
51
+
52
+ def timestamp
53
+ Time.now
54
+ end
55
+
56
+ def duration
57
+ self.timestamp.to_f - self.started_at.to_f
58
+ end
59
+
60
+ def rate
61
+ # self.duration / self.counter.count
62
+ self.counter.count / self.duration
63
+ end
64
+
65
+ def n
66
+ self.counter.count
67
+ end
68
+
69
+ end
data/lib/cadence.rb ADDED
@@ -0,0 +1,5 @@
1
+ module Cadence
2
+ end
3
+
4
+ require 'lib/cadence/computer'
5
+ require 'lib/cadence/computer/counter'
@@ -0,0 +1,32 @@
1
+ $:.unshift(File.join(File.dirname(__FILE__), '..'))
2
+ require 'lib/cadence'
3
+
4
+ data = (1..100).to_a
5
+
6
+ computer = Cadence::Computer.new do |c|
7
+ c.every 5 do
8
+ p [:every, 5, n]
9
+ end
10
+
11
+ c.for(:tens).every do
12
+ p [:tens, :every, n]
13
+ end
14
+
15
+ c.twenties.every 2 do
16
+ p [:twenties, :every, 2, n]
17
+ end
18
+
19
+ c.ticks 1 do
20
+ p [:tock, n, timestamp]
21
+ end
22
+ end
23
+
24
+ computer.start do |c|
25
+ data.each do |n|
26
+ c.next
27
+ c.tens.next if n % 10 == 0
28
+ c.twenties.next if n % 20 == 0
29
+ p [:n, n]
30
+ sleep 0.02
31
+ end
32
+ end
metadata ADDED
@@ -0,0 +1,72 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: cadence
3
+ version: !ruby/object:Gem::Version
4
+ hash: 29
5
+ prerelease: false
6
+ segments:
7
+ - 0
8
+ - 0
9
+ - 1
10
+ version: 0.0.1
11
+ platform: ruby
12
+ authors:
13
+ - Matt Todd
14
+ autorequire:
15
+ bindir: bin
16
+ cert_chain: []
17
+
18
+ date: 2010-09-01 00:00:00 -04:00
19
+ default_executable:
20
+ dependencies: []
21
+
22
+ description: " Track counts and compute rate of iteration. Set up callbacks for various\n intervals such as every n increments or every n ticks.\n \n computer = Cadence::Computer.new do |c|\n c.every 5 do\n p [:completed_processing, n]\n end\n end\n \n computer.start do |c|\n 1.upto(100) do |n|\n c.next\n # do magic here\n end\n end\n \n Mostly intended for providing intermitent feedback of the progress of tasks\n that will run for lengthy periods of time.\n \n Rudimentary support for time-based callbacks is possible through #ticks.\n"
23
+ email: mtodd@highgroove.com
24
+ executables: []
25
+
26
+ extensions: []
27
+
28
+ extra_rdoc_files: []
29
+
30
+ files:
31
+ - README.textile
32
+ - Rakefile
33
+ - lib/cadence/computer/counter.rb
34
+ - lib/cadence/computer.rb
35
+ - lib/cadence.rb
36
+ - test/cadence_test.rb
37
+ has_rdoc: true
38
+ homepage: http://github.com/mtodd/cadence
39
+ licenses: []
40
+
41
+ post_install_message:
42
+ rdoc_options: []
43
+
44
+ require_paths:
45
+ - lib
46
+ required_ruby_version: !ruby/object:Gem::Requirement
47
+ none: false
48
+ requirements:
49
+ - - ">="
50
+ - !ruby/object:Gem::Version
51
+ hash: 3
52
+ segments:
53
+ - 0
54
+ version: "0"
55
+ required_rubygems_version: !ruby/object:Gem::Requirement
56
+ none: false
57
+ requirements:
58
+ - - ">="
59
+ - !ruby/object:Gem::Version
60
+ hash: 3
61
+ segments:
62
+ - 0
63
+ version: "0"
64
+ requirements: []
65
+
66
+ rubyforge_project:
67
+ rubygems_version: 1.3.7
68
+ signing_key:
69
+ specification_version: 3
70
+ summary: Interval/period callback library
71
+ test_files: []
72
+