# JSON::SchemaBuilder [](https://travis-ci.org/parrish/json-schema_builder) [](https://codeclimate.com/github/parrish/json-schema_builder) [](https://codeclimate.com/github/parrish/json-schema_builder) [](http://badge.fury.io/rb/json-schema_builder) ##### Build [JSON Schemas](http://json-schema.org) with Ruby. Validates JSON using [json-schema](https://github.com/ruby-json-schema/json-schema) ## Installation Add this line to your application's Gemfile: ```ruby gem 'json-schema_builder' ``` And then execute: $ bundle Or install it yourself as: $ gem install json-schema_builder ## Usage ### Building schemas ```ruby require 'json/schema_builder' class YourSchema include JSON::SchemaBuilder def schema object do string :name, min_length: 1, required: true array :your_ids do max_items 10 unique_items true items type: :integer end end end end builder = YourSchema.new ``` `builder.schema.as_json` will return a valid JSON schema: ```json { "type": "object", "required": "name", "properties": { "name": { "type": "string", "minLength": 1 }, "your_ids": { "type": "array", "maxItems": 10, "uniqueItems": true, "items": { "type": "integer" } } } } ``` [More examples](https://github.com/parrish/json-schema_builder/tree/master/spec/support/examples) can be found in the specs. ### Validating data against a schema `builder.schema.validate(data)` will validate your object against the schema: ```ruby builder.schema.validate({ }) # => false builder.schema.validate name: 'Your Name' # => true ``` `builder.schema.validate!(data)` validates your object, raising an exception on failure: ```ruby builder.schema.validate!({ }) # JSON::Schema::ValidationError: The property '#/' did not contain a required property of 'name' builder.schema.validate! name: 'Your Name', your_ids: [1, 1, 2] # JSON::Schema::ValidationError: The property '#/your_ids' contained duplicated array values ``` `builder.schema.fully_validate(data)` validates the object and reports all invalid properties: ```ruby builder.schema.fully_validate your_ids: 'fail' # [ # "The property '#/your_ids' of type String did not match the following type: array ", # "The property '#/' did not contain a required property of 'name'" # ] ``` Fragment validation can be accomplished by specifying the schema fragment: ```ruby builder.schema.validate [1], fragment: '#/properties/your_ids' # => true ``` ### Configuring [json-schema](https://github.com/ruby-json-schema/json-schema) validation options can be specified in several contexts: ```ruby # As a global default JSON::SchemaBuilder.configure do |opts| opts.validate_schema = true end # As a class-level default YourSchema.configure do |opts| opts.insert_defaults = true end # Or at validation builder.schema.validate data, strict: true, validate_schema: false # Results in { validate_schema: false, insert_defaults: true, strict: true } ``` ## Contributing 1. Fork it ( https://github.com/parrish/json-schema_builder/fork ) 2. Create your feature branch (`git checkout -b my-new-feature`) 3. Commit your changes (`git commit -am 'Add some feature'`) 4. Push to the branch (`git push origin my-new-feature`) 5. Create a new Pull Request