Sha256: d3f71947be8afd0c73f878725288a8278058b08207fd3dda1a1712ebf368a49b

Contents?: true

Size: 1.35 KB

Versions: 1

Compression:

Stored size: 1.35 KB

Contents

require "active_model"
require "active_model/validator"

module DomainValidator
  class Validator < ActiveModel::EachValidator
    
    RE_DOMAIN = %r(^(?=.{1,255}$)[0-9A-Za-z](?:(?:[0-9A-Za-z]|-){0,61}[0-9A-Za-z])?(?:\.[0-9A-Za-z](?:(?:[0-9A-Za-z]|-){0,61}[0-9A-Za-z])?)+$)

    def validate_each(record, attr_name, value)
      validate_domain_format(record, attr_name, value)
      # Only waste time with DNS check if record is invalid?
      validate_domain_dns(record, attr_name, value) if record.errors.empty? && options[:verify_dns]
    end

    def validate_domain_format(record, attr_name, value)
      valid_domain = is_valid_domain?(value)
      record.errors.add(attr_name, options[:message] || "is invalid") unless valid_domain
    end

    def validate_domain_dns(record, attr_name, value)
      valid_domain = has_dns_record?(value)
      record.errors.add(attr_name, verify_dns_message || "does not have a DNS record") unless valid_domain
    end

    def is_valid_domain?(domain)
      domain =~ RE_DOMAIN
    end

    def has_dns_record?(domain)
      options[:verify_dns] ? DnsCheck.has_record?(domain) : true
    end

    def verify_dns_message
      verify_dns = options[:verify_dns]
      if verify_dns.is_a? Hash
        verify_dns[:message] || options[:message]
      end
    end

  end
end

ActiveModel::Validations::DomainValidator = DomainValidator::Validator

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
domain_validator-0.1.1 lib/domain_validator/validator.rb