scoped_attr_accessor 1.0.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.
data/.gitignore ADDED
@@ -0,0 +1,17 @@
1
+ *.gem
2
+ *.rbc
3
+ .bundle
4
+ .config
5
+ .yardoc
6
+ Gemfile.lock
7
+ InstalledFiles
8
+ _yardoc
9
+ coverage
10
+ doc/
11
+ lib/bundler/man
12
+ pkg
13
+ rdoc
14
+ spec/reports
15
+ test/tmp
16
+ test/version_tmp
17
+ tmp
data/.rvmrc ADDED
@@ -0,0 +1 @@
1
+ rvm gemset use scoped_attr_accessor --create
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in scoped_attr_accessor.gemspec
4
+ gemspec
data/LICENSE.txt ADDED
@@ -0,0 +1,22 @@
1
+ Copyright (c) 2013 David Brady
2
+
3
+ MIT License
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining
6
+ a copy of this software and associated documentation files (the
7
+ "Software"), to deal in the Software without restriction, including
8
+ without limitation the rights to use, copy, modify, merge, publish,
9
+ distribute, sublicense, and/or sell copies of the Software, and to
10
+ permit persons to whom the Software is furnished to do so, subject to
11
+ the following conditions:
12
+
13
+ The above copyright notice and this permission notice shall be
14
+ included in all copies or substantial portions of the Software.
15
+
16
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,127 @@
1
+ # ScopedAttrAccessor
2
+
3
+ Adds scoped accessors to ruby. You can create writers, readers and
4
+ accessors in either private or protected scope. Does not affect the
5
+ scope of code that comes afterward. You can extend a single class (and
6
+ its subclasses) with scoped accessors, or you can extend ruby's entire
7
+ class hierarchy.
8
+
9
+ ## Why Oh Why Does This Exist?!?
10
+
11
+ At the time of this writing (April 2013), the ruby community in
12
+ general is somewhat divided on the meaning of the concept of privacy
13
+ in ruby. For some, especially those who come from Java, C++, VB, or
14
+ some other language that enforces encapsulation with privacy, ruby's
15
+ ability to get around privacy means that encapsulation cannot be
16
+ enforced. Most of us (I count myself in this camp) have discarded the
17
+ use of privacy in ruby altogether, as if it were nothing more than a
18
+ half-hearted nod to other languages' encapsulation practices. Make
19
+ everything public, since everything's ultimately public anyway, we
20
+ say; using the private keyword is merely a speedbump which adds no
21
+ security but does add hassle and headache.
22
+
23
+ I am becoming more and more aware of a number of rubyists who consider
24
+ the use of private and protected methods in ruby to be a useful way to
25
+ communicate to the reader that the code is highly volatile, under
26
+ question, subject to change or outright removal, etc., and that for
27
+ these reasons the code should not be surfaced to the public API of the
28
+ class. They ALSO consider the private keyword to be merely a
29
+ speedbump, but one which communicates that maybe you should slow down
30
+ a bit before trying to access these portions of code. Furthermore,
31
+ making these methods private or protected makes them "exemplary" to
32
+ maintainers of the code, meaning that a maintainer will understand the
33
+ intent of the privacy, and be less likely to *accidentally* create an
34
+ external dependency on on a method that should have been kept private.
35
+
36
+ I am becoming more and more swayed by this second way of thinking, but
37
+ I find that it falls short in one key area: accessors. It is easy to
38
+ create a private method in ruby, but creating a private accessor
39
+ method is actually a bit tortuous. As a result, I see programmers who
40
+ strongly believe in using privacy to communicate undependable
41
+ interfaces frequently making use of either instance variables or
42
+ public accessors for their private variables. These variables are not
43
+ dependable, at least from a "stable interface" standpoint, so both
44
+ solutions offer an unfavorable tradeoff. While instance variables
45
+ communicate privacy, they force the object to depend on its own
46
+ undependable internal interface. Meanwhile, public accessors allow the
47
+ class to isolate itself from its undependable interface, but by making
48
+ it public the communication to the maintainer is that other classes
49
+ can and should depend on that undependable interface.
50
+
51
+ The reason programmers make this tradeoff is that there doesn't seem
52
+ to be an easy, clean, *elegant* way to create private and protected
53
+ accessors in ruby. My goal with this gem, then, is to create such a
54
+ way, so that those who wish to communicate "this variable is
55
+ undependable and it should be kept isolated for now" can do so easily.
56
+
57
+ ## Installation
58
+
59
+ Add this line to your application's Gemfile:
60
+
61
+ gem 'scoped_attr_accessor'
62
+
63
+ And then execute:
64
+
65
+ $ bundle
66
+
67
+ Or install it yourself as:
68
+
69
+ $ gem install scoped_attr_accessor
70
+
71
+ ## Usage
72
+
73
+ You can add scoped accessors to a single class (and its children) by
74
+ directly extending `ScopedAttrAccessor` in your class:
75
+
76
+ require 'scoped_attr_accessor'
77
+
78
+ class Primate
79
+ extend ScopedAttrAccessor
80
+ private_attr_accessor :some_weird_primate_only_counter
81
+ protected_attr_reader :some_weird_counter
82
+ end
83
+
84
+ class Monkey < Primate
85
+ # Monkey can define its own scoped accessors because Primate
86
+ # extended the module.
87
+ private_attr_reader :get_weird_monkey_only_stuff_here
88
+ private_attr_writer :put_weird_monkey_only_stuff_here
89
+
90
+ # use our inherited, protected reader
91
+ def sufficiently_weird?
92
+ some_weird_counter > 42
93
+ end
94
+ end
95
+
96
+ Alternately, if you require `scoped_attr_accessor/include`, ruby's
97
+ `Object` class will be extended with `ScopedAttrAccessor` making all
98
+ classes able to have protected and private accessors.
99
+
100
+ require 'scoped_attr_accessor/include'
101
+
102
+ class Primate
103
+ private_attr_accessor :private_primate_counter
104
+ end
105
+
106
+ ## Avoid Dependency Infection
107
+
108
+ The '/include' form of this gem is a ruby-wide monkeypatch. Please
109
+ remember that it's perfectly fine to use it this way in your own
110
+ applications, but quite rude to use it this way in a library.
111
+
112
+ If you use scoped accessors in a gem or library of your own, please
113
+ consider using the non-include version, or, in Ruby 2.0, use
114
+ refinements to confine the include patch to your library.
115
+
116
+ ## Ruby Versions
117
+
118
+ Tested to work on Ruby 1.9.3 and 2.0.
119
+
120
+ ## Contributing
121
+
122
+ 1. Fork it
123
+ 1. Create your feature branch (`git checkout -b my-new-feature`)
124
+ 1. Write tests for your feature or bug fix
125
+ 1. Commit your changes (`git commit -am 'Add some feature'`)
126
+ 1. Push to the branch (`git push origin my-new-feature`)
127
+ 1. Create new Pull Request
data/Rakefile ADDED
@@ -0,0 +1,10 @@
1
+ require "bundler/gem_tasks"
2
+ require 'rake/testtask'
3
+
4
+ Rake::TestTask.new do |t|
5
+ t.libs.push "lib"
6
+ t.test_files = FileList['test/**/test_*.rb']
7
+ t.verbose = true
8
+ end
9
+
10
+ task :default => [:test]
@@ -0,0 +1,7 @@
1
+ # By requiring 'scoped_attr_accessor/include', scoped_attr_accessor
2
+ # will be injected into every Object automatically.
3
+ require_relative '../scoped_attr_accessor'
4
+
5
+ class Object
6
+ extend ScopedAttrAccessor
7
+ end
@@ -0,0 +1,3 @@
1
+ module ScopedAttrAccessor
2
+ VERSION = "1.0.0"
3
+ end
@@ -0,0 +1,46 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ # This module adds scoped accessor methods to a Ruby Class. For
4
+ # example:
5
+ #
6
+ # class Foo
7
+ # extend ScopedAttrAccessor
8
+ # private_attr_reader :thing1, :thing2, :thing3
9
+ # protected_attr_writer :counter
10
+ # protected_attr_accessor :flagbag
11
+ # end
12
+ #
13
+ # They work exactly the same as the regular ruby attr_accessor
14
+ # methods, except they are placed in the appropriate public or
15
+ # private scope as desired.
16
+ module ScopedAttrAccessor
17
+ def private_attr_reader(*names)
18
+ attr_reader(*names)
19
+ names.each {|name| private name}
20
+ end
21
+
22
+ def private_attr_writer(*names)
23
+ attr_writer(*names)
24
+ names.each {|name| private "#{name}=" }
25
+ end
26
+
27
+ def private_attr_accessor(*names)
28
+ attr_accessor(*names)
29
+ names.each {|name| private name; private "#{name}=" }
30
+ end
31
+
32
+ def protected_attr_reader(*names)
33
+ protected
34
+ attr_reader(*names)
35
+ end
36
+
37
+ def protected_attr_writer(*names)
38
+ protected
39
+ attr_writer(*names)
40
+ end
41
+
42
+ def protected_attr_accessor(*names)
43
+ protected
44
+ attr_accessor(*names)
45
+ end
46
+ end
@@ -0,0 +1,25 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'scoped_attr_accessor/version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = "scoped_attr_accessor"
8
+ spec.version = ScopedAttrAccessor::VERSION
9
+ spec.authors = ["David Brady"]
10
+ spec.email = ["dbrady@shinybit.com"]
11
+ spec.description = %q{Adds private_attr_reader, private_attr_writer, private_attr_accessor, protected_attr_reader, protected_attr_writer, protected_attr_accessor class macros}
12
+ spec.summary = %q{Adds private_* and protected_* attr_reader, attr_writer, and attr_accessor}
13
+ spec.homepage = "https://github.com/dbrady/scoped_attr_accessor.git"
14
+ spec.license = "MIT"
15
+
16
+ spec.files = `git ls-files`.split($/)
17
+ spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
18
+ spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
19
+ spec.require_paths = ["lib"]
20
+
21
+ spec.add_development_dependency "bundler", "~> 1.3"
22
+ spec.add_development_dependency "debugger", "~> 1.5"
23
+ spec.add_development_dependency "rake"
24
+ spec.add_development_dependency "minitest", "~> 4.0"
25
+ end
@@ -0,0 +1,17 @@
1
+ require 'minitest/autorun'
2
+ require_relative '../../lib/scoped_attr_accessor'
3
+
4
+ # Directly extend Foo with ScopedAttrAccessor
5
+ module ScopedAttrAccessorTests
6
+ class Foo
7
+ extend ScopedAttrAccessor
8
+ end
9
+ end
10
+
11
+ # Load the common test suite
12
+ require_relative '../scoped_attr_accessor_test_module'
13
+
14
+ # Create a Test* class so it will run
15
+ class TestFoo < MiniTest::Unit::TestCase
16
+ include ScopedAttrAccessorTests
17
+ end
@@ -0,0 +1,12 @@
1
+ require 'debugger'
2
+ require 'minitest/autorun'
3
+ # Implicitly extend Foo with ScopedAttrAccessor by extending Object
4
+ require_relative '../../lib/scoped_attr_accessor/include'
5
+
6
+ # Load the common test suite
7
+ require_relative '../scoped_attr_accessor_test_module'
8
+
9
+ # Create a Test* class so it will run
10
+ class TestFooInclude < MiniTest::Unit::TestCase
11
+ include ScopedAttrAccessorTests
12
+ end
@@ -0,0 +1,217 @@
1
+ module ScopedAttrAccessorTests
2
+ # Foo uses all the accessor types, and also has a set of public
3
+ # attr_readers mixed in after the readers and another set after the
4
+ # writers and accessors. This is so the test suite can check to make
5
+ # sure that we stayed in public scope afterwards. A set of explicit
6
+ # poke and peek public accessor methods allow the test suite to modify
7
+ # and examine the contents of these private attributes.
8
+ class Foo
9
+ attr_reader :pub_read1, :pub_read2
10
+ private_attr_reader :priv_read1, :priv_read2
11
+ protected_attr_reader :prot_read1, :prot_read2
12
+
13
+ attr_reader :pub_read3, :pub_read4
14
+
15
+ private_attr_writer :priv_write1, :priv_write2
16
+ protected_attr_writer :prot_write1, :prot_write2
17
+
18
+ private_attr_accessor :priv_access1, :priv_access2
19
+ protected_attr_accessor :prot_access1, :prot_access2
20
+
21
+ attr_reader :pub_read5, :pub_read6
22
+
23
+ private
24
+ # this is a REALLY weird edge case, it's probably a bad idea to ever
25
+ # do this intentionally but I want to prove that, from this private
26
+ # scope, the prot_read3 accessor is created in protected scope AND
27
+ # that we bounce back not to public scope, but to private
28
+ protected_attr_reader :prot_read3
29
+
30
+ # We'll test this for privacy down below
31
+ attr_reader :priv_read3
32
+
33
+ public
34
+
35
+ def initialize
36
+ @pub_read1 = "pub_read1"
37
+ @pub_read2 = "pub_read2"
38
+ @pub_read3 = "pub_read3"
39
+ @pub_read4 = "pub_read4"
40
+ @pub_read5 = "pub_read5"
41
+ @pub_read6 = "pub_read6"
42
+
43
+ @prot_read1 = "prot_read1"
44
+ @prot_read2 = "prot_read2"
45
+ @prot_read3 = "prot_read3"
46
+ @prot_write1 = "prot_write1"
47
+ @prot_write2 = "prot_write2"
48
+ @prot_access1 = "prot_access1"
49
+ @prot_access2 = "prot_access2"
50
+
51
+ @priv_read1 = "priv_read1"
52
+ @priv_read2 = "priv_read2"
53
+ @priv_read3 = "priv_read3"
54
+ @priv_write1 = "priv_write1"
55
+ @priv_write2 = "priv_write2"
56
+ @priv_access1 = "priv_access1"
57
+ @priv_access2 = "priv_access2"
58
+ end
59
+
60
+ # Allow tests to peek and poke the private accessors
61
+ def peek_at_priv_read1; priv_read1; end
62
+ def peek_at_priv_read2; priv_read2; end
63
+ def peek_at_priv_read3; priv_read3; end
64
+
65
+ def peek_at_priv_write1; @priv_write1; end
66
+ def peek_at_priv_write2; @priv_write2; end
67
+
68
+ def peek_at_priv_access1; priv_access1; end
69
+ def peek_at_priv_access2; priv_access2; end
70
+
71
+ def poke_at_priv_write1(s); self.priv_write1 = s; end
72
+ def poke_at_priv_write2(s); self.priv_write2 = s; end
73
+
74
+ def poke_at_priv_access1(s); self.priv_access1 = s; end
75
+ def poke_at_priv_access2(s); self.priv_access2 = s; end
76
+
77
+ # Test only -- This method must not work!
78
+ def peek_at_priv_read3_via_protected_access_BAD; self.priv_read3; end
79
+ end
80
+
81
+ # Bar inherits from Foo and is primarily here to test that protected
82
+ # members do in fact inherit correctly. There are no poke/peek methods
83
+ # in Foo for protected attributes, for example; we want to make sure
84
+ # the poke and peek--and their internal accessor calls--are defined
85
+ # here instead of up in Foo.
86
+ class Bar < Foo
87
+ def initialize
88
+ super
89
+ end
90
+
91
+ # peek at our inherited readers
92
+ def peek_at_prot_read1; prot_read1; end
93
+ def peek_at_prot_read2; prot_read2; end
94
+ def peek_at_prot_read3; prot_read3; end
95
+
96
+ # peek at the writers
97
+ def peek_at_prot_access1; prot_access1; end
98
+ def peek_at_prot_access2; prot_access2; end
99
+ def peek_at_prot_write1; @prot_write1; end
100
+ def peek_at_prot_write2; @prot_write2; end
101
+
102
+ def poke_at_prot_write1(s); self.prot_write1 = s; end
103
+ def poke_at_prot_write2(s); self.prot_write2 = s; end
104
+
105
+ def poke_at_prot_access1(s); self.prot_access1 = s; end
106
+ def poke_at_prot_access2(s); self.prot_access2 = s; end
107
+ end
108
+
109
+ def setup
110
+ @foo = Foo.new
111
+ @bar = Bar.new
112
+ end
113
+
114
+ # This is just a sanity check; if it fails start chewing the straps
115
+ def test_unaltered_public_accessors_still_work_normally
116
+ @foo.pub_read1.must_equal "pub_read1"
117
+ @foo.pub_read2.must_equal "pub_read2"
118
+ end
119
+
120
+ # Happy path test 1. If priv_read1-3 are private, they should be
121
+ # inaccessible
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
126
+ end
127
+
128
+ 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
131
+ end
132
+
133
+ 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
136
+ end
137
+
138
+ # Happy path test 2. priv_read1 and priv_read2 may be inaccessible, but are they
139
+ # in fact present? Use the public peek_at_* methods to check them
140
+ def test_private_readers_do_in_fact_exist
141
+ @foo.peek_at_priv_read1.must_equal "priv_read1"
142
+ @foo.peek_at_priv_read2.must_equal "priv_read2"
143
+ @foo.peek_at_priv_read3.must_equal "priv_read3"
144
+ end
145
+
146
+ def test_private_writers_do_in_fact_work_as_writers
147
+ @foo.poke_at_priv_write1 "OOH NEAT1"
148
+ @foo.poke_at_priv_write2 "OOH NEAT2"
149
+ @foo.peek_at_priv_write1.must_equal "OOH NEAT1"
150
+ @foo.peek_at_priv_write2.must_equal "OOH NEAT2"
151
+ end
152
+
153
+ def test_private_accessors_do_in_fact_work_as_accessors
154
+ @foo.poke_at_priv_access1 "OOH WOW1"
155
+ @foo.poke_at_priv_access2 "OOH WOW2"
156
+ @foo.peek_at_priv_access1.must_equal "OOH WOW1"
157
+ @foo.peek_at_priv_access2.must_equal "OOH WOW2"
158
+ end
159
+
160
+ # Happy path test 3. If prot_read1-3 are protected, they should be
161
+ # inaccessible
162
+ 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
166
+ end
167
+
168
+ # Happy path test 4. prot_read1 and prot_read2 may be inaccessible, but are they
169
+ # in fact present? Use the public peek_at_* methods to check them
170
+ def test_protected_readers_do_in_fact_exist
171
+ @bar.peek_at_prot_read1.must_equal "prot_read1"
172
+ @bar.peek_at_prot_read2.must_equal "prot_read2"
173
+ @bar.peek_at_prot_read3.must_equal "prot_read3"
174
+ end
175
+
176
+ # And now the million dollar question: private_attr_accessor changes
177
+ # the scoping to private. When we come back out of this accessor, is
178
+ # Ruby still in private scope? Or does it revert to the scope it had
179
+ # beforehand?
180
+ def test_public_readers_AFTER_private_accessors_still_work_normally
181
+ @foo.pub_read3.must_equal "pub_read3"
182
+ @foo.pub_read4.must_equal "pub_read4"
183
+ @foo.pub_read5.must_equal "pub_read5"
184
+ @foo.pub_read6.must_equal "pub_read6"
185
+ end
186
+
187
+ # And the million-and-one-dollar question: Inside the explicitly
188
+ # private scope, after we created protected reader 3, did
189
+ # attr_accessor priv_read3 still get created privately?
190
+ def test_private_readers_AFTER_protected_accessors_are_STILL_private
191
+ lambda { @foo.peek_at_priv_read3_via_protected_access_BAD }.must_raise NoMethodError
192
+ end
193
+
194
+ 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
197
+ end
198
+
199
+ 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
202
+ end
203
+
204
+ def test_protected_writers_do_in_fact_work_as_writers
205
+ @bar.poke_at_prot_write1 "AWW YEAH1"
206
+ @bar.poke_at_prot_write2 "AWW YEAH2"
207
+ @bar.peek_at_prot_write1.must_equal "AWW YEAH1"
208
+ @bar.peek_at_prot_write2.must_equal "AWW YEAH2"
209
+ end
210
+
211
+ def test_protected_accessors_do_in_fact_work_as_accessors
212
+ @bar.poke_at_prot_access1 "OH SNAP1"
213
+ @bar.poke_at_prot_access2 "OH SNAP2"
214
+ @bar.peek_at_prot_access1.must_equal "OH SNAP1"
215
+ @bar.peek_at_prot_access2.must_equal "OH SNAP2"
216
+ end
217
+ end
metadata ADDED
@@ -0,0 +1,133 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: scoped_attr_accessor
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.0.0
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - David Brady
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2013-04-29 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: bundler
16
+ requirement: !ruby/object:Gem::Requirement
17
+ none: false
18
+ requirements:
19
+ - - ~>
20
+ - !ruby/object:Gem::Version
21
+ version: '1.3'
22
+ type: :development
23
+ prerelease: false
24
+ version_requirements: !ruby/object:Gem::Requirement
25
+ none: false
26
+ requirements:
27
+ - - ~>
28
+ - !ruby/object:Gem::Version
29
+ version: '1.3'
30
+ - !ruby/object:Gem::Dependency
31
+ name: debugger
32
+ requirement: !ruby/object:Gem::Requirement
33
+ none: false
34
+ requirements:
35
+ - - ~>
36
+ - !ruby/object:Gem::Version
37
+ version: '1.5'
38
+ type: :development
39
+ prerelease: false
40
+ version_requirements: !ruby/object:Gem::Requirement
41
+ none: false
42
+ requirements:
43
+ - - ~>
44
+ - !ruby/object:Gem::Version
45
+ version: '1.5'
46
+ - !ruby/object:Gem::Dependency
47
+ name: rake
48
+ requirement: !ruby/object:Gem::Requirement
49
+ none: false
50
+ requirements:
51
+ - - ! '>='
52
+ - !ruby/object:Gem::Version
53
+ version: '0'
54
+ type: :development
55
+ prerelease: false
56
+ version_requirements: !ruby/object:Gem::Requirement
57
+ none: false
58
+ requirements:
59
+ - - ! '>='
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ - !ruby/object:Gem::Dependency
63
+ name: minitest
64
+ requirement: !ruby/object:Gem::Requirement
65
+ none: false
66
+ requirements:
67
+ - - ~>
68
+ - !ruby/object:Gem::Version
69
+ version: '4.0'
70
+ type: :development
71
+ prerelease: false
72
+ version_requirements: !ruby/object:Gem::Requirement
73
+ none: false
74
+ requirements:
75
+ - - ~>
76
+ - !ruby/object:Gem::Version
77
+ version: '4.0'
78
+ description: Adds private_attr_reader, private_attr_writer, private_attr_accessor,
79
+ protected_attr_reader, protected_attr_writer, protected_attr_accessor class macros
80
+ email:
81
+ - dbrady@shinybit.com
82
+ executables: []
83
+ extensions: []
84
+ extra_rdoc_files: []
85
+ files:
86
+ - .gitignore
87
+ - .rvmrc
88
+ - Gemfile
89
+ - LICENSE.txt
90
+ - README.md
91
+ - Rakefile
92
+ - lib/scoped_attr_accessor.rb
93
+ - lib/scoped_attr_accessor/include.rb
94
+ - lib/scoped_attr_accessor/version.rb
95
+ - scoped_attr_accessor.gemspec
96
+ - test/lib/test_scoped_attr_accessor.rb
97
+ - test/lib/test_scoped_attr_accessor_include.rb
98
+ - test/scoped_attr_accessor_test_module.rb
99
+ homepage: https://github.com/dbrady/scoped_attr_accessor.git
100
+ licenses:
101
+ - MIT
102
+ post_install_message:
103
+ rdoc_options: []
104
+ require_paths:
105
+ - lib
106
+ required_ruby_version: !ruby/object:Gem::Requirement
107
+ none: false
108
+ requirements:
109
+ - - ! '>='
110
+ - !ruby/object:Gem::Version
111
+ version: '0'
112
+ segments:
113
+ - 0
114
+ hash: 4018385502197385766
115
+ required_rubygems_version: !ruby/object:Gem::Requirement
116
+ none: false
117
+ requirements:
118
+ - - ! '>='
119
+ - !ruby/object:Gem::Version
120
+ version: '0'
121
+ segments:
122
+ - 0
123
+ hash: 4018385502197385766
124
+ requirements: []
125
+ rubyforge_project:
126
+ rubygems_version: 1.8.25
127
+ signing_key:
128
+ specification_version: 3
129
+ summary: Adds private_* and protected_* attr_reader, attr_writer, and attr_accessor
130
+ test_files:
131
+ - test/lib/test_scoped_attr_accessor.rb
132
+ - test/lib/test_scoped_attr_accessor_include.rb
133
+ - test/scoped_attr_accessor_test_module.rb