dc-kwalify 0.7.2

Sign up to get free protection for your applications and to get access to all the features.
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
data/CHANGES.txt ADDED
@@ -0,0 +1,252 @@
1
+ .=title: ChangeLog
2
+ .?release: $Release: 0.7.2 $
3
+ .?lastupdate: $Date$
4
+ .?version: $Rev$
5
+
6
+
7
+ .: Release 0.7.2 (2010-07-18)
8
+
9
+ .* bugfix:
10
+
11
+ .- Fix a bug that kwalify command raised error when YAML document is empty (thanks to Nuttall).
12
+
13
+ .- Fix a bug that Kwalify::Util.untabify() removed tailing empty strings.
14
+
15
+
16
+ .: Release 0.7.1 (2008-01-28)
17
+
18
+ .* bugfix:
19
+
20
+ .- 'Duplicated key' error is now not raised if corresponding rule
21
+ has 'default:' constraint.
22
+
23
+ .- Path is now copied in Kwalify::ValidationError#initialize()
24
+
25
+
26
+ .: Release 0.7.0 (2008-01-27)
27
+
28
+ .* enhancements:
29
+
30
+ .- YAML parser is rewrited from scratch.
31
+ The new parser class Kwalify::Yaml::Parser is available.
32
+ The old parser class Kwalify::YamlParser is stil available,
33
+ but it is not recommended to use.
34
+
35
+ .- Validator is integrated with yaml parser.
36
+ It is able to parse and validate at once.
37
+ .--------------------
38
+ ## create validator
39
+ require 'kwalify'
40
+ schema = Kwalify::Yaml.load_file('schema.yaml')
41
+ validator = Kwalify::Validator.new(schema)
42
+ ## parse with validation
43
+ parser = Kwalify::Yaml::Parser.new(validator)
44
+ ydoc = parser.parse(File.read('data.yaml'))
45
+ ## show validation errors if exist
46
+ errors = parser.errors()
47
+ if errors && !errors.empty?
48
+ for e in errors
49
+ puts "** %d:%d [%s] %s" % [e.linenum, e.column, e.path, e.message]
50
+ end
51
+ end
52
+ .--------------------
53
+
54
+ .- Data binding is integrated into Kwalify::Yaml::Parser.
55
+ If you set Kwalify::Yaml::Parser#data_binding to true
56
+ and you specified class names in schema file,
57
+ parser creates instance objects instead of Hash objects.
58
+ It means that you don't need to add '!ruby/Classname'
59
+ for each data.
60
+ .? schema file (config.schema.yaml)
61
+ .--------------------
62
+ type: map
63
+ class: Config
64
+ mapping:
65
+ "host": { type: str, required: true }
66
+ "port": { type: int }
67
+ "user": { type: str, required: true }
68
+ "pass": { type: str, required: true }
69
+ .--------------------
70
+ .? configuration file (config.yaml)
71
+ .--------------------
72
+ host: localhost
73
+ port: 8080
74
+ user: user1
75
+ pass: password1
76
+ .--------------------
77
+ .? ruby program (ex1.rb)
78
+ .--------------------
79
+ ## class definition
80
+ require 'kwalify/util/hashlike'
81
+ class Config
82
+ include Kwalify::Util::HashLike # defines [], []=, ...
83
+ attr_accessor :host, :posrt, :user, :pass
84
+ end
85
+ ## create validator object
86
+ require 'kwalify'
87
+ schema = Kwalify::Yaml.load_file('config.schema.yaml')
88
+ validator = Kwalify::Validator.new(schema)
89
+ ## parse configuration file with data binding
90
+ parser = Kwalify::Yaml::Parser.new(validator)
91
+ parser.data_binding = true # enable data binding
92
+ config = parser.parse_file('config.yaml')
93
+ p config #=> #<Config:0x542590 @user="user1", @port=8080,
94
+ # @pass="password1", @host="localhost">
95
+ .--------------------
96
+
97
+ .- Preceding alias supported.
98
+ If you set Kwalify::Yaml::Parser#preceding_alias to true,
99
+ parser allows aliases to apprear before corresponding anchor
100
+ appears.
101
+ This is very useful when node graph is complex.
102
+ .--------------------
103
+ - name: Foo
104
+ parent: *bar # preceding alias
105
+ - &bar
106
+ name: Bar
107
+ parent: *baz # preceding alias
108
+ - &baz
109
+ name: Baz
110
+ .--------------------
111
+
112
+ .- New command-line option '-P' enables preceding alias.
113
+
114
+ .- Kwalify::Yaml.load() and Kwalify::Yaml.load_file() are added.
115
+ They are similar to YAML.load() and YAML.load_file() but they
116
+ use Kwalify::Yaml::Parser object.
117
+
118
+ .- New utilify method Kwalify::Util.traverse_schema() provided.
119
+ .--------------------
120
+ require 'kwalify'
121
+ require 'kwalify/util'
122
+ schema = Kwalify::Yaml.load('schema.yaml')
123
+ Kwalify::Util.traverse_schema(schema) do |rulehash|
124
+ if classname = rulehash['class']
125
+ ## add namespace to class name
126
+ rulehash['class'] = "Foo::Bar::#{classname}"
127
+ end
128
+ end
129
+ .--------------------
130
+
131
+ .- Add 'kwalify/util/hashlike.rb' which contains definition of
132
+ Kwalify::Util::HashLike module.
133
+ This module defines [], []=, keys(), key?(), and each() methods,
134
+ and these are required for data-binding.
135
+
136
+ .- Action 'genclass-ruby' supports '--hashlike' property.
137
+
138
+ .- Action 'genclass-ruby' supports '--initialize=false' property.
139
+
140
+ .- Add action 'geclass-php'
141
+
142
+ .- '\xXX' and '\uXXXX' are supported in Kwalify::Yaml::Parser.
143
+
144
+ .- New constrant 'default:' is added to kwalify.schema.yaml.
145
+ This constrant have no effect to validation and parsing,
146
+ and it is used only in 'genclass-xxx' action.
147
+
148
+
149
+ .* changes:
150
+
151
+ .- Action 'genclass-ruby' and 'genclass-java' are changed to
152
+ generate boolean accessors.
153
+ For example, attribute 'active' is specified as 'type: bool'
154
+ in schema file, action 'genclass-ruby' generates
155
+ "def active? ; @active; end"
156
+ and action 'genclass-java' generates
157
+ "public boolean isActive() { return _active; }".
158
+
159
+ .- Command-line option '-s' (silent) is obsolete and replaced with
160
+ '-q' (quiet). Option '-s' is still available but it is recommended
161
+ to use '-q'.
162
+
163
+ .- License is changed from LGPL to MIT-LICENSE.
164
+
165
+
166
+ .: Release 0.6.0 (2006-05-30)
167
+
168
+ .* enhancements:
169
+
170
+ .- Class definition generation support.
171
+ New command-line option '-a genclass-ruby' or '-a genclass-java' generates
172
+ class definitions in Ruby or Java from schema file.
173
+
174
+
175
+ .: Release 0.5.1 (2005-12-20)
176
+
177
+ .* enhances:
178
+
179
+ .- add new command-line option '-E' which show errors in emacs-compatible style.
180
+
181
+
182
+ .: Release 0.5.0 (2005-12-17)
183
+
184
+ .* enhancements:
185
+
186
+ .- Meta-validation check for 'max < min', 'max-ex <= min-ex', and so on.
187
+ .- Many test-cases are added
188
+
189
+ .* changes:
190
+
191
+ .- 'Parser' class is renamed to 'YamlParser'
192
+ .- 'PlainParser' class is renamed to 'PlainYamlParser'
193
+ .- YamlParser#set_error_linenums() is renamed to set_errors_linenum()
194
+ .- ValidatorError#<=> added
195
+ .- ParseError class is renamed to YamlSyntaxError
196
+
197
+
198
+ .: Release 0.4.1 (2005-10-26)
199
+
200
+ .* bugfix:
201
+
202
+ .- Support Ruby 1.8.3 (around YAML::Syck::DomainType)
203
+ .- Show correct error line number when key is undefined or unknown.
204
+
205
+
206
+ .: Release 0.4.0 (2005-10-25)
207
+
208
+ .* enhancements:
209
+
210
+ .- New command-line option '-l' prints error line numbers.
211
+ .- Supports default rule of mapping.
212
+
213
+
214
+ .: Release 0.3.0 (2005-09-30)
215
+
216
+ .* enhancements:
217
+
218
+ .- Support 'max-ex' and 'min-ex' (max/min exclusive) support with 'range:'
219
+ .- Support 'max-ex' and 'min-ex' (max/min exclusive) support with 'length:'
220
+ .- Support 'unique' constraint
221
+
222
+
223
+ .: Release 0.2.0 (2005-09-25)
224
+
225
+ .* enhancements:
226
+
227
+ .- New type 'scalar' and 'timestamp' added
228
+ .- Add new rule 'range:' which validates value range.
229
+ See users' guide for details.
230
+ .- Add new rule 'length:' which validate length of string value.
231
+ See users' guide for details.
232
+ .- Add experimental rule 'assert:' which validates value with an
233
+ expression. See users' guide for details.
234
+ .- New method 'Kwalify::Validator#validate_hook()' is added.
235
+ This method is called by Kwalify::Validator#validate().
236
+ See users' guide for details.
237
+ .- New class 'MetaValidator' added.
238
+ .- New test script 'test/test-metavalidator.rb' added.
239
+
240
+ .* changes:
241
+
242
+ .- Type name changed to suite YAML data type:
243
+ .= string -> str
244
+ .= integer -> int
245
+ .= boolean -> bool
246
+ .- Error index starts with 0 (before starts with 1).
247
+ .- Class 'Schema' is renamed to 'Rule'.
248
+
249
+
250
+ .: Release 0.1.0 (2005-08-01)
251
+
252
+ .- beta release
data/MIT-LICENSE ADDED
@@ -0,0 +1,20 @@
1
+ copyright(c) 2005-2010 kuwata-lab all rights reserved.
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining
4
+ a copy of this software and associated documentation files (the
5
+ "Software"), to deal in the Software without restriction, including
6
+ without limitation the rights to use, copy, modify, merge, publish,
7
+ distribute, sublicense, and/or sell copies of the Software, and to
8
+ permit persons to whom the Software is furnished to do so, subject to
9
+ the following conditions:
10
+
11
+ The above copyright notice and this permission notice shall be
12
+ included in all copies or substantial portions of the Software.
13
+
14
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
18
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
19
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.txt ADDED
@@ -0,0 +1,61 @@
1
+ = README
2
+
3
+ release:: 0.7.2
4
+ lastupdate:: $Date$
5
+ copyright:: copyright(c) 2005-2010 kuwata-lab all rights reserved.
6
+
7
+
8
+
9
+ == Introduction
10
+
11
+ Kwalify is a parser, schema validator, and data binding tool for
12
+ YAML and JSON.
13
+
14
+ See doc/users-guide.html for details.
15
+
16
+
17
+
18
+ == Installation
19
+
20
+ If you have installed RubyGems, just type 'gem install kwalify'
21
+
22
+ $ sudo gem install kwalify
23
+
24
+ Else if you can be root user, use 'setup.rb' as following:
25
+
26
+ $ tar xjf kwalify-0.7.2.tar.bz2
27
+ $ cd kwalify-0.7.2/
28
+ $ sudo ruby setup.rb install
29
+
30
+ Else copy script and libraries to proper directory.
31
+
32
+ $ tar xjf kwalify-0.7.2.tar.bz2
33
+ $ cd kwalify-0.7.2/
34
+ $ mkdir -p $HOME/bin
35
+ $ cp -a bin/* $HOME/bin
36
+ $ export PATH=$PATH:$HOME/bin
37
+ $ mkdir -p $HOME/lib/ruby
38
+ $ cp -a lib/* $HOME/lib/ruby
39
+ $ export RUBYLIB=$HOME/lib/ruby
40
+
41
+ (Optional) 'contrib/inline-require' script to concatenate all script
42
+ and libraries into a file.
43
+
44
+ $ tar xjf kwalify-0.7.2.tar.bz2
45
+ $ cd kwalify-0.7.2/
46
+ $ unset RUBYLIB
47
+ $ ruby contrib/inline-require -I ./lib bin/kwalify > contrib/kwalify
48
+ $ chmod a+x contrib/kwalify
49
+ $ mv contrib/kwalify $HOME/bin
50
+
51
+
52
+
53
+ == License
54
+
55
+ MIT License
56
+
57
+
58
+
59
+ == Copyright
60
+
61
+ copyright(c) 2005-2010 kuwata-lab all rights reserved.
data/bin/kwalify ADDED
@@ -0,0 +1,13 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ ###
4
+ ### $Rev$
5
+ ### $Release: 0.7.2 $
6
+ ### copyright(c) 2005-2010 kuwata-lab all rights reserved.
7
+ ###
8
+
9
+ require 'kwalify'
10
+ require 'kwalify/main'
11
+
12
+ command = File.basename($0)
13
+ Kwalify::Main.main(command, ARGV)
@@ -0,0 +1,179 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ ###
4
+ ### inline-require - expand 'require "foo"' into inline code
5
+ ###
6
+ ### usage: inline-require [-h] [-I path[,path2,..]] script
7
+ ###
8
+ ### copyright(c) 2005-2010 kuwata-lab all rights reserved.
9
+ ### 0.7.2
10
+ ### $Rev: 10 $
11
+ ###
12
+
13
+
14
+ class InlineRequire
15
+
16
+ def initialize(opts={})
17
+ @opts = opts.dup
18
+ end
19
+ attr_accessor :opts
20
+
21
+ def expand(filename)
22
+ sbuf = ''
23
+ inlined = []
24
+ level = 0
25
+ expand_require(filename, sbuf, inlined, level)
26
+ return sbuf
27
+ end
28
+
29
+ private
30
+
31
+ def expand_require(filename, sbuf, inlined, level)
32
+ raise "*** assertion error" if inlined.include?(filename)
33
+ remove_comment = @opts[:remove_comment]
34
+ expand_indented = @opts[:expand_indented]
35
+ keep_filename = @opts[:keep_filename]
36
+ loaded_features = @opts[:loaded_features]
37
+ inlined << filename
38
+ prog = File.read(filename)
39
+ n = 0
40
+ flag_if_file = false
41
+ prog.each_line do |line|
42
+ n += 1
43
+
44
+ ## comment out from 'if __FILE__ == $0' to 'end'
45
+ if level > 0
46
+ if flag_if_file
47
+ sbuf << "#" << line
48
+ flag_if_file = false if line =~ /^end$/
49
+ next
50
+ end
51
+ if line =~ /^if\s+__FILE__\s*==\s*\$0(\s+then)?$/ || line =~ /^if\s+\$0\s*==\s*__FILE__(\s+then)?$/
52
+ flag_if_file = true
53
+ sbuf << "#" << line
54
+ next
55
+ end
56
+ end
57
+
58
+ ## find 'require "foo"' and expand it to inline code
59
+ flag_inline = false
60
+ pattern = expand_indented ? /^[ \t]*require ['"](.*)["']\s*$/ \
61
+ : /^require ['"](.*)["']\s*$/
62
+ if line =~ pattern
63
+ libname = $1
64
+ libpath = find_library(libname)
65
+ $stderr.puts "*** debug: libpath=#{libpath.inspect}" if $debug_mode
66
+ unless libpath
67
+ #raise "file '#{filename}'(line #{n}): library '#{libname}' not found."
68
+ warn "file '#{filename}'(line #{n}): library '#{libname}' not found."
69
+ else
70
+ flag_inline = true if libpath =~ /\.rb$/ && local_library?(libpath)
71
+ end
72
+ end
73
+ if !flag_inline
74
+ sbuf << line unless remove_comment && line =~ /^[ \t]*\#/
75
+ elsif inlined.include?(libpath)
76
+ sbuf << "#--already included #{line}" unless remove_comment
77
+ else
78
+ if keep_filename
79
+ @n ||= 0; @n += 1; n = @n
80
+ end
81
+ sbuf << "#--begin of #{line}" unless remove_comment
82
+ sbuf << "$LOADED_FEATURES << '#{libname}.rb'\n" if loaded_features
83
+ sbuf << "eval <<'END_OF_SCRIPT__#{n}', TOPLEVEL_BINDING, '#{libpath}', 1\n" if keep_filename
84
+ expand_require(libpath, sbuf, inlined, level+1)
85
+ sbuf << "END_OF_SCRIPT__#{n}\n" if keep_filename
86
+ sbuf << "#--end of #{line}" unless remove_comment
87
+ end
88
+ end
89
+ #sbuf << "\n" if sbuf[-1] != ?\n
90
+ end
91
+
92
+ def local_library?(libpath)
93
+ return libpath !~ /^\//
94
+ end
95
+
96
+ def find_library(libname)
97
+ if libname =~ /^\.rb$/
98
+ libname_rb = libname
99
+ libname_so = nil
100
+ elsif libname =~ /^\.so$/
101
+ libname_rb = nil
102
+ libname_so = libname
103
+ else
104
+ libname_rb = libname + ".rb"
105
+ libname_so = libname + ".so"
106
+ end
107
+ $LOAD_PATH.each do |path|
108
+ if libname_rb
109
+ libpath = path + "/" + libname_rb
110
+ return libpath if test(?f, libpath)
111
+ end
112
+ if libname_so
113
+ libpath = path + "/" + libname_so
114
+ return libpath if test(?f, libpath)
115
+ end
116
+ end
117
+ return nil
118
+ end
119
+
120
+ end
121
+
122
+ if __FILE__ == $0
123
+
124
+ begin
125
+ require "optparse"
126
+ op = OptionParser.new
127
+ options = {}
128
+ op.on("-h", "--help") {|v| options[:help] = v }
129
+ op.on("-I libpath") {|v| options[:libpath] = v }
130
+ op.on("-i") {|v| options[:expand_indented] = v }
131
+ op.on("-c") {|v| options[:remove_comment] = v }
132
+ op.on("-k") {|v| options[:keep_filename] = v }
133
+ op.on("-l") {|v| options[:loaded_features] = v }
134
+ op.on("-D") {|v| options[:debug] = v }
135
+ op.parse!()
136
+
137
+ $debug_mode = options[:debug]
138
+
139
+ if options[:help]
140
+ command = File.basename($0)
141
+ puts "Usage: #{command} [-h] [-I path[,path2,..]] script"
142
+ puts " -h : help"
143
+ puts " -i : expand indented require(), too"
144
+ puts " -c : remove comment lines start with '#'"
145
+ puts " -k : keep filename (for debugging)"
146
+ puts " -l : append libs to $LOADED_FEATURES"
147
+ puts " -I path[,path2,...] : ruby library path"
148
+ exit(0)
149
+ end
150
+
151
+ if options[:libpath]
152
+ rubylib_paths = options[:libpath].split(/,/)
153
+ else
154
+ rubylib_paths = []
155
+ end
156
+ $stderr.puts "*** debug: rubylib_paths=#{rubylib_paths.inspect}" if $debug_mode
157
+ $LOAD_PATH.concat(rubylib_paths)
158
+
159
+ filenames = ARGV
160
+
161
+ opts = { :expand_indented => options[:expand_indented],
162
+ :remove_comment => options[:remove_comment],
163
+ :keep_filename => options[:keep_filename],
164
+ :loaded_features => options[:loaded_features] }
165
+ inline_require = InlineRequire.new(opts)
166
+ filenames.each do |filename|
167
+ print inline_require.expand(filename)
168
+ end
169
+
170
+ rescue => ex
171
+ if $debug_mode
172
+ raise ex
173
+ else
174
+ $stderr.puts ex.message
175
+ end
176
+
177
+ end
178
+
179
+ end