bullshit 0.1.0 → 0.1.1

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 ADDED
@@ -0,0 +1,8 @@
1
+ 2009-10-17 (0.1.1)
2
+ * Added the display of a speedup matrix in the comparison.
3
+ * Added a bs_compare executble in order to compare data files.
4
+ * A lot of smaller changes, esp. make comparing more robust by skipping
5
+ unavailable data files.
6
+ * throw_raise example added.
7
+ 2009-08-31 (0.1.0)
8
+ * Initial Release Version
data/README ADDED
@@ -0,0 +1,25 @@
1
+ = Bullshit - Benchmarking in Ruby
2
+
3
+ == Description
4
+
5
+ == Usage
6
+
7
+ == Example
8
+
9
+ TODO
10
+
11
+ == Download
12
+
13
+ The homepage of this library is located at
14
+
15
+ * http://flori.github.com/bullshit
16
+
17
+ == Author
18
+
19
+ Florian Frank mailto:flori@ping.de
20
+
21
+ == License
22
+
23
+ This is free software; you can redistribute it and/or modify it under the
24
+ terms of the GNU General Public License Version 2 as published by the Free
25
+ Software Foundation: www.gnu.org/copyleft/gpl.html
data/Rakefile CHANGED
@@ -33,41 +33,30 @@ task :doc do
33
33
  end
34
34
 
35
35
  if defined? Gem
36
- spec_src = <<GEM
37
- # -*- encoding: utf-8 -*-
38
- Gem::Specification.new do |s|
39
- s.name = '#{PKG_NAME}'
40
- s.version = '#{PKG_VERSION}'
41
- s.summary = "Benchmarking is Bullshit"
42
- s.description = ""
36
+ spec = Gem::Specification.new do |s|
37
+ s.name = PKG_NAME
38
+ s.version = PKG_VERSION
39
+ s.summary = "Benchmarking is Bullshit"
40
+ s.description = ""
43
41
 
44
- s.add_dependency('dslkit', '>= 0.2.5')
42
+ s.add_dependency('dslkit', '>= 0.2.5')
45
43
 
46
- s.files = #{PKG_FILES.to_a.sort.inspect}
44
+ s.files = PKG_FILES
47
45
 
48
- s.require_path = 'lib'
46
+ s.require_path = 'lib'
47
+ s.executables = 'bs_compare'
49
48
 
50
- s.has_rdoc = true
51
- s.rdoc_options <<
52
- '--title' << 'Bullshit -- Benchmarking in Ruby' <<
53
- '--line-numbers'
54
- s.test_files = #{Dir['tests/*.rb'].to_a.sort.inspect}
49
+ s.has_rdoc = true
50
+ s.rdoc_options <<
51
+ '--title' << 'Bullshit -- Benchmarking in Ruby' << '--main' << 'README'
52
+ s.test_files = Dir['tests/*.rb']
55
53
 
56
- s.author = "Florian Frank"
57
- s.email = "flori@ping.de"
58
- s.homepage = "http://#{PKG_NAME}.rubyforge.org"
59
- s.rubyforge_project = "#{PKG_NAME}"
60
- end
61
- GEM
62
-
63
- desc 'Create a gemspec file'
64
- task :gemspec do
65
- File.open("#{PKG_NAME}.gemspec", 'w') do |f|
66
- f.puts spec_src
67
- end
54
+ s.author = "Florian Frank"
55
+ s.email = "flori@ping.de"
56
+ s.homepage = "http://flori.github.com/#{PKG_NAME}"
57
+ s.rubyforge_project = PKG_NAME
68
58
  end
69
59
 
70
- spec = eval(spec_src)
71
60
  Rake::GemPackageTask.new(spec) do |pkg|
72
61
  pkg.need_tar = true
73
62
  pkg.package_files += PKG_FILES
@@ -91,6 +80,6 @@ EOT
91
80
  end
92
81
  end
93
82
 
94
- task :default => [ :version, :gemspec, :test ]
83
+ task :default => [ :version, :test ]
95
84
 
96
- task :release => [ :clobber, :version, :gemspec, :package ]
85
+ task :release => [ :clobber, :version, :package ]
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.1.0
1
+ 0.1.1
data/bin/bs_compare ADDED
@@ -0,0 +1,21 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'bullshit'
4
+ Bullshit::Case.autorun false
5
+
6
+ bs_cases_methods = []
7
+ for filename in ARGV
8
+ if filename =~ /\.rb\Z/
9
+ warn "Loading #{filename}."
10
+ load filename
11
+ next
12
+ end
13
+ basename = File.basename(filename)
14
+ basename =~ /\A([^-]+)#([^-]+)\.dat\Z/ or next
15
+ bs_cases_methods << [ $1, $2, filename ]
16
+ end
17
+ Bullshit.compare do
18
+ bs_cases_methods.each do |c, m, f|
19
+ benchmark Object.const_get(c), m.to_sym, :load => f
20
+ end
21
+ end
data/examples/compare.rb CHANGED
@@ -1,9 +1,9 @@
1
1
  #!/usr/bin/env ruby
2
2
 
3
3
  require 'bullshit'
4
- require File.join(File.dirname(__FILE__), 'fibonacci')
4
+ load File.join(File.dirname(__FILE__), 'fibonacci.rb')
5
5
 
6
- FibonacciBenchmark.run # to demonstrate loading
6
+ FibonacciBenchmark.run false # to demonstrate loading, do not compare yet
7
7
 
8
8
  Bullshit.compare do
9
9
  benchmark FibonacciBenchmark, :fib_iter, :load => yes
@@ -0,0 +1,35 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'bullshit'
4
+
5
+ class ThrowRaise < Bullshit::RepeatCase
6
+ compare_time real
7
+ warmup yes
8
+ iterations 100
9
+
10
+ N = 2_000
11
+
12
+ autocorrelation yes
13
+
14
+ output_dir 'data'
15
+ data_file yes
16
+
17
+ #output_filename "#{benchmark_name}.log"
18
+
19
+ def benchmark_throw
20
+ N.times do
21
+ catch(:foo) do
22
+ throw :foo
23
+ end
24
+ end
25
+ end
26
+
27
+ def benchmark_raise
28
+ N.times do
29
+ begin
30
+ raise 'foo'
31
+ rescue
32
+ end
33
+ end
34
+ end
35
+ end
data/lib/bullshit.rb CHANGED
@@ -1,32 +1,3 @@
1
- # = Bullshit - Benchmarking in Ruby
2
- #
3
- # == Description
4
- #
5
- # == Usage
6
- #
7
- # == Author
8
- #
9
- # Florian Frank mailto:flori@ping.de
10
- #
11
- # == License
12
- #
13
- # This is free software; you can redistribute it and/or modify it under the
14
- # terms of the GNU General Public License Version 2 as published by the Free
15
- # Software Foundation: www.gnu.org/copyleft/gpl.html
16
- #
17
- # == Download
18
- #
19
- # The latest version of this library can be downloaded at
20
- #
21
- # * http://rubyforge.org/frs/?group_id=8323
22
- #
23
- # The homepage of this library is located at
24
- #
25
- # * http://bullshit.rubyforge.org
26
- #
27
- # == Example
28
- #
29
-
30
1
  require 'dslkit'
31
2
  require 'enumerator'
32
3
 
@@ -463,6 +434,11 @@ module Bullshit
463
434
  define_method(time) { analysis[time].sum }
464
435
  end
465
436
 
437
+ # Returns the sum of measurement times for +time+.
438
+ def sum(time)
439
+ __send__ time
440
+ end
441
+
466
442
  # Seconds per call (mean)
467
443
  def call_time_mean
468
444
  mean(self.case.compare_time)
@@ -1301,11 +1277,11 @@ module Bullshit
1301
1277
  # This method tries to detect autocorrelation with the Ljung-Box
1302
1278
  # statistic. If enough lags can be considered it returns a hash with
1303
1279
  # results, otherwise nil is returned. The keys are
1304
- # :lags: the number of lags,
1305
- # :alpha_level: the alpha level for the test,
1306
- # :q: the value of the ljung_box_statistic,
1307
- # :p: the p-value computed, if p is higher than alpha no correlation was detected,
1308
- # :detected: true if a correlation was found.
1280
+ # :lags:: the number of lags,
1281
+ # :alpha_level:: the alpha level for the test,
1282
+ # :q:: the value of the ljung_box_statistic,
1283
+ # :p:: the p-value computed, if p is higher than alpha no correlation was detected,
1284
+ # :detected:: true if a correlation was found.
1309
1285
  def detect_autocorrelation(lags = 20, alpha_level = 0.05)
1310
1286
  if q = ljung_box_statistic(lags)
1311
1287
  p = ChiSquareDistribution.new(lags).probability(q)
@@ -1446,7 +1422,10 @@ module Bullshit
1446
1422
  end
1447
1423
  end
1448
1424
  self
1425
+ rescue Errno::ENOENT
1449
1426
  end
1427
+
1428
+ alias to_s long_name
1450
1429
  end
1451
1430
 
1452
1431
  module CommonConstants
@@ -1489,6 +1468,8 @@ module Bullshit
1489
1468
 
1490
1469
  dsl_accessor :batch_size, 1
1491
1470
 
1471
+ dsl_accessor :comparison, true
1472
+
1492
1473
  class TruncateData
1493
1474
  extend DSLKit::DSLAccessor
1494
1475
  extend DSLKit::Constant
@@ -1507,8 +1488,8 @@ module Bullshit
1507
1488
  def initialize(enable, &block)
1508
1489
  if block
1509
1490
  enable.nil? or raise ArgumentError, "block form doesn't take an argument"
1510
- instance_eval(&block)
1511
1491
  enabled true
1492
+ instance_eval(&block)
1512
1493
  else
1513
1494
  enabled enable.nil? ? false : enable
1514
1495
  end
@@ -1556,8 +1537,8 @@ module Bullshit
1556
1537
  def initialize(enable = nil, &block)
1557
1538
  if block
1558
1539
  enable.nil? or raise ArgumentError, "block form doesn't take an argument"
1559
- instance_eval(&block)
1560
1540
  enabled true
1541
+ instance_eval(&block)
1561
1542
  else
1562
1543
  enabled enable.nil? ? true : enable
1563
1544
  end
@@ -1658,8 +1639,10 @@ module Bullshit
1658
1639
  # measure their running time.
1659
1640
  def initialize
1660
1641
  @clocks = []
1661
- @comparison = Comparison.new
1662
- @comparison.output self.class.output
1642
+ if self.class.comparison
1643
+ @comparison = Comparison.new
1644
+ @comparison.output self.class.output
1645
+ end
1663
1646
  end
1664
1647
 
1665
1648
  # Return the name of the benchmark case as a string.
@@ -1769,7 +1752,9 @@ module Bullshit
1769
1752
  self.class.output.puts evaluation(clock)
1770
1753
  end
1771
1754
  @clocks << clock
1772
- @comparison.benchmark(self, bc_method.short_name, :run => false)
1755
+ if @comparison
1756
+ @comparison.benchmark(self, bc_method.short_name, :run => false)
1757
+ end
1773
1758
  end
1774
1759
  @clocks
1775
1760
  end
@@ -1779,12 +1764,12 @@ module Bullshit
1779
1764
 
1780
1765
  # Setup, run all benchmark cases (warmup and the real run) and output
1781
1766
  # results, run method speed comparisons, and teardown.
1782
- def run(comparison = true)
1767
+ def run(do_compare = true)
1783
1768
  old_sync, self.class.output.sync = self.class.output.sync, true
1784
1769
  $DEBUG and warn "Calling setup."
1785
1770
  setup
1786
1771
  run_once
1787
- comparison and @comparison.display
1772
+ do_compare and @comparison and @comparison.display
1788
1773
  self
1789
1774
  rescue => e
1790
1775
  warn "Caught #{e.class}: #{e}\n\n#{e.backtrace.map { |x| "\t#{x}\n" }}"
@@ -1796,8 +1781,8 @@ module Bullshit
1796
1781
  end
1797
1782
 
1798
1783
  # Creates an instance of this class and run it.
1799
- def self.run
1800
- new.run
1784
+ def self.run(do_compare = true)
1785
+ new.run do_compare
1801
1786
  end
1802
1787
 
1803
1788
  # Write all output files after run.
@@ -1880,7 +1865,7 @@ module Bullshit
1880
1865
  module EvaluationModule
1881
1866
  def statistics_table(clock)
1882
1867
  result = ' ' * NAME_COLUMN_SIZE << ('%17s ' * 4) % times << "\n"
1883
- result << evaluation_line('sum', times.map { |t| clock.__send__(t) })
1868
+ result << evaluation_line('sum', times.map { |t| clock.sum(t) })
1884
1869
  result << evaluation_line('min', times.map { |t| clock.min(t) })
1885
1870
  result << evaluation_line('std-', times.map { |t| clock.arithmetic_mean(t) - clock.sample_standard_deviation(t) })
1886
1871
  result << evaluation_line('mean', times.map { |t| clock.arithmetic_mean(t) })
@@ -2127,7 +2112,7 @@ module Bullshit
2127
2112
  def benchmark(bc_class, method, opts = {})
2128
2113
  opts = { :run => true, :combine => true }.merge opts
2129
2114
  if Case === bc_class
2130
- bullshit_case, bc_class = bc_class, bullshit_case.class
2115
+ bullshit_case, bc_class = bc_class, bc_class.class
2131
2116
  @cases[bc_class] ||= []
2132
2117
  if opts[:combine]
2133
2118
  if @cases[bc_class].empty?
@@ -2155,15 +2140,20 @@ module Bullshit
2155
2140
  if comment = opts[:comment]
2156
2141
  bc_method.comment = comment
2157
2142
  end
2158
- @benchmark_methods << bc_method
2159
2143
  if file_path = opts[:load]
2160
- if file_path != true
2161
- bc_method.load file_path
2144
+ success = if file_path != true
2145
+ bc_method.load(file_path)
2162
2146
  else
2163
2147
  bc_method.load
2164
2148
  end
2149
+ if success
2150
+ @benchmark_methods << bc_method
2151
+ else
2152
+ warn "Loading of #{bc_method} failed. Skipping to next."
2153
+ end
2165
2154
  else
2166
2155
  opts[:run] and bullshit_case.run false
2156
+ @benchmark_methods << bc_method
2167
2157
  end
2168
2158
  nil
2169
2159
  end
@@ -2193,43 +2183,68 @@ module Bullshit
2193
2183
  output.puts Time.now.strftime(' %FT%T %Z ').center(COLUMNS, '=')
2194
2184
  for comparator in [ :call_time_mean, :call_time_median ]
2195
2185
  output.puts
2196
- methods = compare_methods(comparator)
2197
- methods.size < 2 and return
2198
- max = methods.last.clock.__send__(comparator)
2186
+ cmethods = compare_methods(comparator)
2187
+ cmethods.size < 2 and return
2188
+ max = cmethods.last.clock.__send__(comparator)
2199
2189
  output.puts "Comparing times (#{comparator}):"
2200
- methods.each_with_index do |m, i|
2201
- covers = []
2202
- for x in methods
2203
- if m != x and m.cover?(x)
2204
- j = 0
2205
- if methods.find { |y| j += 1; x == y }
2206
- my_case = m.case.class
2207
- iterations = m.clock.analysis[my_case.compare_time].suggested_sample_size(
2208
- x.clock.analysis[my_case.compare_time], my_case.covering.alpha_level, my_case.covering.beta_level)
2209
- if iterations.nan? or iterations.infinite?
2210
- covers << "#{j} (?)"
2211
- else
2212
- min_iterations = iterations.ceil
2213
- min_iterations >= 1E6 and min_iterations = "%f" % (1 / 0.0)
2214
- covers << "#{j} (>=#{min_iterations})"
2215
- end
2216
- end
2217
- end
2218
- end
2219
- covers *= ', '
2190
+ cmethods.each_with_index do |m, i|
2220
2191
  output.printf\
2221
2192
  "% 2u #{prefix_string(m)}\n %17.9f"\
2222
- " (%#{::Bullshit::Clock::TIMES_MAX}s) -> %8.3fx %s\n"\
2223
- " %17.9f\n",
2193
+ " (%#{::Bullshit::Clock::TIMES_MAX}s) %s\n"\
2194
+ " %17.9f %8.2f %17.9f\n",
2224
2195
  i + 1, m.clock.calls(comparator), m.case.class.compare_time,
2225
- max / m.clock.__send__(comparator), covers, m.clock.__send__(comparator)
2196
+ compute_covers(cmethods, m), m.clock.__send__(comparator),
2197
+ m.clock.sample_standard_deviation_percentage(m.case.class.compare_time),
2198
+ m.clock.sum(m.case.class.compare_time)
2226
2199
  end
2227
- output.puts " %17s (%#{::Bullshit::Clock::TIMES_MAX}s) -> %8s %s\n"\
2228
- " %17s\n"\
2229
- % %w[calls/sec time speed covers secs/call]
2200
+ output.puts " %17s (%#{::Bullshit::Clock::TIMES_MAX}s) %s\n"\
2201
+ " %17s %8s %17s\n"\
2202
+ % %w[calls/sec time covers secs/call std% sum]
2203
+ display_speedup_matrix(cmethods, comparator)
2230
2204
  end
2231
2205
  output.puts '=' * COLUMNS
2232
2206
  end
2207
+
2208
+ private
2209
+
2210
+ def display_speedup_matrix(cmethods, comparator)
2211
+ output.print "\n", " " * 3
2212
+ cmethods.size.times do |i|
2213
+ output.printf "%7d ", i + 1
2214
+ end
2215
+ output.puts
2216
+ cmethods.each_with_index do |x, i|
2217
+ output.printf "%2d ", i + 1
2218
+ cmethods.each do |y|
2219
+ ratio = x.clock.calls(comparator).to_f / y.clock.calls(comparator)
2220
+ ratio /= 0.0 if ratio >= 1000
2221
+ output.printf "%7.2f ", ratio
2222
+ end
2223
+ output.puts
2224
+ end
2225
+ end
2226
+
2227
+ def compute_covers(cmethods, m)
2228
+ covers = []
2229
+ for x in cmethods
2230
+ if m != x and m.cover?(x)
2231
+ j = 0
2232
+ if cmethods.find { |y| j += 1; x == y }
2233
+ my_case = m.case.class
2234
+ iterations = m.clock.analysis[my_case.compare_time].suggested_sample_size(
2235
+ x.clock.analysis[my_case.compare_time], my_case.covering.alpha_level, my_case.covering.beta_level)
2236
+ if iterations.nan? or iterations.infinite?
2237
+ covers << "#{j} (?)"
2238
+ else
2239
+ min_iterations = iterations.ceil
2240
+ min_iterations >= 1E6 and min_iterations = "%f" % (1 / 0.0)
2241
+ covers << "#{j} (>=#{min_iterations})"
2242
+ end
2243
+ end
2244
+ end
2245
+ end
2246
+ covers * ', '
2247
+ end
2233
2248
  end
2234
2249
 
2235
2250
  # Create a Comparison instance configured by +block+ and compute and display
@@ -1,6 +1,6 @@
1
1
  module Bullshit
2
2
  # Bullshit version
3
- VERSION = '0.1.0'
3
+ VERSION = '0.1.1'
4
4
  VERSION_ARRAY = VERSION.split(/\./).map { |x| x.to_i } # :nodoc:
5
5
  VERSION_MAJOR = VERSION_ARRAY[0] # :nodoc:
6
6
  VERSION_MINOR = VERSION_ARRAY[1] # :nodoc:
data/make_doc.rb CHANGED
@@ -1,4 +1,5 @@
1
1
  #!/usr/bin/env ruby
2
2
 
3
3
  puts "Creating documentation."
4
- system "rdoc -S -d #{Dir['lib/**/*.rb'] * ' '}"
4
+ system "rdoc --main README --title 'Bullshit -- Benchmarking in Ruby'"\
5
+ " -d #{Dir['lib/**/*.rb'] * ' '}"
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: bullshit
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.1.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Florian Frank
@@ -9,7 +9,7 @@ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
11
 
12
- date: 2009-08-31 00:00:00 +02:00
12
+ date: 2009-11-18 00:00:00 +01:00
13
13
  default_executable:
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
@@ -24,45 +24,46 @@ dependencies:
24
24
  version:
25
25
  description: ""
26
26
  email: flori@ping.de
27
- executables: []
28
-
27
+ executables:
28
+ - bs_compare
29
29
  extensions: []
30
30
 
31
31
  extra_rdoc_files: []
32
32
 
33
33
  files:
34
- - COPYING
35
- - Rakefile
34
+ - CHANGES
35
+ - bin/bs_compare
36
36
  - VERSION
37
- - bullshit.gemspec
38
- - data
39
- - examples
40
- - examples/compare.rb
41
- - examples/fibonacci.rb
37
+ - README
38
+ - make_doc.rb
39
+ - Rakefile
40
+ - examples/throw_raise.rb
42
41
  - examples/iteration.rb
43
42
  - examples/josephus.rb
43
+ - examples/fibonacci.rb
44
+ - examples/compare.rb
44
45
  - examples/sorting.rb
45
- - install.rb
46
- - lib
47
- - lib/bullshit
48
- - lib/bullshit.rb
49
46
  - lib/bullshit/version.rb
50
- - make_doc.rb
51
- - tests
47
+ - lib/bullshit.rb
48
+ - tests/test_continued_fraction.rb
49
+ - tests/test_window.rb
50
+ - tests/test_functions.rb
52
51
  - tests/test_analysis.rb
53
52
  - tests/test_bullshit.rb
54
- - tests/test_continued_fraction.rb
55
53
  - tests/test_distribution.rb
56
- - tests/test_functions.rb
57
54
  - tests/test_newton_bisection.rb
58
- - tests/test_window.rb
55
+ - COPYING
56
+ - install.rb
59
57
  has_rdoc: true
60
- homepage: http://bullshit.rubyforge.org
58
+ homepage: http://flori.github.com/bullshit
59
+ licenses: []
60
+
61
61
  post_install_message:
62
62
  rdoc_options:
63
63
  - --title
64
64
  - Bullshit -- Benchmarking in Ruby
65
- - --line-numbers
65
+ - --main
66
+ - README
66
67
  require_paths:
67
68
  - lib
68
69
  required_ruby_version: !ruby/object:Gem::Requirement
@@ -80,15 +81,15 @@ required_rubygems_version: !ruby/object:Gem::Requirement
80
81
  requirements: []
81
82
 
82
83
  rubyforge_project: bullshit
83
- rubygems_version: 1.3.1
84
+ rubygems_version: 1.3.5
84
85
  signing_key:
85
- specification_version: 2
86
+ specification_version: 3
86
87
  summary: Benchmarking is Bullshit
87
88
  test_files:
89
+ - tests/test_continued_fraction.rb
90
+ - tests/test_window.rb
91
+ - tests/test_functions.rb
88
92
  - tests/test_analysis.rb
89
93
  - tests/test_bullshit.rb
90
- - tests/test_continued_fraction.rb
91
94
  - tests/test_distribution.rb
92
- - tests/test_functions.rb
93
95
  - tests/test_newton_bisection.rb
94
- - tests/test_window.rb
data/bullshit.gemspec DELETED
@@ -1,24 +0,0 @@
1
- # -*- encoding: utf-8 -*-
2
- Gem::Specification.new do |s|
3
- s.name = 'bullshit'
4
- s.version = '0.1.0'
5
- s.summary = "Benchmarking is Bullshit"
6
- s.description = ""
7
-
8
- s.add_dependency('dslkit', '>= 0.2.5')
9
-
10
- s.files = ["COPYING", "Rakefile", "VERSION", "bullshit.gemspec", "data", "examples", "examples/compare.rb", "examples/fibonacci.rb", "examples/iteration.rb", "examples/josephus.rb", "examples/sorting.rb", "install.rb", "lib", "lib/bullshit", "lib/bullshit.rb", "lib/bullshit/version.rb", "make_doc.rb", "tests", "tests/test_analysis.rb", "tests/test_bullshit.rb", "tests/test_continued_fraction.rb", "tests/test_distribution.rb", "tests/test_functions.rb", "tests/test_newton_bisection.rb", "tests/test_window.rb"]
11
-
12
- s.require_path = 'lib'
13
-
14
- s.has_rdoc = true
15
- s.rdoc_options <<
16
- '--title' << 'Bullshit -- Benchmarking in Ruby' <<
17
- '--line-numbers'
18
- s.test_files = ["tests/test_analysis.rb", "tests/test_bullshit.rb", "tests/test_continued_fraction.rb", "tests/test_distribution.rb", "tests/test_functions.rb", "tests/test_newton_bisection.rb", "tests/test_window.rb"]
19
-
20
- s.author = "Florian Frank"
21
- s.email = "flori@ping.de"
22
- s.homepage = "http://bullshit.rubyforge.org"
23
- s.rubyforge_project = "bullshit"
24
- end