Sha256: a91b82ef29fb054711a9430599f078bd558e2b4dda701c95a607b85a5dd26438

Contents?: true

Size: 866 Bytes

Versions: 1

Compression:

Stored size: 866 Bytes

Contents

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

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

    def pattern_for signature
      return signature if signature.is_a? Regexp
      build_regex(signature.start_with?('/') ? signature : "/#{signature}")
    end

    def build_regex signature
      return %r(^#{signature}$) unless signature.include?(':')

      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
      data = pattern.match path
      if data
        Hash[data.names.map {|n| [n.to_sym, URI.unescape(data[n])]}]
      end
    end
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
nyny-2.0.0 lib/nyny/route_signature.rb