attic 0.5.2 → 0.5.3
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/CHANGES.txt +8 -1
- data/attic.gemspec +1 -7
- data/lib/attic.rb +72 -2
- data/try/01_mixins_tryouts.rb +16 -12
- data/try/10_attic_tryouts.rb +35 -37
- data/try/20_accessing_tryouts.rb +25 -30
- data/try/25_string_tryouts.rb +25 -31
- data/try/30_nometaclass_tryouts.rb +51 -56
- data/try/40_explicit_accessor_tryouts.rb +14 -20
- metadata +17 -6
- data/lib/attic/mixins.rb +0 -68
data/CHANGES.txt
CHANGED
@@ -1,8 +1,15 @@
|
|
1
1
|
ATTIC, CHANGES
|
2
2
|
|
3
|
+
#### 0.5.3 (2011-02-11) ###############################
|
4
|
+
|
5
|
+
* FIXED: Don't redefine Object::NOMETACLASS
|
6
|
+
* CHANGE: Updated tests to Tryouts 2
|
7
|
+
* CHANGE: Move attic/mixins content to attic.rb
|
8
|
+
|
9
|
+
|
3
10
|
#### 0.5.2 (2010-02-15) ###############################
|
4
11
|
|
5
|
-
* CHANGE: Remove hanna dependency
|
12
|
+
* CHANGE: Remove hanna dependency [Diego Elio 'Flameeyes' Pettenò]
|
6
13
|
|
7
14
|
#### 0.5.0 (2009-11-29) ###############################
|
8
15
|
|
data/attic.gemspec
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
@spec = Gem::Specification.new do |s|
|
2
2
|
s.name = "attic"
|
3
3
|
s.rubyforge_project = "attic"
|
4
|
-
s.version = "0.5.
|
4
|
+
s.version = "0.5.3"
|
5
5
|
s.summary = "A place to hide private instance variables in your Ruby objects."
|
6
6
|
s.description = s.summary
|
7
7
|
s.author = "Delano Mandelbaum"
|
@@ -22,11 +22,6 @@
|
|
22
22
|
# Update --main to reflect the default page to display
|
23
23
|
s.rdoc_options = ["--line-numbers", "--title", s.summary, "--main", "README.rdoc"]
|
24
24
|
|
25
|
-
# = DEPENDENCIES =
|
26
|
-
# Add all gem dependencies
|
27
|
-
#s.add_dependency 'name1'
|
28
|
-
#s.add_dependency 'name2', '>= 0.0.0'
|
29
|
-
|
30
25
|
# = MANIFEST =
|
31
26
|
# The complete list of files to be included in the release. When GitHub packages your gem,
|
32
27
|
# it doesn't allow you to run any command that accesses the filesystem. You will get an
|
@@ -40,7 +35,6 @@
|
|
40
35
|
Rakefile
|
41
36
|
attic.gemspec
|
42
37
|
lib/attic.rb
|
43
|
-
lib/attic/mixins.rb
|
44
38
|
try/01_mixins_tryouts.rb
|
45
39
|
try/10_attic_tryouts.rb
|
46
40
|
try/20_accessing_tryouts.rb
|
data/lib/attic.rb
CHANGED
@@ -1,12 +1,82 @@
|
|
1
1
|
|
2
|
-
|
2
|
+
class NoMetaClass < RuntimeError
|
3
|
+
end
|
4
|
+
|
5
|
+
# = Object
|
6
|
+
#
|
7
|
+
# These methods are copied directly from _why's metaid.rb.
|
8
|
+
# See: http://whytheluckystiff.net/articles/seeingMetaclassesClearly.html
|
9
|
+
class Object
|
10
|
+
|
11
|
+
unless defined?(::Object::NOMETACLASS)
|
12
|
+
# An Array of classes which do not have metaclasses.
|
13
|
+
NOMETACLASS = [Symbol, Fixnum].freeze
|
14
|
+
end
|
15
|
+
|
16
|
+
def nometaclass?
|
17
|
+
NOMETACLASS.member?(self)
|
18
|
+
end
|
19
|
+
|
20
|
+
def metaclass?
|
21
|
+
!NOMETACLASS.member?(self.class)
|
22
|
+
end
|
23
|
+
|
24
|
+
# A convenient method for getting the metaclass of the current object.
|
25
|
+
# i.e.
|
26
|
+
#
|
27
|
+
# class << self; self; end;
|
28
|
+
#
|
29
|
+
# NOTE: Some Ruby class do not have meta classes (see: NOMETACLASS).
|
30
|
+
# For these classes, this method returns the class itself. That means
|
31
|
+
# the instance variables will stored in the class itself.
|
32
|
+
def metaclass
|
33
|
+
if !self.metaclass?
|
34
|
+
raise NoMetaClass, self
|
35
|
+
else
|
36
|
+
class << self; self; end;
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
# Execute a block +&blk+ within the metaclass of the current object.
|
41
|
+
def meta_eval &blk; metaclass.instance_eval &blk; end
|
42
|
+
|
43
|
+
# Add an instance method called +name+ to metaclass for the current object.
|
44
|
+
# This is useful because it will be available as a singleton method
|
45
|
+
# to all subclasses too.
|
46
|
+
def meta_def name, &blk
|
47
|
+
meta_eval { define_method name, &blk }
|
48
|
+
end
|
49
|
+
|
50
|
+
# Add a class method called +name+ for the current object's class. This
|
51
|
+
# isn't so special but it maintains consistency with meta_def.
|
52
|
+
def class_def name, &blk
|
53
|
+
class_eval { define_method name, &blk }
|
54
|
+
end
|
55
|
+
|
56
|
+
|
57
|
+
# A convenient method for getting the metaclass of the metaclass
|
58
|
+
# i.e.
|
59
|
+
#
|
60
|
+
# self.metaclass.metaclass
|
61
|
+
#
|
62
|
+
def metametaclass; self.metaclass.metaclass; end
|
63
|
+
|
64
|
+
def metameta_eval &blk; metametaclass.instance_eval &blk; end
|
65
|
+
|
66
|
+
def metameta_def name, &blk
|
67
|
+
metameta_eval { define_method name, &blk }
|
68
|
+
end
|
69
|
+
|
70
|
+
end
|
71
|
+
|
72
|
+
|
3
73
|
|
4
74
|
# = Attic
|
5
75
|
#
|
6
76
|
# A place to store instance variables.
|
7
77
|
#
|
8
78
|
module Attic
|
9
|
-
VERSION = '0.5.
|
79
|
+
VERSION = '0.5.3' unless defined?(VERSION)
|
10
80
|
|
11
81
|
module InstanceMethods
|
12
82
|
def attic_variables
|
data/try/01_mixins_tryouts.rb
CHANGED
@@ -1,13 +1,17 @@
|
|
1
|
-
|
2
|
-
library :attic, "lib"
|
1
|
+
require 'attic'
|
3
2
|
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
3
|
+
## has metaclass", 'Object' do
|
4
|
+
if Tryouts.sysinfo.ruby.to_s == "1.9.1"
|
5
|
+
Object.new.metaclass.superclass.to_s
|
6
|
+
else
|
7
|
+
'Object'
|
8
|
+
end
|
9
|
+
#=> 'Object'
|
10
|
+
|
11
|
+
## has metametaclass", '#<Class:Object>' do
|
12
|
+
if Tryouts.sysinfo.ruby.to_s >= "1.9.1"
|
13
|
+
Object.new.metaclass.superclass.to_s
|
14
|
+
else
|
15
|
+
'#<Class:Object>'
|
16
|
+
end
|
17
|
+
#=> 'Object'
|
data/try/10_attic_tryouts.rb
CHANGED
@@ -1,43 +1,41 @@
|
|
1
|
-
|
2
|
-
library :attic, "lib"
|
3
|
-
tryouts "Basics" do
|
1
|
+
require 'attic'
|
4
2
|
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
3
|
+
## can extend Attic
|
4
|
+
class ::Worker
|
5
|
+
extend Attic
|
6
|
+
def kind() :true end
|
7
|
+
end
|
8
|
+
# 1.9 # 1.8
|
9
|
+
Worker.methods.member?(:attic) || Worker.methods.member?('attic')
|
10
|
+
#=> true
|
13
11
|
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
12
|
+
## can't include Attic raises exception
|
13
|
+
begin
|
14
|
+
class ::Worker
|
15
|
+
include Attic
|
18
16
|
end
|
17
|
+
rescue => RuntimeError
|
18
|
+
:success
|
19
|
+
end
|
20
|
+
#=> :success
|
19
21
|
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
drill "can access attic attributes explicitly", 2 do
|
30
|
-
w = Worker.new
|
31
|
-
w.attic_variable_set :size, 2
|
32
|
-
w.attic_variable_get :size
|
33
|
-
end
|
22
|
+
## can define attic attribute
|
23
|
+
Worker.attic :size
|
24
|
+
w = Worker.new
|
25
|
+
#w.attic :size
|
26
|
+
p Worker.instance_methods(false)
|
27
|
+
p Worker.methods.sort
|
28
|
+
w.respond_to? :size
|
29
|
+
#=> true
|
34
30
|
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
31
|
+
## can access attic attributes explicitly"
|
32
|
+
w = Worker.new
|
33
|
+
w.attic_variable_set :size, 2
|
34
|
+
w.attic_variable_get :size
|
35
|
+
#=> 2
|
40
36
|
|
41
|
-
|
42
|
-
|
43
|
-
|
37
|
+
## won't define a method if on already exists
|
38
|
+
Worker.attic :kind
|
39
|
+
a = Worker.new
|
40
|
+
a.kind
|
41
|
+
#=> :true
|
data/try/20_accessing_tryouts.rb
CHANGED
@@ -1,34 +1,29 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
1
|
+
require 'attic'
|
2
|
+
class ::Worker
|
3
|
+
extend Attic
|
4
|
+
attic :size
|
5
|
+
end
|
6
|
+
|
4
7
|
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
end
|
8
|
+
## save an instance variable the long way
|
9
|
+
w = Worker.new
|
10
|
+
w.metametaclass.instance_variable_set '@mattress', 'S&F'
|
11
|
+
w.metametaclass.instance_variable_get '@mattress'
|
12
|
+
#=> 'S&F'
|
11
13
|
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
14
|
+
## save an instance variable the short way
|
15
|
+
w = Worker.new
|
16
|
+
w.size = :california_king
|
17
|
+
w.size
|
18
|
+
#=> :california_king
|
17
19
|
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
end
|
20
|
+
## new instances don't cross streams
|
21
|
+
w = Worker.new
|
22
|
+
w.size
|
23
|
+
#=> nil
|
23
24
|
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
drill "instance variables are hidden", [] do
|
30
|
-
w = Worker.new
|
31
|
-
w.metametaclass.instance_variable_set '@mattress', 'S&F'
|
32
|
-
w.instance_variables
|
33
|
-
end
|
34
|
-
end
|
25
|
+
## instance variables are hidden
|
26
|
+
w = Worker.new
|
27
|
+
w.metametaclass.instance_variable_set '@mattress', 'S&F'
|
28
|
+
w.instance_variables
|
29
|
+
## []
|
data/try/25_string_tryouts.rb
CHANGED
@@ -1,38 +1,32 @@
|
|
1
|
-
|
2
|
-
library :attic, "lib"
|
3
|
-
tryouts "String Setting and Getting" do
|
1
|
+
require 'attic'
|
4
2
|
|
5
|
-
|
3
|
+
## String can extend Attic
|
6
4
|
String.extend Attic
|
7
5
|
String.respond_to? :attic
|
8
|
-
|
6
|
+
#=> true
|
9
7
|
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
8
|
+
## save an instance variable the long way
|
9
|
+
s = ""
|
10
|
+
s.metametaclass.instance_variable_set '@mattress', 'S&F'
|
11
|
+
s.metametaclass.instance_variable_get '@mattress'
|
12
|
+
#=> 'S&F'
|
15
13
|
|
16
|
-
|
17
|
-
|
18
|
-
|
14
|
+
## can create attributes
|
15
|
+
String.attic :goodies
|
16
|
+
#=> [:goodies]
|
19
17
|
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
18
|
+
## save an instance variable the short way
|
19
|
+
s = ""
|
20
|
+
s.goodies = :california_king
|
21
|
+
p s.instance_variables
|
22
|
+
p s.attic_vars
|
23
|
+
s.goodies
|
24
|
+
#=> :california_king
|
27
25
|
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
end
|
26
|
+
## String instances don't cross streams
|
27
|
+
String.extend Attic
|
28
|
+
String.attic :name
|
29
|
+
a = "any"
|
30
|
+
a.name = :roger
|
31
|
+
a.name == "".name
|
32
|
+
#=> false
|
@@ -1,56 +1,51 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
drill "knows attic variables", [:name] do
|
53
|
-
Symbol.attic_variables
|
54
|
-
end
|
55
|
-
|
56
|
-
end
|
1
|
+
require 'attic'
|
2
|
+
|
3
|
+
## has list of no metaclass classes
|
4
|
+
Object::NOMETACLASS
|
5
|
+
#=> [Symbol, Fixnum]
|
6
|
+
|
7
|
+
## Symbol metaclass raises exception
|
8
|
+
begin
|
9
|
+
:any.metaclass
|
10
|
+
rescue NoMetaClass
|
11
|
+
:success
|
12
|
+
end
|
13
|
+
#=> :success
|
14
|
+
|
15
|
+
## Symbol instances don't cross streams
|
16
|
+
Symbol.extend Attic
|
17
|
+
Symbol.attic :name
|
18
|
+
a, b = :symbol1, :symbol2
|
19
|
+
a.name = :roger
|
20
|
+
[a.name, b.name]
|
21
|
+
#=> [:roger, nil]
|
22
|
+
|
23
|
+
## metaclass? method exists
|
24
|
+
Symbol.extend Attic
|
25
|
+
:any.respond_to? :metaclass?
|
26
|
+
#=> true
|
27
|
+
|
28
|
+
## metaclass? method is false for a Symbol", false do
|
29
|
+
:any.metaclass?
|
30
|
+
#=> false
|
31
|
+
|
32
|
+
## A Symbol's attic vars appear in all_instance_variables" do
|
33
|
+
Symbol.extend Attic
|
34
|
+
Symbol.attic :name
|
35
|
+
a, b = :symbol1, :symbol2
|
36
|
+
a.name = :roger
|
37
|
+
a.all_instance_variables
|
38
|
+
#=> [:@___attic_name]
|
39
|
+
|
40
|
+
|
41
|
+
## A Symbol's attic vars do not appear in instance_variables" do
|
42
|
+
Symbol.extend Attic
|
43
|
+
Symbol.attic :name
|
44
|
+
a, b = :symbol1, :symbol2
|
45
|
+
a.name = :roger
|
46
|
+
a.instance_variables
|
47
|
+
#=> []
|
48
|
+
|
49
|
+
## knows attic variables", [:name] do
|
50
|
+
Symbol.attic_variables
|
51
|
+
#=> [:name]
|
@@ -1,23 +1,17 @@
|
|
1
|
-
|
2
|
-
library :attic, "lib"
|
3
|
-
tryouts "Explicit accessors" do
|
1
|
+
require 'attic'
|
4
2
|
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
end
|
9
|
-
end
|
3
|
+
class ::Worker
|
4
|
+
extend Attic
|
5
|
+
end
|
10
6
|
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
7
|
+
## can set value", 100 do
|
8
|
+
a = Worker.new
|
9
|
+
a.attic_variable_set :space, 100
|
10
|
+
a.attic_variable_get :space
|
11
|
+
#=> 100
|
16
12
|
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
end
|
13
|
+
## doesn't create accessor methods", false do
|
14
|
+
a = Worker.new
|
15
|
+
a.attic_variable_set :space, 100
|
16
|
+
a.respond_to? :space
|
17
|
+
#=> false
|
metadata
CHANGED
@@ -1,7 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: attic
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
|
4
|
+
hash: 13
|
5
|
+
prerelease:
|
6
|
+
segments:
|
7
|
+
- 0
|
8
|
+
- 5
|
9
|
+
- 3
|
10
|
+
version: 0.5.3
|
5
11
|
platform: ruby
|
6
12
|
authors:
|
7
13
|
- Delano Mandelbaum
|
@@ -9,7 +15,7 @@ autorequire:
|
|
9
15
|
bindir: bin
|
10
16
|
cert_chain: []
|
11
17
|
|
12
|
-
date:
|
18
|
+
date: 2011-02-11 00:00:00 -05:00
|
13
19
|
default_executable:
|
14
20
|
dependencies: []
|
15
21
|
|
@@ -30,7 +36,6 @@ files:
|
|
30
36
|
- Rakefile
|
31
37
|
- attic.gemspec
|
32
38
|
- lib/attic.rb
|
33
|
-
- lib/attic/mixins.rb
|
34
39
|
- try/01_mixins_tryouts.rb
|
35
40
|
- try/10_attic_tryouts.rb
|
36
41
|
- try/20_accessing_tryouts.rb
|
@@ -53,21 +58,27 @@ rdoc_options:
|
|
53
58
|
require_paths:
|
54
59
|
- lib
|
55
60
|
required_ruby_version: !ruby/object:Gem::Requirement
|
61
|
+
none: false
|
56
62
|
requirements:
|
57
63
|
- - ">="
|
58
64
|
- !ruby/object:Gem::Version
|
65
|
+
hash: 3
|
66
|
+
segments:
|
67
|
+
- 0
|
59
68
|
version: "0"
|
60
|
-
version:
|
61
69
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
70
|
+
none: false
|
62
71
|
requirements:
|
63
72
|
- - ">="
|
64
73
|
- !ruby/object:Gem::Version
|
74
|
+
hash: 3
|
75
|
+
segments:
|
76
|
+
- 0
|
65
77
|
version: "0"
|
66
|
-
version:
|
67
78
|
requirements: []
|
68
79
|
|
69
80
|
rubyforge_project: attic
|
70
|
-
rubygems_version: 1.
|
81
|
+
rubygems_version: 1.5.2
|
71
82
|
signing_key:
|
72
83
|
specification_version: 3
|
73
84
|
summary: A place to hide private instance variables in your Ruby objects.
|
data/lib/attic/mixins.rb
DELETED
@@ -1,68 +0,0 @@
|
|
1
|
-
class NoMetaClass < RuntimeError
|
2
|
-
end
|
3
|
-
|
4
|
-
# = Object
|
5
|
-
#
|
6
|
-
# These methods are copied directly from _why's metaid.rb.
|
7
|
-
# See: http://whytheluckystiff.net/articles/seeingMetaclassesClearly.html
|
8
|
-
class Object
|
9
|
-
|
10
|
-
# An Array of classes which do not have metaclasses.
|
11
|
-
NOMETACLASS = [Symbol, Fixnum].freeze
|
12
|
-
|
13
|
-
def nometaclass?
|
14
|
-
NOMETACLASS.member?(self)
|
15
|
-
end
|
16
|
-
|
17
|
-
def metaclass?
|
18
|
-
!NOMETACLASS.member?(self.class)
|
19
|
-
end
|
20
|
-
|
21
|
-
# A convenient method for getting the metaclass of the current object.
|
22
|
-
# i.e.
|
23
|
-
#
|
24
|
-
# class << self; self; end;
|
25
|
-
#
|
26
|
-
# NOTE: Some Ruby class do not have meta classes (see: NOMETACLASS).
|
27
|
-
# For these classes, this method returns the class itself. That means
|
28
|
-
# the instance variables will stored in the class itself.
|
29
|
-
def metaclass
|
30
|
-
if !self.metaclass?
|
31
|
-
raise NoMetaClass, self
|
32
|
-
else
|
33
|
-
class << self; self; end;
|
34
|
-
end
|
35
|
-
end
|
36
|
-
|
37
|
-
# Execute a block +&blk+ within the metaclass of the current object.
|
38
|
-
def meta_eval &blk; metaclass.instance_eval &blk; end
|
39
|
-
|
40
|
-
# Add an instance method called +name+ to metaclass for the current object.
|
41
|
-
# This is useful because it will be available as a singleton method
|
42
|
-
# to all subclasses too.
|
43
|
-
def meta_def name, &blk
|
44
|
-
meta_eval { define_method name, &blk }
|
45
|
-
end
|
46
|
-
|
47
|
-
# Add a class method called +name+ for the current object's class. This
|
48
|
-
# isn't so special but it maintains consistency with meta_def.
|
49
|
-
def class_def name, &blk
|
50
|
-
class_eval { define_method name, &blk }
|
51
|
-
end
|
52
|
-
|
53
|
-
|
54
|
-
# A convenient method for getting the metaclass of the metaclass
|
55
|
-
# i.e.
|
56
|
-
#
|
57
|
-
# self.metaclass.metaclass
|
58
|
-
#
|
59
|
-
def metametaclass; self.metaclass.metaclass; end
|
60
|
-
|
61
|
-
def metameta_eval &blk; metametaclass.instance_eval &blk; end
|
62
|
-
|
63
|
-
def metameta_def name, &blk
|
64
|
-
metameta_eval { define_method name, &blk }
|
65
|
-
end
|
66
|
-
|
67
|
-
end
|
68
|
-
|