moosex 0.0.8 → 0.0.9
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/Changelog +5 -0
- data/Gemfile.lock +1 -1
- data/lib/moosex.rb +51 -15
- data/lib/moosex/version.rb +1 -1
- data/spec/moosex_spec.rb +177 -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: bf755e4f809015aa27587ea4009cb8e15d082154
|
4
|
+
data.tar.gz: ec5ee2722ed7fe31bc88050722a803cc366f5958
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 0b5c7d36b5ef46c18cdb83893ce74da0b500c0d11706c08e3f15438c0f3e486d937f73bc2a860993fe1b365559b0c651c84060875f443a04cd1d6c49f07ef9bc
|
7
|
+
data.tar.gz: 4cf80c9f428fe865904ad8c8e79d37460ac1ca4a8cbaf5305ab26a962fefade283ef10ecabf262a58a30e1e852c9c026e933139c09248d0017dc83c31e07baed
|
data/Changelog
CHANGED
data/Gemfile.lock
CHANGED
data/lib/moosex.rb
CHANGED
@@ -18,9 +18,18 @@ module MooseX
|
|
18
18
|
end
|
19
19
|
|
20
20
|
def initialize(args={})
|
21
|
+
args = BUILDARGS(args)
|
21
22
|
|
22
23
|
self.class.__meta().init(self, args)
|
23
24
|
|
25
|
+
BUILD()
|
26
|
+
end
|
27
|
+
|
28
|
+
def BUILDARGS(args)
|
29
|
+
args
|
30
|
+
end
|
31
|
+
|
32
|
+
def BUILD
|
24
33
|
end
|
25
34
|
|
26
35
|
def c.inherited(subclass)
|
@@ -94,8 +103,10 @@ module MooseX
|
|
94
103
|
clearer: false,
|
95
104
|
required: false,
|
96
105
|
predicate: false,
|
97
|
-
isa: lambda { |
|
106
|
+
isa: lambda { |value| true },
|
98
107
|
handles: {},
|
108
|
+
trigger: lambda {|object,value|}, # TODO: implement
|
109
|
+
coerce: lambda {|object| object}, # TODO: implement
|
99
110
|
}
|
100
111
|
|
101
112
|
REQUIRED = [ :is ]
|
@@ -218,11 +229,30 @@ module MooseX
|
|
218
229
|
init_arg: lambda do |init_arg, field_name|
|
219
230
|
init_arg.to_sym
|
220
231
|
end,
|
232
|
+
trigger: lambda do |trigger, field_name|
|
233
|
+
unless trigger.is_a? Proc
|
234
|
+
trigger_method_name = trigger.to_sym
|
235
|
+
trigger = lambda do |object, value|
|
236
|
+
object.send(trigger_method_name,value)
|
237
|
+
end
|
238
|
+
end
|
239
|
+
|
240
|
+
trigger
|
241
|
+
end,
|
242
|
+
coerce: lambda do |coerce, field_name|
|
243
|
+
unless coerce.is_a? Proc
|
244
|
+
coerce_method_name = coerce.to_sym
|
245
|
+
coerce = lambda do |object|
|
246
|
+
object.send(coerce_method_name)
|
247
|
+
end
|
248
|
+
end
|
249
|
+
|
250
|
+
coerce
|
251
|
+
end,
|
221
252
|
};
|
222
253
|
|
223
254
|
def initialize(a, o)
|
224
255
|
# todo extract this to a framework, see issue #21 on facebook
|
225
|
-
|
226
256
|
o = DEFAULTS.merge({
|
227
257
|
reader: a,
|
228
258
|
writter: a.to_s.concat("=").to_sym,
|
@@ -267,6 +297,8 @@ module MooseX
|
|
267
297
|
@writter = o[:writter]
|
268
298
|
@builder = o[:builder]
|
269
299
|
@init_arg = o[:init_arg]
|
300
|
+
@trigger = o[:trigger]
|
301
|
+
@coerce = o[:coerce]
|
270
302
|
end
|
271
303
|
|
272
304
|
def init(object, args)
|
@@ -295,30 +327,28 @@ module MooseX
|
|
295
327
|
end
|
296
328
|
end
|
297
329
|
|
330
|
+
value_from_default = false
|
298
331
|
if args.has_key? @init_arg
|
299
332
|
value = args[ @init_arg ]
|
300
333
|
elsif @default
|
301
334
|
value = @default.call
|
335
|
+
value_from_default = true
|
302
336
|
elsif @required
|
303
337
|
raise "attr \"#{@attr_symbol}\" is required"
|
304
338
|
else
|
305
339
|
return
|
306
340
|
end
|
307
341
|
|
308
|
-
if @is.eql?(:ro) || @is.eql?(:lazy)
|
309
|
-
|
310
|
-
# TODO: remove redundancy
|
311
342
|
|
312
|
-
|
313
|
-
type_check.call(value)
|
343
|
+
value = @coerce.call(value)
|
314
344
|
|
315
|
-
|
345
|
+
@isa.call( value )
|
346
|
+
unless value_from_default
|
347
|
+
@trigger.call(object, value)
|
348
|
+
end
|
349
|
+
|
350
|
+
object.instance_variable_set inst_variable_name, value
|
316
351
|
|
317
|
-
else
|
318
|
-
|
319
|
-
object.send( @writter, value )
|
320
|
-
|
321
|
-
end
|
322
352
|
end
|
323
353
|
|
324
354
|
def generate_getter
|
@@ -329,13 +359,15 @@ module MooseX
|
|
329
359
|
|
330
360
|
if @lazy
|
331
361
|
type_check = @isa
|
332
|
-
|
362
|
+
coerce = @coerce
|
363
|
+
trigger = @trigger
|
333
364
|
before_get = lambda do |object|
|
334
365
|
return if object.instance_variable_defined? inst_variable_name
|
335
366
|
|
336
367
|
value = builder.call(object)
|
368
|
+
value = coerce.call(value)
|
337
369
|
type_check.call(value)
|
338
|
-
|
370
|
+
trigger.call(object, value)
|
339
371
|
object.instance_variable_set(inst_variable_name, value)
|
340
372
|
end
|
341
373
|
end
|
@@ -348,9 +380,13 @@ module MooseX
|
|
348
380
|
|
349
381
|
def generate_setter
|
350
382
|
inst_variable_name = "@#{@attr_symbol}".to_sym
|
383
|
+
coerce = @coerce
|
351
384
|
type_check = @isa
|
385
|
+
trigger = @trigger
|
352
386
|
Proc.new do |value|
|
387
|
+
value = coerce.call(value)
|
353
388
|
type_check.call(value)
|
389
|
+
trigger.call(self,value)
|
354
390
|
instance_variable_set inst_variable_name, value
|
355
391
|
end
|
356
392
|
end
|
data/lib/moosex/version.rb
CHANGED
data/spec/moosex_spec.rb
CHANGED
@@ -575,4 +575,181 @@ describe "LazyFox" do
|
|
575
575
|
end
|
576
576
|
l.last_lazy_attr.should be_zero
|
577
577
|
end
|
578
|
+
end
|
579
|
+
|
580
|
+
class CoerceTest
|
581
|
+
include MooseX
|
582
|
+
|
583
|
+
has attribute_ro: {
|
584
|
+
is: :ro,
|
585
|
+
isa: Integer,
|
586
|
+
coerce: lambda {|value| value.to_i },
|
587
|
+
}
|
588
|
+
|
589
|
+
has attribute_rw: {
|
590
|
+
is: :rw,
|
591
|
+
isa: Integer,
|
592
|
+
coerce: lambda {|value| value.to_i },
|
593
|
+
}
|
594
|
+
|
595
|
+
has attribute_lazy: {
|
596
|
+
is: :lazy,
|
597
|
+
isa: Integer,
|
598
|
+
coerce: lambda {|value| value.to_i },
|
599
|
+
builder: lambda{|object| "2048" },
|
600
|
+
}
|
601
|
+
|
602
|
+
def trigger_attr(new_value)
|
603
|
+
puts "change value of attribute to #{new_value}"
|
604
|
+
end
|
605
|
+
end
|
606
|
+
|
607
|
+
describe "CoerceTest" do
|
608
|
+
it "should coerce the argument using to_i on constructor" do
|
609
|
+
ct = CoerceTest.new(attribute_ro: "12")
|
610
|
+
ct.attribute_ro.should == 12
|
611
|
+
end
|
612
|
+
|
613
|
+
it "should coerce the argument using to_i on constructor" do
|
614
|
+
ct = CoerceTest.new(attribute_rw: "12")
|
615
|
+
ct.attribute_rw.should == 12
|
616
|
+
end
|
617
|
+
|
618
|
+
it "should coerce in the setter" do
|
619
|
+
ct = CoerceTest.new
|
620
|
+
ct.attribute_rw= "128"
|
621
|
+
ct.attribute_rw.should == 128
|
622
|
+
end
|
623
|
+
|
624
|
+
it "should coerce from builder" do
|
625
|
+
ct = CoerceTest.new
|
626
|
+
ct.attribute_lazy.should == 2048
|
627
|
+
end
|
628
|
+
end
|
629
|
+
|
630
|
+
class TriggerTest
|
631
|
+
include MooseX
|
632
|
+
|
633
|
+
has logger: {
|
634
|
+
is: :ro
|
635
|
+
}
|
636
|
+
|
637
|
+
has attr_with_trigger: {
|
638
|
+
is: :rw,
|
639
|
+
trigger: :my_method,
|
640
|
+
}
|
641
|
+
|
642
|
+
has attr_with_trigger_ro: {
|
643
|
+
is: :ro,
|
644
|
+
trigger: :my_method,
|
645
|
+
}
|
646
|
+
|
647
|
+
has attr_with_default: {
|
648
|
+
is: :rw,
|
649
|
+
trigger: lambda do |object, new_value|
|
650
|
+
object.logger.log "will update attr_with_trigger with new value #{new_value}"
|
651
|
+
end,
|
652
|
+
default: 1,
|
653
|
+
}
|
654
|
+
|
655
|
+
has attr_lazy_trigger: {
|
656
|
+
is: :lazy,
|
657
|
+
trigger: :my_method,
|
658
|
+
builder: lambda{ |x| 1},
|
659
|
+
}
|
660
|
+
|
661
|
+
def my_method(new_value)
|
662
|
+
logger.log "will update attr_with_trigger with new value #{new_value}"
|
663
|
+
end
|
664
|
+
end
|
665
|
+
|
666
|
+
describe "TriggerTest" do
|
667
|
+
it "should call trigger on constructor" do
|
668
|
+
log = double
|
669
|
+
log.should_receive(:log)
|
670
|
+
t = TriggerTest.new(attr_with_trigger: 1, logger: log)
|
671
|
+
|
672
|
+
end
|
673
|
+
|
674
|
+
it "should call trigger on constructor (ro)" do
|
675
|
+
log = double
|
676
|
+
log.should_receive(:log)
|
677
|
+
t = TriggerTest.new(attr_with_trigger_ro: 1, logger: log)
|
678
|
+
|
679
|
+
end
|
680
|
+
|
681
|
+
it "should NOT call trigger on constructor (with default)" do
|
682
|
+
log = double
|
683
|
+
log.should_not_receive(:log)
|
684
|
+
t = TriggerTest.new(logger: log)
|
685
|
+
end
|
686
|
+
|
687
|
+
it "should NOT call trigger on constructor (with default)" do
|
688
|
+
log = double
|
689
|
+
log.should_receive(:log)
|
690
|
+
t = TriggerTest.new(logger: log)
|
691
|
+
|
692
|
+
t.attr_with_default = 1
|
693
|
+
end
|
694
|
+
|
695
|
+
it "should call trigger on setter" do
|
696
|
+
log = double
|
697
|
+
log.should_receive(:log)
|
698
|
+
t = TriggerTest.new(logger: log)
|
699
|
+
|
700
|
+
t.attr_with_trigger = 1
|
701
|
+
end
|
702
|
+
|
703
|
+
it "should call trigger on setter" do
|
704
|
+
log = double
|
705
|
+
log.should_receive(:log)
|
706
|
+
t = TriggerTest.new(logger: log)
|
707
|
+
|
708
|
+
t.attr_lazy_trigger.should == 1
|
709
|
+
end
|
710
|
+
end
|
711
|
+
|
712
|
+
class BuildArgsExample
|
713
|
+
include MooseX
|
714
|
+
|
715
|
+
has [:x, :y], {
|
716
|
+
is: :rw,
|
717
|
+
required: true,
|
718
|
+
}
|
719
|
+
|
720
|
+
def BUILDARGS(args)
|
721
|
+
args[:x] = 1024
|
722
|
+
args[:y] = - args[:y]
|
723
|
+
args
|
724
|
+
end
|
725
|
+
end
|
726
|
+
|
727
|
+
describe "BuildArgsExample" do
|
728
|
+
it "should create the object" do
|
729
|
+
ex = BuildArgsExample.new(x: 10, y: -2)
|
730
|
+
ex.x.should == 1024
|
731
|
+
ex.y.should == 2
|
732
|
+
end
|
733
|
+
end
|
734
|
+
|
735
|
+
class BuildExample
|
736
|
+
include MooseX
|
737
|
+
|
738
|
+
has [:x, :y], {
|
739
|
+
is: :rw,
|
740
|
+
required: true,
|
741
|
+
}
|
742
|
+
def BUILD
|
743
|
+
if self.x == self.y
|
744
|
+
raise "invalid: you should use x != y"
|
745
|
+
end
|
746
|
+
end
|
747
|
+
end
|
748
|
+
|
749
|
+
describe "BuildExample" do
|
750
|
+
it "should raise exception on build" do
|
751
|
+
expect {
|
752
|
+
BuildExample.new(x: 0, y: 0)
|
753
|
+
}.to raise_error(/invalid: you should use x != y/)
|
754
|
+
end
|
578
755
|
end
|