memoize 1.2.3 → 1.3.0

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 CHANGED
@@ -1,3 +1,18 @@
1
+ = 1.3.0 - 13-Jul-2009
2
+ * Updated to work with 1.9.x - now passes explicit arguments to super. Still
3
+ works with 1.8.x as well.
4
+ * Changed license to Artistic 2.0.
5
+ * Removed an unnecessary read attribute when writing to a cache file.
6
+ * Added a warranty section to the README file.
7
+ * Changed the test file name to 'test_memoize.rb' in order to more closely
8
+ follow Ruby convention.
9
+ * Changed the example file names so that they are each preceded with the
10
+ text 'example_' to avoid any confusion with test files.
11
+ * The test-unit gem is now a pre-requisite for this library.
12
+ * Added a couple of rake tasks for running example programs.
13
+ * Added a few more tests.
14
+ * Some gemspec updates, including explicit license.
15
+
1
16
  = 1.2.3 - 24-May-2007
2
17
  * Added a Rakefile with tasks for testing and installation.
3
18
  * Removed the install.rb file. Installation is now handled by the Rakefile tasks.
data/MANIFEST CHANGED
@@ -3,7 +3,7 @@
3
3
  * README
4
4
  * Rakefile
5
5
  * memoize.gemspec
6
- * examples/fibonacci.rb
7
- * examples/test_memoize.rb
6
+ * examples/example_fibonacci.rb
7
+ * examples/example_memoize.rb
8
8
  * lib/memoize.rb
9
- * test/tc_memoize.rb
9
+ * test/test_memoize.rb
data/README CHANGED
@@ -63,10 +63,15 @@ Memoize#memoize(method, file=nil)
63
63
  or the forums at http://www.rubyforge.org/projects/shards.
64
64
 
65
65
  == License
66
- Ruby's
66
+ Artistic 2.0
67
+
68
+ == Warranty
69
+ This package is provided "as is" and without any express or
70
+ implied warranties, including, without limitation, the implied
71
+ warranties of merchantability and fitness for a particular purpose.
67
72
 
68
73
  == Copyright
69
- (C) 2005-2007 Daniel J. Berger
74
+ (C) 2005-2009 Daniel J. Berger
70
75
  All Rights Reserved
71
76
 
72
77
  = Author
data/Rakefile CHANGED
@@ -3,22 +3,32 @@ require 'rake/testtask'
3
3
  require 'rbconfig'
4
4
  include Config
5
5
 
6
- desc 'Install the memoize package (non-gem)'
6
+ desc 'Install the memoize library (non-gem)'
7
7
  task :install do
8
- sitelibdir = CONFIG["sitelibdir"]
9
- file = "lib/memoize.rb"
8
+ sitelibdir = CONFIG['sitelibdir']
9
+ file = 'lib/memoize.rb'
10
10
  FileUtils.cp(file, sitelibdir, :verbose => true)
11
11
  end
12
12
 
13
+ desc 'Install the memoize library as a gem'
13
14
  task :install_gem do
14
15
  ruby 'memoize.gemspec'
15
- file = Dir["*.gem"].first
16
- sh "gem install #{file}"
16
+ file = Dir['*.gem'].first
17
+ sh 'gem install #{file}'
18
+ end
19
+
20
+ desc 'Run the fibonacci example & benchmarks'
21
+ task :example_fib do
22
+ ruby '-Ilib examples/example_fibonacci.rb'
23
+ end
24
+
25
+ desc 'Run the memoize example & benchmarks'
26
+ task :example_memoize do
27
+ ruby '-Ilib examples/example_memoize.rb'
17
28
  end
18
29
 
19
30
  Rake::TestTask.new do |t|
20
31
  t.libs << 'test'
21
32
  t.verbose = true
22
33
  t.warning = true
23
- t.test_files = FileList['test/tc_memoize.rb']
24
34
  end
@@ -0,0 +1,45 @@
1
+ ###################################################################
2
+ # fibonacci.rb
3
+ #
4
+ # Demonstrates, via Benchmark, the difference between a memoized
5
+ # version of the fibonnaci method versus a non-memoized version.
6
+ #
7
+ # You can run this via the 'example_fib' rake task.
8
+ ###################################################################
9
+ require 'benchmark'
10
+ require 'memoize'
11
+ include Memoize
12
+
13
+ # Our fibonacci function
14
+ def fib(n)
15
+ return n if n < 2
16
+ fib(n-1) + fib(n-2)
17
+ end
18
+
19
+ file = File.join((ENV['HOME'] || ENV['USERPROFILE']), 'fib.cache')
20
+
21
+ max_iter = ARGV[0].to_i
22
+ max_fib = ARGV[1].to_i
23
+
24
+ max_iter = 100 if max_iter == 0
25
+ max_fib = 25 if max_fib == 0
26
+
27
+ print "\nBenchmarking against version: " + MEMOIZE_VERSION + "\n\n"
28
+
29
+ Benchmark.bm(35) do |x|
30
+ x.report("Not memoized:"){
31
+ max_iter.times{ fib(max_fib) }
32
+ }
33
+
34
+ x.report("Memoized:"){
35
+ memoize(:fib)
36
+ max_iter.times{ fib(max_fib) }
37
+ }
38
+
39
+ x.report("Memoized to file:"){
40
+ memoize(:fib, file)
41
+ max_iter.times{ fib(max_fib) }
42
+ }
43
+ end
44
+
45
+ File.delete(file) if File.exists?(file)
@@ -0,0 +1,62 @@
1
+ #################################################################
2
+ # test_memoize.rb
3
+ #
4
+ # Simple example to demonstrate the use of memoize and cache.
5
+ # You can run this via the 'rake example_memoize' task.
6
+ #################################################################
7
+ require "memoize"
8
+
9
+ puts "MEMOIZE VERSION: " + Memoize::MEMOIZE_VERSION
10
+
11
+ class Foo
12
+ include Memoize
13
+ def fib(n)
14
+ return n if n < 2
15
+ fib(n-1) + fib(n-2)
16
+ end
17
+
18
+ def factorial(n)
19
+ f = 1
20
+ n.downto(2) { |x| f *= x }
21
+ return f
22
+ end
23
+ end
24
+
25
+ if $0 == __FILE__
26
+ a = Foo.new
27
+ b = Foo.new
28
+ c = Foo.new
29
+
30
+ file = ENV["HOME"] || ENV["USERPROFILE"] + "/fib.cache"
31
+
32
+ cache1 = b.memoize(:fib)
33
+ cache2 = b.memoize(:factorial)
34
+ cache3 = c.memoize(:fib, file)
35
+
36
+ p cache1
37
+ b.fib(3)
38
+ p cache1
39
+
40
+ p cache2
41
+ b.factorial(3)
42
+ p cache2
43
+
44
+ p cache1
45
+
46
+ print "\nWithout memoization\n\n"
47
+ puts "Start: " + Time.now.to_s
48
+ a.fib(32)
49
+ puts "Stop: " + Time.now.to_s
50
+
51
+ print "\n\nWith memoization\n\n"
52
+ puts "Start: " + Time.now.to_s
53
+ b.fib(32)
54
+ puts "Stop: " + Time.now.to_s
55
+
56
+ print "\n\nWith memoization to file\n\n"
57
+ puts "Start: " + Time.now.to_s
58
+ c.fib(32)
59
+ puts "Stop: " + Time.now.to_s
60
+
61
+ File.delete(file) if File.exists?(file)
62
+ end
@@ -1,15 +1,15 @@
1
1
  module Memoize
2
- MEMOIZE_VERSION = "1.2.3"
2
+ MEMOIZE_VERSION = '1.3.0'
3
3
 
4
4
  # Memoize the method +name+. If +file+ is provided, then the method results
5
5
  # are stored on disk as well as in memory.
6
6
  def memoize(name, file=nil)
7
- cache = File.open(file, "rb"){ |io| Marshal.load(io) } rescue {}
7
+ cache = File.open(file, 'rb'){ |io| Marshal.load(io) } rescue {}
8
8
 
9
9
  (class<<self; self; end).send(:define_method, name) do |*args|
10
10
  unless cache.has_key?(args)
11
- cache[args] = super
12
- File.open(file, "wb+"){ |f| Marshal.dump(cache, f) } if file
11
+ cache[args] = super(*args)
12
+ File.open(file, 'wb'){ |f| Marshal.dump(cache, f) } if file
13
13
  end
14
14
  cache[args]
15
15
  end
@@ -0,0 +1,29 @@
1
+ require 'rubygems'
2
+
3
+ spec = Gem::Specification.new do |gem|
4
+ gem.name = 'memoize'
5
+ gem.version = '1.3.0'
6
+ gem.author = 'Daniel J. Berger'
7
+ gem.email = 'djberg96@gmail.com'
8
+ gem.homepage = 'http://www.rubyforge.org/projects/shards'
9
+ gem.platform = Gem::Platform::RUBY
10
+ gem.summary = 'Speeds up methods at the cost of memory (or disk space)'
11
+ gem.test_file = 'test/test_memoize.rb'
12
+ gem.has_rdoc = true
13
+ gem.files = Dir['**/*'].reject{ |f| f.include?('CVS') }
14
+ gem.license = 'Artistic 2.0'
15
+
16
+ gem.rubyforge_project = 'shards'
17
+ gem.extra_rdoc_files = ['MANIFEST', 'README', 'CHANGES']
18
+
19
+ gem.add_dependency('test-unit', '>= 2.0.2')
20
+
21
+ gem.description = <<-EOF
22
+ The memoize library allows you to cache methods for faster lookup.
23
+ Cached results can either be stored in memory (the default) or to
24
+ a file.
25
+ EOF
26
+ end
27
+
28
+ Gem.manage_gems if Gem::RubyGemsVersion.to_f < 1.0
29
+ Gem::Builder.new(spec).build
@@ -1,18 +1,13 @@
1
1
  ###############################################
2
- # tc_memoize.rb
2
+ # test_memoize.rb
3
3
  #
4
- # Test suite for the memoize package.
4
+ # Test suite for the memoize library.
5
5
  ###############################################
6
- base = File.basename(Dir.pwd)
6
+ require 'rubygems'
7
+ gem 'test-unit'
7
8
 
8
- if base == "test" || base =~ /memoize/
9
- Dir.chdir("..") if base == "test"
10
- $LOAD_PATH.unshift(Dir.pwd + "/lib")
11
- Dir.chdir("test") rescue nil
12
- end
13
-
14
- require "test/unit"
15
- require "memoize"
9
+ require 'test/unit'
10
+ require 'memoize'
16
11
 
17
12
  class TC_Memoize < Test::Unit::TestCase
18
13
  include Memoize
@@ -20,7 +15,7 @@ class TC_Memoize < Test::Unit::TestCase
20
15
  def setup
21
16
  @cache1 = nil
22
17
  @cache2 = nil
23
- @file = (ENV["HOME"] || ENV["USERPROFILE"]) + "/test.cache"
18
+ @file = File.join((ENV['HOME'] || ENV['USERPROFILE']), 'test.cache')
24
19
  end
25
20
 
26
21
  def fib(n)
@@ -35,7 +30,7 @@ class TC_Memoize < Test::Unit::TestCase
35
30
  end
36
31
 
37
32
  def test_version
38
- assert_equal("1.2.3", Memoize::MEMOIZE_VERSION)
33
+ assert_equal('1.3.0', Memoize::MEMOIZE_VERSION)
39
34
  end
40
35
 
41
36
  def test_memoize
@@ -53,6 +48,15 @@ class TC_Memoize < Test::Unit::TestCase
53
48
  assert_equal(55, fib(10))
54
49
  end
55
50
 
51
+ def test_memoize_file_properties
52
+ assert_false(File.exists?(@file))
53
+ assert_nothing_raised{ memoize(:fib, @file) }
54
+ assert_false(File.exists?(@file))
55
+ assert_nothing_raised{ fib(10) }
56
+ assert_true(File.exists?(@file))
57
+ assert_true(File.size(@file) > 0)
58
+ end
59
+
56
60
  # Ensure that a cache is returned, that it's a hash, and that each
57
61
  # memoized method retains its own cache properly.
58
62
  def test_memoize_cache
metadata CHANGED
@@ -1,53 +1,74 @@
1
1
  --- !ruby/object:Gem::Specification
2
- rubygems_version: 0.9.2
3
- specification_version: 1
4
2
  name: memoize
5
3
  version: !ruby/object:Gem::Version
6
- version: 1.2.3
7
- date: 2007-05-24 00:00:00 -06:00
8
- summary: Speeds up methods at the cost of memory (or disk space)
9
- require_paths:
10
- - lib
11
- email: djberg96@gmail.com
12
- homepage: http://www.rubyforge.org/projects/shards
13
- rubyforge_project:
14
- description: Speeds up methods at the cost of memory (or disk space)
15
- autorequire:
16
- default_executable:
17
- bindir: bin
18
- has_rdoc: true
19
- required_ruby_version: !ruby/object:Gem::Version::Requirement
20
- requirements:
21
- - - ">"
22
- - !ruby/object:Gem::Version
23
- version: 0.0.0
24
- version:
4
+ version: 1.3.0
25
5
  platform: ruby
26
- signing_key:
27
- cert_chain:
28
- post_install_message:
29
6
  authors:
30
7
  - Daniel J. Berger
31
- files:
32
- - lib/memoize.rb
33
- - CHANGES
34
- - MANIFEST
35
- - README
36
- - Rakefile
37
- - test/tc_memoize.rb
38
- test_files:
39
- - test/tc_memoize.rb
40
- rdoc_options: []
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+
12
+ date: 2009-07-20 00:00:00 -06:00
13
+ default_executable:
14
+ dependencies:
15
+ - !ruby/object:Gem::Dependency
16
+ name: test-unit
17
+ type: :runtime
18
+ version_requirement:
19
+ version_requirements: !ruby/object:Gem::Requirement
20
+ requirements:
21
+ - - ">="
22
+ - !ruby/object:Gem::Version
23
+ version: 2.0.2
24
+ version:
25
+ description: " The memoize library allows you to cache methods for faster lookup.\n Cached results can either be stored in memory (the default) or to\n a file.\n"
26
+ email: djberg96@gmail.com
27
+ executables: []
28
+
29
+ extensions: []
41
30
 
42
31
  extra_rdoc_files:
43
32
  - MANIFEST
44
33
  - README
45
34
  - CHANGES
46
- executables: []
47
-
48
- extensions: []
35
+ files:
36
+ - CHANGES
37
+ - examples/example_fibonacci.rb
38
+ - examples/example_memoize.rb
39
+ - lib/memoize.rb
40
+ - MANIFEST
41
+ - memoize.gemspec
42
+ - Rakefile
43
+ - README
44
+ - test/test_memoize.rb
45
+ has_rdoc: true
46
+ homepage: http://www.rubyforge.org/projects/shards
47
+ licenses:
48
+ - Artistic 2.0
49
+ post_install_message:
50
+ rdoc_options: []
49
51
 
52
+ require_paths:
53
+ - lib
54
+ required_ruby_version: !ruby/object:Gem::Requirement
55
+ requirements:
56
+ - - ">="
57
+ - !ruby/object:Gem::Version
58
+ version: "0"
59
+ version:
60
+ required_rubygems_version: !ruby/object:Gem::Requirement
61
+ requirements:
62
+ - - ">="
63
+ - !ruby/object:Gem::Version
64
+ version: "0"
65
+ version:
50
66
  requirements: []
51
67
 
52
- dependencies: []
53
-
68
+ rubyforge_project: shards
69
+ rubygems_version: 1.3.4
70
+ signing_key:
71
+ specification_version: 3
72
+ summary: Speeds up methods at the cost of memory (or disk space)
73
+ test_files:
74
+ - test/test_memoize.rb