smtlaissezfaire-lazy_attr 1.0.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/README.markdown +43 -0
- data/VERSION.yml +4 -0
- data/lib/lazy_attr.rb +18 -0
- data/spec/lazy_attr_spec.rb +105 -0
- data/spec/spec.opts +2 -0
- data/spec/spec_helper.rb +4 -0
- metadata +60 -0
data/README.markdown
ADDED
@@ -0,0 +1,43 @@
|
|
1
|
+
|
2
|
+
LazyAttr
|
3
|
+
========
|
4
|
+
|
5
|
+
Extend your class with LazyAttr:
|
6
|
+
|
7
|
+
require "rubygems"
|
8
|
+
require "lazy_attr"
|
9
|
+
|
10
|
+
class MyClass
|
11
|
+
extend LazyAttr
|
12
|
+
|
13
|
+
lazy_attr_reader :foo, lambda { 17 }
|
14
|
+
attr_writer :foo
|
15
|
+
|
16
|
+
lazy_attr_accessor :bar, lambda { Time.now }
|
17
|
+
end
|
18
|
+
|
19
|
+
|
20
|
+
Use it like a typical `attr_reader` or `attr_accessor`:
|
21
|
+
|
22
|
+
>> obj = MyClass.new
|
23
|
+
=> #<MyClass:0x260818>
|
24
|
+
|
25
|
+
>> obj.foo
|
26
|
+
=> 17
|
27
|
+
>> obj.foo = 18
|
28
|
+
=> 18
|
29
|
+
>> obj.foo
|
30
|
+
=> 18
|
31
|
+
|
32
|
+
>> obj.bar
|
33
|
+
=> Mon Feb 23 01:41:15 -0500 2009
|
34
|
+
>> obj.bar
|
35
|
+
=> Mon Feb 23 01:41:15 -0500 2009
|
36
|
+
>> obj.bar = Time.now
|
37
|
+
=> Mon Feb 23 01:41:20 -0500 2009
|
38
|
+
>> obj.bar
|
39
|
+
=> Mon Feb 23 01:41:20 -0500 2009
|
40
|
+
|
41
|
+
|
42
|
+
|
43
|
+
Scott Taylor // scott@railsnewbie.com
|
data/VERSION.yml
ADDED
data/lib/lazy_attr.rb
ADDED
@@ -0,0 +1,18 @@
|
|
1
|
+
module LazyAttr
|
2
|
+
def lazy_attr_reader(method_name, default_value)
|
3
|
+
ivar_name = "@#{method_name}"
|
4
|
+
|
5
|
+
define_method method_name do
|
6
|
+
if ivar = instance_variable_get(ivar_name)
|
7
|
+
ivar
|
8
|
+
else
|
9
|
+
instance_variable_set(ivar_name, default_value.call)
|
10
|
+
end
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
def lazy_attr_accessor(method_name, default_value)
|
15
|
+
lazy_attr_reader(method_name, default_value)
|
16
|
+
attr_writer(method_name)
|
17
|
+
end
|
18
|
+
end
|
@@ -0,0 +1,105 @@
|
|
1
|
+
require File.dirname(__FILE__) + "/spec_helper"
|
2
|
+
|
3
|
+
describe LazyAttr do
|
4
|
+
def new_class(&block)
|
5
|
+
klass = Class.new do
|
6
|
+
extend LazyAttr
|
7
|
+
end
|
8
|
+
klass.class_eval(&block)
|
9
|
+
klass
|
10
|
+
end
|
11
|
+
|
12
|
+
describe "lazy attr reader" do
|
13
|
+
it "should define a lazy attr reader which sets the value on access" do
|
14
|
+
klass = new_class do
|
15
|
+
lazy_attr_reader :foo, lambda { [] }
|
16
|
+
end
|
17
|
+
|
18
|
+
klass.new.foo.should == []
|
19
|
+
end
|
20
|
+
|
21
|
+
it "should use the correct value for the reader" do
|
22
|
+
klass = new_class do
|
23
|
+
lazy_attr_reader :foo, lambda { "foobar" }
|
24
|
+
end
|
25
|
+
|
26
|
+
klass.new.foo.should == "foobar"
|
27
|
+
end
|
28
|
+
|
29
|
+
it "should use the real value if given" do
|
30
|
+
klass = new_class do
|
31
|
+
lazy_attr_reader :foo, lambda { "foobar" }
|
32
|
+
attr_writer :foo
|
33
|
+
end
|
34
|
+
|
35
|
+
obj = klass.new
|
36
|
+
|
37
|
+
obj.foo = "bar"
|
38
|
+
obj.foo.should == "bar"
|
39
|
+
end
|
40
|
+
|
41
|
+
it "should set the ivar on the first access" do
|
42
|
+
klass = new_class do
|
43
|
+
lazy_attr_reader :foo, lambda { "foobar" }
|
44
|
+
end
|
45
|
+
|
46
|
+
obj = klass.new
|
47
|
+
|
48
|
+
obj.foo
|
49
|
+
obj.instance_variable_get("@foo").should == "foobar"
|
50
|
+
end
|
51
|
+
|
52
|
+
it "should use the correct name for the accessor" do
|
53
|
+
klass = new_class do
|
54
|
+
lazy_attr_reader :bar, lambda { "foobar" }
|
55
|
+
end
|
56
|
+
|
57
|
+
obj = klass.new
|
58
|
+
|
59
|
+
obj.should respond_to(:bar)
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
63
|
+
describe "lazy_attr_accessor" do
|
64
|
+
it "should setup a normal writer" do
|
65
|
+
klass = new_class do
|
66
|
+
lazy_attr_accessor :foo, lambda { nil }
|
67
|
+
end
|
68
|
+
|
69
|
+
obj = klass.new
|
70
|
+
|
71
|
+
obj.foo = "bar"
|
72
|
+
obj.foo.should == "bar"
|
73
|
+
end
|
74
|
+
|
75
|
+
it "should setup a lazy_attr_reader" do
|
76
|
+
klass = new_class do
|
77
|
+
lazy_attr_accessor :foo, lambda { "baz" }
|
78
|
+
end
|
79
|
+
|
80
|
+
obj = klass.new
|
81
|
+
obj.foo.should == "baz"
|
82
|
+
end
|
83
|
+
|
84
|
+
it "should setup a reader & writer with the correct names" do
|
85
|
+
klass = new_class do
|
86
|
+
lazy_attr_accessor :baz, lambda { "baz" }
|
87
|
+
end
|
88
|
+
|
89
|
+
obj = klass.new
|
90
|
+
obj.should respond_to(:baz)
|
91
|
+
obj.should respond_to(:baz=)
|
92
|
+
end
|
93
|
+
|
94
|
+
it "should use the default value given" do
|
95
|
+
an_object = mock 'an object'
|
96
|
+
|
97
|
+
klass = new_class do
|
98
|
+
lazy_attr_accessor :baz, lambda { an_object }
|
99
|
+
end
|
100
|
+
|
101
|
+
obj = klass.new
|
102
|
+
obj.baz.should equal(an_object)
|
103
|
+
end
|
104
|
+
end
|
105
|
+
end
|
data/spec/spec.opts
ADDED
data/spec/spec_helper.rb
ADDED
metadata
ADDED
@@ -0,0 +1,60 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: smtlaissezfaire-lazy_attr
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 1.0.1
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Scott Taylor
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
|
12
|
+
date: 2009-02-24 00:00:00 -08:00
|
13
|
+
default_executable:
|
14
|
+
dependencies: []
|
15
|
+
|
16
|
+
description: TODO
|
17
|
+
email: scott@railsnewbie.com
|
18
|
+
executables: []
|
19
|
+
|
20
|
+
extensions: []
|
21
|
+
|
22
|
+
extra_rdoc_files: []
|
23
|
+
|
24
|
+
files:
|
25
|
+
- README.markdown
|
26
|
+
- VERSION.yml
|
27
|
+
- lib/lazy_attr.rb
|
28
|
+
- spec/lazy_attr
|
29
|
+
- spec/lazy_attr_spec.rb
|
30
|
+
- spec/spec.opts
|
31
|
+
- spec/spec_helper.rb
|
32
|
+
has_rdoc: true
|
33
|
+
homepage: http://github.com/smtlaissezfaire/lazy_attr
|
34
|
+
post_install_message:
|
35
|
+
rdoc_options:
|
36
|
+
- --inline-source
|
37
|
+
- --charset=UTF-8
|
38
|
+
require_paths:
|
39
|
+
- lib
|
40
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
41
|
+
requirements:
|
42
|
+
- - ">="
|
43
|
+
- !ruby/object:Gem::Version
|
44
|
+
version: "0"
|
45
|
+
version:
|
46
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
47
|
+
requirements:
|
48
|
+
- - ">="
|
49
|
+
- !ruby/object:Gem::Version
|
50
|
+
version: "0"
|
51
|
+
version:
|
52
|
+
requirements: []
|
53
|
+
|
54
|
+
rubyforge_project:
|
55
|
+
rubygems_version: 1.2.0
|
56
|
+
signing_key:
|
57
|
+
specification_version: 2
|
58
|
+
summary: TODO
|
59
|
+
test_files: []
|
60
|
+
|