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.
- data/CHANGES.txt +252 -0
- data/MIT-LICENSE +20 -0
- data/README.txt +61 -0
- data/bin/kwalify +13 -0
- data/contrib/inline-require +179 -0
- data/contrib/kwalify +4160 -0
- data/doc/docstyle.css +188 -0
- data/doc/img/fig01.png +0 -0
- data/doc/users-guide.html +2050 -0
- data/doc-api/classes/CommandOptionError.html +184 -0
- data/doc-api/classes/CommandOptionParser.html +325 -0
- data/doc-api/classes/Kwalify/AssertionError.html +148 -0
- data/doc-api/classes/Kwalify/BaseError.html +297 -0
- data/doc-api/classes/Kwalify/BaseParser.html +461 -0
- data/doc-api/classes/Kwalify/CommandOptionError.html +168 -0
- data/doc-api/classes/Kwalify/ErrorHelper.html +223 -0
- data/doc-api/classes/Kwalify/HashInterface.html +118 -0
- data/doc-api/classes/Kwalify/Json.html +105 -0
- data/doc-api/classes/Kwalify/KwalifyError.html +111 -0
- data/doc-api/classes/Kwalify/Main.html +339 -0
- data/doc-api/classes/Kwalify/MetaValidator.html +448 -0
- data/doc-api/classes/Kwalify/Parser.html +155 -0
- data/doc-api/classes/Kwalify/PlainYamlParser/Alias.html +165 -0
- data/doc-api/classes/Kwalify/PlainYamlParser.html +523 -0
- data/doc-api/classes/Kwalify/Rule.html +433 -0
- data/doc-api/classes/Kwalify/SchemaError.html +148 -0
- data/doc-api/classes/Kwalify/SyntaxError.html +185 -0
- data/doc-api/classes/Kwalify/Types.html +302 -0
- data/doc-api/classes/Kwalify/Util/HashLike.html +246 -0
- data/doc-api/classes/Kwalify/Util/OrderedHash.html +330 -0
- data/doc-api/classes/Kwalify/Util.html +390 -0
- data/doc-api/classes/Kwalify/ValidationError.html +148 -0
- data/doc-api/classes/Kwalify/Validator.html +381 -0
- data/doc-api/classes/Kwalify/Yaml/Parser.html +1538 -0
- data/doc-api/classes/Kwalify/Yaml.html +194 -0
- data/doc-api/classes/Kwalify/YamlParser.html +542 -0
- data/doc-api/classes/Kwalify/YamlSyntaxError.html +119 -0
- data/doc-api/classes/Kwalify.html +292 -0
- data/doc-api/classes/Test/Unit.html +101 -0
- data/doc-api/classes/Test.html +107 -0
- data/doc-api/created.rid +1 -0
- data/doc-api/files/__/README_txt.html +172 -0
- data/doc-api/files/kwalify/errors_rb.html +114 -0
- data/doc-api/files/kwalify/main_rb.html +118 -0
- data/doc-api/files/kwalify/messages_rb.html +107 -0
- data/doc-api/files/kwalify/meta-validator_rb.html +117 -0
- data/doc-api/files/kwalify/parser/base_rb.html +116 -0
- data/doc-api/files/kwalify/parser/yaml_rb.html +117 -0
- data/doc-api/files/kwalify/rule_rb.html +116 -0
- data/doc-api/files/kwalify/types_rb.html +114 -0
- data/doc-api/files/kwalify/util/assert-text-equal_rb.html +115 -0
- data/doc-api/files/kwalify/util/hash-interface_rb.html +114 -0
- data/doc-api/files/kwalify/util/hashlike_rb.html +107 -0
- data/doc-api/files/kwalify/util/option-parser_rb.html +107 -0
- data/doc-api/files/kwalify/util/ordered-hash_rb.html +107 -0
- data/doc-api/files/kwalify/util/testcase-helper_rb.html +115 -0
- data/doc-api/files/kwalify/util_rb.html +107 -0
- data/doc-api/files/kwalify/validator_rb.html +117 -0
- data/doc-api/files/kwalify/yaml-parser_rb.html +117 -0
- data/doc-api/files/kwalify_rb.html +121 -0
- data/doc-api/fr_class_index.html +57 -0
- data/doc-api/fr_file_index.html +45 -0
- data/doc-api/fr_method_index.html +168 -0
- data/doc-api/index.html +24 -0
- data/doc-api/rdoc-style.css +208 -0
- data/examples/address-book/Makefile +10 -0
- data/examples/address-book/address-book.schema.yaml +45 -0
- data/examples/address-book/address-book.yaml +36 -0
- data/examples/data-binding/BABEL.data.yaml +63 -0
- data/examples/data-binding/BABEL.schema.yaml +31 -0
- data/examples/data-binding/Makefile +8 -0
- data/examples/data-binding/Rakefile +13 -0
- data/examples/data-binding/main.rb +27 -0
- data/examples/invoice/Makefile +9 -0
- data/examples/invoice/invoice.schema.yaml +43 -0
- data/examples/invoice/invoice.yaml +32 -0
- data/examples/tapkit/Makefile +10 -0
- data/examples/tapkit/main.rb +7 -0
- data/examples/tapkit/tapkit.schema.yaml +146 -0
- data/examples/tapkit/tapkit.yaml +85 -0
- data/lib/kwalify/errors.rb +127 -0
- data/lib/kwalify/kwalify.schema.yaml +58 -0
- data/lib/kwalify/main.rb +442 -0
- data/lib/kwalify/messages.rb +173 -0
- data/lib/kwalify/meta-validator.rb +275 -0
- data/lib/kwalify/parser/base.rb +127 -0
- data/lib/kwalify/parser/yaml.rb +841 -0
- data/lib/kwalify/rule.rb +559 -0
- data/lib/kwalify/templates/genclass-java.eruby +222 -0
- data/lib/kwalify/templates/genclass-php.eruby +104 -0
- data/lib/kwalify/templates/genclass-ruby.eruby +113 -0
- data/lib/kwalify/types.rb +156 -0
- data/lib/kwalify/util/assert-text-equal.rb +46 -0
- data/lib/kwalify/util/hash-interface.rb +18 -0
- data/lib/kwalify/util/hashlike.rb +51 -0
- data/lib/kwalify/util/option-parser.rb +220 -0
- data/lib/kwalify/util/ordered-hash.rb +57 -0
- data/lib/kwalify/util/testcase-helper.rb +112 -0
- data/lib/kwalify/util.rb +158 -0
- data/lib/kwalify/validator.rb +282 -0
- data/lib/kwalify/yaml-parser.rb +870 -0
- data/lib/kwalify.rb +67 -0
- data/setup.rb +1585 -0
- data/test/Rookbook.yaml +10 -0
- data/test/data/users-guide/AddressBook.java.expected +40 -0
- data/test/data/users-guide/BABEL.data.yaml +24 -0
- data/test/data/users-guide/BABEL.schema.yaml +30 -0
- data/test/data/users-guide/ExampleAddressBook.java +47 -0
- data/test/data/users-guide/Group.java.expected +24 -0
- data/test/data/users-guide/Person.java.expected +44 -0
- data/test/data/users-guide/address_book.rb +52 -0
- data/test/data/users-guide/address_book.schema.yaml +28 -0
- data/test/data/users-guide/address_book.yaml +27 -0
- data/test/data/users-guide/answers-schema.yaml +12 -0
- data/test/data/users-guide/answers-validator.rb +52 -0
- data/test/data/users-guide/babel_genclass.result +26 -0
- data/test/data/users-guide/config.schema.yaml +7 -0
- data/test/data/users-guide/config.yaml +4 -0
- data/test/data/users-guide/document01a.yaml +3 -0
- data/test/data/users-guide/document01b.yaml +3 -0
- data/test/data/users-guide/document02a.yaml +4 -0
- data/test/data/users-guide/document02b.yaml +4 -0
- data/test/data/users-guide/document03a.yaml +6 -0
- data/test/data/users-guide/document03b.yaml +6 -0
- data/test/data/users-guide/document04a.yaml +9 -0
- data/test/data/users-guide/document04b.yaml +9 -0
- data/test/data/users-guide/document05a.yaml +11 -0
- data/test/data/users-guide/document05b.yaml +12 -0
- data/test/data/users-guide/document06a.yaml +15 -0
- data/test/data/users-guide/document06b.yaml +16 -0
- data/test/data/users-guide/document07a.yaml +9 -0
- data/test/data/users-guide/document07b.yaml +7 -0
- data/test/data/users-guide/document12a.json +10 -0
- data/test/data/users-guide/document12b.json +6 -0
- data/test/data/users-guide/document13a.yaml +17 -0
- data/test/data/users-guide/document14a.yaml +3 -0
- data/test/data/users-guide/document14b.yaml +3 -0
- data/test/data/users-guide/document15a.yaml +6 -0
- data/test/data/users-guide/document15b.yaml +5 -0
- data/test/data/users-guide/example_address_book.rb +10 -0
- data/test/data/users-guide/example_address_book_java.result +32 -0
- data/test/data/users-guide/example_address_book_ruby.result +31 -0
- data/test/data/users-guide/genclass_java.result +4 -0
- data/test/data/users-guide/howto-validation-with-parsing.rb +28 -0
- data/test/data/users-guide/howto-validation.rb +25 -0
- data/test/data/users-guide/howto3.rb +6 -0
- data/test/data/users-guide/howto3.result +5 -0
- data/test/data/users-guide/howto3.yaml +8 -0
- data/test/data/users-guide/howto5_databinding.result +111 -0
- data/test/data/users-guide/invalid01.result +3 -0
- data/test/data/users-guide/invalid02.result +5 -0
- data/test/data/users-guide/invalid03.result +5 -0
- data/test/data/users-guide/invalid04.result +4 -0
- data/test/data/users-guide/invalid05.result +11 -0
- data/test/data/users-guide/invalid06.result +4 -0
- data/test/data/users-guide/invalid07.result +3 -0
- data/test/data/users-guide/invalid08.result +3 -0
- data/test/data/users-guide/invalid12.json +8 -0
- data/test/data/users-guide/invalid14.result +4 -0
- data/test/data/users-guide/invalid15.result +4 -0
- data/test/data/users-guide/loadbabel.rb +27 -0
- data/test/data/users-guide/loadconfig.rb +16 -0
- data/test/data/users-guide/loadconfig.result +6 -0
- data/test/data/users-guide/models.rb +22 -0
- data/test/data/users-guide/option_ha.result +6 -0
- data/test/data/users-guide/option_ha_genclass_java.result +7 -0
- data/test/data/users-guide/schema01.yaml +3 -0
- data/test/data/users-guide/schema02.yaml +12 -0
- data/test/data/users-guide/schema03.yaml +9 -0
- data/test/data/users-guide/schema04.yaml +20 -0
- data/test/data/users-guide/schema05.yaml +29 -0
- data/test/data/users-guide/schema06.yaml +11 -0
- data/test/data/users-guide/schema12.json +12 -0
- data/test/data/users-guide/schema13.yaml +13 -0
- data/test/data/users-guide/schema14.yaml +5 -0
- data/test/data/users-guide/schema15.yaml +21 -0
- data/test/data/users-guide/valid01.result +2 -0
- data/test/data/users-guide/valid02.result +2 -0
- data/test/data/users-guide/valid03.result +2 -0
- data/test/data/users-guide/valid04.result +2 -0
- data/test/data/users-guide/valid05.result +2 -0
- data/test/data/users-guide/valid06.result +2 -0
- data/test/data/users-guide/valid07.result +2 -0
- data/test/data/users-guide/valid08.result +2 -0
- data/test/data/users-guide/valid12.result +2 -0
- data/test/data/users-guide/valid13.result +2 -0
- data/test/data/users-guide/valid14.result +2 -0
- data/test/data/users-guide/valid15.result +2 -0
- data/test/data/users-guide/validate08.rb +37 -0
- data/test/test-action.rb +78 -0
- data/test/test-action.yaml +738 -0
- data/test/test-databinding.rb +83 -0
- data/test/test-databinding.yaml +339 -0
- data/test/test-main.rb +157 -0
- data/test/test-main.yaml +415 -0
- data/test/test-metavalidator.rb +80 -0
- data/test/test-metavalidator.yaml +1179 -0
- data/test/test-parser-yaml.rb +57 -0
- data/test/test-parser-yaml.yaml +1749 -0
- data/test/test-rule.rb +26 -0
- data/test/test-rule.yaml +317 -0
- data/test/test-users-guide.rb +75 -0
- data/test/test-util.rb +125 -0
- data/test/test-validator.rb +95 -0
- data/test/test-validator.yaml +986 -0
- data/test/test-yaml-parser.rb +47 -0
- data/test/test-yaml-parser.yaml +1226 -0
- data/test/test.rb +61 -0
- 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
|