dc-kwalify 0.7.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 (209) hide show
  1. data/CHANGES.txt +252 -0
  2. data/MIT-LICENSE +20 -0
  3. data/README.txt +61 -0
  4. data/bin/kwalify +13 -0
  5. data/contrib/inline-require +179 -0
  6. data/contrib/kwalify +4160 -0
  7. data/doc/docstyle.css +188 -0
  8. data/doc/img/fig01.png +0 -0
  9. data/doc/users-guide.html +2050 -0
  10. data/doc-api/classes/CommandOptionError.html +184 -0
  11. data/doc-api/classes/CommandOptionParser.html +325 -0
  12. data/doc-api/classes/Kwalify/AssertionError.html +148 -0
  13. data/doc-api/classes/Kwalify/BaseError.html +297 -0
  14. data/doc-api/classes/Kwalify/BaseParser.html +461 -0
  15. data/doc-api/classes/Kwalify/CommandOptionError.html +168 -0
  16. data/doc-api/classes/Kwalify/ErrorHelper.html +223 -0
  17. data/doc-api/classes/Kwalify/HashInterface.html +118 -0
  18. data/doc-api/classes/Kwalify/Json.html +105 -0
  19. data/doc-api/classes/Kwalify/KwalifyError.html +111 -0
  20. data/doc-api/classes/Kwalify/Main.html +339 -0
  21. data/doc-api/classes/Kwalify/MetaValidator.html +448 -0
  22. data/doc-api/classes/Kwalify/Parser.html +155 -0
  23. data/doc-api/classes/Kwalify/PlainYamlParser/Alias.html +165 -0
  24. data/doc-api/classes/Kwalify/PlainYamlParser.html +523 -0
  25. data/doc-api/classes/Kwalify/Rule.html +433 -0
  26. data/doc-api/classes/Kwalify/SchemaError.html +148 -0
  27. data/doc-api/classes/Kwalify/SyntaxError.html +185 -0
  28. data/doc-api/classes/Kwalify/Types.html +302 -0
  29. data/doc-api/classes/Kwalify/Util/HashLike.html +246 -0
  30. data/doc-api/classes/Kwalify/Util/OrderedHash.html +330 -0
  31. data/doc-api/classes/Kwalify/Util.html +390 -0
  32. data/doc-api/classes/Kwalify/ValidationError.html +148 -0
  33. data/doc-api/classes/Kwalify/Validator.html +381 -0
  34. data/doc-api/classes/Kwalify/Yaml/Parser.html +1538 -0
  35. data/doc-api/classes/Kwalify/Yaml.html +194 -0
  36. data/doc-api/classes/Kwalify/YamlParser.html +542 -0
  37. data/doc-api/classes/Kwalify/YamlSyntaxError.html +119 -0
  38. data/doc-api/classes/Kwalify.html +292 -0
  39. data/doc-api/classes/Test/Unit.html +101 -0
  40. data/doc-api/classes/Test.html +107 -0
  41. data/doc-api/created.rid +1 -0
  42. data/doc-api/files/__/README_txt.html +172 -0
  43. data/doc-api/files/kwalify/errors_rb.html +114 -0
  44. data/doc-api/files/kwalify/main_rb.html +118 -0
  45. data/doc-api/files/kwalify/messages_rb.html +107 -0
  46. data/doc-api/files/kwalify/meta-validator_rb.html +117 -0
  47. data/doc-api/files/kwalify/parser/base_rb.html +116 -0
  48. data/doc-api/files/kwalify/parser/yaml_rb.html +117 -0
  49. data/doc-api/files/kwalify/rule_rb.html +116 -0
  50. data/doc-api/files/kwalify/types_rb.html +114 -0
  51. data/doc-api/files/kwalify/util/assert-text-equal_rb.html +115 -0
  52. data/doc-api/files/kwalify/util/hash-interface_rb.html +114 -0
  53. data/doc-api/files/kwalify/util/hashlike_rb.html +107 -0
  54. data/doc-api/files/kwalify/util/option-parser_rb.html +107 -0
  55. data/doc-api/files/kwalify/util/ordered-hash_rb.html +107 -0
  56. data/doc-api/files/kwalify/util/testcase-helper_rb.html +115 -0
  57. data/doc-api/files/kwalify/util_rb.html +107 -0
  58. data/doc-api/files/kwalify/validator_rb.html +117 -0
  59. data/doc-api/files/kwalify/yaml-parser_rb.html +117 -0
  60. data/doc-api/files/kwalify_rb.html +121 -0
  61. data/doc-api/fr_class_index.html +57 -0
  62. data/doc-api/fr_file_index.html +45 -0
  63. data/doc-api/fr_method_index.html +168 -0
  64. data/doc-api/index.html +24 -0
  65. data/doc-api/rdoc-style.css +208 -0
  66. data/examples/address-book/Makefile +10 -0
  67. data/examples/address-book/address-book.schema.yaml +45 -0
  68. data/examples/address-book/address-book.yaml +36 -0
  69. data/examples/data-binding/BABEL.data.yaml +63 -0
  70. data/examples/data-binding/BABEL.schema.yaml +31 -0
  71. data/examples/data-binding/Makefile +8 -0
  72. data/examples/data-binding/Rakefile +13 -0
  73. data/examples/data-binding/main.rb +27 -0
  74. data/examples/invoice/Makefile +9 -0
  75. data/examples/invoice/invoice.schema.yaml +43 -0
  76. data/examples/invoice/invoice.yaml +32 -0
  77. data/examples/tapkit/Makefile +10 -0
  78. data/examples/tapkit/main.rb +7 -0
  79. data/examples/tapkit/tapkit.schema.yaml +146 -0
  80. data/examples/tapkit/tapkit.yaml +85 -0
  81. data/lib/kwalify/errors.rb +127 -0
  82. data/lib/kwalify/kwalify.schema.yaml +58 -0
  83. data/lib/kwalify/main.rb +442 -0
  84. data/lib/kwalify/messages.rb +173 -0
  85. data/lib/kwalify/meta-validator.rb +275 -0
  86. data/lib/kwalify/parser/base.rb +127 -0
  87. data/lib/kwalify/parser/yaml.rb +841 -0
  88. data/lib/kwalify/rule.rb +559 -0
  89. data/lib/kwalify/templates/genclass-java.eruby +222 -0
  90. data/lib/kwalify/templates/genclass-php.eruby +104 -0
  91. data/lib/kwalify/templates/genclass-ruby.eruby +113 -0
  92. data/lib/kwalify/types.rb +156 -0
  93. data/lib/kwalify/util/assert-text-equal.rb +46 -0
  94. data/lib/kwalify/util/hash-interface.rb +18 -0
  95. data/lib/kwalify/util/hashlike.rb +51 -0
  96. data/lib/kwalify/util/option-parser.rb +220 -0
  97. data/lib/kwalify/util/ordered-hash.rb +57 -0
  98. data/lib/kwalify/util/testcase-helper.rb +112 -0
  99. data/lib/kwalify/util.rb +158 -0
  100. data/lib/kwalify/validator.rb +282 -0
  101. data/lib/kwalify/yaml-parser.rb +870 -0
  102. data/lib/kwalify.rb +67 -0
  103. data/setup.rb +1585 -0
  104. data/test/Rookbook.yaml +10 -0
  105. data/test/data/users-guide/AddressBook.java.expected +40 -0
  106. data/test/data/users-guide/BABEL.data.yaml +24 -0
  107. data/test/data/users-guide/BABEL.schema.yaml +30 -0
  108. data/test/data/users-guide/ExampleAddressBook.java +47 -0
  109. data/test/data/users-guide/Group.java.expected +24 -0
  110. data/test/data/users-guide/Person.java.expected +44 -0
  111. data/test/data/users-guide/address_book.rb +52 -0
  112. data/test/data/users-guide/address_book.schema.yaml +28 -0
  113. data/test/data/users-guide/address_book.yaml +27 -0
  114. data/test/data/users-guide/answers-schema.yaml +12 -0
  115. data/test/data/users-guide/answers-validator.rb +52 -0
  116. data/test/data/users-guide/babel_genclass.result +26 -0
  117. data/test/data/users-guide/config.schema.yaml +7 -0
  118. data/test/data/users-guide/config.yaml +4 -0
  119. data/test/data/users-guide/document01a.yaml +3 -0
  120. data/test/data/users-guide/document01b.yaml +3 -0
  121. data/test/data/users-guide/document02a.yaml +4 -0
  122. data/test/data/users-guide/document02b.yaml +4 -0
  123. data/test/data/users-guide/document03a.yaml +6 -0
  124. data/test/data/users-guide/document03b.yaml +6 -0
  125. data/test/data/users-guide/document04a.yaml +9 -0
  126. data/test/data/users-guide/document04b.yaml +9 -0
  127. data/test/data/users-guide/document05a.yaml +11 -0
  128. data/test/data/users-guide/document05b.yaml +12 -0
  129. data/test/data/users-guide/document06a.yaml +15 -0
  130. data/test/data/users-guide/document06b.yaml +16 -0
  131. data/test/data/users-guide/document07a.yaml +9 -0
  132. data/test/data/users-guide/document07b.yaml +7 -0
  133. data/test/data/users-guide/document12a.json +10 -0
  134. data/test/data/users-guide/document12b.json +6 -0
  135. data/test/data/users-guide/document13a.yaml +17 -0
  136. data/test/data/users-guide/document14a.yaml +3 -0
  137. data/test/data/users-guide/document14b.yaml +3 -0
  138. data/test/data/users-guide/document15a.yaml +6 -0
  139. data/test/data/users-guide/document15b.yaml +5 -0
  140. data/test/data/users-guide/example_address_book.rb +10 -0
  141. data/test/data/users-guide/example_address_book_java.result +32 -0
  142. data/test/data/users-guide/example_address_book_ruby.result +31 -0
  143. data/test/data/users-guide/genclass_java.result +4 -0
  144. data/test/data/users-guide/howto-validation-with-parsing.rb +28 -0
  145. data/test/data/users-guide/howto-validation.rb +25 -0
  146. data/test/data/users-guide/howto3.rb +6 -0
  147. data/test/data/users-guide/howto3.result +5 -0
  148. data/test/data/users-guide/howto3.yaml +8 -0
  149. data/test/data/users-guide/howto5_databinding.result +111 -0
  150. data/test/data/users-guide/invalid01.result +3 -0
  151. data/test/data/users-guide/invalid02.result +5 -0
  152. data/test/data/users-guide/invalid03.result +5 -0
  153. data/test/data/users-guide/invalid04.result +4 -0
  154. data/test/data/users-guide/invalid05.result +11 -0
  155. data/test/data/users-guide/invalid06.result +4 -0
  156. data/test/data/users-guide/invalid07.result +3 -0
  157. data/test/data/users-guide/invalid08.result +3 -0
  158. data/test/data/users-guide/invalid12.json +8 -0
  159. data/test/data/users-guide/invalid14.result +4 -0
  160. data/test/data/users-guide/invalid15.result +4 -0
  161. data/test/data/users-guide/loadbabel.rb +27 -0
  162. data/test/data/users-guide/loadconfig.rb +16 -0
  163. data/test/data/users-guide/loadconfig.result +6 -0
  164. data/test/data/users-guide/models.rb +22 -0
  165. data/test/data/users-guide/option_ha.result +6 -0
  166. data/test/data/users-guide/option_ha_genclass_java.result +7 -0
  167. data/test/data/users-guide/schema01.yaml +3 -0
  168. data/test/data/users-guide/schema02.yaml +12 -0
  169. data/test/data/users-guide/schema03.yaml +9 -0
  170. data/test/data/users-guide/schema04.yaml +20 -0
  171. data/test/data/users-guide/schema05.yaml +29 -0
  172. data/test/data/users-guide/schema06.yaml +11 -0
  173. data/test/data/users-guide/schema12.json +12 -0
  174. data/test/data/users-guide/schema13.yaml +13 -0
  175. data/test/data/users-guide/schema14.yaml +5 -0
  176. data/test/data/users-guide/schema15.yaml +21 -0
  177. data/test/data/users-guide/valid01.result +2 -0
  178. data/test/data/users-guide/valid02.result +2 -0
  179. data/test/data/users-guide/valid03.result +2 -0
  180. data/test/data/users-guide/valid04.result +2 -0
  181. data/test/data/users-guide/valid05.result +2 -0
  182. data/test/data/users-guide/valid06.result +2 -0
  183. data/test/data/users-guide/valid07.result +2 -0
  184. data/test/data/users-guide/valid08.result +2 -0
  185. data/test/data/users-guide/valid12.result +2 -0
  186. data/test/data/users-guide/valid13.result +2 -0
  187. data/test/data/users-guide/valid14.result +2 -0
  188. data/test/data/users-guide/valid15.result +2 -0
  189. data/test/data/users-guide/validate08.rb +37 -0
  190. data/test/test-action.rb +78 -0
  191. data/test/test-action.yaml +738 -0
  192. data/test/test-databinding.rb +83 -0
  193. data/test/test-databinding.yaml +339 -0
  194. data/test/test-main.rb +157 -0
  195. data/test/test-main.yaml +415 -0
  196. data/test/test-metavalidator.rb +80 -0
  197. data/test/test-metavalidator.yaml +1179 -0
  198. data/test/test-parser-yaml.rb +57 -0
  199. data/test/test-parser-yaml.yaml +1749 -0
  200. data/test/test-rule.rb +26 -0
  201. data/test/test-rule.yaml +317 -0
  202. data/test/test-users-guide.rb +75 -0
  203. data/test/test-util.rb +125 -0
  204. data/test/test-validator.rb +95 -0
  205. data/test/test-validator.yaml +986 -0
  206. data/test/test-yaml-parser.rb +47 -0
  207. data/test/test-yaml-parser.yaml +1226 -0
  208. data/test/test.rb +61 -0
  209. metadata +274 -0
@@ -0,0 +1,222 @@
1
+ <%
2
+
3
+ ###
4
+ ### $Rev$
5
+ ### $Release: 0.7.2 $
6
+ ### copyright(c) 2005-2010 kuwata-lab all rights reserved.
7
+ ###
8
+
9
+ require 'fileutils'
10
+
11
+ if @describe
12
+ sb = []
13
+ sb << " --package=name : package name\n"
14
+ sb << " --extends=name : class name to extend\n"
15
+ sb << " --implements=name,... : interface names to implement\n"
16
+ sb << " --dir=path : directory to locate output file\n"
17
+ sb << " --basedir=path : base directory to locate output file\n"
18
+ sb << " --constructor=false : not print initialize() method\n"
19
+ #sb << " --ggap : use generation gap pattern\n"
20
+ return sb.join
21
+ end
22
+
23
+
24
+ def java_type(rulehash)
25
+ return rulehash['class'] if rulehash['class']
26
+ imports = []
27
+ case rulehash['type']
28
+ when nil ; return 'String'
29
+ when 'str', 'text' ; return 'String'
30
+ when 'char' ; return 'char'
31
+ when 'int' ; return 'int'
32
+ when 'float' ; return 'float'
33
+ when 'bool' ; return 'boolean'
34
+ when 'date' ; return 'Date'
35
+ when 'timestamp' ; return 'Date'
36
+ when 'seq' ; return 'List'
37
+ when 'map' ; return 'Map'
38
+ when 'any' ; return 'Object'
39
+ else
40
+ raise "*** genclass-java.eruby: '#{rulehash['type']}': unknown type.\n"
41
+ end
42
+ end
43
+
44
+
45
+ #def primitive?(type)
46
+ # @primitives ||= %w[int char float boolean double long byte]
47
+ # return @primitives.include?(type)
48
+ #end
49
+
50
+
51
+ def camelize(str, all=true)
52
+ s = str.split(/[^\w]/).collect { |w| w.capitalize }.join()
53
+ s[0,1] = s[0].chr.lower unless all
54
+ return s
55
+ end
56
+
57
+
58
+ def write_file(classname, classdef)
59
+ if @properties[:dir]
60
+ dir = @properties[:dir]
61
+ else
62
+ basedir = @properties[:basedir] || '.'
63
+ dir = basedir.dup
64
+ dir << '/' << @properties[:package].gsub(/\./, '/') if @properties[:package]
65
+ end
66
+ FileUtils.mkdir_p(dir) unless test(?d, dir)
67
+ filename = "#{dir}/#{classname}.java"
68
+ print "generating #{filename}..."
69
+ File.open(filename, 'w') { |f| f.write(classdef) }
70
+ print "done.\n"
71
+ end
72
+
73
+
74
+ def generate_classdef(schema)
75
+ hash = Kwalify::Util::OrderedHash.new
76
+ Kwalify::Util.traverse_schema(schema) do |rulehash|
77
+ if rulehash['class']
78
+ classdef = _generate(rulehash)
79
+ classname = rulehash['class']
80
+ hash[classname] = classdef if !hash[classname] || classdef.length > hash[classname].length
81
+ end
82
+ end
83
+ hash.each do |classname, classdef|
84
+ write_file(classname, classdef)
85
+ end
86
+ print ""
87
+ end
88
+
89
+
90
+ def _generate(rulehash)
91
+ classname = rulehash['class']
92
+ return unless classname
93
+ assert unless rulehash['mapping']
94
+
95
+ ## preamble
96
+ schema_filename = @properties[:schema_filename]
97
+ sb = ''
98
+ sb << "// generated by kwalify from #{schema_filename}\n"
99
+ sb << "\n"
100
+
101
+ ## package and import classes
102
+ package = @properties[:package]
103
+ sb << "package #{package};\n" if package
104
+ sb << "import java.util.*;\n"
105
+ sb << "\n"
106
+
107
+ ## start class declaration
108
+ extends = @properties[:extends] ? " extends #{@properties[:extends] % classname}" : nil
109
+ implements = @properties[:implements] ? " implements #{@properties[:implements]}" : nil
110
+ classname = classname + '_' if @properties[:ggap]
111
+ sb << "/**\n"
112
+ sb << " * #{rulehash['desc']}\n"
113
+ sb << " */\n"
114
+ sb << "public class #{classname}#{extends}#{implements} {\n"
115
+ sb << "\n"
116
+
117
+ ## instance variables
118
+ rulehash['mapping'].each do |name, map_rulehash|
119
+ next unless name =~ /\A[a-zA-Z_][-\w]*\z/
120
+ name2 = name.gsub(/-/, '_')
121
+ type = java_type(map_rulehash)
122
+ if map_rulehash['default'].nil?
123
+ sb << " private #{type} _#{name2};\n"
124
+ else
125
+ sb << " private #{type} _#{name2} = #{map_rulehash['default'].inspect};\n"
126
+ end
127
+ end
128
+ sb << "\n"
129
+
130
+ ## constructors
131
+ if @properties[:constructor] != false
132
+ sb << _generate_constructor(rulehash)
133
+ sb << "\n"
134
+ end #if
135
+
136
+ ## setter/getter
137
+ rulehash['mapping'].each do |name, map_rulehash|
138
+ next unless name =~ /\A[a-zA-Z_][-\w]*\z/
139
+ name2 = name.gsub(/-/, '_')
140
+ type = java_type(map_rulehash)
141
+ get = type == 'boolean' ? 'is' : 'get'
142
+ sb << " public #{type} #{get}#{camelize(name)}() { return _#{name2}; }\n"
143
+ sb << " public void set#{camelize(name)}(#{type} #{name2}_) { _#{name2} = #{name2}_; }\n"
144
+ end
145
+
146
+ ## end of class declaration
147
+ if @properties[:ggap]
148
+ sb << "}\n"
149
+ sb << "public class #{rulehash['class']} < #{classname}\n"
150
+ end
151
+ sb << "}\n"
152
+
153
+ ##
154
+ classdef = sb
155
+ return classdef
156
+ end
157
+
158
+
159
+ def _generate_constructor(rulehash)
160
+ classname = rulehash['class']
161
+ sb = ''
162
+ ## default constructor
163
+ sb << " public #{classname}() {}\n"
164
+ sb << "\n"
165
+ ## constructor
166
+ sb << " public #{classname}(Map map) {\n"
167
+ objdecl = " Object obj;\n"
168
+ seqdecl = " List seq;\n"
169
+ rulehash['mapping'].each do |name, map_rulehash|
170
+ next unless name =~ /\A[a-zA-Z_][-\w]*\z/
171
+ name2 = name.gsub(/-/, '_')
172
+ if map_rulehash['class']
173
+ cname = map_rulehash['class']
174
+ type = java_type(map_rulehash)
175
+ sb << objdecl; objdecl = ''
176
+ sb << " if ((obj = map.get(\"#{name}\")) != null && obj instanceof Map) {\n"
177
+ sb << " _%-8s = new #{cname}((Map)obj);\n" % name2
178
+ sb << " } else {\n"
179
+ sb << " _%-8s = (#{type})obj;\n" % name2
180
+ sb << " }\n"
181
+ elsif map_rulehash['sequence'] && map_rulehash['sequence'][0]['class']
182
+ item_rulehash = map_rulehash['sequence'][0]
183
+ cname = item_rulehash['class']
184
+ type = java_type(item_rulehash)
185
+ sb << seqdecl; seqdecl = ''
186
+ sb << objdecl; objdecl = ''
187
+ sb << " if ((seq = (List)map.get(\"#{name}\")) != null) {\n"
188
+ sb << " for (int i = 0; i < seq.size(); i++) {\n"
189
+ sb << " if ((obj = seq.get(i)) instanceof Map) {\n"
190
+ sb << " seq.set(i, new #{cname}((Map)obj));\n"
191
+ sb << " }\n"
192
+ sb << " }\n"
193
+ sb << " }\n"
194
+ sb << " _%-12s = seq;\n" % name2
195
+ else
196
+ type = java_type(map_rulehash)
197
+ @wrapper_classes ||= {
198
+ 'int' => 'Number', 'short' => 'Number',
199
+ 'float' => 'Number', 'double' => 'Number',
200
+ 'long' => 'Number', 'byte' => 'Number',
201
+ 'char' => 'Character',
202
+ 'boolean' => 'Boolean',
203
+ }
204
+ if (wrapper = @wrapper_classes[type])
205
+ sb << " if (map.get(\"#{name}\") != null) {\n"
206
+ sb << " _%-8s = ((#{wrapper})map.get(\"#{name}\")).#{type}Value();\n" % name2
207
+ sb << " }\n"
208
+ elsif map_rulehash.key?('default')
209
+ sb << " if (map.get(\"#{name}\") != null)\n"
210
+ sb << " _%-8s = (#{type})map.get(\"#{name}\");\n" % name2
211
+ else
212
+ sb << " _%-12s = (#{type})map.get(\"#{name}\");\n" % name2
213
+ end
214
+ end #if
215
+ end #each
216
+ sb << " }\n"
217
+ return sb
218
+ end
219
+
220
+
221
+ %>
222
+ <%= generate_classdef(@schema) %>
@@ -0,0 +1,104 @@
1
+ <%
2
+
3
+ ###
4
+ ### $Rev$
5
+ ### $Release: 0.7.2 $
6
+ ### copyright(c) 2005-2010 kuwata-lab all rights reserved.
7
+ ###
8
+
9
+ if @describe
10
+ sb = []
11
+ sb << " --namespace=name : prefix name of class\n"
12
+ sb << " --extends=name : parent class name\n"
13
+ sb << " --inplements=name: interface name\n"
14
+ sb << " --constructor=false : not print constructor\n"
15
+ #sb << " --ggap : use generation gap pattern\n"
16
+ return sb.join
17
+ end
18
+
19
+
20
+ require 'kwalify/util/ordered-hash'
21
+
22
+ def generate_classdef(schema)
23
+ hash = Kwalify::Util::OrderedHash.new
24
+ #hash.instance_eval { alias []= add }
25
+ Kwalify::Util.traverse_schema(schema) do |rulehash|
26
+ if rulehash['class']
27
+ arr = _generate_classdef(rulehash)
28
+ key = rulehash['class']
29
+ classdef = arr.join()
30
+ #hash[key] = classdef if !hash.key?(key) || classdef != hash[key]
31
+ hash[key] = classdef if !hash.key?(key) || classdef.length > hash[key].length
32
+ end
33
+ end
34
+ sb = "<?php\n"
35
+ sb << "\n"
36
+ hash.each do |classname, classdef|
37
+ sb << classdef
38
+ sb << "\n"
39
+ end
40
+ sb << "?>\n"
41
+ return sb
42
+ end
43
+
44
+
45
+ def _generate_classdef(rulehash)
46
+ return nil unless rulehash['class']
47
+ assert unless rulehash['mapping']
48
+ classname = rulehash['class']
49
+ classname = classname + '_' if @properties[:ggap]
50
+ ns = @properties[:namespace]
51
+ ns = ns + '_' if ns
52
+ flag_init = @properties[:constructor] != false
53
+ v = nil
54
+ arr = ['']
55
+ arr << "/// #{rulehash['desc']}\n"
56
+ arr << "class #{ns}#{classname}"
57
+ arr << " extends #{v}" if v = @properties[:extends]
58
+ arr << " implements #{v}" if v = @properties[:implements]
59
+ arr << " {\n"
60
+ arr2 = [] # assign into instance variables
61
+ rulehash['mapping'].each do |name, map_rulehash|
62
+ next unless name =~ /\A[a-zA-Z_][-\w]*\z/
63
+ name2 = name.gsub(/-/, '_')
64
+ var = "%-10s" % name2
65
+ len = 10 - name2.length
66
+ spc = ' ' * (len >= 0 ? len : 0)
67
+ if map_rulehash.key?('default')
68
+ arr << " var $#{name2} = #{map_rulehash['default'].inspect}; // #{map_rulehash['type'] || 'str'}\n"
69
+ else
70
+ arr << " var $#{name2}; #{spc}// #{map_rulehash['type'] || 'str'}\n"
71
+ end
72
+ if !flag_init
73
+ # pass
74
+ elsif map_rulehash['class']
75
+ cname = map_rulehash['class']
76
+ arr2 << " $this->#{var} = is_array(@$arr['#{name}']) ? new #{cname}($arr['#{name}']) : @$arr['#{name}'];\n"
77
+ elsif map_rulehash['sequence'] && map_rulehash['sequence'][0]['class']
78
+ item_rulehash = map_rulehash['sequence'][0]
79
+ cname = item_rulehash['class']
80
+ arr2 << " if (is_array(@$arr['#{name}']))\n"
81
+ arr2 << " foreach ($arr['#{name}'] as $k=>$v)\n"
82
+ arr2 << " $this->#{name2}[$k] = is_array($v) ? new #{cname}($v) : $v;\n"
83
+ arr2 << " //else\n"
84
+ arr2 << " // $this->#{var} = @$arr['#{name}'];\n"
85
+ elsif map_rulehash.key?('default')
86
+ arr2 << " if (array_key_exists('#{name}', $arr)) $this->#{name2} = $arr['#{name}'];\n"
87
+ else
88
+ arr2 << " $this->#{var} = @$arr['#{name}'];\n"
89
+ end
90
+ end
91
+ arr << " function __construct($arr=NULL) {\n" if flag_init
92
+ arr << " if (! $arr) return;\n" if flag_init
93
+ arr.concat(arr2)
94
+ arr << " }\n" if flag_init
95
+ if @properties[:ggap]
96
+ arr << "}\n"
97
+ arr << "class #{ns}#{rulehash['class']} extends #{ns}#{classname}\n"
98
+ end
99
+ arr << "}\n"
100
+ return arr
101
+ end
102
+
103
+ %>
104
+ <%= generate_classdef(@schema) %>
@@ -0,0 +1,113 @@
1
+ <%
2
+
3
+ ###
4
+ ### $Rev$
5
+ ### $Release: 0.7.2 $
6
+ ### copyright(c) 2005-2010 kuwata-lab all rights reserved.
7
+ ###
8
+
9
+ if @describe
10
+ sb = []
11
+ sb << " --module=name : module name in which class defined\n"
12
+ sb << " --parent=name : parent class name\n"
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"
16
+ #sb << " --ggap : use generation gap pattern\n"
17
+ return sb.join
18
+ end
19
+
20
+
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
48
+ end
49
+
50
+
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
110
+ end
111
+
112
+ %>
113
+ <%= generate_classdef(@schema) %>
@@ -0,0 +1,156 @@
1
+ ###
2
+ ### $Rev$
3
+ ### $Release: 0.7.2 $
4
+ ### copyright(c) 2005-2010 kuwata-lab all rights reserved.
5
+ ###
6
+
7
+ require 'date'
8
+
9
+
10
+ module Kwalify
11
+ module Boolean # :nodoc:
12
+ end
13
+ end
14
+ class TrueClass # :nodoc:
15
+ include Kwalify::Boolean
16
+ end
17
+ class FalseClass # :nodoc:
18
+ include Kwalify::Boolean
19
+ end
20
+ #module Boolean; end
21
+ #class TrueClass
22
+ # include Boolean
23
+ #end
24
+ #class FalseClass
25
+ # include Boolean
26
+ #end
27
+
28
+
29
+ module Kwalify
30
+ module Text # :nodoc:
31
+ end
32
+ end
33
+ class String # :nodoc:
34
+ include Kwalify::Text
35
+ end
36
+ class Numeric # :nodoc:
37
+ include Kwalify::Text
38
+ end
39
+ #module Text; end
40
+ #class String
41
+ # include Text
42
+ #end
43
+ #class Numeric
44
+ # include Text
45
+ #end
46
+
47
+
48
+ module Kwalify
49
+ module Scalar # :nodoc:
50
+ end
51
+ end
52
+ class String # :nodoc:
53
+ include Kwalify::Scalar
54
+ end
55
+ class Numeric # :nodoc:
56
+ include Kwalify::Scalar
57
+ end
58
+ class Date # :nodoc:
59
+ include Kwalify::Scalar
60
+ end
61
+ class Time # :nodoc:
62
+ include Kwalify::Scalar
63
+ end
64
+ class TrueClass # :nodoc:
65
+ include Kwalify::Scalar
66
+ end
67
+ class FalseClass # :nodoc:
68
+ include Kwalify::Scalar
69
+ end
70
+ class NilClass # :nodoc:
71
+ include Kwalify::Scalar
72
+ end
73
+ module Kwalify
74
+ module Text # :nodoc:
75
+ include Kwalify::Scalar
76
+ end
77
+ end
78
+
79
+
80
+ module Kwalify
81
+
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
+ 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
155
+
156
+ end
@@ -0,0 +1,46 @@
1
+ ###
2
+ ### $Rev$
3
+ ### $Release: 0.7.2 $
4
+ ### copyright(c) 2005-2010 kuwata-lab all rights reserved.
5
+ ###
6
+
7
+ require 'test/unit/testcase'
8
+ require 'tempfile'
9
+
10
+
11
+ class Test::Unit::TestCase # :nodoc:
12
+
13
+ def assert_text_equal(expected, actual, message=nil, options={}) # :nodoc:
14
+ expected = expected.to_s
15
+ actual = actual.to_s
16
+ diffopt = options[:diffopt] || '-u'
17
+ flag_cut = options.key?(:cut) ? options[:key] : true
18
+
19
+ if expected == actual
20
+ assert(true)
21
+ return
22
+ end
23
+ if expected[-1] != ?\n || actual[-1] != ?\n
24
+ expected += "\n"
25
+ actual += "\n"
26
+ end
27
+ begin
28
+ expfile = Tempfile.new(".expected.")
29
+ expfile.write(expected); expfile.flush()
30
+ actfile = Tempfile.new(".actual.")
31
+ actfile.write(actual); actfile.flush()
32
+ diff = `diff #{diffopt} #{expfile.path} #{actfile.path}`
33
+ ensure
34
+ expfile.close(true) if expfile
35
+ actfile.close(true) if actfile
36
+ end
37
+ # cut 1st & 2nd lines
38
+ message = (flag_cut ? diff.gsub(/\A.*\n.*\n/, '') : diff) unless message
39
+ #raise Test::Unit::AssertionFailedError.new(message)
40
+ assert_block(message) { false } # or assert(false, message)
41
+ end
42
+
43
+ alias assert_equal_with_diff assert_text_equal # for compatibility
44
+ alias assert_text_equals assert_text_equal # for typo
45
+
46
+ end
@@ -0,0 +1,18 @@
1
+ ###
2
+ ### $Rev$$
3
+ ### $Release: 0.7.2 $
4
+ ### copyright(c) 2005-2010 kuwata-lab all rights reserved.
5
+ ###
6
+
7
+ require 'kwalify/util/hashlike'
8
+
9
+ module Kwalify
10
+
11
+ ##
12
+ ## OBSOLETE: use Hash::Util::HashLike instead.
13
+ ##
14
+ module HashInterface
15
+ include Kwalify::Util::HashLike
16
+ end
17
+
18
+ end