Class: Fuzzyurl::Match
- Inherits:
-
Object
- Object
- Fuzzyurl::Match
- Defined in:
- lib/fuzzyurl/match.rb
Class Method Summary collapse
-
.best_match_index(masks, url) ⇒ Object
From a list of Fuzzyurl
masks, returns the index of the one which best matchesurl. -
.fuzzy_match(mask, value) ⇒ Object
If
mask(which may contain * wildcards) matchesurl(which may not), returns 1 ifmaskandurlmatch perfectly, 0 ifmaskandurlare a wildcard match, or null otherwise. -
.match(mask, url) ⇒ Object
If
mask(which may contain * wildcards) matchesurl(which may not), returns an integer representing how closely they match (higher is closer). -
.match_scores(mask, url) ⇒ Object
Returns a Fuzzyurl-like object containing values representing how well different parts of
maskandurlmatch. -
.matches?(mask, url) ⇒ Boolean
If
mask(which may contain * wildcards) matchesurl(which may not), returns true; otherwise returns false.
Class Method Details
.best_match_index(masks, url) ⇒ Object
From a list of Fuzzyurl masks, returns the index of the one which best
matches url. Returns null if none of masks match.
60 61 62 63 64 65 66 67 68 69 70 71 |
# File 'lib/fuzzyurl/match.rb', line 60 def best_match_index(masks, url) best_index = nil best_score = -1 masks.each_with_index do |mask, i| score = match(mask, url) if score && score > best_score best_score = score best_index = i end end best_index end |
.fuzzy_match(mask, value) ⇒ Object
If mask (which may contain * wildcards) matches url (which may not),
returns 1 if mask and url match perfectly, 0 if mask and url
are a wildcard match, or null otherwise.
Wildcard language:
* matches anything
foo/* matches "foo/" and "foo/bar/baz" but not "foo"
foo/** matches "foo/" and "foo/bar/baz" and "foo"
*.example.com matches "api.v1.example.com" but not "example.com"
**.example.com matches "api.v1.example.com" and "example.com"
Any other form is treated as a literal match.
91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 |
# File 'lib/fuzzyurl/match.rb', line 91 def fuzzy_match(mask, value) return 0 if mask == "*" return 1 if mask == value return nil if !mask || !value if mask.index("**.") == 0 mask_value = mask[3..-1] return 0 if value.end_with?(".#{mask_value}") return 0 if mask_value == value return nil end if mask.index("*") == 0 return 0 if value.end_with?(mask[1..-1]) return nil end rev_mask = mask.reverse rev_value = value.reverse if rev_mask.index("**/") == 0 rev_mask_value = rev_mask[3..-1] return 0 if rev_value.end_with?("/#{rev_mask_value}") return 0 if rev_mask_value == rev_value return nil end if rev_mask.index("*") == 0 return 0 if rev_value.end_with?(rev_mask[1..-1]) return nil end nil end |
.match(mask, url) ⇒ Object
If mask (which may contain * wildcards) matches url (which may not),
returns an integer representing how closely they match (higher is closer).
If mask does not match url, returns null.
13 14 15 16 17 |
# File 'lib/fuzzyurl/match.rb', line 13 def match(mask, url) scores = match_scores(mask, url) return nil if scores.values.include?(nil) scores.values.reduce(:+) end |
.match_scores(mask, url) ⇒ Object
Returns a Fuzzyurl-like object containing values representing how well
different parts of mask and url match. Values are integers for
matches or null for no match; higher integers indicate a better match.
38 39 40 41 42 43 44 45 46 47 48 49 50 51 |
# File 'lib/fuzzyurl/match.rb', line 38 def match_scores(mask, url) url_protocol = url.protocol || Fuzzyurl::Protocols.get_protocol(url.port) url_port = url.port || Fuzzyurl::Protocols.get_port(url.protocol) { protocol: fuzzy_match(mask.protocol, url_protocol), username: fuzzy_match(mask.username, url.username), password: fuzzy_match(mask.password, url.password), hostname: fuzzy_match(mask.hostname, url.hostname), port: fuzzy_match(mask.port, url_port), path: fuzzy_match(mask.path, url.path), query: fuzzy_match(mask.query, url.query), fragment: fuzzy_match(mask.fragment, url.fragment) } end |
.matches?(mask, url) ⇒ Boolean
If mask (which may contain * wildcards) matches url (which may not),
returns true; otherwise returns false.
26 27 28 |
# File 'lib/fuzzyurl/match.rb', line 26 def matches?(mask, url) match(mask, url) != nil end |