kwalify 0.6.1 → 0.7.0

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 (219) hide show
  1. data/CHANGES.txt +232 -0
  2. data/MIT-LICENSE +20 -0
  3. data/README.txt +16 -19
  4. data/bin/kwalify +3 -3
  5. data/contrib/inline-require +6 -4
  6. data/contrib/kwalify +3719 -2427
  7. data/doc-api/classes/CommandOptionError.html +17 -17
  8. data/doc-api/classes/CommandOptionParser.html +63 -63
  9. data/doc-api/classes/Kwalify.html +29 -7
  10. data/doc-api/classes/Kwalify/AssertionError.html +9 -9
  11. data/doc-api/classes/Kwalify/BaseError.html +72 -71
  12. data/doc-api/classes/Kwalify/BaseParser.html +461 -0
  13. data/doc-api/classes/Kwalify/CommandOptionError.html +11 -11
  14. data/doc-api/classes/Kwalify/ErrorHelper.html +51 -46
  15. data/doc-api/classes/Kwalify/HashInterface.html +13 -135
  16. data/doc-api/classes/Kwalify/Json.html +105 -0
  17. data/doc-api/classes/Kwalify/Main.html +129 -126
  18. data/doc-api/classes/Kwalify/MetaValidator.html +248 -232
  19. data/doc-api/classes/Kwalify/Parser.html +12 -12
  20. data/doc-api/classes/Kwalify/PlainYamlParser.html +166 -163
  21. data/doc-api/classes/Kwalify/PlainYamlParser/Alias.html +11 -11
  22. data/doc-api/classes/Kwalify/Rule.html +152 -130
  23. data/doc-api/classes/Kwalify/SchemaError.html +10 -10
  24. data/doc-api/classes/Kwalify/SyntaxError.html +185 -0
  25. data/doc-api/classes/Kwalify/Types.html +26 -25
  26. data/doc-api/classes/Kwalify/Util.html +389 -0
  27. data/doc-api/classes/Kwalify/Util/HashLike.html +246 -0
  28. data/doc-api/classes/Kwalify/Util/OrderedHash.html +330 -0
  29. data/doc-api/classes/Kwalify/ValidationError.html +10 -10
  30. data/doc-api/classes/Kwalify/Validator.html +153 -86
  31. data/doc-api/classes/Kwalify/Yaml.html +181 -0
  32. data/doc-api/classes/Kwalify/Yaml/Parser.html +1538 -0
  33. data/doc-api/classes/Kwalify/YamlParser.html +190 -183
  34. data/doc-api/classes/Kwalify/YamlSyntaxError.html +8 -57
  35. data/doc-api/created.rid +1 -1
  36. data/doc-api/files/__/README_txt.html +17 -22
  37. data/doc-api/files/kwalify/errors_rb.html +2 -2
  38. data/doc-api/files/kwalify/main_rb.html +4 -3
  39. data/doc-api/files/kwalify/messages_rb.html +2 -2
  40. data/doc-api/files/kwalify/meta-validator_rb.html +3 -3
  41. data/doc-api/files/kwalify/{util/yaml-helper_rb.html → parser/base_rb.html} +8 -6
  42. data/doc-api/files/kwalify/parser/yaml_rb.html +117 -0
  43. data/doc-api/files/kwalify/rule_rb.html +2 -2
  44. data/doc-api/files/kwalify/types_rb.html +2 -2
  45. data/doc-api/files/kwalify/util/assert-text-equal_rb.html +2 -2
  46. data/doc-api/files/kwalify/util/hash-interface_rb.html +9 -2
  47. data/doc-api/files/kwalify/util/hashlike_rb.html +107 -0
  48. data/doc-api/files/kwalify/util/option-parser_rb.html +2 -2
  49. data/doc-api/files/kwalify/util/ordered-hash_rb.html +107 -0
  50. data/doc-api/files/kwalify/util/testcase-helper_rb.html +2 -2
  51. data/doc-api/files/kwalify/util_rb.html +107 -0
  52. data/doc-api/files/kwalify/validator_rb.html +2 -2
  53. data/doc-api/files/kwalify/yaml-parser_rb.html +2 -2
  54. data/doc-api/files/kwalify_rb.html +3 -2
  55. data/doc-api/fr_class_index.html +8 -1
  56. data/doc-api/fr_file_index.html +5 -1
  57. data/doc-api/fr_method_index.html +128 -69
  58. data/doc/img/fig01.png +0 -0
  59. data/doc/users-guide.html +882 -717
  60. data/examples/address-book/address-book.schema.yaml +2 -2
  61. data/examples/data-binding/BABEL.data.yaml +63 -0
  62. data/examples/data-binding/BABEL.schema.yaml +31 -0
  63. data/examples/data-binding/Makefile +8 -0
  64. data/examples/data-binding/Rakefile +13 -0
  65. data/examples/data-binding/main.rb +27 -0
  66. data/examples/invoice/invoice.schema.yaml +3 -3
  67. data/examples/tapkit/tapkit.schema.yaml +2 -2
  68. data/lib/kwalify.rb +41 -4
  69. data/lib/kwalify/errors.rb +118 -96
  70. data/lib/kwalify/kwalify.schema.yaml +58 -0
  71. data/lib/kwalify/main.rb +384 -377
  72. data/lib/kwalify/messages.rb +41 -27
  73. data/lib/kwalify/meta-validator.rb +251 -331
  74. data/lib/kwalify/parser/base.rb +127 -0
  75. data/lib/kwalify/parser/yaml.rb +837 -0
  76. data/lib/kwalify/rule.rb +545 -487
  77. data/lib/kwalify/templates/genclass-java.eruby +189 -162
  78. data/lib/kwalify/templates/genclass-php.eruby +104 -0
  79. data/lib/kwalify/templates/genclass-ruby.eruby +95 -66
  80. data/lib/kwalify/types.rb +107 -106
  81. data/lib/kwalify/util.rb +157 -0
  82. data/lib/kwalify/util/assert-text-equal.rb +33 -31
  83. data/lib/kwalify/util/hash-interface.rb +11 -30
  84. data/lib/kwalify/util/hashlike.rb +51 -0
  85. data/lib/kwalify/util/option-parser.rb +144 -144
  86. data/lib/kwalify/util/ordered-hash.rb +57 -0
  87. data/lib/kwalify/util/testcase-helper.rb +3 -3
  88. data/lib/kwalify/validator.rb +267 -212
  89. data/lib/kwalify/yaml-parser.rb +822 -768
  90. data/setup.rb +861 -607
  91. data/test/Rookbook.yaml +10 -0
  92. data/test/{tmp.dir/Context.java → data/users-guide/AddressBook.java.expected} +11 -11
  93. data/test/data/users-guide/BABEL.data.yaml +24 -0
  94. data/test/data/users-guide/BABEL.schema.yaml +30 -0
  95. data/test/data/users-guide/ExampleAddressBook.java +47 -0
  96. data/test/{tmp.dir/Group.java → data/users-guide/Group.java.expected} +2 -11
  97. data/test/data/users-guide/Person.java.expected +44 -0
  98. data/test/data/users-guide/address_book.rb +52 -0
  99. data/test/data/users-guide/address_book.schema.yaml +28 -0
  100. data/test/data/users-guide/address_book.yaml +27 -0
  101. data/test/data/users-guide/answers-schema.yaml +12 -0
  102. data/test/data/users-guide/answers-validator.rb +52 -0
  103. data/test/data/users-guide/babel_genclass.result +26 -0
  104. data/test/data/users-guide/config.schema.yaml +7 -0
  105. data/test/data/users-guide/config.yaml +4 -0
  106. data/test/{tmp.dir/silent1.document → data/users-guide/document01a.yaml} +0 -0
  107. data/test/data/users-guide/document01b.yaml +3 -0
  108. data/test/data/users-guide/document02a.yaml +4 -0
  109. data/test/data/users-guide/document02b.yaml +4 -0
  110. data/test/data/users-guide/document03a.yaml +6 -0
  111. data/test/data/users-guide/document03b.yaml +6 -0
  112. data/test/data/users-guide/document04a.yaml +9 -0
  113. data/test/data/users-guide/document04b.yaml +9 -0
  114. data/test/data/users-guide/document05a.yaml +11 -0
  115. data/test/data/users-guide/document05b.yaml +12 -0
  116. data/test/data/users-guide/document06a.yaml +15 -0
  117. data/test/data/users-guide/document06b.yaml +16 -0
  118. data/test/data/users-guide/document07a.yaml +9 -0
  119. data/test/data/users-guide/document07b.yaml +7 -0
  120. data/test/data/users-guide/document12a.json +10 -0
  121. data/test/data/users-guide/document12b.json +6 -0
  122. data/test/data/users-guide/document13a.yaml +17 -0
  123. data/test/data/users-guide/document14a.yaml +3 -0
  124. data/test/data/users-guide/document14b.yaml +3 -0
  125. data/test/data/users-guide/document15a.yaml +6 -0
  126. data/test/data/users-guide/document15b.yaml +5 -0
  127. data/test/data/users-guide/example_address_book.rb +10 -0
  128. data/test/data/users-guide/example_address_book_java.result +32 -0
  129. data/test/data/users-guide/example_address_book_ruby.result +31 -0
  130. data/test/data/users-guide/genclass_java.result +4 -0
  131. data/test/data/users-guide/howto-validation-with-parsing.rb +28 -0
  132. data/test/data/users-guide/howto-validation.rb +25 -0
  133. data/test/data/users-guide/howto3.rb +6 -0
  134. data/test/data/users-guide/howto3.result +5 -0
  135. data/test/data/users-guide/howto3.yaml +8 -0
  136. data/test/data/users-guide/howto5_databinding.result +111 -0
  137. data/test/data/users-guide/invalid01.result +3 -0
  138. data/test/data/users-guide/invalid02.result +5 -0
  139. data/test/data/users-guide/invalid03.result +5 -0
  140. data/test/data/users-guide/invalid04.result +4 -0
  141. data/test/data/users-guide/invalid05.result +11 -0
  142. data/test/data/users-guide/invalid06.result +4 -0
  143. data/test/data/users-guide/invalid07.result +3 -0
  144. data/test/data/users-guide/invalid08.result +3 -0
  145. data/test/data/users-guide/invalid12.json +8 -0
  146. data/test/data/users-guide/invalid14.result +4 -0
  147. data/test/data/users-guide/invalid15.result +4 -0
  148. data/test/data/users-guide/loadbabel.rb +27 -0
  149. data/test/data/users-guide/loadconfig.rb +15 -0
  150. data/test/data/users-guide/loadconfig.result +2 -0
  151. data/test/data/users-guide/models.rb +22 -0
  152. data/test/data/users-guide/option_ha.result +6 -0
  153. data/test/data/users-guide/option_ha_genclass_java.result +7 -0
  154. data/test/{tmp.dir/meta1.schema → data/users-guide/schema01.yaml} +0 -0
  155. data/test/data/users-guide/schema02.yaml +12 -0
  156. data/test/data/users-guide/schema03.yaml +9 -0
  157. data/test/data/users-guide/schema04.yaml +20 -0
  158. data/test/data/users-guide/schema05.yaml +29 -0
  159. data/test/data/users-guide/schema06.yaml +11 -0
  160. data/test/data/users-guide/schema12.json +12 -0
  161. data/test/data/users-guide/schema13.yaml +13 -0
  162. data/test/data/users-guide/schema14.yaml +5 -0
  163. data/test/data/users-guide/schema15.yaml +21 -0
  164. data/test/data/users-guide/valid01.result +2 -0
  165. data/test/data/users-guide/valid02.result +2 -0
  166. data/test/data/users-guide/valid03.result +2 -0
  167. data/test/data/users-guide/valid04.result +2 -0
  168. data/test/data/users-guide/valid05.result +2 -0
  169. data/test/data/users-guide/valid06.result +2 -0
  170. data/test/data/users-guide/valid07.result +2 -0
  171. data/test/data/users-guide/valid08.result +2 -0
  172. data/test/data/users-guide/valid12.result +2 -0
  173. data/test/data/users-guide/valid13.result +2 -0
  174. data/test/data/users-guide/valid14.result +2 -0
  175. data/test/data/users-guide/valid15.result +2 -0
  176. data/test/data/users-guide/validate08.rb +37 -0
  177. data/test/test-action.rb +78 -0
  178. data/test/test-action.yaml +738 -0
  179. data/test/test-databinding.rb +80 -0
  180. data/test/test-databinding.yaml +301 -0
  181. data/test/test-main.rb +129 -150
  182. data/test/test-main.yaml +126 -321
  183. data/test/test-metavalidator.rb +47 -47
  184. data/test/test-metavalidator.yaml +77 -21
  185. data/test/test-parser-yaml.rb +57 -0
  186. data/test/test-parser-yaml.yaml +1749 -0
  187. data/test/test-rule.rb +14 -15
  188. data/test/test-rule.yaml +6 -3
  189. data/test/test-users-guide.rb +75 -0
  190. data/test/test-validator.rb +77 -52
  191. data/test/test-validator.yaml +168 -6
  192. data/test/test-yaml-parser.rb +47 -0
  193. data/test/{test-yamlparser.yaml → test-yaml-parser.yaml} +159 -52
  194. data/test/test.rb +37 -21
  195. metadata +136 -37
  196. data/COPYING +0 -340
  197. data/ChangeLog +0 -70
  198. data/doc-api/classes/YamlHelper.html +0 -259
  199. data/lib/kwalify/util/yaml-helper.rb +0 -82
  200. data/test/test-yamlparser.rb +0 -58
  201. data/test/tmp.dir/User.java +0 -43
  202. data/test/tmp.dir/action1.document +0 -18
  203. data/test/tmp.dir/action1.schema +0 -32
  204. data/test/tmp.dir/action2.document +0 -18
  205. data/test/tmp.dir/action2.schema +0 -32
  206. data/test/tmp.dir/emacs.document +0 -6
  207. data/test/tmp.dir/emacs.schema +0 -6
  208. data/test/tmp.dir/meta1.document +0 -0
  209. data/test/tmp.dir/meta2.document +0 -0
  210. data/test/tmp.dir/meta2.schema +0 -3
  211. data/test/tmp.dir/silent1.schema +0 -3
  212. data/test/tmp.dir/silent2.document +0 -7
  213. data/test/tmp.dir/silent2.schema +0 -3
  214. data/test/tmp.dir/stream.invalid +0 -8
  215. data/test/tmp.dir/stream.schema +0 -3
  216. data/test/tmp.dir/stream.valid +0 -8
  217. data/test/tmp.dir/untabify.document +0 -5
  218. data/test/tmp.dir/untabify.schema +0 -10
  219. data/todo.txt +0 -34
@@ -1,84 +1,113 @@
1
1
  <%
2
2
 
3
+ ###
4
+ ### $Rev: 96 $
5
+ ### $Release: 0.7.0 $
6
+ ### copyright(c) 2005-2008 kuwata-lab all rights reserved.
7
+ ###
8
+
3
9
  if @describe
4
10
  sb = []
5
11
  sb << " --module=name : module name in which class defined\n"
6
12
  sb << " --parent=name : parent class name\n"
7
13
  sb << " --include=name : module name which all classes include\n"
14
+ sb << " --initialize=false : not print initialize() method\n"
15
+ sb << " --hashlike : include Kwalify::Util::HashLike module\n"
8
16
  #sb << " --ggap : use generation gap pattern\n"
9
17
  return sb.join
10
18
  end
11
19
 
12
20
 
13
- def generate_classdef(rule)
14
- sb = []
15
- sb << "module #{@properties[:module]}\n\n" if @properties[:module]
16
- done = {}
17
- _generate(rule, sb, done)
18
- if @properties[:module]
19
- code = sb.join(" ")
20
- code << "end\n"
21
- else
22
- code = sb.join
23
- end
24
- return code
21
+ require 'kwalify/util/ordered-hash'
22
+
23
+ def generate_classdef(schema)
24
+ hash = Kwalify::Util::OrderedHash.new
25
+ #hash.instance_eval { alias []= add }
26
+ modname = @properties[:module]
27
+ Kwalify::Util.traverse_schema(schema) do |rulehash|
28
+ if rulehash['class']
29
+ arr = _generate_classdef(rulehash)
30
+ key = rulehash['class']
31
+ classdef = modname ? arr.join(' ') : arr.join()
32
+ #hash[key] = classdef if !hash.key?(key) || classdef != hash[key]
33
+ hash[key] = classdef if !hash.key?(key) || classdef.length > hash[key].length
34
+ end
35
+ end
36
+ sb = ''
37
+ sb << "require 'kwalify/util/hashlike'\n" if @properties[:hashlike]
38
+ sb << "\n" if @properties[:hashlike]
39
+ sb << "module #{@properties[:module]}\n" if modname
40
+ sb << "\n" if modname
41
+ hash.each do |classname, classdef|
42
+ sb << classdef
43
+ sb << "\n"
44
+ end
45
+ sb << "end\n" if modname
46
+ sb << "\n" if modname
47
+ return sb.chomp
25
48
  end
26
49
 
27
50
 
28
- def _generate(rule, sb=[], done={})
29
- return if done.key?(rule.__id__)
30
- done[rule.__id__] = rule
31
- #
32
- if rule.classname
33
- unless rule.type == 'map'
34
- raise "*** assertion error: rule.type==#{rule.type.inspect}"
35
- end
36
- assert unless rule.mapping
37
- classname = rule.classname
38
- classname = classname + '_' if @properties[:ggap]
39
- extend = @properties[:parent] ? " < #{@properties[:parent]}" : nil
40
- sb << "## #{rule.desc}\n"
41
- sb << "class #{classname}#{extend}\n"
42
- sb << " include #{@properties[:include]}\n" if @properties[:include]
43
- sb << " def initialize(hash)\n"
44
- rule.mapping.each do |name, map_rule|
45
- next unless name =~ /\A[a-zA-Z_]\w*\z/
46
- #if map_rule.sequence && map_rule.sequence[0].classname
47
- # item_rule = map_rule.sequence[0]
48
- # cname = item_rule.classname
49
- # sb << " hash['#{name}'].map!{|e| #{cname}.new(e)} if hash.key?('#{name}') && !hash['#{name}'][0].is_a?(#{cname})\n"
50
- #end
51
- if map_rule.classname
52
- cname = map_rule.classname
53
- sb << " @%-10s = (v=hash['#{name}']) && v.is_a?(Hash) ? #{cname}.new(v) : v\n" % name
54
- elsif map_rule.sequence && map_rule.sequence[0].classname
55
- item_rule = map_rule.sequence[0]
56
- cname = item_rule.classname
57
- sb << " @%-10s = (v=hash['#{name}']) ? v.map!{|e| e.is_a?(#{cname}) ? e : #{cname}.new(e)} : v\n" % name
58
- else
59
- sb << " @%-10s = hash['#{name}']\n" % name
60
- end
61
- end
62
- sb << " end\n"
63
- rule.mapping.each do |name, map_rule|
64
- next unless name =~ /\A[a-zA-Z_]\w*\z/
65
- sb << " attr_accessor :%-10s # %s\n" % [name, rule.mapping[name].type]
66
- end
67
- if @properties[:ggap]
68
- sb << "end\n"
69
- sb << "class #{rule.classname} < #{classname}\n"
70
- end
71
- sb << "end\n\n"
72
- end
73
- #
74
- rule.sequence.each do |seq_rule|
75
- _generate(seq_rule, sb, done)
76
- end if rule.sequence
77
- rule.mapping.each do |name, map_rule|
78
- _generate(map_rule, sb, done)
79
- end if rule.mapping
51
+ def _generate_classdef(rulehash)
52
+ return nil unless rulehash['class']
53
+ assert unless rulehash['mapping']
54
+ classname = rulehash['class']
55
+ classname = classname + '_' if @properties[:ggap]
56
+ extend = @properties[:parent] ? " < #{@properties[:parent]}" : nil
57
+ flag_init = @properties[:initialize] != false
58
+ arr = ['']
59
+ arr << "## #{rulehash['desc']}\n"
60
+ arr << "class #{classname}#{extend}\n"
61
+ arr << " include Kwalify::Util::HashLike\n" if @properties[:hashlike]
62
+ arr << " include #{@properties[:include]}\n" if @properties[:include]
63
+ arr1 = []
64
+ arr2 = [] # accessors
65
+ arr3 = [] # boolean accessors
66
+ arr4 = [] # default values
67
+ v = nil
68
+ rulehash['mapping'].each do |name, map_rulehash|
69
+ next unless name =~ /\A[a-zA-Z_][-\w]*\z/
70
+ name2 = name.gsub(/-/, '_')
71
+ var = "%-16s" % name2
72
+ len = 13 - name2.length
73
+ len = 0 if len < 0
74
+ spc = ' ' * len
75
+ arr2 << " attr_accessor :#{var} # #{map_rulehash['type'] || 'str'}\n"
76
+ flag_bool = (t = map_rulehash['type']) == 'bool' || t == 'boolean'
77
+ arr3 << " def #{name2}?#{spc}; @#{name2}#{spc}; end\n" if flag_bool
78
+ arr4 << " @#{var} = #{v.inspect}\n" unless (v=map_rulehash['default']).nil?
79
+ if !flag_init
80
+ # pass
81
+ elsif map_rulehash['class']
82
+ cname = map_rulehash['class']
83
+ arr1 << " @#{var} = (v=hash['#{name}']) && v.is_a?(Hash) ? #{cname}.new(v) : v\n"
84
+ elsif map_rulehash['sequence'] && map_rulehash['sequence'][0]['class']
85
+ item_rulehash = map_rulehash['sequence'][0]
86
+ cname = item_rulehash['class']
87
+ arr1 << " @#{var} = (v=hash['#{name}']) ? v.map!{|e| e.is_a?(#{cname}) ? e : #{cname}.new(e)} : v\n"
88
+ elsif map_rulehash.key?('default')
89
+ #arr << " @#{var} = hash.key?('#{name}') ? hash['#{name}'] : #{map_rulehash['default'].inspect}\n"
90
+ arr1 << " @#{var} = (v=hash['#{name}']).nil? ? #{map_rulehash['default'].inspect} : v\n"
91
+ else
92
+ arr1 << " @#{var} = hash['#{name}']\n"
93
+ end
94
+ end
95
+ arr << " def initialize(hash=nil)\n" if flag_init
96
+ arr << " if hash.nil?\n" if flag_init
97
+ arr.concat arr4 if flag_init
98
+ arr << " return\n" if flag_init
99
+ arr << " end\n" if flag_init
100
+ arr.concat arr1 if flag_init
101
+ arr << " end\n" if flag_init
102
+ arr.concat(arr2)
103
+ arr.concat(arr3)
104
+ if @properties[:ggap]
105
+ arr << "end\n"
106
+ arr << "class #{rulehash['class']} < #{classname}\n"
107
+ end
108
+ arr << "end\n"
109
+ return arr
80
110
  end
81
111
 
82
-
83
112
  %>
84
- <%= generate_classdef(@rule) %>
113
+ <%= generate_classdef(@schema) %>
@@ -1,155 +1,156 @@
1
1
  ###
2
- ### $Rev: 51 $
3
- ### $Release: 0.6.1 $
4
- ### copyright(c) 2005 kuwata-lab all rights reserved.
2
+ ### $Rev: 87 $
3
+ ### $Release: 0.7.0 $
4
+ ### copyright(c) 2005-2008 kuwata-lab all rights reserved.
5
5
  ###
6
6
 
7
7
  require 'date'
8
8
 
9
9
 
10
10
  module Kwalify
11
- module Boolean # :nodoc:
12
- end
11
+ module Boolean # :nodoc:
12
+ end
13
13
  end
14
14
  class TrueClass # :nodoc:
15
- include Kwalify::Boolean
15
+ include Kwalify::Boolean
16
16
  end
17
- class FalseClass # :nodoc:
18
- include Kwalify::Boolean
17
+ class FalseClass # :nodoc:
18
+ include Kwalify::Boolean
19
19
  end
20
20
  #module Boolean; end
21
21
  #class TrueClass
22
- # include Boolean
22
+ # include Boolean
23
23
  #end
24
24
  #class FalseClass
25
- # include Boolean
25
+ # include Boolean
26
26
  #end
27
27
 
28
28
 
29
29
  module Kwalify
30
- module Text # :nodoc:
31
- end
30
+ module Text # :nodoc:
31
+ end
32
32
  end
33
33
  class String # :nodoc:
34
- include Kwalify::Text
34
+ include Kwalify::Text
35
35
  end
36
- class Numeric # :nodoc:
37
- include Kwalify::Text
36
+ class Numeric # :nodoc:
37
+ include Kwalify::Text
38
38
  end
39
39
  #module Text; end
40
40
  #class String
41
- # include Text
41
+ # include Text
42
42
  #end
43
43
  #class Numeric
44
- # include Text
44
+ # include Text
45
45
  #end
46
46
 
47
47
 
48
48
  module Kwalify
49
- module Scalar # :nodoc:
50
- end
49
+ module Scalar # :nodoc:
50
+ end
51
51
  end
52
- class String # :nodoc:
53
- include Kwalify::Scalar
52
+ class String # :nodoc:
53
+ include Kwalify::Scalar
54
54
  end
55
- class Numeric # :nodoc:
56
- include Kwalify::Scalar
55
+ class Numeric # :nodoc:
56
+ include Kwalify::Scalar
57
57
  end
58
- class Date # :nodoc:
59
- include Kwalify::Scalar
58
+ class Date # :nodoc:
59
+ include Kwalify::Scalar
60
60
  end
61
- class Time # :nodoc:
62
- include Kwalify::Scalar
61
+ class Time # :nodoc:
62
+ include Kwalify::Scalar
63
63
  end
64
- class TrueClass # :nodoc:
65
- include Kwalify::Scalar
64
+ class TrueClass # :nodoc:
65
+ include Kwalify::Scalar
66
66
  end
67
- class FalseClass # :nodoc:
68
- include Kwalify::Scalar
67
+ class FalseClass # :nodoc:
68
+ include Kwalify::Scalar
69
69
  end
70
70
  class NilClass # :nodoc:
71
- include Kwalify::Scalar
71
+ include Kwalify::Scalar
72
72
  end
73
73
  module Kwalify
74
- module Text # :nodoc:
75
- include Kwalify::Scalar
76
- end
74
+ module Text # :nodoc:
75
+ include Kwalify::Scalar
76
+ end
77
77
  end
78
78
 
79
79
 
80
80
  module Kwalify
81
81
 
82
82
 
83
- module Types
84
-
85
-
86
- DEFAULT_TYPE = "str" ## use "str" as default of @type
87
-
88
- @@type_table = {
89
- "seq" => Array,
90
- "map" => Hash,
91
- "str" => String,
92
- #"string" => String,
93
- "text" => Text,
94
- "int" => Integer,
95
- #"integer" => Integer,
96
- "float" => Float,
97
- "number" => Numeric,
98
- #"numeric" => Numeric,
99
- "date" => Date,
100
- "time" => Time,
101
- "timestamp" => Time,
102
- "bool" => Boolean,
103
- #"boolean" => Boolean,
104
- #"object" => Object,
105
- "any" => Object,
106
- "scalar" => Scalar,
107
- }
108
-
109
- def self.type_table
110
- return @@type_table
111
- end
112
-
113
- def self.type_class(type)
114
- klass = @@type_table[type]
115
- #assert_error('type=#{type.inspect}') unless klass
116
- return klass
117
- end
118
-
119
- def self.get_type_class(type)
120
- return type_class(type)
121
- end
122
-
123
-
124
-
125
- #--
126
- #def collection_class?(klass)
127
- # return klass.is_a?(Array) || klass.is_a?(Hash)
128
- #end
129
- #
130
- #def scalar_class?(klass)
131
- # return !klass.is_a?(Array) && !klass.is_a?(Hash) && klass != Object
132
- #end
133
-
134
- def collection?(val)
135
- return val.is_a?(Array) || val.is_a?(Hash)
136
- end
137
-
138
- def scalar?(val)
139
- return !val.is_a?(Array) && !val.is_a?(Hash) && val.class != Object
140
- end
141
-
142
- def collection_type?(type)
143
- return type == 'seq' || type == 'map'
144
- end
145
-
146
- def scalar_type?(type)
147
- return type != 'seq' && type != 'map' && type == 'any'
148
- end
149
-
150
- module_function 'collection?', 'scalar?', 'collection_type?', 'scalar_type?'
151
- end
152
-
153
- extend Types
83
+ module Types
84
+
85
+
86
+ DEFAULT_TYPE = "str" ## use "str" as default of @type
87
+
88
+ @@type_table = {
89
+ "seq" => Array,
90
+ "map" => Hash,
91
+ "str" => String,
92
+ #"string" => String,
93
+ "text" => Text,
94
+ "int" => Integer,
95
+ #"integer" => Integer,
96
+ "float" => Float,
97
+ "number" => Numeric,
98
+ #"numeric" => Numeric,
99
+ "date" => Date,
100
+ "time" => Time,
101
+ "timestamp" => Time,
102
+ "bool" => Boolean,
103
+ #"boolean" => Boolean,
104
+ #"object" => Object,
105
+ "any" => Object,
106
+ "scalar" => Scalar,
107
+ }
108
+
109
+ def self.type_table
110
+ return @@type_table
111
+ end
112
+
113
+ def self.type_class(type)
114
+ klass = @@type_table[type]
115
+ #assert_error('type=#{type.inspect}') unless klass
116
+ return klass
117
+ end
118
+
119
+ def self.get_type_class(type)
120
+ return type_class(type)
121
+ end
122
+
123
+
124
+
125
+ #--
126
+ #def collection_class?(klass)
127
+ # return klass.is_a?(Array) || klass.is_a?(Hash)
128
+ #end
129
+ #
130
+ #def scalar_class?(klass)
131
+ # return !klass.is_a?(Array) && !klass.is_a?(Hash) && klass != Object
132
+ #end
133
+
134
+ def collection?(val)
135
+ return val.is_a?(Array) || val.is_a?(Hash)
136
+ end
137
+
138
+ def scalar?(val)
139
+ #return !val.is_a?(Array) && !val.is_a?(Hash) && val.class != Object
140
+ return val.is_a?(Kwalify::Scalar) #&& val.class != Object
141
+ end
142
+
143
+ def collection_type?(type)
144
+ return type == 'seq' || type == 'map'
145
+ end
146
+
147
+ def scalar_type?(type)
148
+ return type != 'seq' && type != 'map' && type == 'any'
149
+ end
150
+
151
+ module_function 'collection?', 'scalar?', 'collection_type?', 'scalar_type?'
152
+ end
153
+
154
+ extend Types
154
155
 
155
156
  end
@@ -0,0 +1,157 @@
1
+ ###
2
+ ### $Rev: 88 $
3
+ ### $Release: 0.7.0 $
4
+ ### copyright(c) 2005-2008 kuwata-lab all rights reserved.
5
+ ###
6
+
7
+ module Kwalify
8
+
9
+ module Util
10
+
11
+ module_function
12
+
13
+ ##
14
+ ## expand tab character to spaces
15
+ ##
16
+ ## ex.
17
+ ## untabified_str = YamlHelper.untabify(tabbed_str)
18
+ ##
19
+ def untabify(str, width=8)
20
+ list = str.split(/\t/)
21
+ last = list.pop
22
+ sb = ''
23
+ list.each do |s|
24
+ column = (n = s.rindex(?\n)) ? s.length - n - 1 : s.length
25
+ n = width - (column % width)
26
+ sb << s << (' ' * n)
27
+ end
28
+ sb << last if last
29
+ return sb
30
+ end
31
+
32
+
33
+ ## traverse schema
34
+ ##
35
+ ## ex.
36
+ ## schema = YAML.load_file('myschema.yaml')
37
+ ## Kwalify::Util.traverse_schema(schema) do |rulehash|
38
+ ## ## add module prefix to class name
39
+ ## if rulehash['class']
40
+ ## rulehash['class'] = "MyModule::' + rulehash['class']
41
+ ## end
42
+ ## end
43
+ def traverse_schema(schema, &block) #:yield: rulehash
44
+ hash = schema
45
+ _done = {}
46
+ _traverse_schema(hash, _done, &block)
47
+ end
48
+
49
+ def _traverse_schema(hash, _done={}, &block)
50
+ return if _done.key?(hash.__id__)
51
+ _done[hash.__id__] = hash
52
+ yield hash
53
+ if hash['mapping']
54
+ hash['mapping'].each {|k, v| _traverse_schema(v, _done, &block) }
55
+ elsif hash['sequence']
56
+ _traverse_schema(hash['sequence'][0], _done, &block)
57
+ end
58
+ end
59
+ private :_traverse_schema
60
+
61
+
62
+ ## traverse rule
63
+ ##
64
+ ## ex.
65
+ ## schema = YAML.load_file('myschema.yaml')
66
+ ## validator = Kwalify::Validator.new(schema)
67
+ ## Kwalify::Util.traverse_rule(validator) do |rule|
68
+ ## p rule if rule.classname
69
+ ## end
70
+ def traverse_rule(validator, &block) #:yield: rule
71
+ rule = validator.is_a?(Rule) ? validator : validator.rule
72
+ _done = {}
73
+ _traverse_rule(rule, _done, &block)
74
+ end
75
+
76
+ def _traverse_rule(rule, _done={}, &block)
77
+ return if _done.key?(rule.__id__)
78
+ _done[rule.__id__] = rule
79
+ yield rule
80
+ rule.sequence.each do |seq_rule|
81
+ _traverse_rule(seq_rule, _done, &block)
82
+ end if rule.sequence
83
+ rule.mapping.each do |name, map_rule|
84
+ _traverse_rule(map_rule, _done, &block)
85
+ end if rule.mapping
86
+ end
87
+ private :_traverse_rule
88
+
89
+
90
+ ##
91
+ ## get class object. if not found, NameError raised.
92
+ ##
93
+ def get_class(classname)
94
+ klass = Object
95
+ classname.split('::').each do |name|
96
+ klass = klass.const_get(name)
97
+ end
98
+ return klass
99
+ end
100
+
101
+
102
+ ##
103
+ ## create a hash table from list of hash with primary key.
104
+ ##
105
+ ## ex.
106
+ ## hashlist = [
107
+ ## { "name"=>"Foo", "gender"=>"M", "age"=>20, },
108
+ ## { "name"=>"Bar", "gender"=>"F", "age"=>25, },
109
+ ## { "name"=>"Baz", "gender"=>"M", "age"=>30, },
110
+ ## ]
111
+ ## hashtable = YamlHelper.create_hashtable(hashlist, "name")
112
+ ## p hashtable
113
+ ## # => { "Foo" => { "name"=>"Foo", "gender"=>"M", "age"=>20, },
114
+ ## # "Bar" => { "name"=>"Bar", "gender"=>"F", "age"=>25, },
115
+ ## # "Baz" => { "name"=>"Baz", "gender"=>"M", "age"=>30, }, }
116
+ ##
117
+ def create_hashtable(hashlist, primarykey, flag_duplicate_check=true)
118
+ hashtable = {}
119
+ hashlist.each do |hash|
120
+ key = hash[primarykey]
121
+ unless key
122
+ riase "primary key '#{key}' not found."
123
+ end
124
+ if flag_duplicate_check && hashtable.key?(key)
125
+ raise "primary key '#{key}' duplicated (value '#{hashtable[key]}')"
126
+ end
127
+ hashtable[key] = hash
128
+ end if hashlist
129
+ return hashtable
130
+ end
131
+
132
+
133
+ ##
134
+ ## get nested value directly.
135
+ ##
136
+ ## ex.
137
+ ## val = YamlHelper.get_value(obj, ['aaa', 0, 'xxx'])
138
+ ##
139
+ ## This is equal to the following:
140
+ ## begin
141
+ ## val = obj['aaa'][0]['xxx']
142
+ ## rescue NameError
143
+ ## val = nil
144
+ ## end
145
+ ##
146
+ def get_value(obj, path)
147
+ val = obj
148
+ path.each do |key|
149
+ return nil unless val.is_a?(Hash) || val.is_a?(Array)
150
+ val = val[key]
151
+ end if path
152
+ return val
153
+ end
154
+
155
+ end
156
+
157
+ end