validations

Validations mixin
0.2.1 Latest release released
vladfaust/validations.cr
13 2 3
Vlad Faust

Validations

Built with Crystal Build status API Docs Releases Awesome vladfaust.com Patrons count Gitter chat

A validations module for Crystal.

Supporters

Thanks to all my patrons, I can continue working on beautiful Open Source Software! 🙏

Lauri Jutila, Alexander Maslov, Dainel Vera, Anton Yordanov

You can become a patron too in exchange of prioritized support and other perks

Become Patron

Installation

Add this to your application's shard.yml:

dependencies:
  validations:
    github: vladfaust/validations.cr
    version: ~> 0.2.0

This shard follows Semantic Versioning 2.0.0, so see releases and change the version accordingly.

Usage

This shards allows validation composition (i.e. inclusion of modules with custom validations and rules).

require "validations"

module CustomValidations
  include Validations

  rule :email do |attr, value, rule|
    invalidate(attr, "must be an email") unless /@/.match(value)
  end
end

struct User
  include Validations
  include CustomValidations

  property name : String
  property email : String
  @age : UInt8?
  @nilable : String?

  def initialize(@name, @email, @age : UInt8? = nil, @nilable : String? = nil)
  end

  validate name, size: (1..16), presence: true
  validate email, size: (6..64), email: true
  validate @age, gte: 18

  # Will not be run if `@nilable.nil?`
  validate @nilable, size: (5..10)

  # Custom validations are allowed
  def validate
    previous_def
    invalidate("name", "must not be equal to Vadim") if name == "Vadim"
  end
end

user = User.new("Vadim", "e-mail", 17)
user.valid? # false
pp user.invalid_attributes
# {
#   "name" => ["must have size in (1..16)", "must not be equal to Vadim"],
#   "email" => ["must have size in (6..64)", "must be an email"],
#   "@age" => ["must be greater than or equal to 18"]
# }

List of currently implemented rules

  • is: Object - check if attribute == object
  • presence: Bool - check unless attribute.nil?
  • gte: Comparable - check if attribute >= comparable
  • lte: Comparable - check if attribute <= comparable
  • gt: Comparable - check if attribute > comparable
  • lt: Comparable - check if attribute < comparable
  • in: Enumerable - check if enumerable.includes?(attribute)
  • size: Enumerable - check if enumerable.includes?(attribute.size)
  • size: Int - check if attribute.size == int
  • regex: Regex - check if regex.match(attribute)

Rules which need to be explicitly required

Some rules are not required with require "validations", you have to require them explicitly.

  • require "validations/rules/scheme" (related to URI scheme)
    • scheme: String - check if attribute.scheme == string
    • scheme: Enumerable - check if enumerable.includes?(attribute.scheme)

Contributing

  1. Fork it (https://github.com/vladfaust/validations.cr/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

Contributors

validations:
  github: vladfaust/validations.cr
  version: ~> 0.2.1
License MIT
Crystal 0.26.0

Authors

Dependencies 0

Development Dependencies 0

Dependents 0

Last synced .
search fire star recently