respect 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (97) hide show
  1. data/MIT-LICENSE +20 -0
  2. data/README.md +289 -0
  3. data/RELATED_WORK.md +40 -0
  4. data/RELEASE_NOTES.md +23 -0
  5. data/Rakefile +31 -0
  6. data/STATUS_MATRIX.html +137 -0
  7. data/lib/respect.rb +231 -0
  8. data/lib/respect/any_schema.rb +22 -0
  9. data/lib/respect/array_def.rb +28 -0
  10. data/lib/respect/array_schema.rb +203 -0
  11. data/lib/respect/boolean_schema.rb +32 -0
  12. data/lib/respect/composite_schema.rb +86 -0
  13. data/lib/respect/core_statements.rb +206 -0
  14. data/lib/respect/datetime_schema.rb +27 -0
  15. data/lib/respect/def_without_name.rb +6 -0
  16. data/lib/respect/divisible_by_validator.rb +20 -0
  17. data/lib/respect/doc_helper.rb +24 -0
  18. data/lib/respect/doc_parser.rb +37 -0
  19. data/lib/respect/dsl_dumper.rb +181 -0
  20. data/lib/respect/equal_to_validator.rb +20 -0
  21. data/lib/respect/fake_name_proxy.rb +116 -0
  22. data/lib/respect/float_schema.rb +27 -0
  23. data/lib/respect/format_validator.rb +136 -0
  24. data/lib/respect/global_def.rb +79 -0
  25. data/lib/respect/greater_than_or_equal_to_validator.rb +19 -0
  26. data/lib/respect/greater_than_validator.rb +19 -0
  27. data/lib/respect/has_constraints.rb +34 -0
  28. data/lib/respect/hash_def.rb +40 -0
  29. data/lib/respect/hash_schema.rb +218 -0
  30. data/lib/respect/in_validator.rb +19 -0
  31. data/lib/respect/integer_schema.rb +27 -0
  32. data/lib/respect/ip_addr_schema.rb +23 -0
  33. data/lib/respect/ipv4_addr_schema.rb +27 -0
  34. data/lib/respect/ipv6_addr_schema.rb +27 -0
  35. data/lib/respect/items_def.rb +21 -0
  36. data/lib/respect/json_schema_html_formatter.rb +143 -0
  37. data/lib/respect/less_than_or_equal_to_validator.rb +19 -0
  38. data/lib/respect/less_than_validator.rb +19 -0
  39. data/lib/respect/match_validator.rb +19 -0
  40. data/lib/respect/max_length_validator.rb +20 -0
  41. data/lib/respect/min_length_validator.rb +20 -0
  42. data/lib/respect/multiple_of_validator.rb +10 -0
  43. data/lib/respect/null_schema.rb +26 -0
  44. data/lib/respect/numeric_schema.rb +33 -0
  45. data/lib/respect/org3_dumper.rb +213 -0
  46. data/lib/respect/regexp_schema.rb +19 -0
  47. data/lib/respect/schema.rb +285 -0
  48. data/lib/respect/schema_def.rb +16 -0
  49. data/lib/respect/string_schema.rb +21 -0
  50. data/lib/respect/unit_test_helper.rb +37 -0
  51. data/lib/respect/uri_schema.rb +23 -0
  52. data/lib/respect/utc_time_schema.rb +17 -0
  53. data/lib/respect/validator.rb +51 -0
  54. data/lib/respect/version.rb +3 -0
  55. data/test/any_schema_test.rb +79 -0
  56. data/test/array_def_test.rb +113 -0
  57. data/test/array_schema_test.rb +487 -0
  58. data/test/boolean_schema_test.rb +89 -0
  59. data/test/composite_schema_test.rb +30 -0
  60. data/test/datetime_schema_test.rb +83 -0
  61. data/test/doc_helper_test.rb +34 -0
  62. data/test/doc_parser_test.rb +109 -0
  63. data/test/dsl_dumper_test.rb +395 -0
  64. data/test/fake_name_proxy_test.rb +138 -0
  65. data/test/float_schema_test.rb +146 -0
  66. data/test/format_validator_test.rb +224 -0
  67. data/test/hash_def_test.rb +126 -0
  68. data/test/hash_schema_test.rb +613 -0
  69. data/test/integer_schema_test.rb +142 -0
  70. data/test/ip_addr_schema_test.rb +78 -0
  71. data/test/ipv4_addr_schema_test.rb +71 -0
  72. data/test/ipv6_addr_schema_test.rb +71 -0
  73. data/test/json_schema_html_formatter_test.rb +214 -0
  74. data/test/null_schema_test.rb +46 -0
  75. data/test/numeric_schema_test.rb +294 -0
  76. data/test/org3_dumper_test.rb +784 -0
  77. data/test/regexp_schema_test.rb +54 -0
  78. data/test/respect_test.rb +108 -0
  79. data/test/schema_def_test.rb +405 -0
  80. data/test/schema_test.rb +290 -0
  81. data/test/string_schema_test.rb +209 -0
  82. data/test/support/circle.rb +11 -0
  83. data/test/support/color.rb +24 -0
  84. data/test/support/point.rb +11 -0
  85. data/test/support/respect/circle_schema.rb +16 -0
  86. data/test/support/respect/color_def.rb +19 -0
  87. data/test/support/respect/color_schema.rb +33 -0
  88. data/test/support/respect/point_schema.rb +19 -0
  89. data/test/support/respect/rgba_schema.rb +20 -0
  90. data/test/support/respect/universal_validator.rb +25 -0
  91. data/test/support/respect/user_macros.rb +12 -0
  92. data/test/support/rgba.rb +11 -0
  93. data/test/test_helper.rb +90 -0
  94. data/test/uri_schema_test.rb +54 -0
  95. data/test/utc_time_schema_test.rb +63 -0
  96. data/test/validator_test.rb +22 -0
  97. metadata +288 -0
data/MIT-LICENSE ADDED
@@ -0,0 +1,20 @@
1
+ Copyright 2013 Nicolas Despres
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.md ADDED
@@ -0,0 +1,289 @@
1
+ # Welcome to Respect
2
+
3
+ _Respect_ is a DSL to concisely describe the structure of common data such as Hash and Array using
4
+ Ruby code. It comes with a validator, a sanitizer and dumpers to generate valid
5
+ [json-schema.org](http://json-schema.org/) compliant specifications. Although it was designed to
6
+ specify JSON schema, it can be used for any data represented as Hash and Array. It does not require
7
+ any JSON parser since it works only on data.
8
+
9
+ Respect is named after the contraction of _REST_ and _SPEC_. Indeed, it was first intended to be
10
+ used to specify REST API in the context of a Web application.
11
+
12
+ There is a plugin called [Respect for Rails](https://github.com/nicolasdespres/respect-rails) which
13
+ integrate this gem in Rails.
14
+
15
+ # Features
16
+
17
+ Already available:
18
+
19
+ * Compact Ruby DSL to specify your schema.
20
+ * Standard [json-schema.org](http://json-schema.org/) specification generator.
21
+ * Validator for JSON document or the like.
22
+ * Contextual validation error.
23
+ * Object sanitizer: turn plain string and integer values into real objects.
24
+ * Extensible API to add your custom validator and sanitizer.
25
+ * Extensible macro definition system to factor you schema definition code.
26
+
27
+ See the RELEASE_NOTES file for detailed feature listing.
28
+
29
+ # Take a Tour
30
+
31
+ _Respect_ comes with a compact Ruby DSL to specify the structure of a hash and/or an array.
32
+ Thus, it is ideal to specify JSON schema. I find it a way more concise than
33
+ [json-schema.org](http://json-schema.org/). And it is plain Ruby so you can rely on all great Ruby features
34
+ to factor your specification code.
35
+
36
+ For instance, this ruby code specify how one could structure a very simple user profile:
37
+
38
+ ```ruby
39
+ schema = Respect::HashSchema.define do |s|
40
+ s.string "name"
41
+ s.integer "age", greater_than: 18
42
+ s.string "homepage", format: :email
43
+ end
44
+ ```
45
+
46
+ But you can still convert this specification to
47
+ [JSON Schema specification draft v3](http://tools.ietf.org/id/draft-zyp-json-schema-03.html)
48
+ easily so that all your customers can read and understand it:
49
+
50
+ ```ruby
51
+ require 'json'
52
+ puts JSON.pretty_generate(schema.to_h)
53
+ ```
54
+
55
+ prints
56
+
57
+ ```json
58
+ {
59
+ "type": "object",
60
+ "properties": {
61
+ "name": {
62
+ "type": "string",
63
+ "required": true
64
+ },
65
+ "age": {
66
+ "type": "integer",
67
+ "required": true,
68
+ "minimum": 18,
69
+ "exclusiveMinimum": true
70
+ },
71
+ "email": {
72
+ "type": "string",
73
+ "required": true,
74
+ "format": "email"
75
+ }
76
+ }
77
+ }
78
+ ```
79
+
80
+ As you can see the Ruby specification is 4 times shorter than the JSON Schema specification...
81
+
82
+ You can also use this specification to validate JSON documents:
83
+
84
+ ```ruby
85
+ schema.validate?({ "name" => "My name", "age" => 20, "email" => "me@example.com" }) #=> true
86
+ schema.validate?({ "name" => "My name", "age" => 15, "email" => "me@example.com" }) #=> false
87
+ ```
88
+
89
+ When it fails to validate a document, you get descriptive error messages with contextual information:
90
+
91
+ ```ruby
92
+ schema.last_error #=> "15 is not greater than 18"
93
+ schema.last_error.message #=> "15 is not greater than 18"
94
+ schema.last_error.context[0] #=> "15 is not greater than 18"
95
+ schema.last_error.context[1] #=> "in hash property `age'"
96
+ ```
97
+
98
+ _Respect_ does not parse JSON document by default but it is easy to do so using one of the JSON parser available in Ruby:
99
+
100
+ ```ruby
101
+ schema.validate?(JSON.parse('{ "name": "My name", "age": 20, "email": "me@example.com" }')) #=> true
102
+ ```
103
+
104
+ Once a JSON document has been validated, we often want to turn its basic strings and integers into real object like `URI`.
105
+ _Respect_ does that automatically for you for standard objects:
106
+
107
+ ```ruby
108
+ schema = Respect::HashSchema.define do |s|
109
+ s.uri "homepage"
110
+ end
111
+ object = { "homepage" => "http://example.com" }
112
+ schema.validate!(object) #=> true
113
+ object["homepage"].class #=> URI::HTTP
114
+ ```
115
+
116
+ You can easily extend the sanitizer with your own object type. Let's assume you have an object type define like this:
117
+
118
+ ```ruby
119
+ class Place
120
+ def initialize(latitude, longitude)
121
+ @latitude, @longitude = latitude, longitude
122
+ end
123
+
124
+ attr_reader :latitude, :longitude
125
+
126
+ def ==(other)
127
+ @latitude == other.latitude && @longitude == other.longitude
128
+ end
129
+ end
130
+ ```
131
+
132
+ Then you must extend the Schema hierarchy with the new schema for your custom type.
133
+ The `CompositeSchema` class assists you in this task so you just have to overwrite
134
+ two methods.
135
+
136
+ ```ruby
137
+ module Respect
138
+ class PlaceSchema < CompositeSchema
139
+ # This method returns the schema specification for your custom type.
140
+ def schema_definition
141
+ Respect::HashSchema.define do |s|
142
+ s.float "latitude"
143
+ s.float "longitude"
144
+ end
145
+ end
146
+
147
+ # The 'sanitize' method is called with the JSON document if the validation succeed.
148
+ # The returned value will be inserted into the JSON document.
149
+ def sanitize(object)
150
+ Place.new(object[:latitude], object[:longitude])
151
+ end
152
+ end
153
+ end
154
+ ```
155
+
156
+ Finally, you define the structure of your JSON document as usual. Note that you have
157
+ access to your custom schema via the `place` method.
158
+
159
+ ```ruby
160
+ schema = Respect::HashSchema.define do |s|
161
+ s.place "home"
162
+ end
163
+
164
+ object = {
165
+ "home" => {
166
+ "latitude" => "48.846559",
167
+ "longitude" => "2.344519",
168
+ }
169
+ }
170
+
171
+ schema.validate!(object) #=> true
172
+ object["home"].class #=> Place
173
+ ```
174
+
175
+ Sometimes you just want to extend the DSL with a new statement providing higher level feature than
176
+ the primitive `integer`, `string` or `float`, etc... For instance if you specify identifier
177
+ in your schema like this:
178
+
179
+ ```ruby
180
+ Respect::HashSchema.define do |s|
181
+ s.integer "article_id", greater_than: 0
182
+ s.string "title"
183
+ s.hash "author" do |s|
184
+ s.integer "author_id", greater_than: 0
185
+ s.string "name"
186
+ end
187
+ end
188
+ ```
189
+
190
+ In such case, you don't need a custom sanitizer. You just want to factor the definition of
191
+ identifier property. You can easily to it like this:
192
+
193
+ ```ruby
194
+ module MyMacros
195
+ def id(name, options = {})
196
+ unless name.nil? || name =~ /_id$/
197
+ name += "_id"
198
+ end
199
+ integer(name, { greater_than: 0 }.merge(options))
200
+ end
201
+ end
202
+ Respect.extend_dsl_with(MyMacros)
203
+ ```
204
+
205
+ Now you can rewrite the original schema this way:
206
+
207
+ ```ruby
208
+ Respect::HashSchema.define do |s|
209
+ s.id "article"
210
+ s.string "title"
211
+ s.hash "author" do |s|
212
+ s.id "author"
213
+ s.string "name"
214
+ end
215
+ end
216
+ ```
217
+
218
+ # Getting started
219
+
220
+ The easiest way to install _Respect_ is to add it to your `Gemfile`:
221
+
222
+ ```ruby
223
+ gem "respect"
224
+ ```
225
+
226
+ Then, after running the `bundle install` command, you can start to validate JSON document in your program like this:
227
+
228
+ ```ruby
229
+ require 'respect'
230
+
231
+ schema = Respect::HashSchema.define do |s|
232
+ s.string "name"
233
+ s.integer "age", greater_than: 18
234
+ end
235
+
236
+ schema.validate?({ "name" => "John", "age" => 30 })
237
+ ```
238
+
239
+ # JSON Schema implementation status
240
+
241
+ _Respect_ currently implements most of the features included in the
242
+ [JSON Schema specification draft v3](http://tools.ietf.org/id/draft-zyp-json-schema-03.html).
243
+
244
+ See the `STATUS_MATRIX` file included in this package for detailed information.
245
+
246
+ Although, the semantics of the schema definition DSL available in this library may change slightly from the
247
+ _JSON schema standard_, we have tried to keep it as close as possible. For instance the `strict` option of
248
+ hash schema is not presented in the standard. However, when a schema is dumped to its _JSON Schema_ version
249
+ the syntax and semantic have been followed. You should note that there is no "loader" available yet in this
250
+ library. In other word, you cannot instantiate a Schema class from a _JSON Schema_ string representation.
251
+
252
+ # Getting help
253
+
254
+ The easiest way to get help about how to use this library is to post your question on the
255
+ [Respect discussion group](https://groups.google.com/forum/#!forum/ruby-respect-gem-talk).
256
+ I will be glade to answer. I may have already answered the
257
+ same question so before you post your question take a bit of time to search the group.
258
+
259
+ You can also read these documents for further documentation:
260
+
261
+ * [Repect API reference documentation](http://nicolasdespres.github.io/respect/)
262
+
263
+ # Compatibility
264
+
265
+ _Respect_ has been tested with:
266
+
267
+ * Ruby 1.9.3-p392 (should be compatible with all 1.9.x family)
268
+ * ActiveSupport 3.2.13
269
+
270
+ Note that **it does not depend on any JSON parsing library**. It works only on primitive Ruby data type. So,
271
+ any JSON parser returning normal basic types like `Hash`, `Array`, `String`, `Numeric`, `TrueClass`,
272
+ `FalseClass`, `NilClass`, should work.
273
+
274
+ # Feedback
275
+
276
+ I would love to hear what you think about this library. Feel free to post any comments/remarks on the
277
+ [Respect discussion group](https://groups.google.com/forum/#!forum/ruby-respect-gem-talk).
278
+
279
+ # Contributing patches
280
+
281
+ I spent quite a lot of time writing this gem but there is still a lot of work to do. Whether it
282
+ is a bug-fix, a new feature, some code re-factoring, or documentation clarification, I will be
283
+ glade to merge your pull request on GitHub. You just have to create a branch from `master` and
284
+ send me a pull request.
285
+
286
+ # License
287
+
288
+ _Respect_ is released under the term of the [MIT License](http://opensource.org/licenses/MIT).
289
+ Copyright (c) 2013 Nicolas Despres.
data/RELATED_WORK.md ADDED
@@ -0,0 +1,40 @@
1
+ # Related works
2
+
3
+ This section describes some projects sharing more or less the same purpose as _Respect_.
4
+ The goal is to have an overview of the eco-system around this topic to borrow ideas and
5
+ to drive implementation.
6
+
7
+ This section is not meant to be accurate even if we try to stay objective here.
8
+
9
+ ## [json-schema](https://github.com/hoxworth/json-schema)
10
+
11
+ * No DSL
12
+ * No doc generation
13
+ * No sanitizer.
14
+
15
+ ## [ruby-jsonschema](https://github.com/Constellation/ruby-jsonchema)
16
+
17
+ * No DSL
18
+ * No doc generation
19
+ * No sanitizer.
20
+
21
+ ## [google/autoparse](https://github.com/google/autoparse)
22
+
23
+ * No DSL
24
+ * Seems no longer maintained.
25
+ * No doc generation.
26
+ * No sanitizer.
27
+
28
+ ## [json expression](https://github.com/chancancode/json_expressions)
29
+
30
+ * Provide an easy way to test your JSON responses.
31
+ * No documentation generator.
32
+ * No DSL.
33
+ * No sanitizer.
34
+
35
+ ## [Net HTTP API Spec](https://github.com/franckcuny/net-http-api-spec)
36
+
37
+ * Seems not used (i.e. no fork and almost no star)
38
+ * Seems no longer maintained.
39
+ * Not compliant with json-schema.org spec.
40
+ * No sanitizer.
data/RELEASE_NOTES.md ADDED
@@ -0,0 +1,23 @@
1
+ # Release notes
2
+
3
+ This document is a list of user visible feature changes made between
4
+ releases except for bug fixes.
5
+
6
+ Note that each entry is kept so brief that no reason behind or
7
+ reference information is supplied with. For a full list of changes
8
+ with all sufficient information, see the git(1) log.
9
+
10
+ A lot more is coming soon check out the issue tagged as `feature`
11
+ in the tracker.
12
+
13
+ ## Part of the first release
14
+
15
+ Feature: DSL to describe schema of Hash, Array, String, Numeric, Integer, Float, Boolean, etc...
16
+ Feature: Dumper to pretty-print a schema using the same DSL syntax.
17
+ Feature: Dumper to generate [JSON schema draft v3 standard](http://tools.ietf.org/id/draft-zyp-json-schema-03.html) representation of a schema.
18
+ Feature: Validation system to check objects follow a schema.
19
+ Feature: Sanitizer to promote validated value to a more specific type.
20
+ Feature: CompositeSchema class to easily create your own schema.
21
+ Feature: Facilities to extends the DSL with user-defined module.
22
+ Feature: Contextual validation error.
23
+ Feature: A JSON schema HTML formatter.
data/Rakefile ADDED
@@ -0,0 +1,31 @@
1
+ #!/usr/bin/env rake
2
+ begin
3
+ require 'bundler/setup'
4
+ rescue LoadError
5
+ puts 'You must `gem install bundler` and `bundle install` to run rake tasks'
6
+ end
7
+
8
+ require 'yard'
9
+ YARD::Rake::YardocTask.new do |t|
10
+ t.files = [
11
+ 'lib/**/*.rb',
12
+ '-',
13
+ 'README.md',
14
+ 'STATUS_MATRIX.html',
15
+ 'RELEASE_NOTES.md',
16
+ 'RELATED_WORK.md',
17
+ ]
18
+ end
19
+
20
+ Bundler::GemHelper.install_tasks
21
+
22
+ require 'rake/testtask'
23
+
24
+ Rake::TestTask.new(:test) do |t|
25
+ t.libs << 'lib'
26
+ t.libs << 'test'
27
+ t.pattern = 'test/**/*_test.rb'
28
+ t.verbose = false
29
+ end
30
+
31
+ task :default => :test
@@ -0,0 +1,137 @@
1
+ <h3>Core Schema definition</h3>
2
+ <p>
3
+ This document is a work in progress and is updated constantly. It may not reflect the exact state
4
+ of implementation.
5
+ </p>
6
+ <table border="1">
7
+ <tr>
8
+ <td>Core Schema definition feature</td>
9
+ <td>Abailable in Respect ?</td>
10
+ </tr><tr>
11
+ <td><a href="http://tools.ietf.org/id/draft-zyp-json-schema-03.html#anchor9">5.1. type</a></td>
12
+ <td style="color:green" align="center">With the various core DSL statements: 'integer', 'string', etc...</td>
13
+ </tr><tr>
14
+ <td><a href="http://tools.ietf.org/id/draft-zyp-json-schema-03.html#properties">5.2. properties</a></td>
15
+ <td style="color:green" align="center">Yes</td>
16
+ </tr><tr>
17
+ <td><a href="http://tools.ietf.org/id/draft-zyp-json-schema-03.html#anchor10">5.3. patternProperties</a></td>
18
+ <td style="color:orangered" align="center">
19
+ With a regular expression instead of a string as property name<br>
20
+ (Ruby regexp instead of ECMA 262)
21
+ </td>
22
+ </tr><tr>
23
+ <td><a href="http://tools.ietf.org/id/draft-zyp-json-schema-03.html#additionalProperties">5.4. additionalProperties</a></td>
24
+ <td style="color:green" align="center">With 'extra' statement or 'required' option</td>
25
+ </tr><tr>
26
+ <td><a href="http://tools.ietf.org/id/draft-zyp-json-schema-03.html#anchor11">5.5. items</a></td>
27
+ <td style="color:green" align="center">With 'item' or 'items' statement</td>
28
+ </tr><tr>
29
+ <td><a href="http://tools.ietf.org/id/draft-zyp-json-schema-03.html#additionalItems">5.6. additionalItems</a></td>
30
+ <td style="color:green" align="center">With 'extra_items' statement</td>
31
+ </tr><tr>
32
+ <td><a href="http://tools.ietf.org/id/draft-zyp-json-schema-03.html#anchor12">5.7. required</a></td>
33
+ <td style="color:green" align="center">Yes</td>
34
+ </tr><tr>
35
+ <td><a href="http://tools.ietf.org/id/draft-zyp-json-schema-03.html#anchor13">5.8. dependencies</a></td>
36
+ <td style="color:red" align="center">No</td>
37
+ </tr><tr>
38
+ <td><a href="http://tools.ietf.org/id/draft-zyp-json-schema-03.html#anchor14">5.9. minimum</a></td>
39
+ <td style="color:green" align="center">With 'greater_than_or_equal_to' option</td>
40
+ </tr><tr>
41
+ <td><a href="http://tools.ietf.org/id/draft-zyp-json-schema-03.html#anchor15">5.10. maximum</a></td>
42
+ <td style="color:green" align="center">With 'less_than_or_equal_to' option</td>
43
+ </tr><tr>
44
+ <td><a href="http://tools.ietf.org/id/draft-zyp-json-schema-03.html#anchor16">5.11. exclusiveMinimum</a></td>
45
+ <td style="color:green" align="center">With 'greater_than' option</td>
46
+ </tr><tr>
47
+ <td><a href="http://tools.ietf.org/id/draft-zyp-json-schema-03.html#anchor17">5.12. exclusiveMaximum</a></td>
48
+ <td style="color:green" align="center">With 'less_than' option</td>
49
+ </tr><tr>
50
+ <td><a href="http://tools.ietf.org/id/draft-zyp-json-schema-03.html#anchor18">5.13. minItems</a></td>
51
+ <td style="color:green" align="center">With 'min_size' option</td>
52
+ </tr><tr>
53
+ <td><a href="http://tools.ietf.org/id/draft-zyp-json-schema-03.html#anchor19">5.14. maxItems</a></td>
54
+ <td style="color:green" align="center">With 'max_size' option</td>
55
+ </tr><tr>
56
+ <td><a href="http://tools.ietf.org/id/draft-zyp-json-schema-03.html#uniqueItems">5.15. uniqueItems</a></td>
57
+ <td style="color:green" align="center">With 'uniq' option</td>
58
+ </tr><tr>
59
+ <td><a href="http://tools.ietf.org/id/draft-zyp-json-schema-03.html#anchor20">5.16. pattern</a></td>
60
+ <td style="color:orangered" align="center">With 'match' option<br>(Ruby regexp instead of ECMA 262)</td>
61
+ </tr><tr>
62
+ <td><a href="http://tools.ietf.org/id/draft-zyp-json-schema-03.html#anchor21">5.17. minLength</a></td>
63
+ <td style="color:green" align="center">With 'min_length' option</td>
64
+ </tr><tr>
65
+ <td><a href="http://tools.ietf.org/id/draft-zyp-json-schema-03.html#anchor22">5.18. maxLength</a></td>
66
+ <td style="color:green" align="center">With 'max_length' option</td>
67
+ </tr><tr>
68
+ <td><a href="http://tools.ietf.org/id/draft-zyp-json-schema-03.html#anchor23">5.19. enum</a></td>
69
+ <td style="color:green" align="center">With 'in' option</td>
70
+ </tr><tr>
71
+ <td><a href="http://tools.ietf.org/id/draft-zyp-json-schema-03.html#anchor24">5.20. default</a></td>
72
+ <td style="color:green" align="center">Yes</td>
73
+ </tr><tr>
74
+ <td><a href="http://tools.ietf.org/id/draft-zyp-json-schema-03.html#anchor25">5.21. title</a></td>
75
+ <td style="color:green" align="center">Yes</td>
76
+ </tr><tr>
77
+ <td><a href="http://tools.ietf.org/id/draft-zyp-json-schema-03.html#anchor26">5.22. description</a></td>
78
+ <td style="color:green" align="center">Yes</td>
79
+ </tr><tr>
80
+ <td><a href="http://tools.ietf.org/id/draft-zyp-json-schema-03.html#anchor27">5.23. format: date-time</a></td>
81
+ <td style="color:orangered" align="center">With 'datetime' parameter<br>(RFC 3399 instead of ISO 8601)</td></tr>
82
+ </tr><tr>
83
+ <td><a href="http://tools.ietf.org/id/draft-zyp-json-schema-03.html#anchor27">5.23. format: regex</a></td>
84
+ <td style="color:orangered" align="center">With 'regexp' parameter<br>(Ruby regexp instead of ECMA 262)</td></tr>
85
+ </tr><tr>
86
+ <td><a href="http://tools.ietf.org/id/draft-zyp-json-schema-03.html#anchor27">5.23. format: format</a></td>
87
+ <td style="color:green" align="center">With 'phone_number' paramter</td>
88
+ </tr><tr>
89
+ <td><a href="http://tools.ietf.org/id/draft-zyp-json-schema-03.html#anchor27">5.23. format: uri</a></td>
90
+ <td style="color:green" align="center">With 'uri' parameter (RFC 2396)</td>
91
+ </tr><tr>
92
+ <td><a href="http://tools.ietf.org/id/draft-zyp-json-schema-03.html#anchor27">5.23. format: email</a></td>
93
+ <td style="color:green" align="center">With 'email' parameter</td>
94
+ </tr><tr>
95
+ <td><a href="http://tools.ietf.org/id/draft-zyp-json-schema-03.html#anchor27">5.23. format: ip-address</a></td>
96
+ <td style="color:green" align="center">With 'ipv4_addr' parameter</td>
97
+ </tr><tr>
98
+ <td><a href="http://tools.ietf.org/id/draft-zyp-json-schema-03.html#anchor27">5.23. format: ipv6</a></td>
99
+ <td style="color:green" align="center">With 'ipv6_addr' parameter</td>
100
+ </tr><tr>
101
+ <td><a href="http://tools.ietf.org/id/draft-zyp-json-schema-03.html#anchor27">5.23. format: host-name</a></td>
102
+ <td style="color:green" align="center">With 'hostname' parameter</td>
103
+ </tr><tr>
104
+ <td><a href="http://tools.ietf.org/id/draft-zyp-json-schema-03.html#anchor27">5.23. format: date</a></td>
105
+ <td style="color:red" align="center">No</td>
106
+ </tr><tr>
107
+ <td><a href="http://tools.ietf.org/id/draft-zyp-json-schema-03.html#anchor27">5.23. format: time</a></td>
108
+ <td style="color:red" align="center">No</td>
109
+ </tr><tr>
110
+ <td><a href="http://tools.ietf.org/id/draft-zyp-json-schema-03.html#anchor27">5.23. format: utc-millisec</a></td>
111
+ <td style="color:red" align="center">No</td>
112
+ </tr><tr>
113
+ <td><a href="http://tools.ietf.org/id/draft-zyp-json-schema-03.html#anchor27">5.23. format: color</a></td>
114
+ <td style="color:red" align="center">No</td>
115
+ </tr><tr>
116
+ <td><a href="http://tools.ietf.org/id/draft-zyp-json-schema-03.html#anchor27">5.23. format: style</a></td>
117
+ <td style="color:red" align="center">No</td>
118
+ </tr><tr>
119
+ <td><a href="http://tools.ietf.org/id/draft-zyp-json-schema-03.html#anchor28">5.24. divisibleBy</a></td>
120
+ <td style="color:green" align="center">With 'divisible_by' or 'multiple_of' option</td>
121
+ </tr><tr>
122
+ <td><a href="http://tools.ietf.org/id/draft-zyp-json-schema-03.html#anchor29">5.25. disallow</a></td>
123
+ <td style="color:red" align="center">No</td>
124
+ </tr><tr>
125
+ <td><a href="http://tools.ietf.org/id/draft-zyp-json-schema-03.html#anchor30">5.26. extends</a></td>
126
+ <td style="color:red" align="center">No</td>
127
+ </tr><tr>
128
+ <td><a href="http://tools.ietf.org/id/draft-zyp-json-schema-03.html#anchor31">5.27. id</a></td>
129
+ <td style="color:red" align="center">No</td>
130
+ </tr><tr>
131
+ <td><a href="http://tools.ietf.org/id/draft-zyp-json-schema-03.html#anchor32">5.28. $ref</a></td>
132
+ <td style="color:red" align="center">No</td>
133
+ </tr><tr>
134
+ <td><a href="http://tools.ietf.org/id/draft-zyp-json-schema-03.html#anchor33">5.29. $schema</a></td>
135
+ <td style="color:red" align="center">No</td>
136
+ </tr>
137
+ </table>