constructable 0.3.1 → 0.3.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.
- data/Gemfile +0 -1
- data/README.markdown +197 -33
- data/TODO.md +2 -0
- data/VERSION +1 -1
- data/constructable.gemspec +3 -2
- data/lib/constructable/attribute.rb +1 -1
- data/lib/constructable/constructor.rb +26 -1
- data/lib/constructable/core_ext.rb +3 -19
- data/test/constructable/test_attribute.rb +1 -1
- data/test/constructable/test_constructable.rb +27 -20
- data/test/constructable/test_constructor.rb +11 -11
- metadata +4 -3
data/Gemfile
CHANGED
data/README.markdown
CHANGED
@@ -2,53 +2,217 @@
|
|
2
2
|
|
3
3
|
Provides a powerful class macro for defining and configuring constructable attributes of a class.
|
4
4
|
|
5
|
-
## Facts
|
6
5
|
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
* Provides a granular control on how accessible your attributes are(no need to define attr_* yourself)
|
6
|
+
## Basic usage
|
7
|
+
|
8
|
+
Define your class like this:
|
11
9
|
|
12
|
-
## Usage
|
13
10
|
```ruby
|
14
|
-
|
15
|
-
|
11
|
+
require 'constructable'
|
12
|
+
class ProgrammingLanguage
|
13
|
+
constructable :creator, :name
|
16
14
|
end
|
15
|
+
```
|
16
|
+
|
17
|
+
Then you can construct objects by providing a hash as the last argument
|
18
|
+
to ProgrammingLanguage.new like this:
|
19
|
+
|
20
|
+
```ruby
|
21
|
+
ruby = ProgrammingLanguage.new(name: 'Ruby', creator: 'Yukihiro Matsumoto')
|
22
|
+
```
|
17
23
|
|
18
|
-
|
19
|
-
|
24
|
+
The object _ruby_ will now have the instance variables _@name_ and
|
25
|
+
_@creator_ set to _'Ruby'_ and _'Yukihiro Matsumoto'_.
|
20
26
|
|
21
|
-
|
27
|
+
## Does not break initialize behaviour
|
22
28
|
|
23
|
-
|
24
|
-
# => 5
|
25
|
-
foo.baz
|
26
|
-
# => 7
|
29
|
+
You can use initialize just like you'd normally do:
|
27
30
|
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
31
|
+
```ruby
|
32
|
+
class Animal
|
33
|
+
constructable [:biological_class, readable: true]
|
34
|
+
attr_reader :name
|
35
|
+
|
36
|
+
GuessBiologicalClass = { ['Pig', 'Cow', 'Whale'] => 'Mammal', [ 'Turtle', 'Caiman' ] => 'Reptile' }
|
37
|
+
|
38
|
+
def initialize(name, options = {})
|
39
|
+
@name = name
|
40
|
+
@biological_class = GuessBiologicalClass.find { |animals,_| animals.include?(name) }.last if options[:guess_biological_class]
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
rhinocerus = Animal.new('Rhinocerus', biological_class: 'Mammal')
|
45
|
+
rhinocerus.biological_class
|
46
|
+
#=> 'Mammal'
|
47
|
+
|
48
|
+
turtle = Animal.new('Turtle', guess_biological_class: true)
|
49
|
+
turtle.biological_class
|
50
|
+
#=> 'Reptile'
|
51
|
+
```
|
52
|
+
|
53
|
+
|
54
|
+
|
55
|
+
## Setters, Getters
|
56
|
+
|
57
|
+
You can define your constructable attributes as readable, writable or
|
58
|
+
both:
|
59
|
+
|
60
|
+
```ruby
|
61
|
+
class Train
|
62
|
+
constructable :speed, readable: true
|
63
|
+
constructable :next_stop, writable: true
|
64
|
+
constructable :location, accsessible: true
|
65
|
+
end
|
66
|
+
|
67
|
+
orient_express = Train.new(speed: 100)
|
68
|
+
orient_express.speed
|
69
|
+
#=> 100
|
70
|
+
|
71
|
+
orient_express.next_stop = 'Bucarest'
|
72
|
+
# @next_stop == "Bucarest"
|
73
|
+
|
74
|
+
orient_express.next_stop
|
75
|
+
# raises NoMethodError
|
76
|
+
|
77
|
+
orient_express.location = 'Budapest'
|
78
|
+
orient_express.location
|
79
|
+
#=> 'Budapest'
|
80
|
+
```
|
81
|
+
|
82
|
+
## Validations
|
83
|
+
|
84
|
+
You can setup validation for constructable attributes, so the users of
|
85
|
+
your api won't provide weird values or none at all:
|
86
|
+
|
87
|
+
### required
|
88
|
+
|
89
|
+
```ruby
|
90
|
+
class Holidays
|
91
|
+
constructable :when, required: true
|
92
|
+
end
|
93
|
+
|
94
|
+
summer_holidays = Holidays.new
|
95
|
+
# raises AttributeError, ':when is a required attribute'
|
96
|
+
```
|
97
|
+
|
98
|
+
### validate\_type
|
99
|
+
|
100
|
+
```ruby
|
101
|
+
class Conference
|
102
|
+
constructable :attendees, validate_type: Integer
|
33
103
|
end
|
34
104
|
|
35
|
-
|
36
|
-
#
|
105
|
+
euruko = Conference.new('~300') # btw, euruko was really great!
|
106
|
+
# raises AttributeError, ':attendees must be of type Integer'
|
107
|
+
```
|
108
|
+
|
109
|
+
### validate
|
110
|
+
|
111
|
+
```ruby
|
112
|
+
class Farm
|
113
|
+
costructable :animals,
|
114
|
+
validate_type: Array,
|
115
|
+
validate: ->(array_of_animals) do
|
116
|
+
array_of_animals.all? { |animal| animal.is_a?(String)
|
117
|
+
end
|
118
|
+
end
|
119
|
+
|
120
|
+
big_farm = Farm.new(animals: [:pigs, :cows])
|
121
|
+
# raises AttributeError, ':animals has not passed validation'
|
122
|
+
```
|
123
|
+
|
124
|
+
## Convert your attributes
|
125
|
+
|
126
|
+
You can pass a converter as an option for a constructable attribute,
|
127
|
+
so before attributes are set, their values get converted to the return
|
128
|
+
value of the proc, you provided:
|
129
|
+
|
130
|
+
```ruby
|
131
|
+
class Box
|
132
|
+
constructable :width, :height, converter: ->(value) { value.to_f * 100 }
|
133
|
+
end
|
134
|
+
|
135
|
+
small_box = Box.new(width: '1.40', height: '2.40')
|
136
|
+
small_box.width
|
137
|
+
#=> 140
|
138
|
+
small_box.height
|
139
|
+
#=> 240
|
140
|
+
```
|
141
|
+
|
142
|
+
## Default values
|
143
|
+
|
144
|
+
You can also specify, which values your constructable attributes are set
|
145
|
+
to by default:
|
146
|
+
|
147
|
+
```ruby
|
148
|
+
class Framework
|
149
|
+
constructable :opinionated, default: true
|
150
|
+
end
|
151
|
+
|
152
|
+
rails = Framework.new
|
153
|
+
rails.opinionated
|
154
|
+
#=> true
|
37
155
|
|
38
|
-
ruby = ProgrammingLanguage.new(paradigms: [:object_oriented, :functional])
|
39
|
-
ruby.paradigms
|
40
|
-
# => [:object_oriented, :functional]
|
41
156
|
```
|
42
157
|
|
158
|
+
## Redefining setters and getters
|
159
|
+
|
160
|
+
You can redefine the setters and getters provided by the constructable
|
161
|
+
macro and still get all the validations and stuff by calling super:
|
162
|
+
|
163
|
+
```ruby
|
164
|
+
class Song
|
165
|
+
constructable :length, accessible: true, validate_type: Integer
|
166
|
+
|
167
|
+
def length=(length)
|
168
|
+
if length.is_a?(String) && length =~ /(\d{,2}):(\d{,2})/
|
169
|
+
@length = $1.to_i * 60 + $2.to_i
|
170
|
+
else
|
171
|
+
super
|
172
|
+
end
|
173
|
+
end
|
174
|
+
end
|
175
|
+
|
176
|
+
song = Song.new(length: 190)
|
177
|
+
#=> #<Song:0x000001010ea040 @length=190>
|
178
|
+
|
179
|
+
song.length = '1:30'
|
180
|
+
song.length
|
181
|
+
#=> 90
|
182
|
+
|
183
|
+
song.length = 'abc'
|
184
|
+
# raises AttributeError, ':length must be of type Integer'
|
185
|
+
```
|
186
|
+
|
187
|
+
## constructable\_attributes method
|
188
|
+
|
189
|
+
You can all the constructable attributes and their values of your class as a hash,
|
190
|
+
by calling the constructable_attributes method from within an instance
|
191
|
+
of your class:
|
192
|
+
|
193
|
+
```ruby
|
194
|
+
class Gadget
|
195
|
+
constructable :fancyness, :name, :price
|
196
|
+
end
|
197
|
+
|
198
|
+
iphone_4 = Gadget.new(fancyness: 1.0/0, name: 'Iphone 4', price: 1.0/0)
|
199
|
+
iphone_4.constructable_attributes
|
200
|
+
#=> { :fancyness => Infinity, :name => "Iphone 4", :price => Infinity }
|
201
|
+
```
|
202
|
+
|
203
|
+
## Modules
|
204
|
+
|
205
|
+
### WARNING
|
43
206
|
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
207
|
+
The constructable macro also works for modules(not for themself, but for
|
208
|
+
the classes, you include them) but it will define the 'included' hook.
|
209
|
+
So if you want to use the 'included' hook yourself, you either need to
|
210
|
+
around alias it or to use another gem. I tried some things, but it is
|
211
|
+
impossible, to provide all the magic of this gem, without defining
|
212
|
+
the 'included' macro. I thought about getting rid of some of the magic,
|
213
|
+
but this would infer with my initial intention, to provide an easy way
|
214
|
+
to make constructable classes. If someone has a nice idea, how to solve
|
215
|
+
this problem elgantely, please contact me!
|
52
216
|
|
53
217
|
## Copyright
|
54
218
|
Copyright (c) 2011 Manuel Korfmann. See LICENSE.txt for
|
data/TODO.md
ADDED
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.3.
|
1
|
+
0.3.2
|
data/constructable.gemspec
CHANGED
@@ -5,11 +5,11 @@
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = %q{constructable}
|
8
|
-
s.version = "0.3.
|
8
|
+
s.version = "0.3.2"
|
9
9
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
11
|
s.authors = ["Manuel Korfmann"]
|
12
|
-
s.date = %q{2011-06-
|
12
|
+
s.date = %q{2011-06-17}
|
13
13
|
s.description = %q{
|
14
14
|
Adds the class macro Class#constructable to easily define what attributes a Class accepts provided as a hash to Class#new.
|
15
15
|
Attributes can be configured in their behaviour in case they are not provided or are in the wrong format.
|
@@ -29,6 +29,7 @@ See the documentation for Constructable::Constructable#constructable or the READ
|
|
29
29
|
"LICENSE.txt",
|
30
30
|
"README.markdown",
|
31
31
|
"Rakefile",
|
32
|
+
"TODO.md",
|
32
33
|
"VERSION",
|
33
34
|
"constructable.gemspec",
|
34
35
|
"lib/constructable.rb",
|
@@ -12,7 +12,7 @@ module Constructable
|
|
12
12
|
},
|
13
13
|
{
|
14
14
|
name: :validate_type,
|
15
|
-
message: proc {":#{self.name}
|
15
|
+
message: proc {":#{self.name} must be of type #{self.validate_type}"},
|
16
16
|
check: ->(hash) { hash[self.name].is_a? self.validate_type }
|
17
17
|
}
|
18
18
|
]
|
@@ -7,9 +7,28 @@ module Constructable
|
|
7
7
|
@module = Module.new
|
8
8
|
@base = base
|
9
9
|
@base.send :include, @module
|
10
|
+
self.redefine_new_calling
|
10
11
|
self.define_concstructable_attributes_method
|
11
12
|
end
|
12
13
|
|
14
|
+
def redefine_new_calling
|
15
|
+
case @base
|
16
|
+
when Class
|
17
|
+
self.redefine_new(@base)
|
18
|
+
when Module
|
19
|
+
constructor = self
|
20
|
+
redefine_new_logic = proc do |base|
|
21
|
+
base.instance_variable_set(:@constructor, constructor)
|
22
|
+
if Class == base.class
|
23
|
+
constructor.redefine_new(base)
|
24
|
+
elsif Module == base.class
|
25
|
+
base.define_singleton_method :included, &redefine_new_logic
|
26
|
+
end
|
27
|
+
end
|
28
|
+
@base.define_singleton_method :included, &redefine_new_logic
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
13
32
|
def redefine_new(klass)
|
14
33
|
constructor = self
|
15
34
|
klass.define_singleton_method(:new) do |*args, &block|
|
@@ -45,8 +64,14 @@ module Constructable
|
|
45
64
|
end
|
46
65
|
|
47
66
|
def generate_attributes(attributes)
|
67
|
+
options = if Hash === attributes.last
|
68
|
+
attributes.pop
|
69
|
+
else
|
70
|
+
{}
|
71
|
+
end
|
72
|
+
|
48
73
|
attributes.map do |attribute|
|
49
|
-
Attribute.new(
|
74
|
+
Attribute.new(attribute, options)
|
50
75
|
end
|
51
76
|
end
|
52
77
|
|
@@ -5,7 +5,7 @@ module Constructable
|
|
5
5
|
# @example
|
6
6
|
#
|
7
7
|
# class Foo
|
8
|
-
# constructable
|
8
|
+
# constructable :bar, :readable => true, :baz, :readable => true, required: true
|
9
9
|
# end
|
10
10
|
#
|
11
11
|
# foo = Foo.new(bar: 5)
|
@@ -19,10 +19,10 @@ module Constructable
|
|
19
19
|
# # => 7
|
20
20
|
#
|
21
21
|
# class ProgrammingLanguage
|
22
|
-
# constructable
|
22
|
+
# constructable :paradigms,
|
23
23
|
# readable: true,
|
24
24
|
# required: true,
|
25
|
-
# validate: ->(value) { value.is_a?(Array) }
|
25
|
+
# validate: ->(value) { value.is_a?(Array) }
|
26
26
|
# end
|
27
27
|
#
|
28
28
|
# c = ProgrammingLanguage.new(paradigms: :functional)
|
@@ -36,22 +36,6 @@ module Constructable
|
|
36
36
|
def constructable(*args)
|
37
37
|
@constructor ||= Constructor.new(self)
|
38
38
|
@constructor.define_attributes(args)
|
39
|
-
case self
|
40
|
-
when Class
|
41
|
-
@constructor.redefine_new(self)
|
42
|
-
when Module
|
43
|
-
redefine_new_logic = proc do |base|
|
44
|
-
|
45
|
-
base.instance_variable_set(:@constructor, @constructor)
|
46
|
-
if Class == base.class
|
47
|
-
@constructor.redefine_new(base)
|
48
|
-
elsif Module == base.class
|
49
|
-
base.define_singleton_method :included, &redefine_new_logic
|
50
|
-
end
|
51
|
-
end
|
52
|
-
|
53
|
-
define_singleton_method :included, &redefine_new_logic
|
54
|
-
end
|
55
39
|
return nil
|
56
40
|
end
|
57
41
|
end
|
@@ -71,7 +71,7 @@ describe 'Attribute' do
|
|
71
71
|
attribute.process(foo: 'notanumber')
|
72
72
|
rescue Exception => e
|
73
73
|
assert AttributeError === e, "[#{e.class},#{e.message}] was not expected"
|
74
|
-
assert_equal ':foo
|
74
|
+
assert_equal ':foo must be of type Integer', e.message
|
75
75
|
else
|
76
76
|
assert false, 'AttributeError was not raised'
|
77
77
|
end
|
@@ -2,61 +2,68 @@ require 'helper'
|
|
2
2
|
describe 'integration' do
|
3
3
|
describe 'Class' do
|
4
4
|
describe 'constructable' do
|
5
|
+
before do
|
6
|
+
@klass = Class.new
|
7
|
+
end
|
8
|
+
|
9
|
+
it 'has a nice syntax' do
|
10
|
+
@klass.constructable :foo, :bar, accessible: true, validate_type: Integer
|
11
|
+
instance = @klass.new(foo: 5, bar: 2)
|
12
|
+
assert_equal 5, instance.foo
|
13
|
+
assert_raises AttributeError do
|
14
|
+
instance.bar = '5'
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
5
18
|
it 'should assign values found in the constructer hash' do
|
6
|
-
klass
|
7
|
-
klass.
|
8
|
-
instance = klass.new(foo: :bar)
|
19
|
+
@klass.constructable(:foo, readable: true)
|
20
|
+
instance = @klass.new(foo: :bar)
|
9
21
|
assert_equal :bar, instance.foo
|
10
22
|
end
|
11
23
|
|
12
24
|
it 'should work with inheritance' do
|
13
|
-
klass
|
14
|
-
|
15
|
-
inherited_klass = Class.new(klass)
|
25
|
+
@klass.constructable(:bar, readable: true)
|
26
|
+
inherited_klass = Class.new(@klass)
|
16
27
|
instance = inherited_klass.new(bar: 1)
|
17
28
|
assert_equal 1, instance.bar
|
18
29
|
end
|
19
30
|
|
20
31
|
it 'should be possible to make attributes required' do
|
21
|
-
klass
|
22
|
-
klass.constructable([:bar, required: true])
|
32
|
+
@klass.constructable(:bar, required: true)
|
23
33
|
assert_raises AttributeError do
|
24
|
-
klass.new
|
34
|
+
@klass.new
|
25
35
|
end
|
26
36
|
end
|
27
37
|
|
28
38
|
describe 'should not break the initalize behaviour' do
|
29
39
|
it 'works for methods with arguments + options provided' do
|
30
|
-
klass
|
31
|
-
klass.
|
32
|
-
klass.class_eval do
|
40
|
+
@klass.constructable :bar, accessible: true
|
41
|
+
@klass.class_eval do
|
33
42
|
def initialize(options = {})
|
34
43
|
self.bar = 20
|
35
44
|
end
|
36
45
|
end
|
37
|
-
instance = klass.new(bar: 5)
|
46
|
+
instance = @klass.new(bar: 5)
|
38
47
|
assert_equal 20, instance.bar
|
39
48
|
end
|
40
49
|
|
41
50
|
it 'works for initialize methods with arguments' do
|
42
|
-
klass
|
43
|
-
klass.
|
44
|
-
klass.
|
45
|
-
klass.class_eval do
|
51
|
+
@klass.constructable :bar, accessible: true
|
52
|
+
@klass.send :attr_accessor, :baz
|
53
|
+
@klass.class_eval do
|
46
54
|
def initialize(baz, options = {})
|
47
55
|
self.baz = baz
|
48
56
|
end
|
49
57
|
end
|
50
58
|
|
51
|
-
instance = klass.new(1, bar: 5)
|
59
|
+
instance = @klass.new(1, bar: 5)
|
52
60
|
assert_equal 1, instance.baz
|
53
61
|
assert_equal 5, instance.bar
|
54
62
|
end
|
55
63
|
end
|
56
64
|
|
57
65
|
it 'should return nil' do
|
58
|
-
|
59
|
-
assert_equal nil, klass.constructable(:bar)
|
66
|
+
assert_equal nil, @klass.constructable(:bar)
|
60
67
|
end
|
61
68
|
end
|
62
69
|
end
|
@@ -8,13 +8,13 @@ describe 'Constructor' do
|
|
8
8
|
describe 'define_attributes' do
|
9
9
|
it 'should define attr_accessors' do
|
10
10
|
klass = Class.new
|
11
|
-
klass.constructable(
|
11
|
+
klass.constructable(:foo, accessible: true)
|
12
12
|
assert_respond_to klass.new, :foo
|
13
13
|
assert_respond_to klass.new, :foo=
|
14
14
|
end
|
15
15
|
|
16
16
|
it 'defines public setters validating like in the constructor' do
|
17
|
-
@klass.constructable
|
17
|
+
@klass.constructable :integer, validate_type: Integer, writable: true
|
18
18
|
instance = @klass.new
|
19
19
|
assert_raises AttributeError do
|
20
20
|
instance.integer = 6.6
|
@@ -25,14 +25,14 @@ describe 'Constructor' do
|
|
25
25
|
|
26
26
|
describe 'class' do
|
27
27
|
it 'getters ' do
|
28
|
-
@klass.constructable
|
28
|
+
@klass.constructable :integer, validate_type: Integer, accessible: true
|
29
29
|
@klass.class_eval { define_method(:integer){ 1 } }
|
30
30
|
instance = @klass.new(integer: 2)
|
31
31
|
assert_equal 1, instance.integer
|
32
32
|
end
|
33
33
|
|
34
34
|
it 'setters ' do
|
35
|
-
@klass.constructable
|
35
|
+
@klass.constructable :integer, validate_type: Integer, accessible: true
|
36
36
|
@klass.class_eval { def integer=(foo);@integer = 1;end }
|
37
37
|
instance = @klass.new(integer: 4)
|
38
38
|
instance.integer = 5
|
@@ -42,7 +42,7 @@ describe 'Constructor' do
|
|
42
42
|
|
43
43
|
describe 'module' do
|
44
44
|
before do
|
45
|
-
@module.constructable
|
45
|
+
@module.constructable :integer, validate_type: Integer, accessible: true
|
46
46
|
end
|
47
47
|
|
48
48
|
it 'getters ' do
|
@@ -74,14 +74,14 @@ describe 'Constructor' do
|
|
74
74
|
|
75
75
|
describe 'allows to super to the generated method' do
|
76
76
|
it 'gets' do
|
77
|
-
@klass.constructable
|
77
|
+
@klass.constructable :integer, validate_type: Integer, accessible: true
|
78
78
|
@klass.class_eval { def integer; super ;end }
|
79
79
|
instance = @klass.new(integer: 2)
|
80
80
|
assert_equal 2, instance.integer
|
81
81
|
end
|
82
82
|
|
83
83
|
it 'sets' do
|
84
|
-
@klass.constructable
|
84
|
+
@klass.constructable :integer, validate_type: Integer, accessible: true
|
85
85
|
@klass.class_eval { def integer=(value); super ;end }
|
86
86
|
instance = @klass.new(integer: 2)
|
87
87
|
assert_raises Constructable::AttributeError do
|
@@ -102,21 +102,21 @@ describe 'Constructor' do
|
|
102
102
|
|
103
103
|
describe 'permission' do
|
104
104
|
it 'should allow writable attributes' do
|
105
|
-
@klass.constructable
|
105
|
+
@klass.constructable :writable_attribute, writable: true
|
106
106
|
instance = @klass.new
|
107
107
|
instance.writable_attribute = "hello"
|
108
108
|
assert_equal "hello", instance.instance_variable_get(:@writable_attribute)
|
109
109
|
end
|
110
110
|
|
111
111
|
it 'should allow readable attributes' do
|
112
|
-
@klass.constructable
|
112
|
+
@klass.constructable :readable_attribute, readable: true
|
113
113
|
instance = @klass.new
|
114
114
|
instance.instance_variable_set(:@readable_attribute, "hello")
|
115
115
|
assert_equal "hello", instance.readable_attribute
|
116
116
|
end
|
117
117
|
|
118
118
|
it 'should allow accessible attributes' do
|
119
|
-
@klass.constructable
|
119
|
+
@klass.constructable :accessible_attribute, accessible: true
|
120
120
|
instance = @klass.new
|
121
121
|
instance.accessible_attribute = 'hello'
|
122
122
|
assert_equal 'hello', instance.accessible_attribute
|
@@ -126,7 +126,7 @@ describe 'Constructor' do
|
|
126
126
|
describe 'module support' do
|
127
127
|
before do
|
128
128
|
@foo = Module.new do
|
129
|
-
constructable
|
129
|
+
constructable :foo, readable: true
|
130
130
|
end
|
131
131
|
end
|
132
132
|
|
metadata
CHANGED
@@ -2,7 +2,7 @@
|
|
2
2
|
name: constructable
|
3
3
|
version: !ruby/object:Gem::Version
|
4
4
|
prerelease:
|
5
|
-
version: 0.3.
|
5
|
+
version: 0.3.2
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
8
8
|
- Manuel Korfmann
|
@@ -10,7 +10,7 @@ autorequire:
|
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
12
|
|
13
|
-
date: 2011-06-
|
13
|
+
date: 2011-06-17 00:00:00 +02:00
|
14
14
|
default_executable:
|
15
15
|
dependencies:
|
16
16
|
- !ruby/object:Gem::Dependency
|
@@ -78,6 +78,7 @@ files:
|
|
78
78
|
- LICENSE.txt
|
79
79
|
- README.markdown
|
80
80
|
- Rakefile
|
81
|
+
- TODO.md
|
81
82
|
- VERSION
|
82
83
|
- constructable.gemspec
|
83
84
|
- lib/constructable.rb
|
@@ -103,7 +104,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
103
104
|
requirements:
|
104
105
|
- - ">="
|
105
106
|
- !ruby/object:Gem::Version
|
106
|
-
hash:
|
107
|
+
hash: 932073679521130628
|
107
108
|
segments:
|
108
109
|
- 0
|
109
110
|
version: "0"
|