Sha256: 0a668ed0c8d0fa72529a2ff7173dface94f96ada16067852ba445cd8c9ad3e38

Contents?: true

Size: 1 KB

Versions: 3

Compression:

Stored size: 1 KB

Contents

module NYNY
  class RouteSignature
    NAME_PATTERN = /:(\S+)/

    attr_reader :pattern
    def initialize signature
      @pattern = pattern_for signature
    end

    def pattern_for string
      return string if string.is_a? Regexp
      return string unless string.include? ':'

      signature = string.start_with?('/') ? string : "/#{string}"
      build_regex signature
    end

    def build_regex signature
      groups = signature.split('/').map do |part|
        next part if part.empty?
        next part unless part.start_with? ':'
        name = NAME_PATTERN.match(part)[1]
        %Q{(?<#{name}>\\S+)}
      end.select {|s| !s.empty? }.join('\/')

      %r(\/#{groups})
    end

    def match path
      return (pattern == path ? {} : nil) if pattern.is_a?(String)
      data = pattern.match path

      if data
        if pattern.respond_to? :names
          Hash[data.names.map {|n| [n.to_sym, URI.unescape(data[n])]}]
        else
          {}
        end
      else
        nil
      end
    end
  end
end

Version data entries

3 entries across 3 versions & 1 rubygems

Version Path
nyny-1.0.2 lib/nyny/route_signature.rb
nyny-1.0.1 lib/nyny/route_signature.rb
nyny-1.0.0 lib/nyny/route_signature.rb