gitlab-org--gitlab-foss/app/validators/devise_email_validator.rb
Horatiu Eugen Vlad c8c0ea6c52 Align EmailValidator to validate_email gem implementation.
Renamed EmailValidator to DeviseEmailValidator to avoid 'email:' naming collision with ActiveModel::Validations::EmailValidator in 'validates' statement.
Make use of the options attribute of the parent class ActiveModel::EachValidator.
Add more options: regex.
2019-03-05 19:56:01 +00:00

36 lines
1.2 KiB
Ruby

# frozen_string_literal: true
# DeviseEmailValidator
#
# Custom validator for email formats. It asserts that there are no
# @ symbols or whitespaces in either the localpart or the domain, and that
# there is a single @ symbol separating the localpart and the domain.
#
# The available options are:
# - regexp: Email regular expression used to validate email formats as instance of Regexp class.
# If provided value has different type then a new Rexexp class instance is created using the value.
# Default: +Devise.email_regexp+
#
# Example:
# class User < ActiveRecord::Base
# validates :personal_email, devise_email: true
#
# validates :public_email, devise_email: { regexp: Devise.email_regexp }
# end
class DeviseEmailValidator < ActiveModel::EachValidator
DEFAULT_OPTIONS = {
regexp: Devise.email_regexp
}.freeze
def initialize(options)
options.reverse_merge!(DEFAULT_OPTIONS)
raise ArgumentError, "Expected 'regexp' argument of type class Regexp" unless options[:regexp].is_a?(Regexp)
super(options)
end
def validate_each(record, attribute, value)
record.errors.add(attribute, :invalid) unless value =~ options[:regexp]
end
end