automatthew-stevedore 0.1.0 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
data/README CHANGED
@@ -0,0 +1,57 @@
1
+ Stevedore is a tool for performing and comparing sets of benchmarks based on similar setup and teardown needs. Instances use their class's setup/teardown where available, and you can set or override these methods per instance.
2
+
3
+ Steve (and his subclasses, naturally) track any instances created and can run a comparison using Steve.compare_instances. If the R language is available, you can do a power analysis using the data from a trial run to suggest sample sizes and number of runs needed to meet certain figures of statistical reliability.
4
+
5
+ Steve uses the rsruby gem, if available, for basic stats and power analysis. As the rsruby gem uses a C extension, this could be problematic for non-MRI Rubys. In the absence of rsruby, stevedore uses bmarini-mathstats for the basic stats and attempts to shell out to R for power analysis (i.e. power.t.test)
6
+
7
+
8
+ class StringConcat < Stevedore
9
+ before_sample do
10
+ ...
11
+ end
12
+ after_sample do
13
+ ...
14
+ end
15
+ end
16
+
17
+ plus = StringConcat.new "Combining strings with +" do
18
+ measure do
19
+ 10000.times do
20
+ "supercalifragilisticexpiali" + "docious"
21
+ end
22
+ end
23
+ end
24
+
25
+ append = StringConcat.new "Combining strings with <<" do
26
+ measure do
27
+ 10000.times do
28
+ "supercalifragilisticexpiali" << "docious"
29
+ end
30
+ end
31
+ end
32
+
33
+ interpolate = StringConcat.new "Combining strings with interpolation" do
34
+ measure do
35
+ 10000.times do
36
+ "supercalifragilisticexpiali#{'docious'}"
37
+ end
38
+ end
39
+ end
40
+
41
+ run_count, sample_size = 3, 8
42
+
43
+ puts "Measuring #{run_count} runs of #{sample_size} for each test."
44
+ StringConcat.run([append, interpolate], run_count, sample_size)
45
+ puts
46
+ StringConcat.report([append, interpolate]) => putses the following:
47
+
48
+
49
+ Combining strings
50
+
51
+ Mean Stddev Minimum Median Max
52
+ --------------------------------------------------------------------------------------
53
+ interpolating strings 0.003064 0.002386 0.001356 0.001682 0.008544
54
+ appending strings 0.009267 0.002933 0.005337 0.010756 0.013299
55
+ Ratio of means: 3.02487110476993
56
+
57
+
data/Rakefile CHANGED
@@ -1,6 +1,4 @@
1
- require 'rubygems'
2
-
3
- Version = '0.1.0'
1
+ Version = '0.2.0'
4
2
 
5
3
  task :default => [ :test ]
6
4
 
@@ -9,9 +7,9 @@ begin
9
7
  require 'echoe'
10
8
  Echoe.new('stevedore', Version) do |p|
11
9
  p.project = 'stevedore'
12
- p.summary = "Benchmarking with a whiff of statistical awareness"
10
+ p.summary = "Benchmarking framework with some statistickal stuff"
13
11
  p.author = "Matthew King"
14
- p.email = "automatthew@gmail.com"
12
+ p.email = "self@automatthew.com"
15
13
  p.ignore_pattern = /^(\.git).+/
16
14
  p.test_pattern = "test/*.rb"
17
15
  end
@@ -0,0 +1,49 @@
1
+ require 'rubygems'
2
+ $:.unshift "#{File.dirname(__FILE__)}/../lib"
3
+ require 'stevedore'
4
+
5
+ class StringConcat < Steve
6
+ subject "Combining strings"
7
+ end
8
+
9
+ plus = StringConcat.new "plus" do
10
+
11
+ measure do
12
+ 10000.times do
13
+ "supercalifragilisticexpiali" + "docious"
14
+ end
15
+ end
16
+
17
+ end
18
+
19
+ append = StringConcat.new "appending strings" do
20
+
21
+ measure do
22
+ 10000.times do
23
+ "supercalifragilisticexpiali" << "docious"
24
+ end
25
+ end
26
+
27
+ end
28
+
29
+ interpolate = StringConcat.new "interpolating strings" do
30
+
31
+ measure do
32
+ 10000.times do
33
+ "supercalifragilisticexpiali#{'docious'}"
34
+ end
35
+ end
36
+
37
+ end
38
+
39
+ # append.load("append")
40
+ # interpolate.load("interpolate")
41
+
42
+ run_count, sample_size = 3, 8
43
+
44
+ puts "Measuring #{run_count} runs of #{sample_size} for each test."
45
+ StringConcat.run([append, interpolate], run_count, sample_size)
46
+ puts
47
+ StringConcat.report([append, interpolate])
48
+ append.dump
49
+ interpolate.dump
@@ -25,7 +25,5 @@ multi_eval = Stevedore.new "instance_eval &block multiple times" do
25
25
  end
26
26
 
27
27
  Stevedore.compare_instances(5, 10)
28
- puts
29
- puts
30
- Stevedore.recommend_test_size(2, 4)
28
+
31
29
 
@@ -5,15 +5,20 @@ require 'rsruby'
5
5
  $:.unshift "#{File.dirname(__FILE__)}/../lib"
6
6
  require 'stevedore'
7
7
 
8
- array = YAML.load_file("data.yml")
8
+ srand(2009)
9
+ array = (1..2000).to_a.map { |i| rand(800.0) }
9
10
 
10
- # rstats_sd = Stevedore.new "rstats standard deviation" do
11
- #
12
- # measure do
13
- # array.standard_deviation
14
- # end
15
- #
16
- # end
11
+ rsruby = Stevedore.new "rsruby standard deviation" do
12
+
13
+ before do
14
+ @r = RSRuby.instance
15
+ end
16
+
17
+ measure do
18
+ @r.sd(array)
19
+ end
20
+
21
+ end
17
22
 
18
23
  mathstats = Stevedore.new "mathstats standard deviation" do
19
24
 
@@ -23,19 +28,16 @@ mathstats = Stevedore.new "mathstats standard deviation" do
23
28
 
24
29
  end
25
30
 
26
- rsruby = Stevedore.new "rsruby standard deviation" do
27
-
31
+ steve_stats = Stevedore.new "steve's own stats" do
28
32
  before do
29
- @r = RSRuby.instance
33
+ array.extend Stevedore::Stats
30
34
  end
31
-
32
35
  measure do
33
- @r.sd(array)
36
+ array.standard_deviation
34
37
  end
35
-
36
38
  end
37
39
 
38
40
 
39
- Stevedore.compare_instances(5, 10)
41
+ Stevedore.compare_instances(5, 25)
40
42
 
41
43
 
@@ -0,0 +1,64 @@
1
+ require 'rubygems'
2
+ $:.unshift "#{File.dirname(__FILE__)}/../lib"
3
+ require 'stevedore'
4
+
5
+
6
+ def variance_two_pass(array, mean)
7
+ n = array.size
8
+ denom = n - 1
9
+ variance = array.inject(0) {|memo, element| memo + (element - mean)**2 } / denom
10
+ end
11
+
12
+ def my_var(array, mean)
13
+ n = array.size
14
+ denom = n - 1
15
+ s = 0
16
+ array.each { |element| s = s + (element - mean)**2; }
17
+ s / denom
18
+ end
19
+
20
+ def for_var(array, mean)
21
+ n = array.size
22
+ denom = n - 1
23
+ s = 0
24
+ for element in array
25
+ s = s + (element - mean)**2
26
+ end
27
+ s / denom
28
+ end
29
+
30
+
31
+
32
+
33
+ class Variances < Steve
34
+ subject = "Calculating a statistical variance"
35
+ before do
36
+ srand(2009)
37
+ @array = (1..2000).to_a.map { |i| rand(800.0) }
38
+ s = 0; @array.each { |element| s = s + element }
39
+ @sum = s
40
+ @mean = @sum / @array.size.to_f
41
+ end
42
+ end
43
+
44
+
45
+ mathstats = Variances.new "bmarini-mathstats" do
46
+ measure do
47
+ @var = variance_two_pass(@array, @mean)
48
+ end
49
+ end
50
+
51
+ no_inject = Variances.new "not using inject" do
52
+ measure do
53
+ @var = my_var(@array, @mean)
54
+ end
55
+ end
56
+
57
+ for_loop = Variances.new "using for loop" do
58
+ measure do
59
+ @var = for_var(@array, @mean)
60
+ end
61
+ end
62
+
63
+ Variances.run_all( 8, 500)
64
+ Variances.report_all
@@ -17,7 +17,11 @@ class Stevedore
17
17
  val ? @delta = val : @delta ||= 0.001
18
18
  end
19
19
 
20
+ def self.subject(val=nil)
21
+ @subject ||= val
22
+ end
20
23
 
24
+ # Heritable blocks for setup and measurement
21
25
  def self.before(&block)
22
26
  block ? @before = block : @before
23
27
  end
@@ -42,28 +46,52 @@ class Stevedore
42
46
  block ? @after_measure = block : @after_measure
43
47
  end
44
48
 
45
- def self.compare_instances(run_count, sample_size)
46
- puts "Measuring #{run_count} runs of #{sample_size} for each instance.\n\n"
47
- @instances.each do |instance|
48
- puts "'#{instance.name}'"
49
+ def self.run(instances, run_count, sample_size)
50
+ instances.each do |instance|
49
51
  instance.go(run_count, sample_size)
50
52
  end
53
+ end
54
+
55
+ def self.run_all(run_count, sample_size)
56
+ run(@instances, run_count, sample_size)
57
+ end
58
+
59
+ def self.report_all
60
+ report(@instances)
61
+ end
62
+
63
+ def self.report(instances)
64
+ puts @subject if @subject
51
65
  name_size = @instances.map { |i| i.name.size }.max
52
- puts "\n%-#{name_size}s %12s %12s %12s %12s %12s" % %w{ Name Mean Stddev Minimum Median Max }
66
+ puts "\n%-#{name_size}s %12s %12s %12s %12s %12s" % ["", "Mean", "Stddev", "Minimum", "Median", "Max"]
53
67
  puts "-" * (name_size + 5 * 13)
54
- @instances.each do |instance|
68
+ instances.sort_by { |i| i.mean }.each do |instance|
55
69
  puts "%-#{name_size}s %12f %12f %12f %12f %12f" %
56
70
  [ instance.name, instance.mean, instance.standard_deviation, instance.min, instance.median, instance.max]
57
71
  end
72
+ means = instances.map { |i| i.mean }.sort
73
+ baseline = means.shift
74
+ diffs = means.map { |m| m / baseline }
75
+ puts "Ratio of means: #{diffs.join(', ')}"
58
76
  puts
59
77
  end
60
78
 
79
+ def self.compare_instances(run_count, sample_size)
80
+ puts
81
+ puts "Benchmark: #{@subject}" if @subject
82
+ puts
83
+ puts "Measuring #{run_count} runs of #{sample_size} for each test."
84
+ self.run_all(run_count, sample_size)
85
+ puts
86
+ self.report_all
87
+ end
88
+
61
89
  # Run a small set of samples and use a power test to determine
62
90
  # the optimal run count and sample size.
63
91
  def self.recommend_test_size(run_count, sample_size)
64
92
  puts "\nRunning trials (#{run_count} runs of #{sample_size}) for each instance.\n\n"
65
93
  @instances.each do |instance|
66
- print "'#{instance.name}'"
94
+ puts "'#{instance.name}'"
67
95
  instance.go(run_count, sample_size)
68
96
  puts " Mean: %6f" % instance.mean
69
97
  puts " Stddev: %6f" % instance.standard_deviation
@@ -83,4 +111,15 @@ class Stevedore
83
111
  Stevedore::Stats.power_test(args)["n"].to_i
84
112
  end
85
113
 
114
+ def self.calculated_power(n, d, std)
115
+ args = { :n => n, :delta => d, :sig_level => sig_level, :sd => std }
116
+ puts args.inspect
117
+ Stevedore::Stats.power_test(args)["power"]
118
+ end
119
+
120
+ def self.calculated_delta(n, std)
121
+ args = { :n => n, :power => power, :sig_level => sig_level, :sd => std }
122
+ Stevedore::Stats.power_test(args)["delta"]
123
+ end
124
+
86
125
  end
@@ -1,3 +1,4 @@
1
+ require 'fileutils'
1
2
  class Stevedore
2
3
 
3
4
  attr_accessor :name, :description, :samples
@@ -9,7 +10,7 @@ class Stevedore
9
10
  @before_measure, @after_measure = klass.before_measure, klass.after_measure
10
11
  @before_sample, @after_sample = klass.before_sample, klass.after_sample
11
12
  @name, @description = name, description
12
- @samples = []
13
+ @samples = Sample.new
13
14
  instance_eval( &block ) if block
14
15
  end
15
16
 
@@ -18,10 +19,33 @@ class Stevedore
18
19
  end
19
20
 
20
21
  def reset
21
- @samples = []
22
- @flattened_samples = []
22
+ @samples = Sample.new
23
+ @flat = nil
23
24
  end
24
25
 
26
+ def dump_path(name)
27
+ "stevedata/#{name.gsub(/\W+/, '_')}.yaml"
28
+ end
29
+
30
+ # Dump sample data to file in YAML format
31
+ def dump(path=nil)
32
+ filename = ( path || dump_path(@name))
33
+ FileUtils.mkdir_p(File.dirname(filename))
34
+ data = {}
35
+ @samples.each_with_index { |s, i| data[i] = s.to_a }
36
+ File.open filename, "w" do |f|
37
+ ::YAML.dump(data, f)
38
+ end
39
+ end
40
+
41
+ def load(name)
42
+ filename = dump_path(name)
43
+ File.open(filename, 'r') do |f|
44
+ @samples = ::YAML.load(f)
45
+ end
46
+ end
47
+
48
+
25
49
  # Blocks for setup and measurement
26
50
 
27
51
  def before(&block); @before = block; end
@@ -36,62 +60,52 @@ class Stevedore
36
60
 
37
61
  def after_measure(&block); @after_measure = block; end
38
62
 
63
+ # Here you do the work you actually want to measure.
39
64
  def measure(&block); @measure = block; end
40
65
 
41
66
  def go(run_count, sample_size)
42
67
  reset
43
68
  instance_eval( &@before ) if @before
44
69
 
45
- run_count.times do |i|
46
- sample = []
70
+ run_count.times do
71
+ sample = Sample.new
47
72
  instance_eval( &@before_sample ) if @before_sample
48
73
 
74
+ print "."; $stdout.flush
49
75
  sample_size.times do
50
76
  instance_eval( &@before_measure ) if @before_measure
51
- sample << Benchmark.realtime do
52
- instance_eval( &@measure )
53
- end
77
+
78
+ sample << Benchmark.realtime { instance_eval( &@measure ) }
79
+
54
80
  instance_eval( &@after_measure ) if @after_measure
55
81
  end
56
-
57
82
  instance_eval( &@after_sample ) if @after_sample
58
83
  @samples << sample
59
84
  end
60
-
85
+ puts; $stdout.flush
61
86
  instance_eval( &@after ) if @after
62
87
  end
63
88
 
64
89
  def report
65
90
  puts self.name
66
- puts "#{run_count} sample runs, #{sample_size} measurements each"
67
91
  puts " Mean: #{self.mean}"
68
92
  puts " Standard deviation: #{self.standard_deviation}"
69
93
  puts
70
94
  end
71
95
 
72
- def mean
73
- self.flattened_samples.mean
74
- end
96
+ def mean; @samples.mean; end
75
97
 
76
- def median
77
- self.flattened_samples.median
78
- end
98
+ def median; @samples.median; end
79
99
 
80
- def min
81
- self.flattened_samples.min
82
- end
100
+ def min; @samples.min; end
83
101
 
84
- def max
85
- self.flattened_samples.max
86
- end
102
+ def max; @samples.max; end
87
103
 
88
- def standard_deviation
89
- self.flattened_samples.standard_deviation
90
- end
104
+ def standard_deviation; @samples.standard_deviation; end
91
105
 
92
- def sample_means
93
- @samples.map { |s| s.mean }
94
- end
106
+ def sample_means; @samples.map { |s| s.mean }; end
107
+
108
+ def sample_sds; @samples.map { |s| s.standard_deviation }; end
95
109
 
96
110
 
97
111
 
@@ -3,34 +3,21 @@ class Stevedore
3
3
 
4
4
  module RSRuby
5
5
 
6
- def rsruby
6
+ def self.rsruby
7
7
  @rsruby ||= ::RSRuby.instance
8
8
  end
9
9
 
10
- def mean
11
- rsruby.mean(self)
10
+ def rsruby
11
+ @rsruby ||= ::RSRuby.instance
12
12
  end
13
13
 
14
- def standard_deviation
15
- rsruby.sd(self)
16
- end
14
+ def mean; rsruby.mean(self); end
17
15
 
18
- def median
19
- rsruby.median(self)
20
- end
16
+ def standard_deviation; rsruby.sd(self); end
21
17
 
22
- def self.rsruby
23
- @rsruby ||= ::RSRuby.instance
24
- end
18
+ def median; rsruby.median(self); end
25
19
 
26
- def self.power_test(args)
27
- delta, power, sig_level, sd = args[:delta], args[:power], args[:sig_level], args[:sd]
28
- if sd < 0.00007
29
- warn "Stddev is very small, which makes power.t.test sad. \nSetting stddev to 0.00007 so we can get this done."
30
- sd = 0.00007
31
- end
32
- rsruby.power_t_test( :delta => delta, :power => power, :sig_level => sig_level, :sd => sd)
33
- end
20
+ def self.power_test(args); rsruby.power_t_test( args ); end
34
21
 
35
22
  end
36
23
 
@@ -0,0 +1,38 @@
1
+ begin
2
+ require 'stevedore/rsruby'
3
+ Stats = Stevedore::RSRuby
4
+ rescue LoadError
5
+ require 'stevedore/stats'
6
+ end
7
+
8
+ class Stevedore
9
+
10
+ class Sample < Array
11
+ include Stats
12
+
13
+ attr_reader :flat
14
+
15
+ alias :old_to_a :to_a
16
+ alias :old_mean :mean
17
+ alias :old_sd :standard_deviation
18
+ alias :old_median :median
19
+ alias :old_min :min
20
+ alias :old_max :max
21
+
22
+ def to_a
23
+ self.map { |a| a.is_a?( Sample ) ? a.to_a : a }
24
+ end
25
+
26
+ def mean; (@flat ||= self.flatten).old_mean; end
27
+
28
+ def standard_deviation; (@flat ||= self.flatten).old_sd; end
29
+
30
+ def median; (@flat ||= self.flatten).old_median; end
31
+
32
+ def min; (@flat ||= self.flatten).old_min; end
33
+
34
+ def max; (@flat ||= self.flatten).old_max; end
35
+
36
+ end
37
+
38
+ end
@@ -34,7 +34,5 @@ class Stevedore
34
34
  Hash[*r]
35
35
  end
36
36
 
37
-
38
-
39
37
  end
40
38
  end
@@ -1,30 +1,41 @@
1
1
  class Stevedore
2
2
 
3
- begin
4
- require 'stevedore/rsruby'
5
- Stats = Stevedore::RSRuby
6
- puts "Stevedore will use RSRuby"
7
- rescue
8
- require 'mathstats'
9
- Stats = Mathstats
10
- module Stats
11
- unless defined?(median)
12
- def median
13
- sorted = self.sort; i = sorted.size % 2
14
- case i
15
- when 0 then sorted[i/2 - 1, 2].mean
16
- when 1 then sorted[i/2].to_f
17
- end if sorted.size > 0
18
- end
19
- end
20
- def self.power_test(*args)
21
- Stevedore::ShellR.new.power_test(*args)
22
- end
3
+ module Stats
4
+
5
+ def sum
6
+ s = 0; self.each { |element| s = s + element }; s
23
7
  end
24
- puts "Stevedore will use Mathstats"
8
+
9
+ def mean
10
+ self.sum.to_f / self.size
11
+ end
12
+
13
+ def variance
14
+ n = self.size
15
+ denom = n - 1
16
+ m = self.mean
17
+ s = 0
18
+ self.each { |element| s = s + (element - m)**2; }
19
+ s / denom
20
+ end
21
+
22
+ def standard_deviation
23
+ Math.sqrt( self.variance )
24
+ end
25
+
26
+ def median
27
+ sorted = self.sort; i = sorted.size % 2
28
+ case i
29
+ when 0 then sorted[i/2 - 1, 2].mean
30
+ when 1 then sorted[i/2].to_f
31
+ end if sorted.size > 0
32
+ end
33
+
34
+ def self.power_test(*args)
35
+ Stevedore::ShellR.new.power_test(*args)
36
+ end
37
+
25
38
  end
26
-
27
- Array.send :include, Stats
28
39
 
29
40
  end
30
41
 
data/lib/stevedore.rb CHANGED
@@ -1,11 +1,9 @@
1
1
  require 'benchmark'
2
- require 'stevedore/stats'
2
+ require 'yaml'
3
+ require 'stevedore/sample'
3
4
  require 'stevedore/shell_r'
4
5
  require 'stevedore/class'
5
6
  require 'stevedore/instance'
6
7
 
7
- class Stevedore
8
-
9
- end
10
-
11
- Steve = Stevedore
8
+ class Stevedore; end
9
+ Steve = Stevedore
data/stevedore.gemspec CHANGED
@@ -2,22 +2,22 @@
2
2
 
3
3
  Gem::Specification.new do |s|
4
4
  s.name = %q{stevedore}
5
- s.version = "0.1.0"
5
+ s.version = "0.2.0"
6
6
 
7
7
  s.required_rubygems_version = Gem::Requirement.new(">= 1.2") if s.respond_to? :required_rubygems_version=
8
8
  s.authors = ["Matthew King"]
9
- s.date = %q{2009-01-01}
10
- s.description = %q{Benchmarking with a whiff of statistical awareness}
11
- s.email = %q{automatthew@gmail.com}
12
- s.extra_rdoc_files = ["lib/stevedore/class.rb", "lib/stevedore/instance.rb", "lib/stevedore/rsruby.rb", "lib/stevedore/shell_r.rb", "lib/stevedore/stats.rb", "lib/stevedore.rb", "README"]
13
- s.files = ["examples/data.yml", "examples/instance_eval.rb", "examples/stats_libs.rb", "lib/stevedore/class.rb", "lib/stevedore/instance.rb", "lib/stevedore/rsruby.rb", "lib/stevedore/shell_r.rb", "lib/stevedore/stats.rb", "lib/stevedore.rb", "Manifest", "Rakefile", "README", "stevedore.gemspec", "test/helper.rb", "test/test_R.rb", "test/test_sample.rb"]
9
+ s.date = %q{2009-02-09}
10
+ s.description = %q{Benchmarking framework with some statistickal stuff}
11
+ s.email = %q{self@automatthew.com}
12
+ s.extra_rdoc_files = ["lib/stevedore/class.rb", "lib/stevedore/instance.rb", "lib/stevedore/rsruby.rb", "lib/stevedore/sample.rb", "lib/stevedore/shell_r.rb", "lib/stevedore/stats.rb", "lib/stevedore.rb", "README"]
13
+ s.files = ["examples/aliasing.rb", "examples/concat.rb", "examples/data.yml", "examples/instance_eval.rb", "examples/stats_libs.rb", "examples/stevedata/appending_strings.yaml", "examples/stevedata/interpolating_strings.yaml", "examples/variance.rb", "lib/stevedore/class.rb", "lib/stevedore/instance.rb", "lib/stevedore/rsruby.rb", "lib/stevedore/sample.rb", "lib/stevedore/shell_r.rb", "lib/stevedore/stats.rb", "lib/stevedore.rb", "Manifest", "Rakefile", "README", "stevedore.gemspec", "test/helper.rb", "test/test_R.rb", "test/test_sample.rb"]
14
14
  s.has_rdoc = true
15
15
  s.homepage = %q{}
16
16
  s.rdoc_options = ["--line-numbers", "--inline-source", "--title", "Stevedore", "--main", "README"]
17
17
  s.require_paths = ["lib"]
18
18
  s.rubyforge_project = %q{stevedore}
19
19
  s.rubygems_version = %q{1.3.1}
20
- s.summary = %q{Benchmarking with a whiff of statistical awareness}
20
+ s.summary = %q{Benchmarking framework with some statistickal stuff}
21
21
  s.test_files = ["test/helper.rb", "test/test_R.rb", "test/test_sample.rb"]
22
22
 
23
23
  if s.respond_to? :specification_version then
data/test/helper.rb CHANGED
@@ -1,4 +1,4 @@
1
- %w{ rubygems bacon facon }.each { |dep| require dep }
1
+ %w{ bacon facon }.each { |dep| require dep }
2
2
 
3
3
  Bacon.extend Bacon::TestUnitOutput
4
4
  Bacon.summary_on_exit
data/test/test_sample.rb CHANGED
@@ -6,7 +6,7 @@ describe "Stevedore::Sample" do
6
6
 
7
7
  before do
8
8
  @sample = Sample.new((1..40).to_a)
9
- @nested_sample = Sample.new [@sample, @sample, @sample ]
9
+ @nested_sample = Sample.new [Sample.new((1..40).to_a), Sample.new((1..40).to_a), Sample.new((1..40).to_a) ]
10
10
  end
11
11
 
12
12
  it "a flattened Sample is still a Sample" do
@@ -24,4 +24,10 @@ describe "Stevedore::Sample" do
24
24
  @nested_sample.standard_deviation.to_i.should == 11
25
25
  end
26
26
 
27
+ it "can become simple arrays" do
28
+ @nested_sample.to_a.each do |a|
29
+ a.class.should == Array
30
+ end
31
+ end
32
+
27
33
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: automatthew-stevedore
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Matthew King
@@ -9,7 +9,7 @@ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
11
 
12
- date: 2009-01-01 00:00:00 -08:00
12
+ date: 2009-02-09 00:00:00 -08:00
13
13
  default_executable:
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
@@ -21,8 +21,8 @@ dependencies:
21
21
  - !ruby/object:Gem::Version
22
22
  version: "0"
23
23
  version:
24
- description: Benchmarking with a whiff of statistical awareness
25
- email: automatthew@gmail.com
24
+ description: Benchmarking framework with some statistickal stuff
25
+ email: self@automatthew.com
26
26
  executables: []
27
27
 
28
28
  extensions: []
@@ -31,17 +31,24 @@ extra_rdoc_files:
31
31
  - lib/stevedore/class.rb
32
32
  - lib/stevedore/instance.rb
33
33
  - lib/stevedore/rsruby.rb
34
+ - lib/stevedore/sample.rb
34
35
  - lib/stevedore/shell_r.rb
35
36
  - lib/stevedore/stats.rb
36
37
  - lib/stevedore.rb
37
38
  - README
38
39
  files:
40
+ - examples/aliasing.rb
41
+ - examples/concat.rb
39
42
  - examples/data.yml
40
43
  - examples/instance_eval.rb
41
44
  - examples/stats_libs.rb
45
+ - examples/stevedata/appending_strings.yaml
46
+ - examples/stevedata/interpolating_strings.yaml
47
+ - examples/variance.rb
42
48
  - lib/stevedore/class.rb
43
49
  - lib/stevedore/instance.rb
44
50
  - lib/stevedore/rsruby.rb
51
+ - lib/stevedore/sample.rb
45
52
  - lib/stevedore/shell_r.rb
46
53
  - lib/stevedore/stats.rb
47
54
  - lib/stevedore.rb
@@ -82,7 +89,7 @@ rubyforge_project: stevedore
82
89
  rubygems_version: 1.2.0
83
90
  signing_key:
84
91
  specification_version: 2
85
- summary: Benchmarking with a whiff of statistical awareness
92
+ summary: Benchmarking framework with some statistickal stuff
86
93
  test_files:
87
94
  - test/helper.rb
88
95
  - test/test_R.rb