Class: Mustermann::Pattern Abstract
- Inherits:
-
Object
- Object
- Mustermann::Pattern
- Includes:
- Mustermann
- Defined in:
- lib/mustermann/pattern.rb
Overview
Superclass for all pattern implementations.
Direct Known Subclasses
Constant Summary
Constants included from Mustermann
Class Method Summary collapse
-
.new(string, **options) ⇒ Mustermann::Pattern
A new instance of Mustermann::Pattern.
-
.supported?(option, **options) ⇒ Boolean
Whether or not option is supported.
-
.supported_options(*list) ⇒ Object
List of supported options.
Instance Method Summary collapse
-
#===(string) ⇒ Boolean
Whether or not the pattern matches the given string.
-
#=~(string) ⇒ Integer?
Nil if pattern does not match the string, zero if it does.
-
#expand(behavior = nil, values = {}) ⇒ String
Expanding is supported by almost all patterns (notable execptions are Shell, Regular and Simple).
-
#initialize(string, **options) ⇒ Pattern
constructor
A new instance of Pattern.
-
#match(string) ⇒ MatchData, ...
MatchData or similar object if the pattern matches.
-
#named_captures ⇒ Hash{String: Array<Integer>}
Capture names mapped to capture index.
-
#names ⇒ Array<String>
Capture names.
-
#params(string = nil, captures: nil, offset: 0) ⇒ Hash{String: String, Array<String>}?
Sinatra style params if pattern matches.
-
#peek(string) ⇒ String?
Tries to match the pattern against the beginning of the string (as opposed to the full string).
-
#peek_match(string) ⇒ MatchData, ...
Tries to match the pattern against the beginning of the string (as opposed to the full string).
-
#peek_params(string) ⇒ Array<Hash, Integer>?
Tries to match the pattern against the beginning of the string (as opposed to the full string).
-
#peek_size(string) ⇒ Integer?
Tries to match the pattern against the beginning of the string (as opposed to the full string).
-
#to_proc ⇒ Proc
Proc wrapping #===.
-
#to_s ⇒ String
The string representation of the pattern.
-
#to_templates ⇒ Array<String>
Generates a list of URI template strings representing the pattern.
-
#|(other) ⇒ Mustermann::Pattern
(also: #&, #^)
A composite pattern.
Methods included from Mustermann
Constructor Details
#initialize(string, **options) ⇒ Pattern
Returns a new instance of Pattern.
67 68 69 70 |
# File 'lib/mustermann/pattern.rb', line 67 def initialize(string, uri_decode: true, **) @uri_decode = uri_decode @string = string.to_s.dup end |
Class Method Details
.new(string, **options) ⇒ Mustermann::Pattern
Returns a new instance of Mustermann::Pattern.
49 50 51 52 53 54 55 56 57 |
# File 'lib/mustermann/pattern.rb', line 49 def self.new(string, ignore_unknown_options: false, **) unless unsupported = .keys.detect { |key| not supported?(key, **) } raise ArgumentError, "unsupported option %p for %p" % [unsupported, self] if unsupported end @map ||= Tool::EqualityMap.new @map.fetch(string, ) { super(string, ) } end |
.supported?(option, **options) ⇒ Boolean
Returns Whether or not option is supported.
39 40 41 |
# File 'lib/mustermann/pattern.rb', line 39 def self.supported?(option, **) .include? option end |
.supported_options ⇒ Array<Symbol> .supported_options(*list) ⇒ Array<Symbol>
List of supported options.
23 24 25 26 27 28 |
# File 'lib/mustermann/pattern.rb', line 23 def self.(*list) @supported_options ||= [] = @supported_options.concat(list) += superclass. if self < Pattern end |
Instance Method Details
#===(string) ⇒ Boolean
Needs to be overridden by subclass.
Returns Whether or not the pattern matches the given string.
97 98 99 |
# File 'lib/mustermann/pattern.rb', line 97 def ===(string) raise NotImplementedError, 'subclass responsibility' end |
#=~(string) ⇒ Integer?
Returns nil if pattern does not match the string, zero if it does.
89 90 91 |
# File 'lib/mustermann/pattern.rb', line 89 def =~(string) 0 if self === string end |
#expand(behavior = nil, values = {}) ⇒ String
211 212 213 |
# File 'lib/mustermann/pattern.rb', line 211 def (behavior = nil, values = {}) raise NotImplementedError, "expanding not supported by #{self.class}" end |
#match(string) ⇒ MatchData, ...
Returns MatchData or similar object if the pattern matches.
82 83 84 |
# File 'lib/mustermann/pattern.rb', line 82 def match(string) SimpleMatch.new(string) if self === string end |
#named_captures ⇒ Hash{String: Array<Integer>}
Returns capture names mapped to capture index.
163 164 165 |
# File 'lib/mustermann/pattern.rb', line 163 def named_captures {} end |
#names ⇒ Array<String>
Returns capture names.
169 170 171 |
# File 'lib/mustermann/pattern.rb', line 169 def names [] end |
#params(string = nil, captures: nil, offset: 0) ⇒ Hash{String: String, Array<String>}?
Returns Sinatra style params if pattern matches.
175 176 177 178 179 180 181 182 183 184 |
# File 'lib/mustermann/pattern.rb', line 175 def params(string = nil, captures: nil, offset: 0) return unless captures ||= match(string) params = named_captures.map do |name, positions| values = positions.map { |pos| map_param(name, captures[pos + offset]) }.flatten values = values.first if values.size < 2 and not always_array? name [name, values] end Hash[params] end |
#peek(string) ⇒ String?
Tries to match the pattern against the beginning of the string (as opposed to the full string). Will return the substring if it matches.
124 125 126 127 |
# File 'lib/mustermann/pattern.rb', line 124 def peek(string) size = peek_size(string) string[0, size] if size end |
#peek_match(string) ⇒ MatchData, ...
Tries to match the pattern against the beginning of the string (as opposed to the full string). Will return a MatchData or similar instance for the matched substring.
139 140 141 142 |
# File 'lib/mustermann/pattern.rb', line 139 def peek_match(string) matched = peek(string) match(matched) if matched end |
#peek_params(string) ⇒ Array<Hash, Integer>?
Tries to match the pattern against the beginning of the string (as opposed to the full string). Will return a two element Array with the params parsed from the substring as first entry and the length of the substring as second.
156 157 158 159 |
# File 'lib/mustermann/pattern.rb', line 156 def peek_params(string) match = peek_match(string) [params(captures: match), match.to_s.size] if match end |
#peek_size(string) ⇒ Integer?
Tries to match the pattern against the beginning of the string (as opposed to the full string). Will return the count of the matching characters if it matches.
110 111 112 113 |
# File 'lib/mustermann/pattern.rb', line 110 def peek_size(string) # this is a very naive, unperformant implementation string.size.downto(0).detect { |s| self === string[0, s] } end |
#to_proc ⇒ Proc
Returns proc wrapping #===.
299 300 301 |
# File 'lib/mustermann/pattern.rb', line 299 def to_proc @to_proc ||= method(:===).to_proc end |
#to_s ⇒ String
Returns the string representation of the pattern.
73 74 75 |
# File 'lib/mustermann/pattern.rb', line 73 def to_s @string.dup end |
#to_templates ⇒ Array<String>
This method is only implemented by certain subclasses.
Generates a list of URI template strings representing the pattern.
Note that this transformation is lossy and the strings matching these templates might not match the pattern (and vice versa).
This comes in quite handy since URI templates are not made for pattern matching. That way you can easily use a more precise template syntax and have it automatically generate hypermedia links for you.
Template generation is supported by almost all patterns (notable execptions are Shell, Regular and Simple). Union Composite patterns (with the | operator) support template generation if all patterns they are composed of also support it.
250 251 252 |
# File 'lib/mustermann/pattern.rb', line 250 def to_templates raise NotImplementedError, "template generation not supported by #{self.class}" end |
#|(other) ⇒ Mustermann::Pattern #&(other) ⇒ Mustermann::Pattern #^(other) ⇒ Mustermann::Pattern Also known as: &, ^
Returns a composite pattern.
286 287 288 |
# File 'lib/mustermann/pattern.rb', line 286 def |(other) Mustermann.new(self, other, operator: __callee__, type: :identity) end |