attributable 0.0.2 → 0.0.3
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +16 -2
- data/lib/attributable/version.rb +1 -1
- data/lib/attributable.rb +4 -0
- data/spec/attributable/specialisation_spec.rb +29 -0
- metadata +1 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 167cb3bfb8d4237095209222dd5e925e909b3e6c
|
4
|
+
data.tar.gz: 99d532b61ef03948d2e43a3c00412f54323a7978
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 3b6b9812417f37be3717ce38c74dd04c4e13ba0ddda2278aa7684aeca11f3a0fb234a1bcb3b3359c52c98ad8cdbf1e432473b3f2bdb71a0edff1b0cdbcb33400
|
7
|
+
data.tar.gz: dd81b2cc7552dfe36f6d2f9ca1b69b8197055439f6e728615695493741481816674038169dd33d22053a6773424becb84ebe6cfa36a63a3cd2a8c722a031597c
|
data/README.md
CHANGED
@@ -76,8 +76,6 @@ Attributable adds an `inspect` method to your class which display attribute valu
|
|
76
76
|
|
77
77
|
Attributable provides the `initialize_attributes` method which can be used if you need to specify your own `initialize` method. For example:
|
78
78
|
|
79
|
-
require "attributable"
|
80
|
-
|
81
79
|
class UserWithDerivedAttribute
|
82
80
|
extend Attributable
|
83
81
|
attributes :forename, :surname
|
@@ -126,6 +124,22 @@ Specialising classes can override the defaults set in specialised classes.
|
|
126
124
|
Ronson.new(forename: "Jon").inspect # <Ronson forename="Jon", surname="Ronson">
|
127
125
|
Ronson.new(forename: "Mark").inspect # <Ronson forename="Mark", surname="Ronson">
|
128
126
|
|
127
|
+
### Automatic specialisation for superclasses
|
128
|
+
|
129
|
+
`specialise` is automatically called when subclassing a type that already mixes-in Attributable. In other words, the following code:
|
130
|
+
|
131
|
+
class AuthorWithDerivedAttribute < UserWithDerivedAttribute
|
132
|
+
attributes blogs: []
|
133
|
+
end
|
134
|
+
|
135
|
+
is equivalent to the slightly more verbose:
|
136
|
+
|
137
|
+
class AuthorWithDerivedAttribute < UserWithDerivedAttribute
|
138
|
+
specialises UserWithDerivedAttribute
|
139
|
+
attributes blogs: []
|
140
|
+
end
|
141
|
+
|
142
|
+
|
129
143
|
## Installation
|
130
144
|
|
131
145
|
Add this line to your application's Gemfile:
|
data/lib/attributable/version.rb
CHANGED
data/lib/attributable.rb
CHANGED
@@ -16,6 +16,7 @@ module Attributable
|
|
16
16
|
@predefined_attributes ||= {}
|
17
17
|
@predefined_attributes = super_attributes.merge(@predefined_attributes)
|
18
18
|
add_instance_methods(@predefined_attributes)
|
19
|
+
@predefined_attributes
|
19
20
|
end
|
20
21
|
|
21
22
|
private
|
@@ -42,6 +43,9 @@ module Attributable
|
|
42
43
|
end
|
43
44
|
|
44
45
|
define_method "initialize_attributes" do |attributes = {}|
|
46
|
+
if self.class.superclass.kind_of? Attributable
|
47
|
+
predefined_attributes = self.class.specialises(self.class.superclass)
|
48
|
+
end
|
45
49
|
@attributes = predefined_attributes.merge(attributes)
|
46
50
|
end
|
47
51
|
end
|
@@ -79,4 +79,33 @@ describe Attributable do
|
|
79
79
|
)
|
80
80
|
end
|
81
81
|
end
|
82
|
+
|
83
|
+
describe "automatic specialisation" do
|
84
|
+
it "should automatically specialise if superclass is an instance of Attributable" do
|
85
|
+
class SuperUser6 < User
|
86
|
+
attributes :password, active: true
|
87
|
+
end
|
88
|
+
|
89
|
+
s = SuperUser6.new(id: 1, forename: "Bob", password: "secret", active: false)
|
90
|
+
|
91
|
+
expect(s.id).to eq(1)
|
92
|
+
expect(s.forename).to eq("Bob")
|
93
|
+
expect(s.surname).to eq("Bloggs")
|
94
|
+
expect(s.password).to eq("secret")
|
95
|
+
expect(s.active).to be_false
|
96
|
+
end
|
97
|
+
|
98
|
+
it "shouldn't automatically specialise unless superclass is an instance of Attributable" do
|
99
|
+
class PORO
|
100
|
+
attr_accessor :name
|
101
|
+
end
|
102
|
+
|
103
|
+
class SuperUser7 < PORO
|
104
|
+
extend Attributable
|
105
|
+
attributes :forename, :surname
|
106
|
+
end
|
107
|
+
|
108
|
+
expect { SuperUser7.new }.to_not raise_error
|
109
|
+
end
|
110
|
+
end
|
82
111
|
end
|