attr_plus 0.2.2 → 0.3.0

Sign up to get free protection for your applications and to get access to all the features.
data/README.md CHANGED
@@ -5,6 +5,8 @@
5
5
  Adds `#class_attr_accessor` (and reader/writer) and `#inheritable_class_attr_accessor` (and
6
6
  reader/writer of course) to Class.
7
7
 
8
+ require 'attr_plus'
9
+
8
10
  class Polygon
9
11
  class_attr_accessor :sides
10
12
  end
@@ -33,6 +35,8 @@ You can provide default values using a hash with :default set for the last value
33
35
  creating one accessor/reader/writer add `=> defaultvalue` to the end, this example should
34
36
  make it more clear:
35
37
 
38
+ require 'attr_plus/class'
39
+
36
40
  class Person
37
41
  class_attr_accessor :name => 'John Doe'
38
42
  inheritable_class_attr_accessor :arms, :legs, :default => 2
@@ -52,10 +56,12 @@ make it more clear:
52
56
 
53
57
  ## ModuleAttr
54
58
 
55
- Almost exactly the same as `class_*` but for modules. __Note__ there is no module inheritence
59
+ Almost exactly the same as `class_*` but for modules. __Note__ there is no module inheritance
56
60
  so `inheritable_module_*` will not work, I am thinking of adding `includable_module_*` later
57
61
  but they aren't in yet so can't be used!
58
62
 
63
+ require 'attr_plus/module'
64
+
59
65
  module MyHouse
60
66
  module_attr_accessor :width, :height, :default => 200
61
67
  module_attr_accessor :rooms => []
@@ -67,6 +73,44 @@ but they aren't in yet so can't be used!
67
73
  House.rooms.first #=> :living_room
68
74
 
69
75
 
76
+ ## Instance Extensions
77
+
78
+ I've also added extensions to the methods for creating accessors on instances. These create
79
+ private versions, working exactly the same in every other way.
80
+
81
+ require 'attr_plus/instance'
82
+
83
+ class SecretBox
84
+ attr_writer :stuff
85
+ private_attr_reader :stuff
86
+
87
+ def initialize
88
+ @stuff = []
89
+ end
90
+
91
+ def <<(val)
92
+ stuff << val
93
+ end
94
+
95
+ def shake
96
+ stuff[rand(stuff.size)]
97
+ end
98
+ end
99
+
100
+ box = SecretBox.new
101
+ box << "giraffe"
102
+ box << "elephant"
103
+ box << "camel"
104
+ box << "cat"
105
+ p box.shake #=> "giraffe"
106
+ p box.stuff # NoMethodError: private method 'stuff' called
107
+ box.stuff = %w(dog hamster fish)
108
+ p box.shake #=> "fish"
109
+
110
+ And then as usual there are `private_attr_accessor` and `private_attr_writer` which work
111
+ as expected.
112
+
113
+
70
114
  ## Install
71
115
 
72
116
  (sudo) gem install attr_plus
@@ -79,13 +123,13 @@ but they aren't in yet so can't be used!
79
123
  # or for specific methods
80
124
  require 'attr_plus/class' # for only class_*
81
125
  require 'attr_plus/module' # for only module_*
126
+ require 'attr_plus/instance' # for only private_attr_*
82
127
 
83
128
 
84
129
  ### Important!
85
130
 
86
- If in a class you define the `self.inherited` method, make sure to call super at the end (or beginning)
87
- otherwise default values will not be set for the subclass. But I'm guessing you already called super
88
- anyway in a method like that.
131
+ If in a class you define the `self.inherited` method, make sure to call super
132
+ somewhere otherwise default values will not be set for the subclass.
89
133
 
90
134
 
91
135
  ## Thanks
@@ -1,19 +1,18 @@
1
- # At the moment attr_* is very fast, but very inflexible. It is not possible
2
- # to create :something? methods, which would be much easier than
3
- #
4
- # attr_accessor :alive
5
- # alias_method :alive?, :alive
6
- #
7
- # Also it is not possible to set defaults, these things could be remedied,
8
- # but should be done in the most efficient ways possible, ie. don't rely on
9
- # eval.
10
- #
11
- # attr_accessor :alive?
12
- #
13
- # Could become...
14
- #
15
- # attr_accessor :alive
16
- # alias_method :alive?, :alive
17
- #
18
- # Or something similar.
19
- #
1
+ class Module
2
+
3
+ def private_attr_accessor(*args)
4
+ private_attr_writer(*args)
5
+ private_attr_reader(*args)
6
+ end
7
+
8
+ def private_attr_writer(*args)
9
+ attr_writer(*args)
10
+ private(*args.map {|i| "#{i.to_s}=".to_sym })
11
+ end
12
+
13
+ def private_attr_reader(*args)
14
+ attr_reader(*args)
15
+ private(*args)
16
+ end
17
+
18
+ end
@@ -2,7 +2,7 @@ require 'spec_helper'
2
2
 
3
3
  describe Class do
4
4
 
5
- describe "#class_attr_reader" do
5
+ describe ".class_attr_reader" do
6
6
  subject { Class.new { class_attr_reader :test } }
7
7
 
8
8
  it "defines a read method for the class" do
@@ -14,7 +14,7 @@ describe Class do
14
14
  end
15
15
  end
16
16
 
17
- describe "#class_attr_writer" do
17
+ describe ".class_attr_writer" do
18
18
  subject { Class.new { class_attr_writer :test } }
19
19
 
20
20
  it "defines a write method for the class" do
@@ -22,7 +22,7 @@ describe Class do
22
22
  end
23
23
  end
24
24
 
25
- describe "#class_attr_accessor" do
25
+ describe ".class_attr_accessor" do
26
26
  subject { Class.new { class_attr_accessor :test } }
27
27
 
28
28
  it "defines a read method for the class" do
@@ -69,7 +69,7 @@ describe Class do
69
69
 
70
70
  # Inheritable class attributes
71
71
 
72
- describe "#inheritable_class_attr_reader" do
72
+ describe ".inheritable_class_attr_reader" do
73
73
  subject { Class.new { inheritable_class_attr_reader :test } }
74
74
 
75
75
  it "defines a read method for the class" do
@@ -81,7 +81,7 @@ describe Class do
81
81
  end
82
82
  end
83
83
 
84
- describe "#inheritable_class_attr_writer" do
84
+ describe ".inheritable_class_attr_writer" do
85
85
  subject { Class.new { inheritable_class_attr_writer :test } }
86
86
 
87
87
  it "defines a write method for the class" do
@@ -89,7 +89,7 @@ describe Class do
89
89
  end
90
90
  end
91
91
 
92
- describe "#inheritable_class_attr_accessor" do
92
+ describe ".inheritable_class_attr_accessor" do
93
93
  subject { Class.new { inheritable_class_attr_accessor :test } }
94
94
 
95
95
  it "defines a read method for the class" do
@@ -162,4 +162,11 @@ describe Class do
162
162
 
163
163
  end
164
164
 
165
+
166
+ # Class Variables
167
+
168
+ describe ".cattr_accessor" do
169
+
170
+ end
171
+
165
172
  end
@@ -0,0 +1,71 @@
1
+ require 'spec_helper'
2
+
3
+ describe Module do
4
+
5
+ describe ".private_attr_reader" do
6
+ subject {
7
+ Class.new {
8
+ private_attr_reader :test
9
+ attr_writer :test
10
+ def read; test; end
11
+ }.new
12
+ }
13
+
14
+ it "defines a private reader method" do
15
+ subject.should_not respond_to :test
16
+ subject.respond_to?(:test, true).should be_true
17
+ end
18
+
19
+ it "allows the class to call it" do
20
+ subject.test = "hi"
21
+ subject.instance_eval("test").should == "hi"
22
+ end
23
+ end
24
+
25
+ describe ".private_attr_writer" do
26
+ subject {
27
+ Class.new {
28
+ private_attr_writer :test
29
+ attr_reader :test
30
+ }.new
31
+ }
32
+
33
+ it "defines a private reader method" do
34
+ subject.should_not respond_to :test=
35
+ subject.respond_to?(:test=, true).should be_true
36
+ end
37
+
38
+ it "allows the class to call it" do
39
+ subject.instance_eval("self.test = 'hi'")
40
+ subject.test.should == "hi"
41
+ end
42
+ end
43
+
44
+ describe ".private_attr_accessor" do
45
+ subject {
46
+ Class.new {
47
+ private_attr_accessor :test
48
+ def read; test; end
49
+ }.new
50
+ }
51
+
52
+ it "defines private writer and reader methods" do
53
+ subject.should_not respond_to :test
54
+ subject.respond_to?(:test, true).should be_true
55
+
56
+ subject.should_not respond_to :test=
57
+ subject.respond_to?(:test=, true).should be_true
58
+ end
59
+
60
+ it "allows the class to write to it" do
61
+ subject.instance_eval("self.test = 'hi'")
62
+ subject.read.should == "hi"
63
+ end
64
+
65
+ it "allows the class to read it" do
66
+ subject.send(:test=, "hi")
67
+ subject.instance_eval("test").should == "hi"
68
+ end
69
+ end
70
+
71
+ end
metadata CHANGED
@@ -1,32 +1,25 @@
1
- --- !ruby/object:Gem::Specification
1
+ --- !ruby/object:Gem::Specification
2
2
  name: attr_plus
3
- version: !ruby/object:Gem::Version
4
- prerelease: false
5
- segments:
6
- - 0
7
- - 2
8
- - 2
9
- version: 0.2.2
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.3.0
5
+ prerelease:
10
6
  platform: ruby
11
- authors:
7
+ authors:
12
8
  - Joshua Hawxwell
13
9
  autorequire:
14
10
  bindir: bin
15
11
  cert_chain: []
16
-
17
- date: 2011-02-22 00:00:00 +00:00
12
+ date: 2011-04-27 00:00:00.000000000 +01:00
18
13
  default_executable:
19
14
  dependencies: []
20
-
21
- description: " Provides attr_accessor style methods for easily creating methods for\n working with class level instance variables and module level instance\n variables. Variables can be inherited and have default values.\n"
15
+ description: ! " Provides attr_accessor style methods for easily creating methods
16
+ for\n working with class level instance variables and module level instance\n
17
+ \ variables. Variables can be inherited and have default values.\n"
22
18
  email: m@hawx.me
23
19
  executables: []
24
-
25
20
  extensions: []
26
-
27
21
  extra_rdoc_files: []
28
-
29
- files:
22
+ files:
30
23
  - README.md
31
24
  - LICENSE
32
25
  - lib/attr_plus/class.rb
@@ -36,43 +29,38 @@ files:
36
29
  - lib/attr_plus.rb
37
30
  - lib/class_attr.rb
38
31
  - spec/attr_plus/class_spec.rb
32
+ - spec/attr_plus/instance_spec.rb
39
33
  - spec/attr_plus/module_spec.rb
40
34
  - spec/class_attr_spec.rb
41
35
  - spec/spec_helper.rb
42
36
  has_rdoc: false
43
37
  homepage: http://github.com/hawx/attr_plus
44
38
  licenses: []
45
-
46
39
  post_install_message:
47
40
  rdoc_options: []
48
-
49
- require_paths:
41
+ require_paths:
50
42
  - lib
51
- required_ruby_version: !ruby/object:Gem::Requirement
43
+ required_ruby_version: !ruby/object:Gem::Requirement
52
44
  none: false
53
- requirements:
54
- - - ">="
55
- - !ruby/object:Gem::Version
56
- segments:
57
- - 0
58
- version: "0"
59
- required_rubygems_version: !ruby/object:Gem::Requirement
45
+ requirements:
46
+ - - ! '>='
47
+ - !ruby/object:Gem::Version
48
+ version: '0'
49
+ required_rubygems_version: !ruby/object:Gem::Requirement
60
50
  none: false
61
- requirements:
62
- - - ">="
63
- - !ruby/object:Gem::Version
64
- segments:
65
- - 0
66
- version: "0"
51
+ requirements:
52
+ - - ! '>='
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
67
55
  requirements: []
68
-
69
56
  rubyforge_project:
70
- rubygems_version: 1.3.7
57
+ rubygems_version: 1.6.2
71
58
  signing_key:
72
59
  specification_version: 3
73
60
  summary: attr_accessor for class and module level instance variables.
74
- test_files:
61
+ test_files:
75
62
  - spec/attr_plus/class_spec.rb
63
+ - spec/attr_plus/instance_spec.rb
76
64
  - spec/attr_plus/module_spec.rb
77
65
  - spec/class_attr_spec.rb
78
66
  - spec/spec_helper.rb