respect 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (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>