attributable 0.0.2 → 0.0.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.
- 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
|