lib/lite/validators/url_validator.rb in lite-validators-1.3.2 vs lib/lite/validators/url_validator.rb in lite-validators-1.4.0

- old
+ new

@@ -9,40 +9,45 @@ ].freeze def validate_each(record, attribute, value) assign_attr_readers(record, attribute, URI.parse(value.to_s)) valid_attr? - rescue URI::InvalidURIError + rescue URI::BadURIError, URI::InvalidURIError record.errors.add(attribute, *error_message) end private - def scheme - options[:scheme] || UrlValidator::SCHEMES - end - def error_message_for(option) options[:message] || I18n.t("errors.messages.url.#{option}") end + # rubocop:disable Layout/LineLength, Metrics/AbcSize def valid_attr? raise URI::InvalidURIError if value.to_s.strip.empty? - valid_uri? && valid_domain? && valid_scheme? && valid_root? + valid_uri? && valid_host? && valid_domain? && valid_scheme? && valid_root? end - # rubocop:disable Layout/LineLength, Metrics/AbcSize def valid_domain? return true unless options[:domain] value_downcased = value.host.to_s.downcase check = Array(options[:domain]).any? { |domain| value_downcased.end_with?(".#{domain.downcase}") } record.errors.add(attribute, error_message_for(:domain)) unless check end - # rubocop:enable Layout/LineLength, Metrics/AbcSize + def valid_host? + hosts = options[:include_host] || options[:exclude_host] + return true unless hosts + + value_downcased = value.host.to_s.downcase + check = options[:include_host] ? :any? : :none? + check = Array(hosts).send(check) { |host| value_downcased.include?(host.to_s.downcase) } + record.errors.add(attribute, error_message_for(:host)) unless check + end + def valid_root? return true unless options[:root_only] check = ['', '/'].include?(value.path) && value.query.blank? && value.fragment.blank? record.errors.add(attribute, error_message_for(:root)) unless check @@ -50,14 +55,16 @@ def valid_scheme? return true unless options[:scheme] value_downcased = value.scheme.to_s.downcase - check = Array(scheme).any? { |sch| value_downcased == sch.to_s.downcase } + schemes = options[:scheme] || SCHEMES + check = Array(schemes).any? { |scheme| value_downcased == scheme.to_s.downcase } record.errors.add(attribute, error_message_for(:scheme)) unless check end def valid_uri? value.is_a?(URI::Generic) end + # rubocop:enable Layout/LineLength, Metrics/AbcSize end