module SimpleJSONSchema::Validators::Concerns::Format

Constants

ASCII_REGEX
DATE_TIME_OFFSET_REGEX
EMAIL_REGEX

this is no good

HOSTNAME_REGEX
INVALID_QUERY_REGEX
LABEL_REGEX_STRING

Public Instance Methods

valid_format(scope) click to toggle source
# File lib/simple_json_schema/validators/concerns/format.rb, line 15
def valid_format(scope)
  format = scope[:format]
  return if format.nil?
  return if valid_spec_format?(scope.value, format)

  scope.error(:format)
end

Private Instance Methods

iri_escape(value) click to toggle source
# File lib/simple_json_schema/validators/concerns/format.rb, line 111
def iri_escape(value)
  value.gsub(ASCII_REGEX) do |match|
    us = match
    tmp = +''
    us.each_byte do |uc|
      tmp << format('%%%02X', uc)
    end
    tmp
  end.force_encoding(Encoding::US_ASCII)
end
parse_uri_scheme(value) click to toggle source
# File lib/simple_json_schema/validators/concerns/format.rb, line 90
def parse_uri_scheme(value)
  scheme, _, _, _, _, _, opaque, query, = URI::RFC3986_PARSER.split(value)
  # URI::RFC3986_PARSER.parse allows spaces in these and I don't think it should
  raise URI::InvalidURIError if INVALID_QUERY_REGEX.match?(query) || INVALID_QUERY_REGEX.match?(opaque)

  scheme
end
valid_date_time?(value) click to toggle source

rubocop:enable Metrics/AbcSize, Metrics/CyclomaticComplexity, Metrics/MethodLength

# File lib/simple_json_schema/validators/concerns/format.rb, line 66
def valid_date_time?(value)
  DateTime.rfc3339(value)
  DATE_TIME_OFFSET_REGEX.match?(value)
rescue ArgumentError => e
  raise e unless e.message == 'invalid date'

  false
end
valid_email?(value) click to toggle source
# File lib/simple_json_schema/validators/concerns/format.rb, line 75
def valid_email?(value)
  EMAIL_REGEX.match?(value)
end
valid_hostname?(value) click to toggle source
# File lib/simple_json_schema/validators/concerns/format.rb, line 79
def valid_hostname?(value)
  HOSTNAME_REGEX.match?(value) && value.split('.').all? { |label| label.size <= 63 }
end
valid_ip?(value, type) click to toggle source
# File lib/simple_json_schema/validators/concerns/format.rb, line 83
def valid_ip?(value, type)
  ip_address = IPAddr.new(value)
  type == :v4 ? ip_address.ipv4? : ip_address.ipv6?
rescue IPAddr::InvalidAddressError
  false
end
valid_spec_format?(value, format) click to toggle source

rubocop:disable Metrics/AbcSize, Metrics/CyclomaticComplexity, Metrics/MethodLength

# File lib/simple_json_schema/validators/concerns/format.rb, line 26
def valid_spec_format?(value, format)
  case format
  when 'date-time'
    valid_date_time?(value)
  when 'date'
    valid_date_time?("#{value}T04:05:06.123456789+07:00")
  when 'time'
    valid_date_time?("2001-02-03T#{value}")
  when 'email'
    value.ascii_only? && valid_email?(value)
  when 'idn-email'
    valid_email?(value)
  when 'hostname'
    value.ascii_only? && valid_hostname?(value)
  when 'idn-hostname'
    valid_hostname?(value)
  when 'ipv4'
    valid_ip?(value, :v4)
  when 'ipv6'
    valid_ip?(value, :v6)
  when 'uri'
    valid_uri?(value)
  when 'uri-reference'
    valid_uri_reference?(value)
  when 'iri'
    valid_uri?(iri_escape(value))
  when 'iri-reference'
    valid_uri_reference?(iri_escape(value))
  # when 'uri-template'
  #   valid_uri_template?(value)
  when 'json-pointer'
    Checker.json_pointer?(value)
  when 'relative-json-pointer'
    Checker.relative_json_pointer?(value)
  when 'regex'
    EcmaReValidator.valid?(value)
  end
end
valid_uri?(value) click to toggle source
# File lib/simple_json_schema/validators/concerns/format.rb, line 98
def valid_uri?(value)
  !parse_uri_scheme(value).nil?
rescue URI::InvalidURIError
  false
end
valid_uri_reference?(value) click to toggle source
# File lib/simple_json_schema/validators/concerns/format.rb, line 104
def valid_uri_reference?(value)
  parse_uri_scheme(value)
  true
rescue URI::InvalidURIError
  false
end