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 collapse
- PATTERN_METHODS =
%w[expand to_templates].map(&:to_sym)
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
- #&(other) ⇒ Object
-
#===(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.
- #^(other) ⇒ Object
- #expand(behavior = nil, values = {}) ⇒ String
-
#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, options = {}) ⇒ 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
A composite pattern.
Methods included from Mustermann
Constructor Details
#initialize(string, **options) ⇒ Pattern
Returns a new instance of Pattern.
70 71 72 73 74 |
# File 'lib/mustermann/pattern.rb', line 70 def initialize(string, = {}) uri_decode = .fetch(: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.
50 51 52 53 54 55 56 57 58 59 60 |
# File 'lib/mustermann/pattern.rb', line 50 def self.new(string, = {}) = .fetch(:ignore_unknown_options, false) .delete(:ignore_unknown_options) unless unsupported = .keys.detect { |key| not supported?(key, ) } raise ArgumentError, "unsupported option %p for %p" % [unsupported, self] if unsupported end @map ||= EqualityMap.new @map.fetch(string, ) { super(string, ) } end |
.supported?(option, options = {}) ⇒ Boolean
Returns Whether or not option is supported.
40 41 42 |
# File 'lib/mustermann/pattern.rb', line 40 def self.supported?(option, = {}) .include? option end |
.supported_options ⇒ Array<Symbol> .supported_options(*list) ⇒ Array<Symbol>
List of supported options.
24 25 26 27 28 29 |
# File 'lib/mustermann/pattern.rb', line 24 def self.(*list) @supported_options ||= [] = @supported_options.concat(list) += superclass. if self < Pattern end |
Instance Method Details
#&(other) ⇒ Object
297 298 299 |
# File 'lib/mustermann/pattern.rb', line 297 def &(other) Mustermann.new(self, other, :operator => :&, :type => :identity) end |
#===(string) ⇒ Boolean
Needs to be overridden by subclass.
Returns Whether or not the pattern matches the given string.
101 102 103 |
# File 'lib/mustermann/pattern.rb', line 101 def ===(string) raise NotImplementedError, 'subclass responsibility' end |
#=~(string) ⇒ Integer?
Returns nil if pattern does not match the string, zero if it does.
93 94 95 |
# File 'lib/mustermann/pattern.rb', line 93 def =~(string) 0 if self === string end |
#^(other) ⇒ Object
301 302 303 |
# File 'lib/mustermann/pattern.rb', line 301 def ^(other) Mustermann.new(self, other, :operator => :^, :type => :identity) end |
#expand(behavior = nil, values = {}) ⇒ String
218 219 220 |
# File 'lib/mustermann/pattern.rb', line 218 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.
86 87 88 |
# File 'lib/mustermann/pattern.rb', line 86 def match(string) SimpleMatch.new(string) if self === string end |
#named_captures ⇒ Hash{String: Array<Integer>}
Returns capture names mapped to capture index.
167 168 169 |
# File 'lib/mustermann/pattern.rb', line 167 def named_captures {} end |
#names ⇒ Array<String>
Returns capture names.
173 174 175 |
# File 'lib/mustermann/pattern.rb', line 173 def names [] end |
#params(string = nil, options = {}) ⇒ Hash{String: String, Array<String>}?
Returns Sinatra style params if pattern matches.
179 180 181 182 183 184 185 186 187 188 189 190 191 |
# File 'lib/mustermann/pattern.rb', line 179 def params(string = nil, = {}) , string = string, nil if string.is_a?(Hash) captures = .fetch(:captures, nil) offset = .fetch(: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.
128 129 130 131 |
# File 'lib/mustermann/pattern.rb', line 128 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.
143 144 145 146 |
# File 'lib/mustermann/pattern.rb', line 143 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.
160 161 162 163 |
# File 'lib/mustermann/pattern.rb', line 160 def peek_params(string) match = peek_match(string) [params(nil, :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.
114 115 116 117 |
# File 'lib/mustermann/pattern.rb', line 114 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 #===.
311 312 313 |
# File 'lib/mustermann/pattern.rb', line 311 def to_proc @to_proc ||= method(:===).to_proc end |
#to_s ⇒ String
Returns the string representation of the pattern.
77 78 79 |
# File 'lib/mustermann/pattern.rb', line 77 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 Sinatra, Rails, Template and Identity patterns. Union Composite patterns (with the | operator) support template generation if all patterns they are composed of also support it.
257 258 259 |
# File 'lib/mustermann/pattern.rb', line 257 def to_templates raise NotImplementedError, "template generation not supported by #{self.class}" end |
#|(other) ⇒ Mustermann::Pattern #&(other) ⇒ Mustermann::Pattern #^(other) ⇒ Mustermann::Pattern
Returns a composite pattern.
293 294 295 |
# File 'lib/mustermann/pattern.rb', line 293 def |(other) Mustermann.new(self, other, :operator => :|, :type => :identity) end |