scoped_attr_accessor 1.0.1 → 1.0.2

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: 9fd58a73e8641fcfbd9205039fad4c77fb1920a2
4
+ data.tar.gz: 788bb68336faabada51d7454d56769bea5924830
5
+ SHA512:
6
+ metadata.gz: 4edfae715f4bbb70688ba3326e4928f174e2174d646834f9772d4aeb75c453c092accce186762805148e88a3a63fa4ee57a4a89d5a9524da701615f8d98af08a
7
+ data.tar.gz: f92e78883d16dc0d5220ef4aeab45fd1fd956c79de9bfb963390ca2bf58e389a6287992aa190c25dcd15e65edf7f45c2b05862f53f9db194b0fade829bec1a0e
data/README.md CHANGED
@@ -59,7 +59,9 @@ classes able to have protected and private accessors.
59
59
 
60
60
  The '/include' form of this gem is a ruby-wide monkeypatch. Please
61
61
  remember that it's perfectly fine to use it this way in your own
62
- applications, but quite rude to use it this way in a library.
62
+ applications, but quite rude to use it this way in a library. People
63
+ who use your library would then be infected by this monkeypatch as
64
+ well. Not cool.
63
65
 
64
66
  If you use scoped accessors in a gem or library of your own, please
65
67
  consider using the non-include version, or, in Ruby 2.0, use
@@ -85,12 +87,12 @@ general is somewhat divided on the meaning of the concept of privacy
85
87
  in ruby. For some, especially those who come from Java, C++, VB, or
86
88
  some other language that enforces encapsulation with privacy, ruby's
87
89
  ability to get around privacy means that encapsulation cannot be
88
- enforced. Most of us (I count myself in this camp) have discarded the
89
- use of privacy in ruby altogether, as if it were nothing more than a
90
- half-hearted nod to other languages' encapsulation practices. Make
91
- everything public, since everything's ultimately public anyway, we
92
- say; using the private keyword is merely a speedbump which adds no
93
- security but does add hassle and headache.
90
+ enforced. Most of us (I have counted myself in this camp until now)
91
+ have discarded the use of privacy in ruby altogether, as if it were
92
+ nothing more than a half-hearted nod to other languages' encapsulation
93
+ practices. Make everything public, we say; since everything's
94
+ ultimately public anyway, using the private keyword is merely a
95
+ speedbump which adds no security but does add hassle and headache.
94
96
 
95
97
  I am becoming more and more aware of a number of rubyists who consider
96
98
  the use of private and protected methods in ruby to be a useful way to
@@ -105,23 +107,42 @@ maintainers of the code, meaning that a maintainer will understand the
105
107
  intent of the privacy, and be less likely to *accidentally* create an
106
108
  external dependency on on a method that should have been kept private.
107
109
 
108
- I am becoming more and more swayed by this second way of thinking, but
109
- I find that it falls short in one key area: accessors. It is easy to
110
- create a private method in ruby, but creating a private accessor
111
- method is actually a bit tortuous. As a result, I see programmers who
112
- strongly believe in using privacy to communicate undependable
113
- interfaces frequently making use of either instance variables or
114
- public accessors for their private variables. These variables are not
115
- dependable, at least from a "stable interface" standpoint, so both
116
- solutions offer an unfavorable tradeoff. While instance variables
117
- communicate privacy, they force the object to depend on its own
118
- undependable internal interface. Meanwhile, public accessors allow the
119
- class to isolate itself from its undependable interface, but by making
120
- it public the communication to the maintainer is that other classes
121
- can and should depend on that undependable interface.
122
-
123
- The reason programmers make this tradeoff is that there doesn't seem
124
- to be an easy, clean, *elegant* way to create private and protected
125
- accessors in ruby. My goal with this gem, then, is to create such a
126
- way, so that those who wish to communicate "this variable is
127
- undependable and it should be kept isolated for now" can do so easily.
110
+ Another way of looking at this difference of opinion is that the old
111
+ way of thinking is that `private` is there to protect my code from
112
+ your prying eyes, which implies that I think I am smarter than every
113
+ programmer ever, even all the ones who come from the future. It also
114
+ means, at least in ruby, that I think hiding stuff inside a wet paper
115
+ bag is a pretty good way of securing such code from you future
116
+ programmers. This new way of thinking admits to the wet paper bag, but
117
+ more importantly it reverses the direction of the protection: it is
118
+ only a speedbump, but it is there to protect YOU, a smart future
119
+ programmer, from code that I, a programmer from the past who knows he
120
+ will never be as dumb as he is right now, wrote and got working but
121
+ it's volatile and dangerous to depend upon. You may figure out a way
122
+ to use that code safely, and if you do, then by all means cut through
123
+ that paper bag.
124
+
125
+ I have become swayed by this second way of thinking, but I find that
126
+ it falls short in one key area: accessors. It is easy to create a
127
+ private method in ruby, but creating a private accessor method is
128
+ actually a bit tortuous. As a result, I see programmers who strongly
129
+ believe in using privacy to communicate undependable interfaces
130
+ frequently making one of two bad tradeoffs: they either use instance
131
+ variables or public accessors for their private variables. These
132
+ variables are not dependable, at least from a "stable interface"
133
+ standpoint, so both solutions are suboptimal. While instance variables
134
+ communicate privacy, they force the class to depend on its own
135
+ undependable internals. Making an accessor allows the class to create
136
+ an internal interface to isolates itself from its own undependable
137
+ internals, but by making it public the communication to the maintainer
138
+ is that other classes can and should depend on that interface.
139
+
140
+ What is needed is a clean, easy, *elegant* way to create private and
141
+ protected accessors, so that classes can create internal interfaces
142
+ to their instance variables, reducing their exposure to their own
143
+ volatility WITHOUT communicating that interface publically.
144
+
145
+ We need a clean and easy way to create private and protected accessors
146
+ in ruby. My goal with this gem, then, is to create such a way, so that
147
+ those who wish to communicate "this variable is undependable and it
148
+ should be kept isolated for now" can do so easily.
@@ -1,3 +1,3 @@
1
1
  module ScopedAttrAccessor
2
- VERSION = "1.0.1"
2
+ VERSION = "1.0.2"
3
3
  end
@@ -25,22 +25,22 @@ module ScopedAttrAccessor
25
25
  end
26
26
 
27
27
  def private_attr_accessor(*names)
28
- attr_accessor(*names)
29
- names.each {|name| private name; private "#{name}=" }
28
+ private_attr_reader(*names)
29
+ private_attr_writer(*names)
30
30
  end
31
31
 
32
32
  def protected_attr_reader(*names)
33
- protected
34
33
  attr_reader(*names)
34
+ names.each {|name| protected name}
35
35
  end
36
36
 
37
37
  def protected_attr_writer(*names)
38
- protected
39
38
  attr_writer(*names)
39
+ names.each {|name| protected "#{name}=" }
40
40
  end
41
41
 
42
42
  def protected_attr_accessor(*names)
43
- protected
44
- attr_accessor(*names)
43
+ protected_attr_reader(*names)
44
+ protected_attr_writer(*names)
45
45
  end
46
46
  end
@@ -20,6 +20,6 @@ Gem::Specification.new do |spec|
20
20
 
21
21
  spec.add_development_dependency "bundler", "~> 1.3"
22
22
  spec.add_development_dependency "debugger", "~> 1.5"
23
- spec.add_development_dependency "rake"
23
+ spec.add_development_dependency "rake", "~> 10.0"
24
24
  spec.add_development_dependency "minitest", "~> 4.0"
25
25
  end
@@ -120,19 +120,30 @@ module ScopedAttrAccessorTests
120
120
  # Happy path test 1. If priv_read1-3 are private, they should be
121
121
  # inaccessible
122
122
  def test_private_readers_are_in_fact_private
123
- lambda { @foo.priv_read1 }.must_raise NoMethodError
124
- lambda { @foo.priv_read2 }.must_raise NoMethodError
125
- lambda { @foo.priv_read3 }.must_raise NoMethodError
123
+ -> { @foo.priv_read1 }.must_raise NoMethodError
124
+ -> { @foo.priv_read2 }.must_raise NoMethodError
125
+ -> { @foo.priv_read3 }.must_raise NoMethodError
126
+ -> { @bar.priv_read1 }.must_raise NoMethodError
127
+ -> { @bar.priv_read2 }.must_raise NoMethodError
128
+ -> { @bar.priv_read3 }.must_raise NoMethodError
126
129
  end
127
130
 
128
131
  def test_private_writers_are_in_fact_private
129
- lambda { @foo.priv_write1 = "OH NOES" }.must_raise NoMethodError
130
- lambda { @foo.priv_write2 = "OH NOES" }.must_raise NoMethodError
132
+ -> { @foo.priv_write1 = "OH NOES" }.must_raise NoMethodError
133
+ -> { @foo.priv_write2 = "OH NOES" }.must_raise NoMethodError
134
+ -> { @bar.priv_write1 = "OH NOES" }.must_raise NoMethodError
135
+ -> { @bar.priv_write2 = "OH NOES" }.must_raise NoMethodError
131
136
  end
132
137
 
133
138
  def test_private_accessors_are_in_fact_private
134
- lambda { @foo.priv_access1 = "OH NOES" }.must_raise NoMethodError
135
- lambda { @foo.priv_access2 = "OH NOES" }.must_raise NoMethodError
139
+ -> { @foo.priv_access1 = "OH NOES" }.must_raise NoMethodError
140
+ -> { @foo.priv_access2 = "OH NOES" }.must_raise NoMethodError
141
+ -> { @foo.priv_access1 }.must_raise NoMethodError
142
+ -> { @foo.priv_access2 }.must_raise NoMethodError
143
+ -> { @bar.priv_access1 = "OH NOES" }.must_raise NoMethodError
144
+ -> { @bar.priv_access2 = "OH NOES" }.must_raise NoMethodError
145
+ -> { @bar.priv_access1 }.must_raise NoMethodError
146
+ -> { @bar.priv_access2 }.must_raise NoMethodError
136
147
  end
137
148
 
138
149
  # Happy path test 2. priv_read1 and priv_read2 may be inaccessible, but are they
@@ -160,9 +171,9 @@ module ScopedAttrAccessorTests
160
171
  # Happy path test 3. If prot_read1-3 are protected, they should be
161
172
  # inaccessible
162
173
  def test_protected_readers_are_in_fact_private
163
- lambda { @foo.prot_read1 }.must_raise NoMethodError
164
- lambda { @foo.prot_read2 }.must_raise NoMethodError
165
- lambda { @foo.prot_read3 }.must_raise NoMethodError
174
+ -> { @foo.prot_read1 }.must_raise NoMethodError
175
+ -> { @foo.prot_read2 }.must_raise NoMethodError
176
+ -> { @foo.prot_read3 }.must_raise NoMethodError
166
177
  end
167
178
 
168
179
  # Happy path test 4. prot_read1 and prot_read2 may be inaccessible, but are they
@@ -188,17 +199,19 @@ module ScopedAttrAccessorTests
188
199
  # private scope, after we created protected reader 3, did
189
200
  # attr_accessor priv_read3 still get created privately?
190
201
  def test_private_readers_AFTER_protected_accessors_are_STILL_private
191
- lambda { @foo.peek_at_priv_read3_via_protected_access_BAD }.must_raise NoMethodError
202
+ -> { @foo.peek_at_priv_read3_via_protected_access_BAD }.must_raise NoMethodError
192
203
  end
193
204
 
194
205
  def test_protected_writers_are_in_fact_protected
195
- lambda { @bar.prot_write1 = "OH NOES" }.must_raise NoMethodError
196
- lambda { @bar.prot_write2 = "OH NOES" }.must_raise NoMethodError
206
+ -> { @bar.prot_write1 = "OH NOES" }.must_raise NoMethodError
207
+ -> { @bar.prot_write2 = "OH NOES" }.must_raise NoMethodError
197
208
  end
198
209
 
199
210
  def test_protected_accessors_are_in_fact_protected
200
- lambda { @bar.prot_access1 = "OH NOES" }.must_raise NoMethodError
201
- lambda { @bar.prot_access2 = "OH NOES" }.must_raise NoMethodError
211
+ -> { @bar.prot_access1 }.must_raise NoMethodError
212
+ -> { @bar.prot_access2 }.must_raise NoMethodError
213
+ -> { @bar.prot_access1 = "OH NOES" }.must_raise NoMethodError
214
+ -> { @bar.prot_access2 = "OH NOES" }.must_raise NoMethodError
202
215
  end
203
216
 
204
217
  def test_protected_writers_do_in_fact_work_as_writers
metadata CHANGED
@@ -1,20 +1,18 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: scoped_attr_accessor
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.1
5
- prerelease:
4
+ version: 1.0.2
6
5
  platform: ruby
7
6
  authors:
8
7
  - David Brady
9
8
  autorequire:
10
9
  bindir: bin
11
10
  cert_chain: []
12
- date: 2013-04-29 00:00:00.000000000 Z
11
+ date: 2013-05-01 00:00:00.000000000 Z
13
12
  dependencies:
14
13
  - !ruby/object:Gem::Dependency
15
14
  name: bundler
16
15
  requirement: !ruby/object:Gem::Requirement
17
- none: false
18
16
  requirements:
19
17
  - - ~>
20
18
  - !ruby/object:Gem::Version
@@ -22,7 +20,6 @@ dependencies:
22
20
  type: :development
23
21
  prerelease: false
24
22
  version_requirements: !ruby/object:Gem::Requirement
25
- none: false
26
23
  requirements:
27
24
  - - ~>
28
25
  - !ruby/object:Gem::Version
@@ -30,7 +27,6 @@ dependencies:
30
27
  - !ruby/object:Gem::Dependency
31
28
  name: debugger
32
29
  requirement: !ruby/object:Gem::Requirement
33
- none: false
34
30
  requirements:
35
31
  - - ~>
36
32
  - !ruby/object:Gem::Version
@@ -38,7 +34,6 @@ dependencies:
38
34
  type: :development
39
35
  prerelease: false
40
36
  version_requirements: !ruby/object:Gem::Requirement
41
- none: false
42
37
  requirements:
43
38
  - - ~>
44
39
  - !ruby/object:Gem::Version
@@ -46,23 +41,20 @@ dependencies:
46
41
  - !ruby/object:Gem::Dependency
47
42
  name: rake
48
43
  requirement: !ruby/object:Gem::Requirement
49
- none: false
50
44
  requirements:
51
- - - ! '>='
45
+ - - ~>
52
46
  - !ruby/object:Gem::Version
53
- version: '0'
47
+ version: '10.0'
54
48
  type: :development
55
49
  prerelease: false
56
50
  version_requirements: !ruby/object:Gem::Requirement
57
- none: false
58
51
  requirements:
59
- - - ! '>='
52
+ - - ~>
60
53
  - !ruby/object:Gem::Version
61
- version: '0'
54
+ version: '10.0'
62
55
  - !ruby/object:Gem::Dependency
63
56
  name: minitest
64
57
  requirement: !ruby/object:Gem::Requirement
65
- none: false
66
58
  requirements:
67
59
  - - ~>
68
60
  - !ruby/object:Gem::Version
@@ -70,7 +62,6 @@ dependencies:
70
62
  type: :development
71
63
  prerelease: false
72
64
  version_requirements: !ruby/object:Gem::Requirement
73
- none: false
74
65
  requirements:
75
66
  - - ~>
76
67
  - !ruby/object:Gem::Version
@@ -99,33 +90,26 @@ files:
99
90
  homepage: https://github.com/dbrady/scoped_attr_accessor.git
100
91
  licenses:
101
92
  - MIT
93
+ metadata: {}
102
94
  post_install_message:
103
95
  rdoc_options: []
104
96
  require_paths:
105
97
  - lib
106
98
  required_ruby_version: !ruby/object:Gem::Requirement
107
- none: false
108
99
  requirements:
109
- - - ! '>='
100
+ - - '>='
110
101
  - !ruby/object:Gem::Version
111
102
  version: '0'
112
- segments:
113
- - 0
114
- hash: -2597970377507506024
115
103
  required_rubygems_version: !ruby/object:Gem::Requirement
116
- none: false
117
104
  requirements:
118
- - - ! '>='
105
+ - - '>='
119
106
  - !ruby/object:Gem::Version
120
107
  version: '0'
121
- segments:
122
- - 0
123
- hash: -2597970377507506024
124
108
  requirements: []
125
109
  rubyforge_project:
126
- rubygems_version: 1.8.25
110
+ rubygems_version: 2.0.0.rc.2
127
111
  signing_key:
128
- specification_version: 3
112
+ specification_version: 4
129
113
  summary: Adds private_* and protected_* attr_reader, attr_writer, and attr_accessor
130
114
  test_files:
131
115
  - test/lib/test_scoped_attr_accessor.rb