benelux 0.2.0.001
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/CHANGES.txt +4 -0
- data/LICENSE.txt +19 -0
- data/README.rdoc +36 -0
- data/Rakefile +73 -0
- data/benelux.gemspec +34 -0
- data/lib/benelux.rb +130 -0
- data/lib/benelux/mark.rb +37 -0
- data/lib/benelux/mixins/thread.rb +6 -0
- data/lib/benelux/timeline.rb +84 -0
- data/tryouts/basic_tryouts.rb +69 -0
- metadata +79 -0
data/CHANGES.txt
ADDED
data/LICENSE.txt
ADDED
@@ -0,0 +1,19 @@
|
|
1
|
+
Copyright (c) 2009 Solutious Inc, Delano Mandelbaum
|
2
|
+
|
3
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
4
|
+
of this software and associated documentation files (the "Software"), to deal
|
5
|
+
in the Software without restriction, including without limitation the rights
|
6
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
7
|
+
copies of the Software, and to permit persons to whom the Software is
|
8
|
+
furnished to do so, subject to the following conditions:
|
9
|
+
|
10
|
+
The above copyright notice and this permission notice shall be included in
|
11
|
+
all copies or substantial portions of the Software.
|
12
|
+
|
13
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
14
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
15
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
16
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
17
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
18
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
19
|
+
THE SOFTWARE.
|
data/README.rdoc
ADDED
@@ -0,0 +1,36 @@
|
|
1
|
+
= Benelux v0.1
|
2
|
+
|
3
|
+
<b></b>
|
4
|
+
|
5
|
+
|
6
|
+
== Features
|
7
|
+
|
8
|
+
|
9
|
+
|
10
|
+
== Installation
|
11
|
+
|
12
|
+
Get it in one of the following ways:
|
13
|
+
|
14
|
+
$ gem install benelux
|
15
|
+
$ git clone git://github.com/delano/benelux.git
|
16
|
+
$ gem install delano-benelux --source http://gems.github.com
|
17
|
+
|
18
|
+
|
19
|
+
== More Information
|
20
|
+
|
21
|
+
* Codes[http://github.com/delano/benelux]
|
22
|
+
* RDocs[http://delano.github.com/benelux]
|
23
|
+
|
24
|
+
== Credits
|
25
|
+
|
26
|
+
* Delano Mandelbaum (http://solutious.com)
|
27
|
+
|
28
|
+
|
29
|
+
== Thanks
|
30
|
+
|
31
|
+
* Alexis Sellier for fielding my Ruby questions
|
32
|
+
|
33
|
+
|
34
|
+
== License
|
35
|
+
|
36
|
+
See LICENSE.txt
|
data/Rakefile
ADDED
@@ -0,0 +1,73 @@
|
|
1
|
+
|
2
|
+
require 'rake/clean'
|
3
|
+
require 'rake/gempackagetask'
|
4
|
+
require 'hanna/rdoctask'
|
5
|
+
require 'rake/testtask'
|
6
|
+
require 'shoulda/tasks'
|
7
|
+
require 'rake/runtest'
|
8
|
+
require 'monkeyspecdoc' # http://jgre.org/2008/09/03/monkeyspecdoc/
|
9
|
+
require 'fileutils'
|
10
|
+
include FileUtils
|
11
|
+
|
12
|
+
task :default => :test
|
13
|
+
|
14
|
+
|
15
|
+
# PACKAGE =============================================================
|
16
|
+
|
17
|
+
name = "benelux"
|
18
|
+
load "#{name}.gemspec"
|
19
|
+
|
20
|
+
version = @spec.version
|
21
|
+
|
22
|
+
Rake::GemPackageTask.new(@spec) do |p|
|
23
|
+
p.need_tar = true if RUBY_PLATFORM !~ /mswin/
|
24
|
+
end
|
25
|
+
|
26
|
+
task :release => [ "publish:gem", :clean, "publish:rdoc" ] do
|
27
|
+
$: << File.join(File.dirname(__FILE__), 'lib')
|
28
|
+
require "rudy"
|
29
|
+
abort if Drydock.debug?
|
30
|
+
end
|
31
|
+
|
32
|
+
task :install => [ :rdoc, :package ] do
|
33
|
+
sh %{sudo gem install pkg/#{name}-#{version}.gem}
|
34
|
+
end
|
35
|
+
|
36
|
+
task :uninstall => [ :clean ] do
|
37
|
+
sh %{sudo gem uninstall #{name}}
|
38
|
+
end
|
39
|
+
|
40
|
+
|
41
|
+
# Rubyforge Release / Publish Tasks ==================================
|
42
|
+
|
43
|
+
#about 'Publish website to rubyforge'
|
44
|
+
task 'publish:rdoc' => 'doc/index.html' do
|
45
|
+
sh "scp -rp doc/* rubyforge.org:/var/www/gforge-projects/#{name}/"
|
46
|
+
end
|
47
|
+
|
48
|
+
#about 'Public release to rubyforge'
|
49
|
+
task 'publish:gem' => [:package] do |t|
|
50
|
+
sh <<-end
|
51
|
+
rubyforge add_release -o Any -a CHANGES.txt -f -n README.rdoc #{name} #{name} #{@spec.version} pkg/#{name}-#{@spec.version}.gem &&
|
52
|
+
rubyforge add_file -o Any -a CHANGES.txt -f -n README.rdoc #{name} #{name} #{@spec.version} pkg/#{name}-#{@spec.version}.tgz
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
|
57
|
+
Rake::RDocTask.new do |t|
|
58
|
+
t.rdoc_dir = 'doc'
|
59
|
+
t.title = @spec.summary
|
60
|
+
t.options << '--line-numbers' << '-A cattr_accessor=object'
|
61
|
+
t.options << '--charset' << 'utf-8'
|
62
|
+
t.rdoc_files.include('LICENSE.txt')
|
63
|
+
t.rdoc_files.include('README.rdoc')
|
64
|
+
t.rdoc_files.include('CHANGES.txt')
|
65
|
+
#t.rdoc_files.include('Rudyfile') # why is the formatting f'd?
|
66
|
+
t.rdoc_files.include('bin/*')
|
67
|
+
t.rdoc_files.include('lib/**/*.rb')
|
68
|
+
end
|
69
|
+
|
70
|
+
CLEAN.include [ 'pkg', '*.gem', '.config', 'doc', 'coverage*' ]
|
71
|
+
|
72
|
+
|
73
|
+
|
data/benelux.gemspec
ADDED
@@ -0,0 +1,34 @@
|
|
1
|
+
@spec = Gem::Specification.new do |s|
|
2
|
+
s.name = "benelux"
|
3
|
+
s.rubyforge_project = 'benelux'
|
4
|
+
s.version = "0.2.0.001"
|
5
|
+
s.summary = "Benelux: Little freakin' timers for your Ruby codes"
|
6
|
+
s.description = s.summary
|
7
|
+
s.author = "Delano Mandelbaum"
|
8
|
+
s.email = "delano@solutious.com"
|
9
|
+
s.homepage = "http://github.com/delano/benelux"
|
10
|
+
|
11
|
+
s.extra_rdoc_files = %w[README.rdoc LICENSE.txt CHANGES.txt]
|
12
|
+
s.has_rdoc = true
|
13
|
+
s.rdoc_options = ["--line-numbers", "--title", s.summary, "--main", "README.rdoc"]
|
14
|
+
s.require_paths = %w[lib]
|
15
|
+
|
16
|
+
s.add_dependency 'hexoid'
|
17
|
+
|
18
|
+
# = MANIFEST =
|
19
|
+
# git ls-files
|
20
|
+
s.files = %w(
|
21
|
+
CHANGES.txt
|
22
|
+
LICENSE.txt
|
23
|
+
README.rdoc
|
24
|
+
Rakefile
|
25
|
+
benelux.gemspec
|
26
|
+
lib/benelux.rb
|
27
|
+
lib/benelux/mark.rb
|
28
|
+
lib/benelux/mixins/thread.rb
|
29
|
+
lib/benelux/timeline.rb
|
30
|
+
tryouts/basic_tryouts.rb
|
31
|
+
)
|
32
|
+
|
33
|
+
|
34
|
+
end
|
data/lib/benelux.rb
ADDED
@@ -0,0 +1,130 @@
|
|
1
|
+
require 'attic'
|
2
|
+
require 'thread'
|
3
|
+
require 'hexoid'
|
4
|
+
|
5
|
+
module Benelux
|
6
|
+
NOTSUPPORTED = [Class, Object, Kernel]
|
7
|
+
SUFFIX_START = :a.freeze
|
8
|
+
SUFFIX_END = :z.freeze
|
9
|
+
|
10
|
+
require 'benelux/timeline'
|
11
|
+
require 'benelux/mark'
|
12
|
+
require 'benelux/mixins/thread'
|
13
|
+
|
14
|
+
@@timed_methods = {}
|
15
|
+
@@thread_timelines = []
|
16
|
+
@@timeline = Benelux::Timeline.new
|
17
|
+
@@mutex = Mutex.new
|
18
|
+
|
19
|
+
class BeneluxError < RuntimeError; end
|
20
|
+
class NotSupported < BeneluxError; end
|
21
|
+
|
22
|
+
def benelux_timers
|
23
|
+
Benelux.timed_methods[self.class]
|
24
|
+
end
|
25
|
+
|
26
|
+
def Benelux.supported?(klass)
|
27
|
+
!NOTSUPPORTED.member?(klass)
|
28
|
+
end
|
29
|
+
|
30
|
+
def Benelux.store_thread_reference
|
31
|
+
return if Benelux.thread_timelines.member? Thread.current
|
32
|
+
@@mutex.synchronize do
|
33
|
+
Benelux.thread_timelines << Thread.current
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
def Benelux.timed_methods
|
38
|
+
@@timed_methods
|
39
|
+
end
|
40
|
+
|
41
|
+
def Benelux.thread_timelines
|
42
|
+
@@thread_timelines
|
43
|
+
end
|
44
|
+
|
45
|
+
def Benelux.timeline
|
46
|
+
@@timeline = Benelux.generate_timeline if @@timeline.empty?
|
47
|
+
@@timeline
|
48
|
+
end
|
49
|
+
|
50
|
+
def Benelux.generate_timeline
|
51
|
+
@@mutex.synchronize do
|
52
|
+
timeline = Benelux::Timeline.new
|
53
|
+
Benelux.thread_timelines.each { |t| timeline << t.benelux }
|
54
|
+
timeline.flatten.sort
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
def Benelux.thread_timeline(thread_id=nil)
|
59
|
+
Thread.current.benelux ||= Benelux::Timeline.new
|
60
|
+
Thread.current.benelux
|
61
|
+
end
|
62
|
+
|
63
|
+
|
64
|
+
def Benelux.included(klass)
|
65
|
+
timed_methods[klass] = [] unless timed_methods.has_key? klass
|
66
|
+
end
|
67
|
+
|
68
|
+
def Benelux.timed_method? klass, meth
|
69
|
+
!timed_methods[klass].nil? && timed_methods[klass].member?(meth)
|
70
|
+
end
|
71
|
+
|
72
|
+
def Benelux.add_timer klass, meth
|
73
|
+
raise NotSupported, klass unless Benelux.supported? klass
|
74
|
+
raise AlreadyTimed, klass if Benelux.timed_method? klass, meth
|
75
|
+
prepare_object klass
|
76
|
+
meth_alias = rename_method klass, meth
|
77
|
+
timed_methods[klass] << meth
|
78
|
+
klass.module_eval generate_timer_str(meth_alias, meth)
|
79
|
+
end
|
80
|
+
|
81
|
+
def Benelux.add_tally obj, meth
|
82
|
+
end
|
83
|
+
|
84
|
+
def Benelux.name(*names)
|
85
|
+
names.flatten.collect { |n| n.to_s }.join('_')
|
86
|
+
end
|
87
|
+
|
88
|
+
private
|
89
|
+
def Benelux.prepare_object obj
|
90
|
+
obj.extend Attic unless obj.kind_of?(Attic)
|
91
|
+
unless obj.kind_of?(Benelux)
|
92
|
+
obj.attic :benelux
|
93
|
+
obj.send :include, Benelux
|
94
|
+
end
|
95
|
+
end
|
96
|
+
|
97
|
+
def Benelux.rename_method(obj, meth)
|
98
|
+
## NOTE: This is commented out so we can include
|
99
|
+
## Benelux definitions before all classes are loaded.
|
100
|
+
##unless obj.respond_to? meth
|
101
|
+
## raise NoMethodError, "undefined method `#{meth}' for #{obj}:Class"
|
102
|
+
##end
|
103
|
+
thread_id, call_id = Thread.current.object_id.abs, obj.object_id.abs
|
104
|
+
meth_alias = "__benelux_#{meth}_#{thread_id}_#{call_id}"
|
105
|
+
obj.module_eval do
|
106
|
+
alias_method meth_alias, meth
|
107
|
+
end
|
108
|
+
meth_alias
|
109
|
+
end
|
110
|
+
|
111
|
+
def Benelux.generate_timer_str(meth_alias, meth)
|
112
|
+
%Q{
|
113
|
+
def #{meth}(*args, &block)
|
114
|
+
# We only need to do these things once.
|
115
|
+
if self.benelux.nil?
|
116
|
+
self.benelux = Benelux::Timeline.new
|
117
|
+
Benelux.store_thread_reference
|
118
|
+
end
|
119
|
+
ref = self.object_id.abs.to_s << args.object_id.abs.to_s
|
120
|
+
self.benelux.add_mark_open ref, :'#{meth}'
|
121
|
+
ret = #{meth_alias}(*args, &block)
|
122
|
+
self.benelux.add_mark_close ref, :'#{meth}'
|
123
|
+
ret
|
124
|
+
end
|
125
|
+
}
|
126
|
+
end
|
127
|
+
|
128
|
+
end
|
129
|
+
|
130
|
+
|
data/lib/benelux/mark.rb
ADDED
@@ -0,0 +1,37 @@
|
|
1
|
+
module Benelux
|
2
|
+
class Mark < Time
|
3
|
+
attr_accessor :name
|
4
|
+
attr_accessor :thread_id
|
5
|
+
attr_accessor :call_id
|
6
|
+
def self.now(n=nil,c=nil,t=nil)
|
7
|
+
v = super()
|
8
|
+
v.name, v.call_id, v.thread_id = n, c, t
|
9
|
+
v
|
10
|
+
end
|
11
|
+
def inspect(reftime=nil)
|
12
|
+
val = reftime.nil? ? self.to_f : (self.to_f - reftime.to_f)
|
13
|
+
args = [self.class, self.hexoid, self.name, val, thread_id, call_id]
|
14
|
+
"#<%s:%s name=%s at=%f thread_id=%s call_id=%s>" % args
|
15
|
+
end
|
16
|
+
def to_s(reftime=nil)
|
17
|
+
val = reftime.nil? ? self.to_f : (self.to_f - reftime.to_f)
|
18
|
+
val.to_s
|
19
|
+
end
|
20
|
+
def ==(other)
|
21
|
+
return false unless other.respond_to? :call_id
|
22
|
+
self.name == other.name &&
|
23
|
+
self.thread_id == other.thread_id &&
|
24
|
+
self.call_id == other.call_id &&
|
25
|
+
self.to_f == self.to_f
|
26
|
+
end
|
27
|
+
def same_timeline?(other)
|
28
|
+
return false unless other.respond_to? :thread_id
|
29
|
+
self.thread_id == other.thread_id
|
30
|
+
end
|
31
|
+
def same_call?(other)
|
32
|
+
return false unless other.respond_to? :call_id
|
33
|
+
self.thread_id == other.thread_id &&
|
34
|
+
self.call_id == other.call_id
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
@@ -0,0 +1,84 @@
|
|
1
|
+
|
2
|
+
module Benelux
|
3
|
+
#
|
4
|
+
# |------+----+--+----+----|
|
5
|
+
# |
|
6
|
+
# 0.02
|
7
|
+
class Timeline < Array
|
8
|
+
|
9
|
+
def each(*args, &blk)
|
10
|
+
if args.empty?
|
11
|
+
super(&blk)
|
12
|
+
else
|
13
|
+
self.marks(*args).each(&blk)
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
##def between(*names)
|
18
|
+
## name_s, name_e = *names.collect { |n| Benelux.name n }
|
19
|
+
## time_s, time_e = at(name_s), at(name_e)
|
20
|
+
## time_e.first.to_f - time_s.first.to_f
|
21
|
+
##end
|
22
|
+
##def duration(*names)
|
23
|
+
## name = Benelux.name *names
|
24
|
+
## name_s, name_e = "#{name}_a", "#{name}_z"
|
25
|
+
## between(name_s, name_e)
|
26
|
+
##end
|
27
|
+
|
28
|
+
#
|
29
|
+
# obj.region(:execute) =>
|
30
|
+
# [[:execute_a, :execute_z], [:execute_a, :execute_z]]
|
31
|
+
#
|
32
|
+
def regions(*names)
|
33
|
+
|
34
|
+
end
|
35
|
+
|
36
|
+
#
|
37
|
+
# obj.marks(:execute_a, :execute_z, :do_request_a) =>
|
38
|
+
# [:execute_a, :do_request_a, :do_request_a, :execute_z]
|
39
|
+
#
|
40
|
+
def marks(*names)
|
41
|
+
names = names.flatten.collect { |n| n.to_s }
|
42
|
+
self.benelux.select do |mark|
|
43
|
+
names.member? mark.name.to_s
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
def duration(name)
|
48
|
+
name_s = Benelux.name name, SUFFIX_START
|
49
|
+
name_e = Benelux.name name, SUFFIX_END
|
50
|
+
end
|
51
|
+
|
52
|
+
def add_mark(call_id, name)
|
53
|
+
thread_id = Thread.current.object_id.abs
|
54
|
+
mark = Benelux::Mark.now(name, call_id, thread_id)
|
55
|
+
Benelux.thread_timeline << mark
|
56
|
+
self << mark
|
57
|
+
end
|
58
|
+
|
59
|
+
def add_mark_open(call_id, name)
|
60
|
+
add_mark call_id, Benelux.name(name, SUFFIX_START)
|
61
|
+
end
|
62
|
+
|
63
|
+
def add_mark_close(call_id, name)
|
64
|
+
add_mark call_id, Benelux.name(name, SUFFIX_END)
|
65
|
+
end
|
66
|
+
|
67
|
+
def to_line
|
68
|
+
marks = self.sort
|
69
|
+
str, prev = [], marks.first
|
70
|
+
marks.each do |mark|
|
71
|
+
str << "%s(%s):%.4f" % [mark.name, mark.thread_id, mark.to_s(prev)]
|
72
|
+
prev = mark
|
73
|
+
end
|
74
|
+
str.join('; ')
|
75
|
+
end
|
76
|
+
def +(other)
|
77
|
+
self << other
|
78
|
+
self.flatten
|
79
|
+
end
|
80
|
+
# Needs to compare thread id and call id.
|
81
|
+
#def <=>(other)
|
82
|
+
#end
|
83
|
+
end
|
84
|
+
end
|
@@ -0,0 +1,69 @@
|
|
1
|
+
|
2
|
+
group "Benelux"
|
3
|
+
|
4
|
+
library :benelux, 'lib'
|
5
|
+
|
6
|
+
tryouts "Basics" do
|
7
|
+
|
8
|
+
setup do
|
9
|
+
class ::Sleeper
|
10
|
+
def do_something() sleep rand/3 end
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
drill "Add timers to existing objects", true do
|
15
|
+
Benelux.add_timer Sleeper, :do_something
|
16
|
+
Sleeper.new.respond_to? :benelux
|
17
|
+
end
|
18
|
+
|
19
|
+
dream :class, Hash
|
20
|
+
dream { Hash[ Sleeper => [:do_something] ] }
|
21
|
+
drill "Benelux keeps track of timed objects" do
|
22
|
+
Benelux.timed_objects
|
23
|
+
end
|
24
|
+
|
25
|
+
dream [:do_something]
|
26
|
+
drill "A Benelux object has a benelux_timers method" do
|
27
|
+
Sleeper.new.benelux_timers
|
28
|
+
end
|
29
|
+
|
30
|
+
dream :class, Benelux::Timeline
|
31
|
+
dream :size, 10 # 5 * 2 = 10 (marks are stored for the method start and end)
|
32
|
+
drill "Creates a timeline" do
|
33
|
+
sleeper = Sleeper.new
|
34
|
+
5.times { sleeper.do_something }
|
35
|
+
sleeper.benelux
|
36
|
+
end
|
37
|
+
|
38
|
+
dream :size, 4
|
39
|
+
drill "Timelines are stored per object" do
|
40
|
+
sleeper = Sleeper.new
|
41
|
+
Thread.new do
|
42
|
+
2.times { sleeper.do_something }
|
43
|
+
end.join
|
44
|
+
sleeper.benelux
|
45
|
+
end
|
46
|
+
|
47
|
+
dream :class, Benelux::Timeline
|
48
|
+
dream :size, 10
|
49
|
+
drill "Creates a timeline for the thread" do
|
50
|
+
Benelux.thread_timeline
|
51
|
+
end
|
52
|
+
|
53
|
+
dream :class, Benelux::Timeline
|
54
|
+
dream :size, 14
|
55
|
+
drill "Creates a global timeline" do
|
56
|
+
Benelux.timeline
|
57
|
+
end
|
58
|
+
|
59
|
+
end
|
60
|
+
|
61
|
+
|
62
|
+
tryouts "Not supported" do
|
63
|
+
|
64
|
+
dream :exception, Benelux::NotSupported
|
65
|
+
drill "Class is not supported" do
|
66
|
+
Benelux.add_timer Class, :new
|
67
|
+
end
|
68
|
+
|
69
|
+
end
|
metadata
ADDED
@@ -0,0 +1,79 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: benelux
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.2.0.001
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Delano Mandelbaum
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
|
12
|
+
date: 2009-09-21 00:00:00 -04:00
|
13
|
+
default_executable:
|
14
|
+
dependencies:
|
15
|
+
- !ruby/object:Gem::Dependency
|
16
|
+
name: hexoid
|
17
|
+
type: :runtime
|
18
|
+
version_requirement:
|
19
|
+
version_requirements: !ruby/object:Gem::Requirement
|
20
|
+
requirements:
|
21
|
+
- - ">="
|
22
|
+
- !ruby/object:Gem::Version
|
23
|
+
version: "0"
|
24
|
+
version:
|
25
|
+
description: "Benelux: Little freakin' timers for your Ruby codes"
|
26
|
+
email: delano@solutious.com
|
27
|
+
executables: []
|
28
|
+
|
29
|
+
extensions: []
|
30
|
+
|
31
|
+
extra_rdoc_files:
|
32
|
+
- README.rdoc
|
33
|
+
- LICENSE.txt
|
34
|
+
- CHANGES.txt
|
35
|
+
files:
|
36
|
+
- CHANGES.txt
|
37
|
+
- LICENSE.txt
|
38
|
+
- README.rdoc
|
39
|
+
- Rakefile
|
40
|
+
- benelux.gemspec
|
41
|
+
- lib/benelux.rb
|
42
|
+
- lib/benelux/mark.rb
|
43
|
+
- lib/benelux/mixins/thread.rb
|
44
|
+
- lib/benelux/timeline.rb
|
45
|
+
- tryouts/basic_tryouts.rb
|
46
|
+
has_rdoc: true
|
47
|
+
homepage: http://github.com/delano/benelux
|
48
|
+
licenses: []
|
49
|
+
|
50
|
+
post_install_message:
|
51
|
+
rdoc_options:
|
52
|
+
- --line-numbers
|
53
|
+
- --title
|
54
|
+
- "Benelux: Little freakin' timers for your Ruby codes"
|
55
|
+
- --main
|
56
|
+
- README.rdoc
|
57
|
+
require_paths:
|
58
|
+
- lib
|
59
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
60
|
+
requirements:
|
61
|
+
- - ">="
|
62
|
+
- !ruby/object:Gem::Version
|
63
|
+
version: "0"
|
64
|
+
version:
|
65
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
66
|
+
requirements:
|
67
|
+
- - ">="
|
68
|
+
- !ruby/object:Gem::Version
|
69
|
+
version: "0"
|
70
|
+
version:
|
71
|
+
requirements: []
|
72
|
+
|
73
|
+
rubyforge_project: benelux
|
74
|
+
rubygems_version: 1.3.2
|
75
|
+
signing_key:
|
76
|
+
specification_version: 3
|
77
|
+
summary: "Benelux: Little freakin' timers for your Ruby codes"
|
78
|
+
test_files: []
|
79
|
+
|