classx 0.0.3 → 0.0.4

Sign up to get free protection for your applications and to get access to all the features.
Files changed (57) hide show
  1. data/ChangeLog +354 -0
  2. data/README +5 -0
  3. data/Rakefile +2 -2
  4. data/bench/attribute_get.rb +73 -0
  5. data/bench/attribute_set.rb +53 -19
  6. data/bench/define_attribute.rb +226 -0
  7. data/bench/initialize.rb +25 -7
  8. data/doc/output/coverage/index.html +74 -128
  9. data/doc/output/coverage/lib-classx-attribute_rb.html +291 -190
  10. data/doc/output/coverage/lib-classx-attributes_rb.html +167 -101
  11. data/doc/output/coverage/lib-classx-bracketable_rb.html +671 -0
  12. data/doc/output/coverage/lib-classx-class_attributes_rb.html +775 -0
  13. data/doc/output/coverage/lib-classx-commandable_rb.html +727 -0
  14. data/doc/output/coverage/{-Library-Ruby-Gems-gems-diff-lcs-1_1_2-lib-diff-lcs-block_rb.html → lib-classx-declare_rb.html} +60 -62
  15. data/doc/output/coverage/lib-classx-validate_rb.html +43 -41
  16. data/doc/output/coverage/lib-classx_rb.html +208 -78
  17. data/example/commandable.rb +1 -0
  18. data/lib/classx.rb +146 -16
  19. data/lib/classx/attribute.rb +244 -143
  20. data/lib/classx/attributes.rb +93 -27
  21. data/lib/classx/bracketable.rb +61 -0
  22. data/lib/classx/class_attributes.rb +165 -0
  23. data/lib/classx/commandable.rb +55 -4
  24. data/lib/classx/declare.rb +40 -3
  25. data/lib/classx/role/logger.rb +17 -13
  26. data/lib/classx/validate.rb +26 -24
  27. data/spec/classx/handles_spec.rb +21 -6
  28. data/spec/classx/serialize_spec.rb +57 -0
  29. data/spec/classx/{with_coerce.rb → with_coerce_spec.rb} +0 -0
  30. data/spec/classx/with_extend_spec.rb +58 -0
  31. data/spec/classx/with_include_spec.rb +58 -0
  32. data/spec/classx/with_validate_spec.rb +363 -0
  33. data/spec/classx/without_anyoption_spec.rb +1 -1
  34. data/spec/classx/writable_option_spec.rb +29 -4
  35. data/spec/classx_bracketable_spec.rb +160 -0
  36. data/spec/classx_class_attributes/default_option_spec.rb +121 -0
  37. data/spec/classx_class_attributes/dsl_accessor_spec.rb +88 -0
  38. data/spec/classx_class_attributes/handles_spec.rb +77 -0
  39. data/spec/classx_class_attributes/with_coerce_spec.rb +119 -0
  40. data/spec/classx_class_attributes/with_extend_spec.rb +64 -0
  41. data/spec/classx_class_attributes/with_include_spec.rb +64 -0
  42. data/spec/classx_class_attributes/with_multiple_class_spec.rb +60 -0
  43. data/spec/classx_class_attributes/with_validate_spec.rb +248 -0
  44. data/spec/classx_class_attributes/without_accessor_spec.rb +19 -0
  45. data/spec/classx_class_attributes/without_anyoption_spec.rb +21 -0
  46. data/spec/classx_class_attributes/writable_option_spec.rb +100 -0
  47. data/spec/classx_declare_spec.rb +117 -0
  48. data/spec/classx_validate_spec.rb +1 -3
  49. data/tasks/basic_tasks.rake +1 -1
  50. metadata +36 -26
  51. data/doc/output/coverage/-Library-Ruby-Gems-gems-diff-lcs-1_1_2-lib-diff-lcs-callbacks_rb.html +0 -932
  52. data/doc/output/coverage/-Library-Ruby-Gems-gems-diff-lcs-1_1_2-lib-diff-lcs-change_rb.html +0 -779
  53. data/doc/output/coverage/-Library-Ruby-Gems-gems-diff-lcs-1_1_2-lib-diff-lcs-hunk_rb.html +0 -867
  54. data/doc/output/coverage/-Library-Ruby-Gems-gems-diff-lcs-1_1_2-lib-diff-lcs_rb.html +0 -1715
  55. data/doc/output/coverage/-Library-Ruby-Gems-gems-rcov-0_8_1_2_0-lib-rcov_rb.html +0 -1598
  56. data/spec/classx/with_extend.rb +0 -27
  57. data/spec/classx/with_include.rb +0 -27
@@ -553,7 +553,7 @@ span.run100 {
553
553
  </style>
554
554
  </head>
555
555
  <body><h3>C0 code coverage information</h3>
556
- <p>Generated on Sat Aug 23 14:29:19 +0900 2008 with <a href='http://eigenclass.org/hiki/rcov'>rcov 0.8.1.2</a>
556
+ <p>Generated on Sat Sep 13 00:31:29 +0900 2008 with <a href='http://eigenclass.org/hiki/rcov'>rcov 0.8.1.2</a>
557
557
  </p>
558
558
  <hr/>
559
559
  <pre><span class='marked0'>Code reported as executed by Ruby looks like this...
@@ -571,24 +571,24 @@ span.run100 {
571
571
  </thead>
572
572
  <tbody><tr class='light'><td><a href='lib-classx-attribute_rb.html'>lib/classx/attribute.rb</a>
573
573
  </td>
574
- <td class='lines_total'><tt>185</tt>
574
+ <td class='lines_total'><tt>286</tt>
575
575
  </td>
576
- <td class='lines_code'><tt>149</tt>
576
+ <td class='lines_code'><tt>221</tt>
577
577
  </td>
578
- <td><table cellspacing='0' cellpadding='0' align='right'><tr><td><tt class='coverage_total'>53.0%</tt>
578
+ <td><table cellspacing='0' cellpadding='0' align='right'><tr><td><tt class='coverage_total'>98.6%</tt>
579
579
  &nbsp;</td>
580
- <td><table cellspacing='0' class='percent_graph' cellpadding='0' width='100'><tr><td class='covered' width='53'/>
581
- <td class='uncovered' width='47'/>
580
+ <td><table cellspacing='0' class='percent_graph' cellpadding='0' width='100'><tr><td class='covered' width='99'/>
581
+ <td class='uncovered' width='1'/>
582
582
  </tr>
583
583
  </table>
584
584
  </td>
585
585
  </tr>
586
586
  </table>
587
587
  </td>
588
- <td><table cellspacing='0' cellpadding='0' align='right'><tr><td><tt class='coverage_code'>45.6%</tt>
588
+ <td><table cellspacing='0' cellpadding='0' align='right'><tr><td><tt class='coverage_code'>98.2%</tt>
589
589
  &nbsp;</td>
590
- <td><table cellspacing='0' class='percent_graph' cellpadding='0' width='100'><tr><td class='covered' width='46'/>
591
- <td class='uncovered' width='54'/>
590
+ <td><table cellspacing='0' class='percent_graph' cellpadding='0' width='100'><tr><td class='covered' width='98'/>
591
+ <td class='uncovered' width='2'/>
592
592
  </tr>
593
593
  </table>
594
594
  </td>
@@ -599,190 +599,291 @@ span.run100 {
599
599
  </tbody>
600
600
  </table>
601
601
  <pre><span class="marked0"><a name="line1"></a> 1 module ClassX
602
- </span><span class="marked1"><a name="line2"></a> 2 class AttributeFactory
603
- </span><span class="marked0"><a name="line3"></a> 3 def self.create args
604
- </span><span class="marked1"><a name="line4"></a> 4 klass = Class.new
605
- </span><span class="marked0"><a name="line5"></a> 5 klass.class_eval do
606
- </span><span class="inferred1"><a name="line6"></a> 6
607
- </span><span class="inferred0"><a name="line7"></a> 7 # XXX: Hack for defining class method for klass
608
- </span><span class="marked1"><a name="line8"></a> 8 tmp_mod = Module.new
609
- </span><span class="marked0"><a name="line9"></a> 9 tmp_mod.module_eval do
610
- </span><span class="marked1"><a name="line10"></a> 10 define_method :config do
611
- </span><span class="marked0"><a name="line11"></a> 11 args
612
- </span><span class="inferred1"><a name="line12"></a> 12 end
613
- </span><span class="inferred0"><a name="line13"></a> 13
614
- </span><span class="marked1"><a name="line14"></a> 14 define_method :value_class do
615
- </span><span class="uncovered0"><a name="line15"></a> 15 args[:isa] || args[:kind_of]
616
- </span><span class="uncovered1"><a name="line16"></a> 16 end
602
+ </span><span class="marked1"><a name="line2"></a> 2 module AttributeMethods #:nodoc:
603
+ </span><span class="marked0"><a name="line3"></a> 3 module ClassMethods #:nodoc:
604
+ </span><span class="marked1"><a name="line4"></a> 4 def value_class
605
+ </span><span class="marked0"><a name="line5"></a> 5 config[:isa] || config[:kind_of]
606
+ </span><span class="marked1"><a name="line6"></a> 6 end
607
+ </span><span class="inferred0"><a name="line7"></a> 7
608
+ </span><span class="inferred1"><a name="line8"></a> 8 # description for attribute
609
+ </span><span class="marked0"><a name="line9"></a> 9 def desc
610
+ </span><span class="uncovered1"><a name="line10"></a> 10 config[:desc]
611
+ </span><span class="uncovered0"><a name="line11"></a> 11 end
612
+ </span><span class="inferred1"><a name="line12"></a> 12
613
+ </span><span class="inferred0"><a name="line13"></a> 13 # when this option specify true, not raise error in #initialize without value.
614
+ </span><span class="marked1"><a name="line14"></a> 14 def optional?
615
+ </span><span class="marked0"><a name="line15"></a> 15 return config[:optional]
616
+ </span><span class="marked1"><a name="line16"></a> 16 end
617
617
  </span><span class="inferred0"><a name="line17"></a> 17
618
- </span><span class="inferred1"><a name="line18"></a> 18 # description for attribute
619
- </span><span class="marked0"><a name="line19"></a> 19 define_method :desc do
620
- </span><span class="uncovered1"><a name="line20"></a> 20 args[:desc]
621
- </span><span class="uncovered0"><a name="line21"></a> 21 end
618
+ </span><span class="inferred1"><a name="line18"></a> 18 # when it lazy option specified, it will not be initialized when #initialize.
619
+ </span><span class="marked0"><a name="line19"></a> 19 def lazy?
620
+ </span><span class="marked1"><a name="line20"></a> 20 return config[:lazy]
621
+ </span><span class="marked0"><a name="line21"></a> 21 end
622
622
  </span><span class="inferred1"><a name="line22"></a> 22
623
- </span><span class="inferred0"><a name="line23"></a> 23 # you specify type changing rule with :coerce option.
624
- </span><span class="inferred1"><a name="line24"></a> 24 #
625
- </span><span class="marked0"><a name="line25"></a> 25 define_method :coerce do |val|
626
- </span><span class="marked1"><a name="line26"></a> 26 if args[:coerce]
627
- </span><span class="uncovered0"><a name="line27"></a> 27 case args[:coerce]
628
- </span><span class="uncovered1"><a name="line28"></a> 28 when Hash
629
- </span><span class="uncovered0"><a name="line29"></a> 29 result = val
630
- </span><span class="uncovered1"><a name="line30"></a> 30 args[:coerce].each do |cond, rule|
631
- </span><span class="uncovered0"><a name="line31"></a> 31 case cond
632
- </span><span class="uncovered1"><a name="line32"></a> 32 when Proc
633
- </span><span class="uncovered0"><a name="line33"></a> 33 if cond.call(val)
634
- </span><span class="uncovered1"><a name="line34"></a> 34 result = rule.call(val)
635
- </span><span class="uncovered0"><a name="line35"></a> 35 break
636
- </span><span class="uncovered1"><a name="line36"></a> 36 end
637
- </span><span class="uncovered0"><a name="line37"></a> 37 when Symbol
638
- </span><span class="uncovered1"><a name="line38"></a> 38 if val.respond_to? cond
639
- </span><span class="uncovered0"><a name="line39"></a> 39 result = rule.call(val)
640
- </span><span class="uncovered1"><a name="line40"></a> 40 break
641
- </span><span class="uncovered0"><a name="line41"></a> 41 end
642
- </span><span class="uncovered1"><a name="line42"></a> 42 when Module
643
- </span><span class="uncovered0"><a name="line43"></a> 43 if val.kind_of? cond
644
- </span><span class="uncovered1"><a name="line44"></a> 44 result = rule.call(val)
645
- </span><span class="uncovered0"><a name="line45"></a> 45 break
646
- </span><span class="uncovered1"><a name="line46"></a> 46 end
647
- </span><span class="uncovered0"><a name="line47"></a> 47 end
648
- </span><span class="uncovered1"><a name="line48"></a> 48 end
649
- </span><span class="uncovered0"><a name="line49"></a> 49
650
- </span><span class="uncovered1"><a name="line50"></a> 50 return result
651
- </span><span class="uncovered0"><a name="line51"></a> 51 when Array
652
- </span><span class="uncovered1"><a name="line52"></a> 52 result = val
653
- </span><span class="uncovered0"><a name="line53"></a> 53 args[:coerce].each do |item|
654
- </span><span class="uncovered1"><a name="line54"></a> 54 raise unless item.kind_of? Hash
655
- </span><span class="uncovered0"><a name="line55"></a> 55
656
- </span><span class="uncovered1"><a name="line56"></a> 56 case item
657
- </span><span class="uncovered0"><a name="line57"></a> 57 when Hash
658
- </span><span class="uncovered1"><a name="line58"></a> 58 item.each do |cond, rule|
659
- </span><span class="uncovered0"><a name="line59"></a> 59
660
- </span><span class="uncovered1"><a name="line60"></a> 60 case cond
661
- </span><span class="uncovered0"><a name="line61"></a> 61 when Proc
662
- </span><span class="uncovered1"><a name="line62"></a> 62 if cond.call(val)
663
- </span><span class="uncovered0"><a name="line63"></a> 63 result = rule.call(val)
664
- </span><span class="uncovered1"><a name="line64"></a> 64 break
665
- </span><span class="uncovered0"><a name="line65"></a> 65 end
666
- </span><span class="uncovered1"><a name="line66"></a> 66 end
667
- </span><span class="uncovered0"><a name="line67"></a> 67
668
- </span><span class="uncovered1"><a name="line68"></a> 68 break if result
669
- </span><span class="uncovered0"><a name="line69"></a> 69 end
670
- </span><span class="uncovered1"><a name="line70"></a> 70 end
671
- </span><span class="uncovered0"><a name="line71"></a> 71
672
- </span><span class="uncovered1"><a name="line72"></a> 72 break if result
673
- </span><span class="uncovered0"><a name="line73"></a> 73 end
674
- </span><span class="uncovered1"><a name="line74"></a> 74
675
- </span><span class="uncovered0"><a name="line75"></a> 75 return result
676
- </span><span class="uncovered1"><a name="line76"></a> 76 end
677
- </span><span class="inferred0"><a name="line77"></a> 77 else
678
- </span><span class="marked1"><a name="line78"></a> 78 return val
679
- </span><span class="inferred0"><a name="line79"></a> 79 end
680
- </span><span class="marked1"><a name="line80"></a> 80 end
681
- </span><span class="inferred0"><a name="line81"></a> 81
682
- </span><span class="inferred1"><a name="line82"></a> 82 # you can specify :validate option for checking when value is setted.
683
- </span><span class="inferred0"><a name="line83"></a> 83 # you can use :respond_to as shotcut for specifying { :validate =&gt; proc {|val| respond_to?(val, true) } }
684
- </span><span class="inferred1"><a name="line84"></a> 84 # you can use :isa or :kind_of as shotcut for specifying { :validate =&gt; proc {|val| kind_of?(val) } }
685
- </span><span class="marked0"><a name="line85"></a> 85 define_method :validate? do |val|
686
- </span><span class="marked1"><a name="line86"></a> 86 if args[:validate]
687
- </span><span class="uncovered0"><a name="line87"></a> 87 case args[:validate]
688
- </span><span class="uncovered1"><a name="line88"></a> 88 when Proc
689
- </span><span class="uncovered0"><a name="line89"></a> 89 return args[:validate].call(val)
690
- </span><span class="uncovered1"><a name="line90"></a> 90 when Regexp
691
- </span><span class="uncovered0"><a name="line91"></a> 91 return args[:validate] =~ val
692
- </span><span class="uncovered1"><a name="line92"></a> 92 else
693
- </span><span class="uncovered0"><a name="line93"></a> 93 return args[:validate] == val
694
- </span><span class="uncovered1"><a name="line94"></a> 94 end
695
- </span><span class="marked0"><a name="line95"></a> 95 elsif mod = ( args[:isa] || args[:kind_of] )
696
- </span><span class="marked1"><a name="line96"></a> 96 return val.kind_of?(mod)
697
- </span><span class="marked0"><a name="line97"></a> 97 elsif args[:respond_to]
698
- </span><span class="uncovered1"><a name="line98"></a> 98 return val.respond_to?(args[:respond_to], true)
699
- </span><span class="inferred0"><a name="line99"></a> 99 else
700
- </span><span class="inferred1"><a name="line100"></a>100 # nothing checked.
701
- </span><span class="marked0"><a name="line101"></a>101 true
702
- </span><span class="inferred1"><a name="line102"></a>102 end
703
- </span><span class="inferred0"><a name="line103"></a>103 end
704
- </span><span class="inferred1"><a name="line104"></a>104
705
- </span><span class="inferred0"><a name="line105"></a>105 # default paramater for attribute.
706
- </span><span class="inferred1"><a name="line106"></a>106 # if default is Proc, run Proc every time in instanciate.
707
- </span><span class="marked0"><a name="line107"></a>107 define_method :default do |parent|
708
- </span><span class="marked1"><a name="line108"></a>108 case args[:default]
709
- </span><span class="marked0"><a name="line109"></a>109 when Proc
710
- </span><span class="marked1"><a name="line110"></a>110 args[:default].call(parent)
711
- </span><span class="inferred0"><a name="line111"></a>111 else
712
- </span><span class="marked1"><a name="line112"></a>112 begin
713
- </span><span class="marked0"><a name="line113"></a>113 args[:default].dup
714
- </span><span class="inferred1"><a name="line114"></a>114 rescue Exception
715
- </span><span class="marked0"><a name="line115"></a>115 args[:default]
716
- </span><span class="inferred1"><a name="line116"></a>116 end
717
- </span><span class="inferred0"><a name="line117"></a>117 end
718
- </span><span class="inferred1"><a name="line118"></a>118 end
719
- </span><span class="inferred0"><a name="line119"></a>119
720
- </span><span class="inferred1"><a name="line120"></a>120 # when this option specify true, not raise error in #initialize without value.
721
- </span><span class="marked0"><a name="line121"></a>121 define_method :optional? do
722
- </span><span class="marked1"><a name="line122"></a>122 return args[:optional]
723
- </span><span class="inferred0"><a name="line123"></a>123 end
724
- </span><span class="inferred1"><a name="line124"></a>124
725
- </span><span class="inferred0"><a name="line125"></a>125 # when it lazy option specified, it will not be initialized when #initialize.
726
- </span><span class="marked1"><a name="line126"></a>126 define_method :lazy? do
727
- </span><span class="marked0"><a name="line127"></a>127 return args[:lazy]
728
- </span><span class="inferred1"><a name="line128"></a>128 end
729
- </span><span class="inferred0"><a name="line129"></a>129
730
- </span><span class="marked1"><a name="line130"></a>130 define_method :inspect do
731
- </span><span class="uncovered0"><a name="line131"></a>131 &quot;ClassX::Attribute[#{self.config.inspect}]&quot;
732
- </span><span class="uncovered1"><a name="line132"></a>132 end
733
- </span><span class="uncovered0"><a name="line133"></a>133 end
734
- </span><span class="marked1"><a name="line134"></a>134 __send__ :extend, tmp_mod
735
- </span><span class="inferred0"><a name="line135"></a>135
736
- </span><span class="marked1"><a name="line136"></a>136 raise ClassX::RequiredAttrShouldNotHaveDefault if args[:optional] == false &amp;&amp; !args[:default].nil?
737
- </span><span class="marked0"><a name="line137"></a>137 raise ClassX::OptionalAttrShouldBeWritable if args[:optional] &amp;&amp; args[:writable] == false
738
- </span><span class="inferred1"><a name="line138"></a>138
739
- </span><span class="marked0"><a name="line139"></a>139 define_method :initialize do |val|
740
- </span><span class="marked1"><a name="line140"></a>140 @parent = val
741
- </span><span class="marked0"><a name="line141"></a>141 @data = nil
742
- </span><span class="inferred1"><a name="line142"></a>142 end
743
- </span><span class="inferred0"><a name="line143"></a>143
744
- </span><span class="marked1"><a name="line144"></a>144 define_method :get do
745
- </span><span class="marked0"><a name="line145"></a>145 @data ||= self.class.default(@parent)
746
- </span><span class="inferred1"><a name="line146"></a>146 end
747
- </span><span class="inferred0"><a name="line147"></a>147
748
- </span><span class="marked1"><a name="line148"></a>148 define_method :set do |val|
749
- </span><span class="marked0"><a name="line149"></a>149 val = self.class.coerce(val)
750
- </span><span class="marked1"><a name="line150"></a>150 raise ClassX::InvalidAttrArgument unless self.class.validate? val
751
- </span><span class="marked0"><a name="line151"></a>151 @data = val
752
- </span><span class="inferred1"><a name="line152"></a>152 end
753
- </span><span class="inferred0"><a name="line153"></a>153
754
- </span><span class="inferred1"><a name="line154"></a>154 # for extending attribute point.
755
- </span><span class="marked0"><a name="line155"></a>155 if args[:include]
756
- </span><span class="uncovered1"><a name="line156"></a>156 case args[:include]
757
- </span><span class="uncovered0"><a name="line157"></a>157 when Array
758
- </span><span class="uncovered1"><a name="line158"></a>158 args[:include].each do |mod|
759
- </span><span class="uncovered0"><a name="line159"></a>159 self.__send__ :include, mod
760
- </span><span class="uncovered1"><a name="line160"></a>160 end
761
- </span><span class="uncovered0"><a name="line161"></a>161 else
762
- </span><span class="uncovered1"><a name="line162"></a>162 self.__send__ :include, args[:include]
763
- </span><span class="uncovered0"><a name="line163"></a>163 end
764
- </span><span class="uncovered1"><a name="line164"></a>164 end
765
- </span><span class="inferred0"><a name="line165"></a>165
766
- </span><span class="marked1"><a name="line166"></a>166 if args[:extend]
767
- </span><span class="uncovered0"><a name="line167"></a>167 case args[:extend]
768
- </span><span class="uncovered1"><a name="line168"></a>168 when Array
769
- </span><span class="uncovered0"><a name="line169"></a>169 args[:extend].each do |mod|
770
- </span><span class="uncovered1"><a name="line170"></a>170 self.__send__ :extend, mod
771
- </span><span class="uncovered0"><a name="line171"></a>171 end
772
- </span><span class="uncovered1"><a name="line172"></a>172 else
773
- </span><span class="uncovered0"><a name="line173"></a>173 self.__send__ :extend, args[:extend]
774
- </span><span class="uncovered1"><a name="line174"></a>174 end
775
- </span><span class="uncovered0"><a name="line175"></a>175 end
776
- </span><span class="inferred1"><a name="line176"></a>176
777
- </span><span class="marked0"><a name="line177"></a>177 define_method :inspect do
778
- </span><span class="uncovered1"><a name="line178"></a>178 &quot;&lt;#ClassX::Attribute:#{object_id} #{ @data.nil? ? '@data=nil' : '@data=' + @data.inspect } config=#{self.class.config.inspect}&gt;&quot;
779
- </span><span class="uncovered0"><a name="line179"></a>179 end
780
- </span><span class="uncovered1"><a name="line180"></a>180 end
623
+ </span><span class="marked0"><a name="line23"></a> 23 def inspect
624
+ </span><span class="uncovered1"><a name="line24"></a> 24 &quot;ClassX::Attribute[#{self.config.inspect}]&quot;
625
+ </span><span class="uncovered0"><a name="line25"></a> 25 end
626
+ </span><span class="inferred1"><a name="line26"></a> 26
627
+ </span><span class="marked0"><a name="line27"></a> 27 module CoerceWithHash #:nodoc:
628
+ </span><span class="marked1"><a name="line28"></a> 28 def coerce val
629
+ </span><span class="marked0"><a name="line29"></a> 29 result = val
630
+ </span><span class="marked1"><a name="line30"></a> 30 config[:coerce].each do |cond, rule|
631
+ </span><span class="marked0"><a name="line31"></a> 31 case cond
632
+ </span><span class="marked1"><a name="line32"></a> 32 when Proc
633
+ </span><span class="marked0"><a name="line33"></a> 33 if cond.call(val)
634
+ </span><span class="marked1"><a name="line34"></a> 34 result = rule.call(val)
635
+ </span><span class="marked0"><a name="line35"></a> 35 break
636
+ </span><span class="inferred1"><a name="line36"></a> 36 end
637
+ </span><span class="marked0"><a name="line37"></a> 37 when Symbol
638
+ </span><span class="marked1"><a name="line38"></a> 38 if val.respond_to? cond
639
+ </span><span class="marked0"><a name="line39"></a> 39 result = rule.call(val)
640
+ </span><span class="marked1"><a name="line40"></a> 40 break
641
+ </span><span class="inferred0"><a name="line41"></a> 41 end
642
+ </span><span class="marked1"><a name="line42"></a> 42 when Module
643
+ </span><span class="marked0"><a name="line43"></a> 43 if val.kind_of? cond
644
+ </span><span class="marked1"><a name="line44"></a> 44 result = rule.call(val)
645
+ </span><span class="marked0"><a name="line45"></a> 45 break
646
+ </span><span class="inferred1"><a name="line46"></a> 46 end
647
+ </span><span class="inferred0"><a name="line47"></a> 47 end
648
+ </span><span class="inferred1"><a name="line48"></a> 48 end
649
+ </span><span class="inferred0"><a name="line49"></a> 49
650
+ </span><span class="marked1"><a name="line50"></a> 50 return result
651
+ </span><span class="inferred0"><a name="line51"></a> 51 end
652
+ </span><span class="inferred1"><a name="line52"></a> 52 end
653
+ </span><span class="marked0"><a name="line53"></a> 53 module CoerceWithArray #:nodoc:
654
+ </span><span class="marked1"><a name="line54"></a> 54 def coerce val
655
+ </span><span class="marked0"><a name="line55"></a> 55 result = val
656
+ </span><span class="marked1"><a name="line56"></a> 56 config[:coerce].each do |item|
657
+ </span><span class="marked0"><a name="line57"></a> 57 raise unless item.kind_of? Hash
658
+ </span><span class="inferred1"><a name="line58"></a> 58
659
+ </span><span class="marked0"><a name="line59"></a> 59 case item
660
+ </span><span class="marked1"><a name="line60"></a> 60 when Hash
661
+ </span><span class="marked0"><a name="line61"></a> 61 item.each do |cond, rule|
662
+ </span><span class="marked1"><a name="line62"></a> 62 case cond
663
+ </span><span class="marked0"><a name="line63"></a> 63 when Proc
664
+ </span><span class="marked1"><a name="line64"></a> 64 if cond.call(val)
665
+ </span><span class="marked0"><a name="line65"></a> 65 result = rule.call(val)
666
+ </span><span class="marked1"><a name="line66"></a> 66 break
667
+ </span><span class="inferred0"><a name="line67"></a> 67 end
668
+ </span><span class="inferred1"><a name="line68"></a> 68 end
669
+ </span><span class="inferred0"><a name="line69"></a> 69
670
+ </span><span class="marked1"><a name="line70"></a> 70 break if result
671
+ </span><span class="inferred0"><a name="line71"></a> 71 end
672
+ </span><span class="inferred1"><a name="line72"></a> 72 end
673
+ </span><span class="inferred0"><a name="line73"></a> 73
674
+ </span><span class="marked1"><a name="line74"></a> 74 break if result
675
+ </span><span class="inferred0"><a name="line75"></a> 75 end
676
+ </span><span class="inferred1"><a name="line76"></a> 76
677
+ </span><span class="marked0"><a name="line77"></a> 77 return result
678
+ </span><span class="inferred1"><a name="line78"></a> 78 end
679
+ </span><span class="inferred0"><a name="line79"></a> 79 end
680
+ </span><span class="inferred1"><a name="line80"></a> 80
681
+ </span><span class="marked0"><a name="line81"></a> 81 module CoerceNothing #:nodoc:
682
+ </span><span class="marked1"><a name="line82"></a> 82 def coerce val
683
+ </span><span class="marked0"><a name="line83"></a> 83 val
684
+ </span><span class="marked1"><a name="line84"></a> 84 end
685
+ </span><span class="inferred0"><a name="line85"></a> 85 end
686
+ </span><span class="inferred1"><a name="line86"></a> 86
687
+ </span><span class="marked0"><a name="line87"></a> 87 module DefaultWithProc #:nodoc:
688
+ </span><span class="marked1"><a name="line88"></a> 88 def default parent
689
+ </span><span class="marked0"><a name="line89"></a> 89 config[:default].call(parent)
690
+ </span><span class="marked1"><a name="line90"></a> 90 end
691
+ </span><span class="inferred0"><a name="line91"></a> 91 end
692
+ </span><span class="marked1"><a name="line92"></a> 92 module DefaultWithNoProc #:nodoc:
693
+ </span><span class="marked0"><a name="line93"></a> 93 def default parent
694
+ </span><span class="marked1"><a name="line94"></a> 94 begin
695
+ </span><span class="marked0"><a name="line95"></a> 95 config[:default].dup
696
+ </span><span class="inferred1"><a name="line96"></a> 96 rescue Exception
697
+ </span><span class="marked0"><a name="line97"></a> 97 config[:default]
698
+ </span><span class="inferred1"><a name="line98"></a> 98 end
699
+ </span><span class="marked0"><a name="line99"></a> 99 end
700
+ </span><span class="inferred1"><a name="line100"></a>100 end
701
+ </span><span class="inferred0"><a name="line101"></a>101
702
+ </span><span class="marked1"><a name="line102"></a>102 module ValidateWithProc #:nodoc:
703
+ </span><span class="marked0"><a name="line103"></a>103 def validate? val
704
+ </span><span class="marked1"><a name="line104"></a>104 return config[:validate].call(val)
705
+ </span><span class="marked0"><a name="line105"></a>105 end
706
+ </span><span class="inferred1"><a name="line106"></a>106 end
707
+ </span><span class="inferred0"><a name="line107"></a>107
708
+ </span><span class="marked1"><a name="line108"></a>108 module ValidateWithNotProc #:nodoc:
709
+ </span><span class="marked0"><a name="line109"></a>109 def validate? val
710
+ </span><span class="marked1"><a name="line110"></a>110 return config[:validate] === val
711
+ </span><span class="marked0"><a name="line111"></a>111 end
712
+ </span><span class="inferred1"><a name="line112"></a>112 end
713
+ </span><span class="inferred0"><a name="line113"></a>113
714
+ </span><span class="marked1"><a name="line114"></a>114 module ValidateEach #:nodoc:
715
+ </span><span class="marked0"><a name="line115"></a>115 def validate? val
716
+ </span><span class="marked1"><a name="line116"></a>116 return false unless val.respond_to? :all?
717
+ </span><span class="inferred0"><a name="line117"></a>117
718
+ </span><span class="marked1"><a name="line118"></a>118 if self.value_class
719
+ </span><span class="marked0"><a name="line119"></a>119 return false unless val.kind_of?(self.value_class)
720
+ </span><span class="inferred1"><a name="line120"></a>120
721
+ </span><span class="marked0"><a name="line121"></a>121 case val
722
+ </span><span class="marked1"><a name="line122"></a>122 when Hash
723
+ </span><span class="marked0"><a name="line123"></a>123 if config[:validate_each].arity == 2
724
+ </span><span class="marked1"><a name="line124"></a>124 val.all? {|item| config[:validate_each].call(*item) }
725
+ </span><span class="inferred0"><a name="line125"></a>125 else
726
+ </span><span class="marked1"><a name="line126"></a>126 ClassX::Validate.validate(val, &amp;config[:validate_each])
727
+ </span><span class="inferred0"><a name="line127"></a>127 end
728
+ </span><span class="inferred1"><a name="line128"></a>128 else
729
+ </span><span class="marked0"><a name="line129"></a>129 val.all? {|item| config[:validate_each].call(*item) }
730
+ </span><span class="inferred1"><a name="line130"></a>130 end
731
+ </span><span class="inferred0"><a name="line131"></a>131 else
732
+ </span><span class="marked1"><a name="line132"></a>132 val.all? {|item| config[:validate_each].call(*item) }
733
+ </span><span class="inferred0"><a name="line133"></a>133 end
734
+ </span><span class="inferred1"><a name="line134"></a>134 end
735
+ </span><span class="inferred0"><a name="line135"></a>135 end
736
+ </span><span class="inferred1"><a name="line136"></a>136
737
+ </span><span class="marked0"><a name="line137"></a>137 module ValidateKindOf #:nodoc:
738
+ </span><span class="marked1"><a name="line138"></a>138 def validate? val
739
+ </span><span class="marked0"><a name="line139"></a>139 return val.kind_of?(self.value_class)
740
+ </span><span class="marked1"><a name="line140"></a>140 end
741
+ </span><span class="inferred0"><a name="line141"></a>141 end
742
+ </span><span class="inferred1"><a name="line142"></a>142
743
+ </span><span class="marked0"><a name="line143"></a>143 module ValidateRespondTo #:nodoc:
744
+ </span><span class="marked1"><a name="line144"></a>144 def validate? val
745
+ </span><span class="marked0"><a name="line145"></a>145 return val.respond_to?(config[:respond_to])
746
+ </span><span class="marked1"><a name="line146"></a>146 end
747
+ </span><span class="inferred0"><a name="line147"></a>147 end
748
+ </span><span class="inferred1"><a name="line148"></a>148
749
+ </span><span class="marked0"><a name="line149"></a>149 module ValidateNothing #:nodoc:
750
+ </span><span class="marked1"><a name="line150"></a>150 def validate? val
751
+ </span><span class="inferred0"><a name="line151"></a>151 # nothing checked.
752
+ </span><span class="marked1"><a name="line152"></a>152 true
753
+ </span><span class="marked0"><a name="line153"></a>153 end
754
+ </span><span class="inferred1"><a name="line154"></a>154 end
755
+ </span><span class="inferred0"><a name="line155"></a>155 end
756
+ </span><span class="inferred1"><a name="line156"></a>156
757
+ </span><span class="marked0"><a name="line157"></a>157 module InstanceMethods #:nodoc:
758
+ </span><span class="marked1"><a name="line158"></a>158 def initialize val
759
+ </span><span class="marked0"><a name="line159"></a>159 @parent = val
760
+ </span><span class="marked1"><a name="line160"></a>160 @data = nil
761
+ </span><span class="inferred0"><a name="line161"></a>161 end
762
+ </span><span class="inferred1"><a name="line162"></a>162
763
+ </span><span class="marked0"><a name="line163"></a>163 def get
764
+ </span><span class="marked1"><a name="line164"></a>164 @data ||= self.class.default(@parent)
765
+ </span><span class="marked0"><a name="line165"></a>165 end
766
+ </span><span class="inferred1"><a name="line166"></a>166
767
+ </span><span class="inferred0"><a name="line167"></a>167 # XXX:
768
+ </span><span class="inferred1"><a name="line168"></a>168 # you should not call this method except for @parent instance's setter method.
769
+ </span><span class="inferred0"><a name="line169"></a>169 # It's because caching as instance_variable in @parent instance for performance.
770
+ </span><span class="marked1"><a name="line170"></a>170 def set val
771
+ </span><span class="marked0"><a name="line171"></a>171 val = self.class.coerce(val)
772
+ </span><span class="marked1"><a name="line172"></a>172 raise ClassX::InvalidAttrArgument unless self.class.validate? val
773
+ </span><span class="marked0"><a name="line173"></a>173 @data = val
774
+ </span><span class="inferred1"><a name="line174"></a>174 end
775
+ </span><span class="inferred0"><a name="line175"></a>175
776
+ </span><span class="marked1"><a name="line176"></a>176 def inspect
777
+ </span><span class="marked0"><a name="line177"></a>177 &quot;&lt;#ClassX::Attribute:#{object_id} #{ @data.nil? ? '@data=nil' : '@data=' + @data.inspect } @parent=#{@parent} config=#{self.class.config.inspect}&gt;&quot;
778
+ </span><span class="marked1"><a name="line178"></a>178 end
779
+ </span><span class="inferred0"><a name="line179"></a>179 end
780
+ </span><span class="inferred1"><a name="line180"></a>180 end
781
781
  </span><span class="inferred0"><a name="line181"></a>181
782
- </span><span class="marked1"><a name="line182"></a>182 klass
783
- </span><span class="inferred0"><a name="line183"></a>183 end
784
- </span><span class="inferred1"><a name="line184"></a>184 end
785
- </span><span class="inferred0"><a name="line185"></a>185 end
782
+ </span><span class="inferred1"><a name="line182"></a>182 #
783
+ </span><span class="inferred0"><a name="line183"></a>183 # generating anonymous class for meta attribute class.
784
+ </span><span class="inferred1"><a name="line184"></a>184 #
785
+ </span><span class="marked0"><a name="line185"></a>185 class AttributeFactory
786
+ </span><span class="inferred1"><a name="line186"></a>186 #
787
+ </span><span class="inferred0"><a name="line187"></a>187 # creating anonymous class for meta attribute class.
788
+ </span><span class="marked1"><a name="line188"></a>188 def self.create args
789
+ </span><span class="inferred0"><a name="line189"></a>189 # TODO: hmm, ClassX::Commandable do nothing when freezed.
790
+ </span><span class="inferred1"><a name="line190"></a>190 #
791
+ </span><span class="inferred0"><a name="line191"></a>191 # if you would like to change attribute's infomation, it's better to redefine attribute.
792
+ </span><span class="inferred1"><a name="line192"></a>192 # So, config should freezed.
793
+ </span><span class="inferred0"><a name="line193"></a>193 # args.each do |key, val|
794
+ </span><span class="inferred1"><a name="line194"></a>194 # key.freeze
795
+ </span><span class="inferred0"><a name="line195"></a>195 # val.freeze
796
+ </span><span class="inferred1"><a name="line196"></a>196 # end
797
+ </span><span class="inferred0"><a name="line197"></a>197 # args.freeze
798
+ </span><span class="inferred1"><a name="line198"></a>198
799
+ </span><span class="marked0"><a name="line199"></a>199 raise ClassX::RequiredAttrShouldNotHaveDefault if args[:optional] == false &amp;&amp; !args[:default].nil?
800
+ </span><span class="marked1"><a name="line200"></a>200 raise ClassX::OptionalAttrShouldBeWritable if args[:optional] &amp;&amp; args[:writable] == false
801
+ </span><span class="inferred0"><a name="line201"></a>201
802
+ </span><span class="marked1"><a name="line202"></a>202 klass = Class.new
803
+ </span><span class="inferred0"><a name="line203"></a>203
804
+ </span><span class="marked1"><a name="line204"></a>204 klass.extend(ClassX::AttributeMethods::ClassMethods)
805
+ </span><span class="inferred0"><a name="line205"></a>205
806
+ </span><span class="inferred1"><a name="line206"></a>206 # you specify type changing rule with :coerce option.
807
+ </span><span class="marked0"><a name="line207"></a>207 if args[:coerce]
808
+ </span><span class="marked1"><a name="line208"></a>208 case args[:coerce]
809
+ </span><span class="marked0"><a name="line209"></a>209 when Hash
810
+ </span><span class="marked1"><a name="line210"></a>210 klass.extend(ClassX::AttributeMethods::ClassMethods::CoerceWithHash)
811
+ </span><span class="marked0"><a name="line211"></a>211 when Array
812
+ </span><span class="marked1"><a name="line212"></a>212 klass.extend(ClassX::AttributeMethods::ClassMethods::CoerceWithArray)
813
+ </span><span class="inferred0"><a name="line213"></a>213 end
814
+ </span><span class="inferred1"><a name="line214"></a>214 else
815
+ </span><span class="marked0"><a name="line215"></a>215 klass.extend(ClassX::AttributeMethods::ClassMethods::CoerceNothing)
816
+ </span><span class="inferred1"><a name="line216"></a>216 end
817
+ </span><span class="inferred0"><a name="line217"></a>217
818
+ </span><span class="inferred1"><a name="line218"></a>218 # default paramater for attribute.
819
+ </span><span class="inferred0"><a name="line219"></a>219 # if default is Proc, run Proc every time in instanciate.
820
+ </span><span class="marked1"><a name="line220"></a>220 case args[:default]
821
+ </span><span class="marked0"><a name="line221"></a>221 when Proc
822
+ </span><span class="marked1"><a name="line222"></a>222 klass.extend(ClassX::AttributeMethods::ClassMethods::DefaultWithProc)
823
+ </span><span class="inferred0"><a name="line223"></a>223 else
824
+ </span><span class="marked1"><a name="line224"></a>224 klass.extend(ClassX::AttributeMethods::ClassMethods::DefaultWithNoProc)
825
+ </span><span class="inferred0"><a name="line225"></a>225 end
826
+ </span><span class="inferred1"><a name="line226"></a>226
827
+ </span><span class="inferred0"><a name="line227"></a>227 # you can specify :validate option for checking when value is setted.
828
+ </span><span class="inferred1"><a name="line228"></a>228 # you can use :respond_to as shotcut for specifying { :validate =&gt; proc {|val| respond_to?(val, true) } }
829
+ </span><span class="inferred0"><a name="line229"></a>229 # you can use :isa or :kind_of as shotcut for specifying { :validate =&gt; proc {|val| kind_of?(val) } }
830
+ </span><span class="marked1"><a name="line230"></a>230 if args[:validate]
831
+ </span><span class="marked0"><a name="line231"></a>231 case args[:validate]
832
+ </span><span class="marked1"><a name="line232"></a>232 when Proc
833
+ </span><span class="marked0"><a name="line233"></a>233 klass.extend(ClassX::AttributeMethods::ClassMethods::ValidateWithProc)
834
+ </span><span class="inferred1"><a name="line234"></a>234 else
835
+ </span><span class="marked0"><a name="line235"></a>235 klass.extend(ClassX::AttributeMethods::ClassMethods::ValidateWithNotProc)
836
+ </span><span class="inferred1"><a name="line236"></a>236 end
837
+ </span><span class="marked0"><a name="line237"></a>237 elsif args[:validate_each]
838
+ </span><span class="marked1"><a name="line238"></a>238 klass.extend(ClassX::AttributeMethods::ClassMethods::ValidateEach)
839
+ </span><span class="marked0"><a name="line239"></a>239 elsif mod = ( args[:isa] || args[:kind_of] )
840
+ </span><span class="marked1"><a name="line240"></a>240 klass.extend(ClassX::AttributeMethods::ClassMethods::ValidateKindOf)
841
+ </span><span class="marked0"><a name="line241"></a>241 elsif args[:respond_to]
842
+ </span><span class="marked1"><a name="line242"></a>242 klass.extend(ClassX::AttributeMethods::ClassMethods::ValidateRespondTo)
843
+ </span><span class="inferred0"><a name="line243"></a>243 else
844
+ </span><span class="marked1"><a name="line244"></a>244 klass.extend(ClassX::AttributeMethods::ClassMethods::ValidateNothing)
845
+ </span><span class="inferred0"><a name="line245"></a>245 end
846
+ </span><span class="inferred1"><a name="line246"></a>246
847
+ </span><span class="inferred0"><a name="line247"></a>247 # for extending attribute point.
848
+ </span><span class="marked1"><a name="line248"></a>248 if args[:include]
849
+ </span><span class="marked0"><a name="line249"></a>249 case args[:include]
850
+ </span><span class="marked1"><a name="line250"></a>250 when Array
851
+ </span><span class="marked0"><a name="line251"></a>251 args[:include].each do |mod|
852
+ </span><span class="marked1"><a name="line252"></a>252 klass.__send__ :include, mod
853
+ </span><span class="inferred0"><a name="line253"></a>253 end
854
+ </span><span class="inferred1"><a name="line254"></a>254 else
855
+ </span><span class="marked0"><a name="line255"></a>255 klass.__send__ :include, args[:include]
856
+ </span><span class="inferred1"><a name="line256"></a>256 end
857
+ </span><span class="inferred0"><a name="line257"></a>257 end
858
+ </span><span class="inferred1"><a name="line258"></a>258
859
+ </span><span class="marked0"><a name="line259"></a>259 if args[:extend]
860
+ </span><span class="marked1"><a name="line260"></a>260 case args[:extend]
861
+ </span><span class="marked0"><a name="line261"></a>261 when Array
862
+ </span><span class="marked1"><a name="line262"></a>262 args[:extend].each do |mod|
863
+ </span><span class="marked0"><a name="line263"></a>263 klass.__send__ :extend, mod
864
+ </span><span class="inferred1"><a name="line264"></a>264 end
865
+ </span><span class="inferred0"><a name="line265"></a>265 else
866
+ </span><span class="marked1"><a name="line266"></a>266 klass.__send__ :extend, args[:extend]
867
+ </span><span class="inferred0"><a name="line267"></a>267 end
868
+ </span><span class="inferred1"><a name="line268"></a>268 end
869
+ </span><span class="inferred0"><a name="line269"></a>269
870
+ </span><span class="inferred1"><a name="line270"></a>270 # XXX: Hack for defining class method for klass
871
+ </span><span class="marked0"><a name="line271"></a>271 tmp_mod = Module.new
872
+ </span><span class="marked1"><a name="line272"></a>272 tmp_mod.module_eval do
873
+ </span><span class="marked0"><a name="line273"></a>273 define_method :config do
874
+ </span><span class="marked1"><a name="line274"></a>274 args
875
+ </span><span class="inferred0"><a name="line275"></a>275 end
876
+ </span><span class="inferred1"><a name="line276"></a>276 end
877
+ </span><span class="marked0"><a name="line277"></a>277 klass.extend(tmp_mod)
878
+ </span><span class="inferred1"><a name="line278"></a>278
879
+ </span><span class="marked0"><a name="line279"></a>279 klass.class_eval do
880
+ </span><span class="marked1"><a name="line280"></a>280 include ClassX::AttributeMethods::InstanceMethods
881
+ </span><span class="inferred0"><a name="line281"></a>281 end
882
+ </span><span class="inferred1"><a name="line282"></a>282
883
+ </span><span class="marked0"><a name="line283"></a>283 klass
884
+ </span><span class="inferred1"><a name="line284"></a>284 end
885
+ </span><span class="inferred0"><a name="line285"></a>285 end
886
+ </span><span class="inferred1"><a name="line286"></a>286 end
786
887
  </span></pre><hr/>
787
888
  <p>Generated using the <a href='http://eigenclass.org/hiki.rb?rcov'>rcov code coverage analysis tool for Ruby</a>
788
889
  version 0.8.1.2.</p>