Class: URLValidation

Inherits:
Validation show all
Defined in:
lib/json_patterns.rb

Constant Summary collapse

@@url_regexp =

TODO: Replace this with a conjunction of RegexpValidations with customized errors?

Regexp::new("^" +
# protocol identifier
"(?:(?:https?|ftp)://)" +
# user:pass authentication
"(?:\\S+(?::\\S*)?@)?" +
"(?:" +
# IP address exclusion
# private & local networks
"(?!10(?:\\.\\d{1,3}){3})" +
"(?!127(?:\\.\\d{1,3}){3})" +
"(?!169\\.254(?:\\.\\d{1,3}){2})" +
"(?!192\\.168(?:\\.\\d{1,3}){2})" +
"(?!172\\.(?:1[6-9]|2\\d|3[0-1])(?:\\.\\d{1,3}){2})" +
# IP address dotted notation octets
# excludes loopback network 0.0.0.0
# excludes reserved space >= 224.0.0.0
# excludes network & broadcast addresses
# (first & last IP address of each class)
"(?:[1-9]\\d?|1\\d\\d|2[01]\\d|22[0-3])" +
"(?:\\.(?:1?\\d{1,2}|2[0-4]\\d|25[0-5])){2}" +
"(?:\\.(?:[1-9]\\d?|1\\d\\d|2[0-4]\\d|25[0-4]))" +
"|" +
# host name
"(?:(?:[a-z\\u00a1-\\uffff0-9]+-?)*[a-z\\u00a1-\\uffff0-9]+)" +
# domain name
"(?:\\.(?:[a-z\\u00a1-\\uffff0-9]+-?)*[a-z\\u00a1-\\uffff0-9]+)*" +
# TLD identifier
"(?:\\.(?:[a-z\\u00a1-\\uffff]{2,}))" +
")" +
# port number
"(?::\\d{2,5})?" +
# resource path
"(?:/[^\\s]*)?" +
"$", true
)

Constants included from Inspectable

Inspectable::INSPECTING_KEY

Instance Method Summary collapse

Methods inherited from Validation

#as_object_members, #expects_an_object?, memoized_new_from_pattern, new_from_pattern, #shallow_describe, #shallow_match?, #validate_from_root

Methods included from HashInitialized

#initialize

Methods included from DeepEquality

#==

Methods included from Inspectable

#inspect

Instance Method Details

#to_sObject



1086
1087
1088
# File 'lib/json_patterns.rb', line 1086

def to_s
  'URL'
end

#validate(path, data) ⇒ Object



1066
1067
1068
1069
1070
1071
1072
1073
1074
1075
1076
1077
1078
1079
1080
1081
1082
1083
1084
# File 'lib/json_patterns.rb', line 1066

def validate(path, data)
  if data.is_a? String
    if data =~ @@url_regexp
      return []
    else
      return [ValidationUnexpected.new(
        path: path,
        expected: "URL",
        found: data.inspect,
      )]
    end
  else
    return [ValidationUnexpected.new(
      path: path,
      expected: 'string',
      found: json_type_name(data),
    )]
  end
end