memoist2 0.1.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.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 9469f4a69b93e831b13b1ffb25a5c1dde24d0b4f
4
+ data.tar.gz: 0f62199fc4a58d8011e9a497eabb4dca0bba474a
5
+ SHA512:
6
+ metadata.gz: 240188ec5c43029bc30607098a97231761af2e3653608b8eec6b5c2bee1e95287a0be170186721e11c98a342ba18fd25d673e75e04c7490f520bdf3ebefb04be
7
+ data.tar.gz: edb58147414a0db8c312f21cee8fbcde1ecdb1013838efa3ff2f69f8a44e1b0f3e1563a7e3cae2db4853386aa3bb69011b3c49a4ca9b9c581d06b1fe6ee1e19f
data/.gitignore ADDED
@@ -0,0 +1,19 @@
1
+ *.gem
2
+ *.rbc
3
+ .bundle
4
+ .config
5
+ coverage
6
+ InstalledFiles
7
+ lib/bundler/man
8
+ pkg
9
+ rdoc
10
+ spec/reports
11
+ test/tmp
12
+ test/version_tmp
13
+ tmp
14
+
15
+ Gemfile.lock
16
+ # YARD artifacts
17
+ .yardoc
18
+ _yardoc
19
+ doc/
data/.rspec ADDED
@@ -0,0 +1,2 @@
1
+ --color
2
+ --format progress
data/.ruby-version ADDED
@@ -0,0 +1 @@
1
+ 2.0.0
data/.travis.yml ADDED
@@ -0,0 +1,4 @@
1
+ language: ruby
2
+ rvm:
3
+ - 2.0.0
4
+ # - jruby-20mode # Module prepend not supported yet
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source "https://rubygems.org"
2
+
3
+ gem "rspec"
4
+ gem "rake"
data/README.md ADDED
@@ -0,0 +1,4 @@
1
+ memoist2
2
+ ========
3
+
4
+ Simple Memoization for Ruby 2.0
data/Rakefile ADDED
@@ -0,0 +1,71 @@
1
+ require 'rspec/core/rake_task'
2
+ RSpec::Core::RakeTask.new(:spec)
3
+ task :default => :spec
4
+
5
+ require "rubygems"
6
+ require "rubygems/package_task"
7
+ require "rdoc/task"
8
+
9
+ # This builds the actual gem. For details of what all these options
10
+ # mean, and other ones you can add, check the documentation here:
11
+ #
12
+ # http://rubygems.org/read/chapter/20
13
+ #
14
+ spec = Gem::Specification.new do |s|
15
+
16
+ # Basic details
17
+ s.name = "memoist2"
18
+ s.version = "0.1.0"
19
+ s.summary = "Really simple memoization for ruby 2.0"
20
+ s.author = "Matthew Rudy Jacobs"
21
+ s.email = "MatthewRudyJacobs@gmail.com"
22
+ s.homepage = "https://github.com/matthewrudy/memoist2"
23
+
24
+ s.has_rdoc = true
25
+ s.extra_rdoc_files = %w(README.md)
26
+ s.rdoc_options = %w(--main README.md)
27
+
28
+ # Add any extra files to include in the gem
29
+ s.files = `git ls-files`.split
30
+ s.require_paths = ["lib"]
31
+
32
+ # Dependencies to run tests
33
+ s.add_development_dependency("rspec")
34
+ s.add_development_dependency("rake")
35
+ end
36
+
37
+ # This task actually builds the gem. We also regenerate a static
38
+ # .gemspec file, which is useful if something (i.e. GitHub) will
39
+ # be automatically building a gem for this project. If you're not
40
+ # using GitHub, edit as appropriate.
41
+ #
42
+ # To publish your gem online, install the 'gemcutter' gem; Read more
43
+ # about that here: http://gemcutter.org/pages/gem_docs
44
+ Gem::PackageTask.new(spec) do |pkg|
45
+ pkg.gem_spec = spec
46
+ end
47
+
48
+ desc "Build the gemspec file #{spec.name}.gemspec"
49
+ task :gemspec do
50
+ file = File.dirname(__FILE__) + "/#{spec.name}.gemspec"
51
+ File.open(file, "w") {|f| f << spec.to_ruby }
52
+ end
53
+
54
+ # If you don't want to generate the .gemspec file, just remove this line. Reasons
55
+ # why you might want to generate a gemspec:
56
+ # - using bundler with a git source
57
+ # - building the gem without rake (i.e. gem build blah.gemspec)
58
+ # - maybe others?
59
+ task :package => :gemspec
60
+
61
+ # Generate documentation
62
+ RDoc::Task.new do |rd|
63
+ rd.main = "README.md"
64
+ rd.rdoc_files.include("README.md", "lib/**/*.rb")
65
+ rd.rdoc_dir = "rdoc"
66
+ end
67
+
68
+ desc 'Clear out RDoc and generated packages'
69
+ task :clean => [:clobber_rdoc, :clobber_package] do
70
+ rm "#{spec.name}.gemspec"
71
+ end
data/example/foo.rb ADDED
@@ -0,0 +1,58 @@
1
+ require File.expand_path('../../lib/memoist2', __FILE__)
2
+
3
+ class Foo
4
+ extend Memoist2
5
+
6
+ def string
7
+ "string"
8
+ end
9
+
10
+ def string_memoized
11
+ "string"
12
+ end
13
+ memoize :string_memoized
14
+
15
+ def fixnum
16
+ 42
17
+ end
18
+
19
+ def fixnum_memoized
20
+ 42
21
+ end
22
+ memoize :fixnum_memoized
23
+ end
24
+
25
+ require 'benchmark'
26
+
27
+ TIMES = 10_000_000
28
+
29
+ Benchmark.bmbm do |x|
30
+
31
+ x.report "string - memoized" do
32
+ foo = Foo.new
33
+ TIMES.times do
34
+ foo.string_memoized
35
+ end
36
+ end
37
+
38
+ x.report "string - unmemoized" do
39
+ foo = Foo.new
40
+ TIMES.times do
41
+ foo.string
42
+ end
43
+ end
44
+
45
+ x.report "fixnum - memoized" do
46
+ foo = Foo.new
47
+ TIMES.times do
48
+ foo.fixnum_memoized
49
+ end
50
+ end
51
+
52
+ x.report "fixnum - unmemoized" do
53
+ foo = Foo.new
54
+ TIMES.times do
55
+ foo.fixnum
56
+ end
57
+ end
58
+ end
data/lib/memoist2.rb ADDED
@@ -0,0 +1,22 @@
1
+ module Memoist2
2
+
3
+ def self.memoized_ivar_for(symbol)
4
+ "@_memoized_#{symbol.to_s.sub(/\?\Z/, '_query').sub(/!\Z/, '_bang')}".to_sym
5
+ end
6
+
7
+ def memoize(method_name)
8
+ memoized_ivar = Memoist2.memoized_ivar_for(method_name)
9
+ memoized_module = Module.new do
10
+ module_eval <<-EVAL
11
+ def #{method_name}
12
+ if !defined?(#{memoized_ivar}) || #{memoized_ivar}.empty?
13
+ #{memoized_ivar} = [super]
14
+ end
15
+ #{memoized_ivar}[0]
16
+ end
17
+ EVAL
18
+ end
19
+ prepend memoized_module
20
+ end
21
+
22
+ end
@@ -0,0 +1,68 @@
1
+ require 'memoist2'
2
+
3
+ describe Memoist2 do
4
+
5
+ class Foo
6
+ extend Memoist2
7
+
8
+ def bar
9
+ count!
10
+ end
11
+ memoize :bar
12
+
13
+ def question?
14
+ count!
15
+ end
16
+ memoize :question?
17
+
18
+ def bang!
19
+ count!
20
+ end
21
+ memoize :bang!
22
+
23
+ private
24
+
25
+ def count!
26
+ @count ||= 0
27
+ @count += 1
28
+ end
29
+
30
+ class << self
31
+ extend Memoist2
32
+
33
+ def bar
34
+ @bar_count ||= 0
35
+ @bar_count += 1
36
+ end
37
+ memoize :bar
38
+ end
39
+ end
40
+
41
+ describe "instance methods" do
42
+ subject{ Foo.new }
43
+
44
+ it "can be memoized" do
45
+ subject.bar.should == subject.bar
46
+ end
47
+ end
48
+
49
+ describe "class methods" do
50
+ subject{ Foo }
51
+
52
+ it "can be memoized" do
53
+ subject.bar.should == subject.bar
54
+ end
55
+ end
56
+
57
+ describe "punctuated methods" do
58
+ subject{ Foo.new }
59
+
60
+ it "can memoize question methods" do
61
+ subject.question?.should == subject.question?
62
+ end
63
+
64
+ it "can memoize bang methods" do
65
+ subject.bang!.should == subject.bang!
66
+ end
67
+ end
68
+ end
@@ -0,0 +1,17 @@
1
+ # This file was generated by the `rspec --init` command. Conventionally, all
2
+ # specs live under a `spec` directory, which RSpec adds to the `$LOAD_PATH`.
3
+ # Require this file using `require "spec_helper"` to ensure that it is only
4
+ # loaded once.
5
+ #
6
+ # See http://rubydoc.info/gems/rspec-core/RSpec/Core/Configuration
7
+ RSpec.configure do |config|
8
+ config.treat_symbols_as_metadata_keys_with_true_values = true
9
+ config.run_all_when_everything_filtered = true
10
+ config.filter_run :focus
11
+
12
+ # Run specs in random order to surface order dependencies. If you find an
13
+ # order dependency and want to debug it, you can fix the order by providing
14
+ # the seed, which is printed after each run.
15
+ # --seed 1234
16
+ config.order = 'random'
17
+ end
metadata ADDED
@@ -0,0 +1,84 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: memoist2
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Matthew Rudy Jacobs
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2013-07-19 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: rspec
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - '>='
18
+ - !ruby/object:Gem::Version
19
+ version: '0'
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - '>='
25
+ - !ruby/object:Gem::Version
26
+ version: '0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: rake
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - '>='
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - '>='
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
41
+ description:
42
+ email: MatthewRudyJacobs@gmail.com
43
+ executables: []
44
+ extensions: []
45
+ extra_rdoc_files:
46
+ - README.md
47
+ files:
48
+ - .gitignore
49
+ - .rspec
50
+ - .ruby-version
51
+ - .travis.yml
52
+ - Gemfile
53
+ - README.md
54
+ - Rakefile
55
+ - example/foo.rb
56
+ - lib/memoist2.rb
57
+ - spec/memoist2_spec.rb
58
+ - spec/spec_helper.rb
59
+ homepage: https://github.com/matthewrudy/memoist2
60
+ licenses: []
61
+ metadata: {}
62
+ post_install_message:
63
+ rdoc_options:
64
+ - --main
65
+ - README.md
66
+ require_paths:
67
+ - lib
68
+ required_ruby_version: !ruby/object:Gem::Requirement
69
+ requirements:
70
+ - - '>='
71
+ - !ruby/object:Gem::Version
72
+ version: '0'
73
+ required_rubygems_version: !ruby/object:Gem::Requirement
74
+ requirements:
75
+ - - '>='
76
+ - !ruby/object:Gem::Version
77
+ version: '0'
78
+ requirements: []
79
+ rubyforge_project:
80
+ rubygems_version: 2.0.3
81
+ signing_key:
82
+ specification_version: 4
83
+ summary: Really simple memoization for ruby 2.0
84
+ test_files: []