classx 0.0.1 → 0.0.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.
Files changed (40) hide show
  1. data/ChangeLog +408 -2
  2. data/README +2 -2
  3. data/Rakefile +4 -3
  4. data/doc/output/coverage/-Library-Ruby-Gems-gems-diff-lcs-1_1_2-lib-diff-lcs-block_rb.html +1 -1
  5. data/doc/output/coverage/-Library-Ruby-Gems-gems-diff-lcs-1_1_2-lib-diff-lcs-callbacks_rb.html +1 -1
  6. data/doc/output/coverage/-Library-Ruby-Gems-gems-diff-lcs-1_1_2-lib-diff-lcs-change_rb.html +1 -1
  7. data/doc/output/coverage/-Library-Ruby-Gems-gems-diff-lcs-1_1_2-lib-diff-lcs-hunk_rb.html +1 -1
  8. data/doc/output/coverage/-Library-Ruby-Gems-gems-diff-lcs-1_1_2-lib-diff-lcs_rb.html +1 -1
  9. data/doc/output/coverage/-Library-Ruby-Gems-gems-rcov-0_8_1_2_0-lib-rcov_rb.html +1 -1
  10. data/doc/output/coverage/index.html +37 -172
  11. data/doc/output/coverage/lib-classx-attribute_rb.html +788 -0
  12. data/doc/output/coverage/{-System-Library-Frameworks-Ruby_framework-Versions-1_8-usr-lib-ruby-1_8-drb-invokemethod_rb.html → lib-classx-attributes_rb.html} +96 -47
  13. data/doc/output/coverage/lib-classx-validate_rb.html +36 -36
  14. data/doc/output/coverage/lib-classx_rb.html +74 -151
  15. data/example/commandable.rb +28 -0
  16. data/lib/classx.rb +35 -112
  17. data/lib/classx/attribute.rb +178 -0
  18. data/lib/classx/attributes.rb +80 -8
  19. data/lib/classx/commandable.rb +38 -0
  20. data/lib/classx/validate.rb +1 -1
  21. data/spec/classx/default_option_spec.rb +140 -0
  22. data/spec/classx/handles_spec.rb +44 -0
  23. data/spec/classx/with_coerce.rb +79 -0
  24. data/spec/classx/with_extend.rb +25 -0
  25. data/spec/classx/with_include.rb +25 -0
  26. data/spec/classx/with_multiple_class_spec.rb +23 -0
  27. data/spec/classx/without_accessor_spec.rb +26 -0
  28. data/spec/classx/without_anyoption_spec.rb +23 -0
  29. data/spec/classx/writable_option_spec.rb +73 -0
  30. data/spec/classx_attributes_spec.rb +30 -0
  31. data/tasks/basic_config.rake +5 -1
  32. metadata +22 -15
  33. data/doc/output/coverage/-System-Library-Frameworks-Ruby_framework-Versions-1_8-usr-lib-ruby-1_8-drb-drb_rb.html +0 -2373
  34. data/doc/output/coverage/-System-Library-Frameworks-Ruby_framework-Versions-1_8-usr-lib-ruby-1_8-drb-eq_rb.html +0 -626
  35. data/doc/output/coverage/-System-Library-Frameworks-Ruby_framework-Versions-1_8-usr-lib-ruby-1_8-forwardable_rb.html +0 -828
  36. data/doc/output/coverage/-System-Library-Frameworks-Ruby_framework-Versions-1_8-usr-lib-ruby-1_8-pp_rb.html +0 -1257
  37. data/doc/output/coverage/-System-Library-Frameworks-Ruby_framework-Versions-1_8-usr-lib-ruby-1_8-prettyprint_rb.html +0 -1506
  38. data/doc/output/coverage/-System-Library-Frameworks-Ruby_framework-Versions-1_8-usr-lib-ruby-1_8-timeout_rb.html +0 -715
  39. data/lib/classx.rb.new +0 -102
  40. data/spec/classx_spec.rb +0 -261
@@ -1,5 +1,5 @@
1
1
  <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
2
- <html lang='en' xml:lang='en' xmlns='http://www.w3.org/1999/xhtml'><head><title>/System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/lib/ruby/1.8/drb/invokemethod.rb - C0 code coverage information</title>
2
+ <html lang='en' xml:lang='en' xmlns='http://www.w3.org/1999/xhtml'><head><title>lib/classx/attributes.rb - C0 code coverage information</title>
3
3
  <style type='text/css'>body { background-color: rgb(240, 240, 245); }</style>
4
4
  <style type='text/css'>span.cross-ref-title {
5
5
  font-size: 140%;
@@ -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 Wed May 28 01:22:15 +0900 2008 with <a href='http://eigenclass.org/hiki/rcov'>rcov 0.8.1.2</a>
556
+ <p>Generated on Thu Aug 21 17:23:12 +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...
@@ -569,26 +569,26 @@ span.run100 {
569
569
  <td class='heading'>Code coverage</td>
570
570
  </tr>
571
571
  </thead>
572
- <tbody><tr class='light'><td><a href='-System-Library-Frameworks-Ruby_framework-Versions-1_8-usr-lib-ruby-1_8-drb-invokemethod_rb.html'>/System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/lib/ruby/1.8/drb/invokemethod.rb</a>
572
+ <tbody><tr class='light'><td><a href='lib-classx-attributes_rb.html'>lib/classx/attributes.rb</a>
573
573
  </td>
574
- <td class='lines_total'><tt>36</tt>
574
+ <td class='lines_total'><tt>85</tt>
575
575
  </td>
576
- <td class='lines_code'><tt>33</tt>
576
+ <td class='lines_code'><tt>70</tt>
577
577
  </td>
578
- <td><table cellspacing='0' cellpadding='0' align='right'><tr><td><tt class='coverage_total'>22.2%</tt>
578
+ <td><table cellspacing='0' cellpadding='0' align='right'><tr><td><tt class='coverage_total'>95.3%</tt>
579
579
  &nbsp;</td>
580
- <td><table cellspacing='0' class='percent_graph' cellpadding='0' width='100'><tr><td class='covered' width='22'/>
581
- <td class='uncovered' width='78'/>
580
+ <td><table cellspacing='0' class='percent_graph' cellpadding='0' width='100'><tr><td class='covered' width='95'/>
581
+ <td class='uncovered' width='5'/>
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'>15.2%</tt>
588
+ <td><table cellspacing='0' cellpadding='0' align='right'><tr><td><tt class='coverage_code'>94.3%</tt>
589
589
  &nbsp;</td>
590
- <td><table cellspacing='0' class='percent_graph' cellpadding='0' width='100'><tr><td class='covered' width='15'/>
591
- <td class='uncovered' width='85'/>
590
+ <td><table cellspacing='0' class='percent_graph' cellpadding='0' width='100'><tr><td class='covered' width='94'/>
591
+ <td class='uncovered' width='6'/>
592
592
  </tr>
593
593
  </table>
594
594
  </td>
@@ -598,42 +598,91 @@ span.run100 {
598
598
  </tr>
599
599
  </tbody>
600
600
  </table>
601
- <pre><span class="inferred0"><a name="line1"></a> 1 # for ruby-1.8.0
602
- </span><span class="inferred1"><a name="line2"></a> 2
603
- </span><span class="marked0"><a name="line3"></a> 3 module DRb
604
- </span><span class="marked1"><a name="line4"></a> 4 class DRbServer
605
- </span><span class="marked0"><a name="line5"></a> 5 module InvokeMethod18Mixin
606
- </span><span class="marked1"><a name="line6"></a> 6 def block_yield(x)
607
- </span><span class="uncovered0"><a name="line7"></a> 7 if x.size == 1 &amp;&amp; x[0].class == Array
608
- </span><span class="uncovered1"><a name="line8"></a> 8 x[0] = DRbArray.new(x[0])
609
- </span><span class="uncovered0"><a name="line9"></a> 9 end
610
- </span><span class="uncovered1"><a name="line10"></a>10 block_value = @block.call(*x)
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="marked0"><a name="line13"></a>13 def perform_with_block
614
- </span><span class="uncovered1"><a name="line14"></a>14 @obj.__send__(@msg_id, *@argv) do |*x|
615
- </span><span class="uncovered0"><a name="line15"></a>15 jump_error = nil
616
- </span><span class="uncovered1"><a name="line16"></a>16 begin
617
- </span><span class="uncovered0"><a name="line17"></a>17 block_value = block_yield(x)
618
- </span><span class="uncovered1"><a name="line18"></a>18 rescue LocalJumpError
619
- </span><span class="uncovered0"><a name="line19"></a>19 jump_error = $!
620
- </span><span class="uncovered1"><a name="line20"></a>20 end
621
- </span><span class="uncovered0"><a name="line21"></a>21 if jump_error
622
- </span><span class="uncovered1"><a name="line22"></a>22 case jump_error.reason
623
- </span><span class="uncovered0"><a name="line23"></a>23 when :retry
624
- </span><span class="uncovered1"><a name="line24"></a>24 retry
625
- </span><span class="uncovered0"><a name="line25"></a>25 when :break
626
- </span><span class="uncovered1"><a name="line26"></a>26 break(jump_error.exit_value)
627
- </span><span class="uncovered0"><a name="line27"></a>27 else
628
- </span><span class="uncovered1"><a name="line28"></a>28 raise jump_error
629
- </span><span class="uncovered0"><a name="line29"></a>29 end
630
- </span><span class="uncovered1"><a name="line30"></a>30 end
631
- </span><span class="uncovered0"><a name="line31"></a>31 block_value
632
- </span><span class="uncovered1"><a name="line32"></a>32 end
633
- </span><span class="uncovered0"><a name="line33"></a>33 end
634
- </span><span class="uncovered1"><a name="line34"></a>34 end
635
- </span><span class="uncovered0"><a name="line35"></a>35 end
636
- </span><span class="uncovered1"><a name="line36"></a>36 end
601
+ <pre><span class="marked0"><a name="line1"></a> 1 class ClassX
602
+ </span><span class="marked1"><a name="line2"></a> 2 module Attributes
603
+ </span><span class="marked0"><a name="line3"></a> 3 ATTRIBUTE_REGEX = /\Aattribute_of:(\w+)\z/
604
+ </span><span class="inferred1"><a name="line4"></a> 4
605
+ </span><span class="marked0"><a name="line5"></a> 5 def attribute_of
606
+ </span><span class="marked1"><a name="line6"></a> 6 unless @__attribute_of
607
+ </span><span class="marked0"><a name="line7"></a> 7 @__attribute_of = {}
608
+ </span><span class="marked1"><a name="line8"></a> 8 private_instance_methods.select {|meth| meth.to_s =~ ATTRIBUTE_REGEX }.each do |meth|
609
+ </span><span class="marked0"><a name="line9"></a> 9 key = meth.to_s.sub(ATTRIBUTE_REGEX) { $1 }
610
+ </span><span class="marked1"><a name="line10"></a>10 @__attribute_of[key] = __send__ &quot;attribute_of:#{key}&quot;
611
+ </span><span class="inferred0"><a name="line11"></a>11 end
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 @__attribute_of
615
+ </span><span class="inferred0"><a name="line15"></a>15 end
616
+ </span><span class="inferred1"><a name="line16"></a>16
617
+ </span><span class="marked0"><a name="line17"></a>17 private
618
+ </span><span class="marked1"><a name="line18"></a>18 def define_attribute name, attribute
619
+ </span><span class="marked0"><a name="line19"></a>19 klass_attribute = ClassX::AttributeFactory.create(attribute)
620
+ </span><span class="marked1"><a name="line20"></a>20 mod = Module.new
621
+ </span><span class="marked0"><a name="line21"></a>21 mod.module_eval do
622
+ </span><span class="marked1"><a name="line22"></a>22 define_method &quot;attribute_of:#{name}&quot; do
623
+ </span><span class="uncovered0"><a name="line23"></a>23 klass_attribute
624
+ </span><span class="uncovered1"><a name="line24"></a>24 end
625
+ </span><span class="inferred0"><a name="line25"></a>25
626
+ </span><span class="marked1"><a name="line26"></a>26 private &quot;attribute_of:#{name}&quot;
627
+ </span><span class="inferred0"><a name="line27"></a>27 end
628
+ </span><span class="marked1"><a name="line28"></a>28 self.extend(mod)
629
+ </span><span class="marked0"><a name="line29"></a>29 @__attribute_of ||= {}
630
+ </span><span class="marked1"><a name="line30"></a>30 @__attribute_of[name] = klass_attribute
631
+ </span><span class="inferred0"><a name="line31"></a>31
632
+ </span><span class="marked1"><a name="line32"></a>32 define_method &quot;attribute_of:#{name}&quot; do
633
+ </span><span class="marked0"><a name="line33"></a>33 @__attribute_of ||= {}
634
+ </span><span class="marked1"><a name="line34"></a>34 @__attribute_of[name] ||= klass_attribute.new(self)
635
+ </span><span class="inferred0"><a name="line35"></a>35 end
636
+ </span><span class="inferred1"><a name="line36"></a>36
637
+ </span><span class="marked0"><a name="line37"></a>37 private &quot;attribute_of:#{name}&quot;
638
+ </span><span class="inferred1"><a name="line38"></a>38 end
639
+ </span><span class="inferred0"><a name="line39"></a>39
640
+ </span><span class="marked1"><a name="line40"></a>40 def add_attribute name, attrs={}
641
+ </span><span class="marked0"><a name="line41"></a>41 name = name.to_s
642
+ </span><span class="inferred1"><a name="line42"></a>42
643
+ </span><span class="marked0"><a name="line43"></a>43 define_attribute(name, attrs)
644
+ </span><span class="inferred1"><a name="line44"></a>44
645
+ </span><span class="marked0"><a name="line45"></a>45 define_method name do
646
+ </span><span class="marked1"><a name="line46"></a>46 attribute_of[name].get
647
+ </span><span class="inferred0"><a name="line47"></a>47 end
648
+ </span><span class="inferred1"><a name="line48"></a>48
649
+ </span><span class="marked0"><a name="line49"></a>49 define_method &quot;#{name}=&quot; do |val|
650
+ </span><span class="uncovered1"><a name="line50"></a>50 attribute_of[name].set val
651
+ </span><span class="uncovered0"><a name="line51"></a>51 end
652
+ </span><span class="inferred1"><a name="line52"></a>52
653
+ </span><span class="marked0"><a name="line53"></a>53 cached_attribute_of = attribute_of
654
+ </span><span class="marked1"><a name="line54"></a>54 if cached_attribute_of[name]
655
+ </span><span class="marked0"><a name="line55"></a>55 unless cached_attribute_of[name].config[:writable]
656
+ </span><span class="marked1"><a name="line56"></a>56 private &quot;#{name}=&quot;
657
+ </span><span class="inferred0"><a name="line57"></a>57 end
658
+ </span><span class="inferred1"><a name="line58"></a>58
659
+ </span><span class="marked0"><a name="line59"></a>59 if cached_attribute_of[name].config[:handles]
660
+ </span><span class="marked1"><a name="line60"></a>60 case cached_attribute_of[name].config[:handles]
661
+ </span><span class="marked0"><a name="line61"></a>61 when Hash
662
+ </span><span class="marked1"><a name="line62"></a>62 cached_attribute_of[name].config[:handles].each do |before, after|
663
+ </span><span class="marked0"><a name="line63"></a>63 define_method before do
664
+ </span><span class="marked1"><a name="line64"></a>64 attribute_of[name].get.__send__ after
665
+ </span><span class="inferred0"><a name="line65"></a>65 end
666
+ </span><span class="inferred1"><a name="line66"></a>66 end
667
+ </span><span class="marked0"><a name="line67"></a>67 when Array
668
+ </span><span class="marked1"><a name="line68"></a>68 cached_attribute_of[name].config[:handles].each do |meth|
669
+ </span><span class="marked0"><a name="line69"></a>69 define_method meth do
670
+ </span><span class="marked1"><a name="line70"></a>70 attribute_of[name].get.__send__ meth
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 end
674
+ </span><span class="inferred1"><a name="line74"></a>74 end
675
+ </span><span class="inferred0"><a name="line75"></a>75 end
676
+ </span><span class="inferred1"><a name="line76"></a>76 end
677
+ </span><span class="inferred0"><a name="line77"></a>77
678
+ </span><span class="marked1"><a name="line78"></a>78 alias has add_attribute
679
+ </span><span class="inferred0"><a name="line79"></a>79
680
+ </span><span class="marked1"><a name="line80"></a>80 def included klass
681
+ </span><span class="marked0"><a name="line81"></a>81 klass.extend self
682
+ </span><span class="marked1"><a name="line82"></a>82 end
683
+ </span><span class="inferred0"><a name="line83"></a>83
684
+ </span><span class="inferred1"><a name="line84"></a>84 end
685
+ </span><span class="inferred0"><a name="line85"></a>85 end
637
686
  </span></pre><hr/>
638
687
  <p>Generated using the <a href='http://eigenclass.org/hiki.rb?rcov'>rcov code coverage analysis tool for Ruby</a>
639
688
  version 0.8.1.2.</p>
@@ -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 Wed May 28 01:22:16 +0900 2008 with <a href='http://eigenclass.org/hiki/rcov'>rcov 0.8.1.2</a>
556
+ <p>Generated on Thu Aug 21 17:23:12 +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...
@@ -598,41 +598,41 @@ span.run100 {
598
598
  </tr>
599
599
  </tbody>
600
600
  </table>
601
- <pre><span class="marked0"><a name="line1"></a> 1 module ClassX::Validate
602
- </span><span class="marked1"><a name="line2"></a> 2 private
603
- </span><span class="inferred0"><a name="line3"></a> 3 #
604
- </span><span class="inferred1"><a name="line4"></a> 4 # for validatation Hash parameter declaretively.
605
- </span><span class="inferred0"><a name="line5"></a> 5 #
606
- </span><span class="inferred1"><a name="line6"></a> 6 # require 'classx/validate'
607
- </span><span class="inferred0"><a name="line7"></a> 7 #
608
- </span><span class="inferred1"><a name="line8"></a> 8 # class YourClass &lt; ClassX
609
- </span><span class="inferred0"><a name="line9"></a> 9 # include Validate
610
- </span><span class="inferred1"><a name="line10"></a>10 #
611
- </span><span class="inferred0"><a name="line11"></a>11 # def run params
612
- </span><span class="inferred1"><a name="line12"></a>12 # validate params do
613
- </span><span class="inferred0"><a name="line13"></a>13 # has :x
614
- </span><span class="inferred1"><a name="line14"></a>14 # has :y, :default =&gt; &quot;hoge&quot;, :kind_of =&gt; Hash
615
- </span><span class="inferred0"><a name="line15"></a>15 # end
616
- </span><span class="inferred1"><a name="line16"></a>16 #
617
- </span><span class="inferred0"><a name="line17"></a>17 # # do something with params
618
- </span><span class="inferred1"><a name="line18"></a>18 #
619
- </span><span class="inferred0"><a name="line19"></a>19 # end
620
- </span><span class="inferred1"><a name="line20"></a>20 # end
621
- </span><span class="inferred0"><a name="line21"></a>21 #
622
- </span><span class="inferred1"><a name="line22"></a>22 # YourClass.new.run(:x =&gt; 10) # raise ClassX::AttrRequiredError
623
- </span><span class="inferred0"><a name="line23"></a>23 #
624
- </span><span class="marked1"><a name="line24"></a>24 def validate hash, &amp;block
625
- </span><span class="inferred0"><a name="line25"></a>25 # FIXME: it's experimental feature for caching validate class.
626
- </span><span class="inferred1"><a name="line26"></a>26 # it can use class variable because it use caller[0] as key.
627
- </span><span class="marked0"><a name="line27"></a>27 @@__validate_cached ||= {}
628
- </span><span class="marked1"><a name="line28"></a>28 uniq_key = caller[0]
629
- </span><span class="marked0"><a name="line29"></a>29 unless @@__validate_cached[uniq_key]
630
- </span><span class="marked1"><a name="line30"></a>30 @@__validate_cached[uniq_key] = Class.new(ClassX)
631
- </span><span class="marked0"><a name="line31"></a>31 @@__validate_cached[uniq_key].class_eval &amp;block
632
- </span><span class="inferred1"><a name="line32"></a>32 end
633
- </span><span class="marked0"><a name="line33"></a>33 @@__validate_cached[uniq_key].new hash
634
- </span><span class="inferred1"><a name="line34"></a>34 end
635
- </span><span class="inferred0"><a name="line35"></a>35 end
601
+ <pre><span class="marked1"><a name="line1"></a> 1 module ClassX::Validate
602
+ </span><span class="marked0"><a name="line2"></a> 2 private
603
+ </span><span class="inferred1"><a name="line3"></a> 3 #
604
+ </span><span class="inferred0"><a name="line4"></a> 4 # for validatation Hash parameter declaretively.
605
+ </span><span class="inferred1"><a name="line5"></a> 5 #
606
+ </span><span class="inferred0"><a name="line6"></a> 6 # require 'classx/validate'
607
+ </span><span class="inferred1"><a name="line7"></a> 7 #
608
+ </span><span class="inferred0"><a name="line8"></a> 8 # class YourClass &lt; ClassX
609
+ </span><span class="inferred1"><a name="line9"></a> 9 # include Validate
610
+ </span><span class="inferred0"><a name="line10"></a>10 #
611
+ </span><span class="inferred1"><a name="line11"></a>11 # def run params
612
+ </span><span class="inferred0"><a name="line12"></a>12 # validate params do
613
+ </span><span class="inferred1"><a name="line13"></a>13 # has :x
614
+ </span><span class="inferred0"><a name="line14"></a>14 # has :y, :default =&gt; &quot;hoge&quot;, :kind_of =&gt; Hash
615
+ </span><span class="inferred1"><a name="line15"></a>15 # end
616
+ </span><span class="inferred0"><a name="line16"></a>16 #
617
+ </span><span class="inferred1"><a name="line17"></a>17 # # do something with params
618
+ </span><span class="inferred0"><a name="line18"></a>18 #
619
+ </span><span class="inferred1"><a name="line19"></a>19 # end
620
+ </span><span class="inferred0"><a name="line20"></a>20 # end
621
+ </span><span class="inferred1"><a name="line21"></a>21 #
622
+ </span><span class="inferred0"><a name="line22"></a>22 # YourClass.new.run(:x =&gt; 10) # raise ClassX::AttrRequiredError
623
+ </span><span class="inferred1"><a name="line23"></a>23 #
624
+ </span><span class="marked0"><a name="line24"></a>24 def validate hash, &amp;block
625
+ </span><span class="inferred1"><a name="line25"></a>25 # FIXME: it's experimental feature for caching validate class.
626
+ </span><span class="inferred0"><a name="line26"></a>26 # it can use class variable because it use caller[0] as key.
627
+ </span><span class="marked1"><a name="line27"></a>27 @@__validate_cached ||= {}
628
+ </span><span class="marked0"><a name="line28"></a>28 uniq_key = caller[0]
629
+ </span><span class="marked1"><a name="line29"></a>29 unless @@__validate_cached[uniq_key]
630
+ </span><span class="marked0"><a name="line30"></a>30 @@__validate_cached[uniq_key] = Class.new(ClassX)
631
+ </span><span class="marked1"><a name="line31"></a>31 @@__validate_cached[uniq_key].class_eval(&amp;block)
632
+ </span><span class="inferred0"><a name="line32"></a>32 end
633
+ </span><span class="marked1"><a name="line33"></a>33 @@__validate_cached[uniq_key].new hash
634
+ </span><span class="inferred0"><a name="line34"></a>34 end
635
+ </span><span class="inferred1"><a name="line35"></a>35 end
636
636
  </span></pre><hr/>
637
637
  <p>Generated using the <a href='http://eigenclass.org/hiki.rb?rcov'>rcov code coverage analysis tool for Ruby</a>
638
638
  version 0.8.1.2.</p>
@@ -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 Wed May 28 01:22:16 +0900 2008 with <a href='http://eigenclass.org/hiki/rcov'>rcov 0.8.1.2</a>
556
+ <p>Generated on Thu Aug 21 17:23:12 +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_rb.html'>lib/classx.rb</a>
573
573
  </td>
574
- <td class='lines_total'><tt>142</tt>
574
+ <td class='lines_total'><tt>65</tt>
575
575
  </td>
576
- <td class='lines_code'><tt>117</tt>
576
+ <td class='lines_code'><tt>49</tt>
577
577
  </td>
578
- <td><table cellspacing='0' cellpadding='0' align='right'><tr><td><tt class='coverage_total'>97.2%</tt>
578
+ <td><table cellspacing='0' cellpadding='0' align='right'><tr><td><tt class='coverage_total'>100.0%</tt>
579
579
  &nbsp;</td>
580
- <td><table cellspacing='0' class='percent_graph' cellpadding='0' width='100'><tr><td class='covered' width='97'/>
581
- <td class='uncovered' width='3'/>
580
+ <td><table cellspacing='0' class='percent_graph' cellpadding='0' width='100'><tr><td class='covered' width='100'/>
581
+ <td class='uncovered' width='0'/>
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'>96.6%</tt>
588
+ <td><table cellspacing='0' cellpadding='0' align='right'><tr><td><tt class='coverage_code'>100.0%</tt>
589
589
  &nbsp;</td>
590
- <td><table cellspacing='0' class='percent_graph' cellpadding='0' width='100'><tr><td class='covered' width='97'/>
591
- <td class='uncovered' width='3'/>
590
+ <td><table cellspacing='0' class='percent_graph' cellpadding='0' width='100'><tr><td class='covered' width='100'/>
591
+ <td class='uncovered' width='0'/>
592
592
  </tr>
593
593
  </table>
594
594
  </td>
@@ -598,148 +598,71 @@ span.run100 {
598
598
  </tr>
599
599
  </tbody>
600
600
  </table>
601
- <pre><span class="inferred0"><a name="line1"></a> 1
602
- </span><span class="marked1"><a name="line2"></a> 2 class ClassX
603
- </span><span class="marked0"><a name="line3"></a> 3 class AttrRequiredError &lt; Exception; end
604
- </span><span class="marked1"><a name="line4"></a> 4 class InvalidAttrArgument &lt; Exception; end
605
- </span><span class="marked0"><a name="line5"></a> 5 class LazyOptionShouldHaveDefault &lt; Exception; end
606
- </span><span class="marked1"><a name="line6"></a> 6 class OptionalAttrShouldBeWritable &lt; Exception; end
607
- </span><span class="marked0"><a name="line7"></a> 7 class RequiredAttrShouldNotHaveDefault &lt; Exception; end
608
- </span><span class="marked1"><a name="line8"></a> 8 class &lt;&lt;self
609
- </span><span class="marked0"><a name="line9"></a> 9 def has name, attrs={}
610
- </span><span class="marked1"><a name="line10"></a> 10 name = name.to_s
611
- </span><span class="inferred0"><a name="line11"></a> 11
612
- </span><span class="marked1"><a name="line12"></a> 12 setter_definition = ''
613
- </span><span class="marked0"><a name="line13"></a> 13 if !attrs[:respond_to].nil?
614
- </span><span class="uncovered1"><a name="line14"></a> 14 setter_definition += &lt;&lt;-END_OF_RESPOND_TO
615
- </span><span class="uncovered0"><a name="line15"></a> 15 raise InvalidAttrArgument, &quot;param :#{name}'s value \#{val.inspect} should respond_to #{attrs[:respond_to]}}&quot; unless val.respond_to? #{attrs[:respond_to]}
616
- </span><span class="uncovered1"><a name="line16"></a> 16 END_OF_RESPOND_TO
617
- </span><span class="uncovered0"><a name="line17"></a> 17 end
618
- </span><span class="marked1"><a name="line18"></a> 18 if !attrs[:kind_of].nil?
619
- </span><span class="marked0"><a name="line19"></a> 19 setter_definition += &lt;&lt;-END_OF_KIND_OF
620
- </span><span class="inferred1"><a name="line20"></a> 20 raise InvalidAttrArgument, &quot;param :#{name}'s value \#{val.inspect} should kind_of #{attrs[:kind_of]}&quot; unless val.kind_of? #{attrs[:kind_of]}
621
- </span><span class="inferred0"><a name="line21"></a> 21 END_OF_KIND_OF
622
- </span><span class="inferred1"><a name="line22"></a> 22 end
623
- </span><span class="inferred0"><a name="line23"></a> 23
624
- </span><span class="marked1"><a name="line24"></a> 24 self.class_eval &lt;&lt;-END_OF_ACCESSOR
625
- </span><span class="inferred0"><a name="line25"></a> 25 attr_reader &quot;#{name}&quot;
626
- </span><span class="inferred1"><a name="line26"></a> 26
627
- </span><span class="inferred0"><a name="line27"></a> 27 def #{name}= val
628
- </span><span class="inferred1"><a name="line28"></a> 28 #{setter_definition}
629
- </span><span class="inferred0"><a name="line29"></a> 29 @#{name} = val
630
- </span><span class="inferred1"><a name="line30"></a> 30 end
631
- </span><span class="inferred0"><a name="line31"></a> 31 END_OF_ACCESSOR
632
- </span><span class="inferred1"><a name="line32"></a> 32
633
- </span><span class="marked0"><a name="line33"></a> 33 if attrs[:default].nil?
634
- </span><span class="marked1"><a name="line34"></a> 34 raise LazyOptionShouldHaveDefault, &quot;in :#{name}: :lazy option need specifying :default&quot; if attrs[:lazy]
635
- </span><span class="inferred0"><a name="line35"></a> 35 else
636
- </span><span class="inferred1"><a name="line36"></a> 36 # when you specify :optional to false explicitly, raise Error.
637
- </span><span class="marked0"><a name="line37"></a> 37 if attrs[:optional].nil?
638
- </span><span class="marked1"><a name="line38"></a> 38 attrs[:optional] = true
639
- </span><span class="inferred0"><a name="line39"></a> 39 end
640
- </span><span class="marked1"><a name="line40"></a> 40 raise RequiredAttrShouldNotHaveDefault, &quot;in :#{name}: required attribute should not have :default option&quot; unless attrs[:optional]
641
- </span><span class="marked0"><a name="line41"></a> 41 case attrs[:default]
642
- </span><span class="marked1"><a name="line42"></a> 42 when Proc
643
- </span><span class="marked0"><a name="line43"></a> 43 register_attr_default_value_proc name, &amp;attrs[:default]
644
- </span><span class="inferred1"><a name="line44"></a> 44 else
645
- </span><span class="marked0"><a name="line45"></a> 45 register_attr_default_value name, attrs[:default]
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
649
- </span><span class="marked0"><a name="line49"></a> 49 if attrs[:optional]
650
- </span><span class="marked1"><a name="line50"></a> 50 if attrs[:writable].nil?
651
- </span><span class="marked0"><a name="line51"></a> 51 attrs[:writable] = true
652
- </span><span class="inferred1"><a name="line52"></a> 52 else
653
- </span><span class="marked0"><a name="line53"></a> 53 raise OptionalAttrShouldBeWritable unless attrs[:writable]
654
- </span><span class="inferred1"><a name="line54"></a> 54 end
655
- </span><span class="inferred0"><a name="line55"></a> 55 else
656
- </span><span class="marked1"><a name="line56"></a> 56 register_attr_required name
657
- </span><span class="inferred0"><a name="line57"></a> 57 end
658
- </span><span class="inferred1"><a name="line58"></a> 58
659
- </span><span class="marked0"><a name="line59"></a> 59 unless attrs[:writable]
660
- </span><span class="marked1"><a name="line60"></a> 60 __send__ :private,&quot;#{name}=&quot;
661
- </span><span class="inferred0"><a name="line61"></a> 61 end
662
- </span><span class="inferred1"><a name="line62"></a> 62
663
- </span><span class="inferred0"><a name="line63"></a> 63 end
664
- </span><span class="inferred1"><a name="line64"></a> 64
665
- </span><span class="marked0"><a name="line65"></a> 65 def register_attr_default_value name, value
666
- </span><span class="marked1"><a name="line66"></a> 66 self.class_eval do
667
- </span><span class="marked0"><a name="line67"></a> 67 define_method &quot;set_attr_default_value_of[#{name}]&quot; do
668
- </span><span class="marked1"><a name="line68"></a> 68 self.__send__ &quot;#{name}=&quot;, value
669
- </span><span class="inferred0"><a name="line69"></a> 69 end
670
- </span><span class="inferred1"><a name="line70"></a> 70
671
- </span><span class="marked0"><a name="line71"></a> 71 private &quot;set_attr_default_value_of[#{name}]&quot;
672
- </span><span class="inferred1"><a name="line72"></a> 72 end
673
- </span><span class="marked0"><a name="line73"></a> 73 end
674
- </span><span class="inferred1"><a name="line74"></a> 74
675
- </span><span class="marked0"><a name="line75"></a> 75 def register_attr_default_value_proc name, &amp;block
676
- </span><span class="marked1"><a name="line76"></a> 76 self.class_eval do
677
- </span><span class="marked0"><a name="line77"></a> 77 define_method &quot;set_attr_default_value_of[#{name}]&quot; do
678
- </span><span class="marked1"><a name="line78"></a> 78 self.__send__ &quot;#{name}=&quot;, block.call(self)
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 private &quot;set_attr_default_value_of[#{name}]&quot;
682
- </span><span class="inferred1"><a name="line82"></a> 82 end
683
- </span><span class="inferred0"><a name="line83"></a> 83 end
684
- </span><span class="inferred1"><a name="line84"></a> 84
685
- </span><span class="marked0"><a name="line85"></a> 85 def register_attr_required name
686
- </span><span class="marked1"><a name="line86"></a> 86 define_method &quot;attr_required[#{name}]&quot; do
687
- </span><span class="inferred0"><a name="line87"></a> 87 end
688
- </span><span class="inferred1"><a name="line88"></a> 88
689
- </span><span class="marked0"><a name="line89"></a> 89 private &quot;attr_required[#{name}]&quot;
690
- </span><span class="inferred1"><a name="line90"></a> 90 end
691
- </span><span class="inferred0"><a name="line91"></a> 91
692
- </span><span class="marked1"><a name="line92"></a> 92 ATTR_REGEX = /^([^=]*?)=$/
693
- </span><span class="marked0"><a name="line93"></a> 93 def attributes
694
- </span><span class="marked1"><a name="line94"></a> 94 ( public_instance_methods + private_instance_methods ).select {|meth|
695
- </span><span class="marked0"><a name="line95"></a> 95 meth.to_s =~ ATTR_REGEX
696
- </span><span class="inferred1"><a name="line96"></a> 96 }.map {|item|
697
- </span><span class="marked0"><a name="line97"></a> 97 item.to_s.sub(ATTR_REGEX) { $1 }
698
- </span><span class="inferred1"><a name="line98"></a> 98 }
699
- </span><span class="marked0"><a name="line99"></a> 99 end
700
- </span><span class="inferred1"><a name="line100"></a>100
701
- </span><span class="marked0"><a name="line101"></a>101 ATTR_REQUIRED_REGEX = /^attr_required\[(.*?)\]/
702
- </span><span class="marked1"><a name="line102"></a>102 def required_attributes
703
- </span><span class="marked0"><a name="line103"></a>103 private_instance_methods.select {|meth|
704
- </span><span class="marked1"><a name="line104"></a>104 meth.to_s =~ ATTR_REQUIRED_REGEX
705
- </span><span class="inferred0"><a name="line105"></a>105 }.map {|item|
706
- </span><span class="marked1"><a name="line106"></a>106 item.sub(ATTR_REQUIRED_REGEX) { $1 }
707
- </span><span class="inferred0"><a name="line107"></a>107 }
708
- </span><span class="marked1"><a name="line108"></a>108 end
709
- </span><span class="inferred0"><a name="line109"></a>109 end
710
- </span><span class="inferred1"><a name="line110"></a>110
711
- </span><span class="marked0"><a name="line111"></a>111 def initialize hash={}
712
- </span><span class="marked1"><a name="line112"></a>112 before_init hash
713
- </span><span class="inferred0"><a name="line113"></a>113
714
- </span><span class="marked1"><a name="line114"></a>114 unless hash &amp;&amp; hash.kind_of?(Hash)
715
- </span><span class="marked0"><a name="line115"></a>115 raise ArgumentError, &quot;#{hash.inspect} was wrong as arguments. please specify kind of Hash instance&quot;
716
- </span><span class="inferred1"><a name="line116"></a>116 end
717
- </span><span class="inferred0"><a name="line117"></a>117
718
- </span><span class="marked1"><a name="line118"></a>118 hash = hash.inject({}) {|h,item| h[item.first.to_s] = item.last; h } # allow String or Symbol for key
719
- </span><span class="marked0"><a name="line119"></a>119 self.class.required_attributes.each do |name|
720
- </span><span class="marked1"><a name="line120"></a>120 raise AttrRequiredError, &quot;param :#{name} is required to #{hash.inspect}&quot; unless hash.keys.include?(name)
721
- </span><span class="inferred0"><a name="line121"></a>121 end
722
- </span><span class="marked1"><a name="line122"></a>122 hash.each do |key,val|
723
- </span><span class="marked0"><a name="line123"></a>123 if respond_to? &quot;#{key}=&quot;, true
724
- </span><span class="marked1"><a name="line124"></a>124 __send__ &quot;#{key}=&quot;, val
725
- </span><span class="inferred0"><a name="line125"></a>125 end
726
- </span><span class="inferred1"><a name="line126"></a>126 end
727
- </span><span class="marked0"><a name="line127"></a>127 private_methods.select do |meth|
728
- </span><span class="marked1"><a name="line128"></a>128 meth.to_s =~ /^set_attr_default_value_of\[(.*?)\]$/
729
- </span><span class="inferred0"><a name="line129"></a>129 end.each do |meth|
730
- </span><span class="marked1"><a name="line130"></a>130 __send__ meth
731
- </span><span class="inferred0"><a name="line131"></a>131 end
732
- </span><span class="marked1"><a name="line132"></a>132 after_init
733
- </span><span class="inferred0"><a name="line133"></a>133 end
734
- </span><span class="inferred1"><a name="line134"></a>134
735
- </span><span class="inferred0"><a name="line135"></a>135 # just extend point
736
- </span><span class="marked1"><a name="line136"></a>136 def before_init hash
737
- </span><span class="marked0"><a name="line137"></a>137 end
738
- </span><span class="inferred1"><a name="line138"></a>138
739
- </span><span class="marked0"><a name="line139"></a>139 def after_init
740
- </span><span class="marked1"><a name="line140"></a>140 end
741
- </span><span class="inferred0"><a name="line141"></a>141
742
- </span><span class="inferred1"><a name="line142"></a>142 end
601
+ <pre><span class="marked1"><a name="line1"></a> 1 require 'classx/attribute'
602
+ </span><span class="marked0"><a name="line2"></a> 2 require 'classx/attributes'
603
+ </span><span class="inferred1"><a name="line3"></a> 3
604
+ </span><span class="marked0"><a name="line4"></a> 4 class ClassX
605
+ </span><span class="marked1"><a name="line5"></a> 5 class InstanceException &lt; Exception; end
606
+ </span><span class="marked0"><a name="line6"></a> 6 class AttrRequiredError &lt; InstanceException; end
607
+ </span><span class="marked1"><a name="line7"></a> 7 class InvalidAttrArgument &lt; InstanceException; end
608
+ </span><span class="marked0"><a name="line8"></a> 8 class LazyOptionShouldHaveDefault &lt; Exception; end
609
+ </span><span class="marked1"><a name="line9"></a> 9 class OptionalAttrShouldBeWritable &lt; Exception; end
610
+ </span><span class="marked0"><a name="line10"></a>10 class RequiredAttrShouldNotHaveDefault &lt; Exception; end
611
+ </span><span class="inferred1"><a name="line11"></a>11
612
+ </span><span class="marked0"><a name="line12"></a>12 extend Attributes
613
+ </span><span class="inferred1"><a name="line13"></a>13
614
+ </span><span class="marked0"><a name="line14"></a>14 def initialize *args
615
+ </span><span class="marked1"><a name="line15"></a>15 hash = before_init(*args)
616
+ </span><span class="inferred0"><a name="line16"></a>16
617
+ </span><span class="marked1"><a name="line17"></a>17 unless hash &amp;&amp; hash.kind_of?(Hash)
618
+ </span><span class="marked0"><a name="line18"></a>18 raise ArgumentError, &quot;#{hash.inspect} was wrong as arguments. please specify kind of Hash instance&quot;
619
+ </span><span class="inferred1"><a name="line19"></a>19 end
620
+ </span><span class="inferred0"><a name="line20"></a>20
621
+ </span><span class="inferred1"><a name="line21"></a>21 # allow String or Symbol for key
622
+ </span><span class="marked0"><a name="line22"></a>22 tmp_hash = {}
623
+ </span><span class="marked1"><a name="line23"></a>23 hash.each do |key,val|
624
+ </span><span class="marked0"><a name="line24"></a>24 tmp_hash[key.to_s] = val
625
+ </span><span class="inferred1"><a name="line25"></a>25 end
626
+ </span><span class="marked0"><a name="line26"></a>26 hash = tmp_hash
627
+ </span><span class="inferred1"><a name="line27"></a>27
628
+ </span><span class="marked0"><a name="line28"></a>28 cached_attribute_of = attribute_of
629
+ </span><span class="marked1"><a name="line29"></a>29 hash.each do |key, val|
630
+ </span><span class="marked0"><a name="line30"></a>30 if cached_attribute_of[key]
631
+ </span><span class="marked1"><a name="line31"></a>31 cached_attribute_of[key].set val
632
+ </span><span class="inferred0"><a name="line32"></a>32 end
633
+ </span><span class="inferred1"><a name="line33"></a>33 end
634
+ </span><span class="inferred0"><a name="line34"></a>34
635
+ </span><span class="marked1"><a name="line35"></a>35 cached_attribute_of.each do |key, val|
636
+ </span><span class="marked0"><a name="line36"></a>36 next if val.class.lazy?
637
+ </span><span class="marked1"><a name="line37"></a>37 raise AttrRequiredError, &quot;param: :#{key} is required to #{hash.inspect}&quot; if !val.class.optional? &amp;&amp; !val.get
638
+ </span><span class="inferred0"><a name="line38"></a>38 end
639
+ </span><span class="inferred1"><a name="line39"></a>39
640
+ </span><span class="marked0"><a name="line40"></a>40 after_init
641
+ </span><span class="inferred1"><a name="line41"></a>41 end
642
+ </span><span class="inferred0"><a name="line42"></a>42
643
+ </span><span class="marked1"><a name="line43"></a>43 def attribute_of
644
+ </span><span class="marked0"><a name="line44"></a>44 hash = {}
645
+ </span><span class="marked1"><a name="line45"></a>45 if self.class.attribute_of
646
+ </span><span class="marked0"><a name="line46"></a>46 self.class.attribute_of.keys.each do |key|
647
+ </span><span class="marked1"><a name="line47"></a>47 hash[key] = __send__ &quot;attribute_of:#{key}&quot;
648
+ </span><span class="inferred0"><a name="line48"></a>48 end
649
+ </span><span class="inferred1"><a name="line49"></a>49 end
650
+ </span><span class="inferred0"><a name="line50"></a>50
651
+ </span><span class="marked1"><a name="line51"></a>51 hash
652
+ </span><span class="inferred0"><a name="line52"></a>52 end
653
+ </span><span class="inferred1"><a name="line53"></a>53
654
+ </span><span class="inferred0"><a name="line54"></a>54 # just extend point
655
+ </span><span class="marked1"><a name="line55"></a>55 def before_init *args
656
+ </span><span class="marked0"><a name="line56"></a>56 raise ArgumentError if args.size &gt; 1
657
+ </span><span class="inferred1"><a name="line57"></a>57
658
+ </span><span class="marked0"><a name="line58"></a>58 hash = args.first
659
+ </span><span class="marked1"><a name="line59"></a>59 hash.nil? ? {} : hash
660
+ </span><span class="inferred0"><a name="line60"></a>60 end
661
+ </span><span class="inferred1"><a name="line61"></a>61
662
+ </span><span class="marked0"><a name="line62"></a>62 def after_init
663
+ </span><span class="marked1"><a name="line63"></a>63 end
664
+ </span><span class="inferred0"><a name="line64"></a>64
665
+ </span><span class="inferred1"><a name="line65"></a>65 end
743
666
  </span></pre><hr/>
744
667
  <p>Generated using the <a href='http://eigenclass.org/hiki.rb?rcov'>rcov code coverage analysis tool for Ruby</a>
745
668
  version 0.8.1.2.</p>