memoist2 0.2.0 → 0.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.
- checksums.yaml +4 -4
- data/.ruby-version +1 -1
- data/.travis.yml +3 -1
- data/README.md +30 -17
- data/Rakefile +1 -71
- data/lib/memoist2.rb +22 -14
- data/lib/memoist2/version.rb +3 -0
- data/memoist2.gemspec +23 -29
- data/spec/memoist2_spec.rb +28 -7
- metadata +21 -20
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: ef4b828c8b6a81a9fd4a8aac1c184a43bb7f780f
|
4
|
+
data.tar.gz: b8d944584b7b9a3c714ae90fe1604d4cd1673bf2
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 0a175366c60c368b9cbc45a0b20c1a0da48a192b1704e63db7d78753aaf7b6b4c280e979f623e0f0f3adf7163650a977c8c21511cfeb90161967e506ae58923c
|
7
|
+
data.tar.gz: 648a750081622643148de2f103856c8858f149484937a18d2c41db0e479de72cfa19fecd7f98efa65049504b73f9681ae92789c9a571fed1a4a3f35946ad086e
|
data/.ruby-version
CHANGED
@@ -1 +1 @@
|
|
1
|
-
2.
|
1
|
+
2.2.0
|
data/.travis.yml
CHANGED
data/README.md
CHANGED
@@ -5,34 +5,47 @@ memoist2
|
|
5
5
|
|
6
6
|
Simple Memoization for Ruby 2.0
|
7
7
|
|
8
|
+
### Differences between Memoist & Memoist2
|
9
|
+
|
10
|
+
Unlike [Memoist], this is **not** a drop-in replacement for old ActiveSupport::Memoizable. Memoist will still work just fine for that if you're using Ruby 2.0. This project, on the other hand, is just me playing using Module#prepend which makes this stuff very simple.
|
11
|
+
|
12
|
+
* Memoist works on all Rubies
|
13
|
+
* Memoist is quite complicated
|
14
|
+
* Memoist has the exact same api as ActiveSupport::Memoizable
|
15
|
+
* Memoist2 only works on Ruby >= 2.0.0
|
16
|
+
* Memoist2 is deliberately much simpler
|
17
|
+
* Memoist2 has a slightly different API that could totally change
|
18
|
+
|
19
|
+
[Memoist]: https://github.com/matthewrudy/memoist
|
20
|
+
|
8
21
|
Example
|
9
|
-
|
22
|
+
-------
|
10
23
|
|
11
24
|
Memoize an instance method
|
12
25
|
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
26
|
+
class Foo
|
27
|
+
include Memoist2
|
28
|
+
|
29
|
+
def bar
|
30
|
+
sleep 1 && 2**10
|
31
|
+
end
|
32
|
+
memoize :bar
|
18
33
|
end
|
19
|
-
memoize :bar
|
20
|
-
end
|
21
34
|
|
22
35
|
Memoize a class method
|
23
36
|
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
37
|
+
class Foo
|
38
|
+
include Memoist2
|
39
|
+
|
40
|
+
def self.bar
|
41
|
+
# something expensive
|
42
|
+
end
|
43
|
+
memoize_class_method :bar
|
29
44
|
end
|
30
|
-
memoize_class_method :bar
|
31
|
-
end
|
32
45
|
|
33
46
|
Licence
|
34
|
-
|
47
|
+
-------
|
35
48
|
|
36
49
|
Licensed under the MIT licence.
|
37
50
|
|
38
|
-
See the file LICENCE.
|
51
|
+
See the file LICENCE.
|
data/Rakefile
CHANGED
@@ -2,74 +2,4 @@ require 'rspec/core/rake_task'
|
|
2
2
|
RSpec::Core::RakeTask.new(:spec)
|
3
3
|
task :default => :spec
|
4
4
|
|
5
|
-
require "
|
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.2.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
|
-
s.license = "MIT"
|
24
|
-
|
25
|
-
s.has_rdoc = true
|
26
|
-
s.extra_rdoc_files = %w(README.md)
|
27
|
-
s.rdoc_options = %w(--main README.md)
|
28
|
-
|
29
|
-
# Only works with Ruby 2
|
30
|
-
s.required_ruby_version = '>= 2.0.0'
|
31
|
-
|
32
|
-
# Add any extra files to include in the gem
|
33
|
-
s.files = `git ls-files`.split
|
34
|
-
s.require_paths = ["lib"]
|
35
|
-
|
36
|
-
# Dependencies to run tests
|
37
|
-
s.add_development_dependency("rspec")
|
38
|
-
s.add_development_dependency("rake")
|
39
|
-
end
|
40
|
-
|
41
|
-
# This task actually builds the gem. We also regenerate a static
|
42
|
-
# .gemspec file, which is useful if something (i.e. GitHub) will
|
43
|
-
# be automatically building a gem for this project. If you're not
|
44
|
-
# using GitHub, edit as appropriate.
|
45
|
-
#
|
46
|
-
# To publish your gem online, install the 'gemcutter' gem; Read more
|
47
|
-
# about that here: http://gemcutter.org/pages/gem_docs
|
48
|
-
Gem::PackageTask.new(spec) do |pkg|
|
49
|
-
pkg.gem_spec = spec
|
50
|
-
end
|
51
|
-
|
52
|
-
desc "Build the gemspec file #{spec.name}.gemspec"
|
53
|
-
task :gemspec do
|
54
|
-
file = File.dirname(__FILE__) + "/#{spec.name}.gemspec"
|
55
|
-
File.open(file, "w") {|f| f << spec.to_ruby }
|
56
|
-
end
|
57
|
-
|
58
|
-
# If you don't want to generate the .gemspec file, just remove this line. Reasons
|
59
|
-
# why you might want to generate a gemspec:
|
60
|
-
# - using bundler with a git source
|
61
|
-
# - building the gem without rake (i.e. gem build blah.gemspec)
|
62
|
-
# - maybe others?
|
63
|
-
task :package => :gemspec
|
64
|
-
|
65
|
-
# Generate documentation
|
66
|
-
RDoc::Task.new do |rd|
|
67
|
-
rd.main = "README.md"
|
68
|
-
rd.rdoc_files.include("README.md", "lib/**/*.rb")
|
69
|
-
rd.rdoc_dir = "rdoc"
|
70
|
-
end
|
71
|
-
|
72
|
-
desc 'Clear out RDoc and generated packages'
|
73
|
-
task :clean => [:clobber_rdoc, :clobber_package] do
|
74
|
-
rm "#{spec.name}.gemspec"
|
75
|
-
end
|
5
|
+
require "bundler/gem_tasks"
|
data/lib/memoist2.rb
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
require "memoist2/version"
|
2
|
+
|
1
3
|
module Memoist2
|
2
4
|
|
3
5
|
def self.memoized_ivar_for(symbol)
|
@@ -6,28 +8,34 @@ module Memoist2
|
|
6
8
|
|
7
9
|
module ClassMethods
|
8
10
|
|
9
|
-
def memoize(
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
#{memoized_ivar}
|
11
|
+
def memoize(*method_names)
|
12
|
+
method_names.each do |method_name|
|
13
|
+
memoized_ivar = Memoist2.memoized_ivar_for(method_name)
|
14
|
+
memoized_module = Module.new do
|
15
|
+
module_eval <<-EVAL
|
16
|
+
def #{method_name}
|
17
|
+
unless #{memoized_ivar}
|
18
|
+
#{memoized_ivar} = [super]
|
19
|
+
end
|
20
|
+
#{memoized_ivar}[0]
|
21
|
+
end
|
22
|
+
|
23
|
+
def self.to_s
|
24
|
+
"Memoist2::MemoizedMethod(#{method_name})"
|
16
25
|
end
|
17
|
-
|
18
|
-
|
19
|
-
|
26
|
+
def self.inspect; to_s; end
|
27
|
+
EVAL
|
28
|
+
end
|
29
|
+
prepend memoized_module
|
20
30
|
end
|
21
|
-
prepend memoized_module
|
22
31
|
end
|
23
32
|
|
24
|
-
def memoize_class_method(
|
33
|
+
def memoize_class_method(*method_names)
|
25
34
|
singleton_class.class_eval do
|
26
35
|
include Memoist2 unless ancestors.include?(Memoist2)
|
27
|
-
memoize
|
36
|
+
memoize *method_names
|
28
37
|
end
|
29
38
|
end
|
30
|
-
|
31
39
|
end
|
32
40
|
|
33
41
|
def self.included(klass)
|
data/memoist2.gemspec
CHANGED
@@ -1,35 +1,29 @@
|
|
1
|
-
#
|
1
|
+
# coding: utf-8
|
2
|
+
lib = File.expand_path('../lib', __FILE__)
|
3
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
|
+
require 'memoist2/version'
|
5
|
+
|
2
6
|
|
3
7
|
Gem::Specification.new do |s|
|
4
|
-
|
5
|
-
s.
|
8
|
+
# Basic details
|
9
|
+
s.name = "memoist2"
|
10
|
+
s.version = Memoist2::VERSION
|
11
|
+
s.authors = ["Matthew Rudy Jacobs"]
|
12
|
+
s.email = ["matthewrudyjacobs@gmail.com"]
|
13
|
+
|
14
|
+
s.summary = "Really simple memoization for ruby 2.0"
|
15
|
+
s.homepage = "https://github.com/matthewrudy/memoist2"
|
16
|
+
s.license = "MIT"
|
6
17
|
|
7
|
-
|
8
|
-
s.
|
9
|
-
s.date = "2013-07-19"
|
10
|
-
s.email = "MatthewRudyJacobs@gmail.com"
|
11
|
-
s.extra_rdoc_files = ["README.md"]
|
12
|
-
s.files = [".gitignore", ".rspec", ".ruby-version", ".travis.yml", "Gemfile", "LICENCE", "README.md", "Rakefile", "benchmark.rb", "example/foo.rb", "lib/memoist2.rb", "memoist2.gemspec", "spec/memoist2_spec.rb", "spec/spec_helper.rb"]
|
13
|
-
s.homepage = "https://github.com/matthewrudy/memoist2"
|
14
|
-
s.licenses = ["MIT"]
|
15
|
-
s.rdoc_options = ["--main", "README.md"]
|
16
|
-
s.require_paths = ["lib"]
|
17
|
-
s.required_ruby_version = Gem::Requirement.new(">= 2.0.0")
|
18
|
-
s.rubygems_version = "2.0.3"
|
19
|
-
s.summary = "Really simple memoization for ruby 2.0"
|
18
|
+
# Only works with Ruby 2
|
19
|
+
s.required_ruby_version = '>= 2.0.0'
|
20
20
|
|
21
|
-
|
22
|
-
|
21
|
+
# Add any extra files to include in the gem
|
22
|
+
s.files = `git ls-files`.split
|
23
|
+
s.require_paths = ["lib"]
|
24
|
+
s.test_files = s.files.grep(%r{^(test|spec|features)/})
|
23
25
|
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
else
|
28
|
-
s.add_dependency(%q<rspec>, [">= 0"])
|
29
|
-
s.add_dependency(%q<rake>, [">= 0"])
|
30
|
-
end
|
31
|
-
else
|
32
|
-
s.add_dependency(%q<rspec>, [">= 0"])
|
33
|
-
s.add_dependency(%q<rake>, [">= 0"])
|
34
|
-
end
|
26
|
+
# Dependencies to run tests
|
27
|
+
s.add_development_dependency("rspec")
|
28
|
+
s.add_development_dependency("rake")
|
35
29
|
end
|
data/spec/memoist2_spec.rb
CHANGED
@@ -29,7 +29,7 @@ describe Memoist2 do
|
|
29
29
|
|
30
30
|
it "returns the expected value" do
|
31
31
|
5.times do
|
32
|
-
subject.nilly.
|
32
|
+
expect(subject.nilly).to be nil
|
33
33
|
end
|
34
34
|
end
|
35
35
|
|
@@ -55,7 +55,7 @@ describe Memoist2 do
|
|
55
55
|
|
56
56
|
it "returns the expected value" do
|
57
57
|
5.times do
|
58
|
-
subject.foo.
|
58
|
+
expect(subject.foo).to be :bar
|
59
59
|
end
|
60
60
|
end
|
61
61
|
|
@@ -64,6 +64,27 @@ describe Memoist2 do
|
|
64
64
|
5.times{ subject.foo }
|
65
65
|
end.to change{ subject.counter }.by(1)
|
66
66
|
end
|
67
|
+
|
68
|
+
it "can memoize multiple methods simultaneously" do
|
69
|
+
subject = Class.new(Counter) do
|
70
|
+
include Memoist2
|
71
|
+
|
72
|
+
def a
|
73
|
+
count! && :a
|
74
|
+
end
|
75
|
+
|
76
|
+
def b
|
77
|
+
count! && :b
|
78
|
+
end
|
79
|
+
|
80
|
+
memoize :a, :b
|
81
|
+
end.new
|
82
|
+
|
83
|
+
5.times{ subject.a }
|
84
|
+
5.times{ subject.b }
|
85
|
+
|
86
|
+
expect(subject.counter).to be 2
|
87
|
+
end
|
67
88
|
end
|
68
89
|
|
69
90
|
describe "class methods" do
|
@@ -84,7 +105,7 @@ describe Memoist2 do
|
|
84
105
|
|
85
106
|
it "works" do
|
86
107
|
5.times do
|
87
|
-
subject.foo.
|
108
|
+
expect(subject.foo).to be 1
|
88
109
|
end
|
89
110
|
end
|
90
111
|
end
|
@@ -104,7 +125,7 @@ describe Memoist2 do
|
|
104
125
|
|
105
126
|
it "works" do
|
106
127
|
5.times do
|
107
|
-
subject.foo.
|
128
|
+
expect(subject.foo).to be 1
|
108
129
|
end
|
109
130
|
end
|
110
131
|
end
|
@@ -132,14 +153,14 @@ describe Memoist2 do
|
|
132
153
|
|
133
154
|
it "can memoize question methods" do
|
134
155
|
5.times do
|
135
|
-
subject.question
|
156
|
+
expect(subject.question?).to be 1
|
136
157
|
end
|
137
158
|
end
|
138
159
|
|
139
160
|
it "can memoize bang methods" do
|
140
161
|
5.times do
|
141
|
-
subject.bang
|
162
|
+
expect(subject.bang!).to be 1
|
142
163
|
end
|
143
164
|
end
|
144
165
|
end
|
145
|
-
end
|
166
|
+
end
|
metadata
CHANGED
@@ -1,54 +1,54 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: memoist2
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.3.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Matthew Rudy Jacobs
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2015-02-07 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rspec
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
16
16
|
requirements:
|
17
|
-
- -
|
17
|
+
- - ">="
|
18
18
|
- !ruby/object:Gem::Version
|
19
19
|
version: '0'
|
20
20
|
type: :development
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
|
-
- -
|
24
|
+
- - ">="
|
25
25
|
- !ruby/object:Gem::Version
|
26
26
|
version: '0'
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: rake
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
30
30
|
requirements:
|
31
|
-
- -
|
31
|
+
- - ">="
|
32
32
|
- !ruby/object:Gem::Version
|
33
33
|
version: '0'
|
34
34
|
type: :development
|
35
35
|
prerelease: false
|
36
36
|
version_requirements: !ruby/object:Gem::Requirement
|
37
37
|
requirements:
|
38
|
-
- -
|
38
|
+
- - ">="
|
39
39
|
- !ruby/object:Gem::Version
|
40
40
|
version: '0'
|
41
41
|
description:
|
42
|
-
email:
|
42
|
+
email:
|
43
|
+
- matthewrudyjacobs@gmail.com
|
43
44
|
executables: []
|
44
45
|
extensions: []
|
45
|
-
extra_rdoc_files:
|
46
|
-
- README.md
|
46
|
+
extra_rdoc_files: []
|
47
47
|
files:
|
48
|
-
- .gitignore
|
49
|
-
- .rspec
|
50
|
-
- .ruby-version
|
51
|
-
- .travis.yml
|
48
|
+
- ".gitignore"
|
49
|
+
- ".rspec"
|
50
|
+
- ".ruby-version"
|
51
|
+
- ".travis.yml"
|
52
52
|
- Gemfile
|
53
53
|
- LICENCE
|
54
54
|
- README.md
|
@@ -56,6 +56,7 @@ files:
|
|
56
56
|
- benchmark.rb
|
57
57
|
- example/foo.rb
|
58
58
|
- lib/memoist2.rb
|
59
|
+
- lib/memoist2/version.rb
|
59
60
|
- memoist2.gemspec
|
60
61
|
- spec/memoist2_spec.rb
|
61
62
|
- spec/spec_helper.rb
|
@@ -64,25 +65,25 @@ licenses:
|
|
64
65
|
- MIT
|
65
66
|
metadata: {}
|
66
67
|
post_install_message:
|
67
|
-
rdoc_options:
|
68
|
-
- --main
|
69
|
-
- README.md
|
68
|
+
rdoc_options: []
|
70
69
|
require_paths:
|
71
70
|
- lib
|
72
71
|
required_ruby_version: !ruby/object:Gem::Requirement
|
73
72
|
requirements:
|
74
|
-
- -
|
73
|
+
- - ">="
|
75
74
|
- !ruby/object:Gem::Version
|
76
75
|
version: 2.0.0
|
77
76
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
78
77
|
requirements:
|
79
|
-
- -
|
78
|
+
- - ">="
|
80
79
|
- !ruby/object:Gem::Version
|
81
80
|
version: '0'
|
82
81
|
requirements: []
|
83
82
|
rubyforge_project:
|
84
|
-
rubygems_version: 2.
|
83
|
+
rubygems_version: 2.4.5
|
85
84
|
signing_key:
|
86
85
|
specification_version: 4
|
87
86
|
summary: Really simple memoization for ruby 2.0
|
88
|
-
test_files:
|
87
|
+
test_files:
|
88
|
+
- spec/memoist2_spec.rb
|
89
|
+
- spec/spec_helper.rb
|