Project

yas

0.0
No commit activity in last 3 years
No release in over 3 years
YAS is a Ruby hash schema and validator.
2005
2006
2007
2008
2009
2010
2011
2012
2013
2014
2015
2016
2017
2018
2019
2020
2021
2022
2023
2024
 Dependencies

Development

~> 5.3
~> 1.1
~> 10.3
 Project Readme

YAS

YAS (Yet Another Schema) is an extensible hash validator for Ruby used to maintain hash integrity. Using YAS, you can enforce a specific key to be required, rename them, perform automatic type conversion, and other goodies.

Installation

gem install yas
require 'yas'

Quick Example

require 'yas'

class MySchema < YAS::Schema
  rename :bar => :foo
end

h = { bar: "value" }
h.validate! MySchema
h[:foo]  # "value"
h[:bar]  # nil

Extensions

You can extend the behavior of YAS by writing your own custom extensions. YAS::Schema already comes with a set of awesome default extensions that you can immediately use. Optionally, you may also use YAS::SchemaBase if you want to start off from a clean slate.

Default Extensions

Attribute

Declares an attribute/key with various requirements. The Attribute extension allows you to specify certain requirements/restrictions for a given key. attribute and key are aliases, you can use either one.

attribute name, &block
key name, &block

Example:

class MySchema < YAS::Schema
  key :email do
    required
  end

  key :first_name do
    type String
  end
end

hash = { :first_name => 'John' }
hash.validate! MySchema # raises YAS::ValidationError "Key 'email' is missing"
hash.merge!(:email => 'john@email.com')
hash.validate! MySchema # Success!

You can also specify multiple keys per key/attribute block.

class MySchema < YAS::Schema
  attribute :email, :first_name do
    required
    type String
  end
end

List of directives you can use:

  • required

    Sets this key as required. Will raise an error if key is missing.

  • type(T)

    Sets the type of this key. Will perform type check if specified. Can be nested if type is a YAS::Schema!

  • auto_convert

    Enables auto-conversion to the specified type. This gets ignored if type is not specified.

  • default(&block)

    Runs the block to set the default value for this key, if it's missing or nil.

  • alter(&block)

    Adjust the value of this key. Can be useful if you want to enforce certain formatting, such as upper/lowercase, unique arrays, etc. Value returned by block will be used as the new value for this key, which then gets validated by the validate_value block.

  • validate_value(&block)

    Custom validation method to check the value of a key. This is useful in cases where you only want certain values to be stored (e.g a number between 1-10 only). Return true to indicate value passes validation, false for fail.

Rename

Using rename to rename keys.

rename :from => :to

Example:

class UserSchema < YAS::Schema
  rename :username => :nickname
end
hash = { :username => 'jdoe' } )
hash.validate!(UserSchema)
hash[:nickname] # 'jdoe'

Migrate

Migrate the value of a key. This is useful if you have keys whose values are in the old format and you want to convert them to the new format.

migrate :key, &block 

Example:

class UserSchema < YAS::Schema
  migrate :nicknames do |v|
    v.class == String ? [v] : v
  end
end
hash = { :nicknames => 'jdoe' }
hash.validate!(UserSchema)
hash[:nicknames] # ['jdoe']

Whitelist

Whitelist allows you to remove unneeded keys.

whitelist [keys]

Example:

class UserSchema < YAS::Schema
  whitelist :name, :address
end
hash = { :name => 'jdoe', :address => '123 Main St', :phone => '9990000000', :comment => 'JDoe is cool' }
hash.validate!(UserSchema)
hash[:name] # ['jdoe']
hash[:address] # ['123 Main St']
hash[:phone] # nil
hash[:comment] # nil

Symbolize

Symbolize keys in your hash. This does not perform deep symbolize. See type in the Attribute section for if you want deep symbolize.

symbolize true|false

Example:

class UserSchema < YAS::Schema
  symbolize true
end
hash = { 'name' => 'jdoe', 'address' => '123 Main St' }
hash.validate!(UserSchema)
hash[:name] # ['jdoe']

Duplicate

Duplicate the values of a key.

duplicate :source => :destination

Example:

class UserSchema < YAS::Schema
  duplicate :name => :first_name
end
hash = { :name => 'john' }
hash.validate!(UserSchema)
hash[:name] # 'john'
hash[:first_name] # 'john'