Sha256: 3361cb2b2d129d7b970207ea32451d5e29ee85089de4fda5a3670a69e0bb03fc

Contents?: true

Size: 1.82 KB

Versions: 9

Compression:

Stored size: 1.82 KB

Contents

module Deas
  class Url

    def self.http_query(hash, &escape_value_proc)
      escape_value_proc ||= proc{ |v| v.to_s }
      hash.map do |(key, value)|
        "#{key}=#{escape_value_proc.call(value)}"
      end.sort.join('&')
    end

    attr_reader :name, :path
    attr_reader :escape_query_value_proc

    def initialize(name, path, options = nil)
      options ||= {}
      @name, @path = name, path
      @escape_query_value_proc = options[:escape_query_value]
    end

    def path_for(*args)
      hashed, ordered = [
        args.last.kind_of?(::Hash) ? args.pop : {},
        args
      ]
      apply_ordered(apply_hashed(@path, hashed), ordered)
    end

    private

    def apply_ordered(path, params)
      params.inject(path){ |p, v| p.sub(/\*+|\:\w+/i, v.to_s) }.gsub(/\/\/+/, '/')
    end

    def apply_hashed(path, params)
      # don't alter the given params
      h = params.dup

      # ignore captures in applying params
      captures = h.delete(:captures) || h.delete('captures') || []
      splat    = h.delete(:splat)    || h.delete('splat')    || []
      anchor   = h.delete(:'#')      || h.delete('#')        || nil

      apply_anchor(apply_extra(apply_named(apply_splat(path, splat), h), h), anchor)
    end

    def apply_splat(path, params)
      params.inject(path){ |p, v| p.sub(/\*+/, v.to_s) }
    end

    def apply_named(path, params)
      params.inject(path) do |p, (k, v)|
        if p.include?(":#{k}")
          params.delete(k)
          p.gsub(":#{k}", v.to_s)
        else
          p
        end
      end
    end

    def apply_extra(path, params)
      return path if params.empty?
      query_string = Deas::Url.http_query(params, &self.escape_query_value_proc)
      "#{path}?#{query_string}"
    end

    def apply_anchor(path, anchor)
      anchor.to_s.empty? ? path : "#{path}##{anchor}"
    end

  end
end

Version data entries

9 entries across 9 versions & 1 rubygems

Version Path
deas-0.40.0 lib/deas/url.rb
deas-0.39.2 lib/deas/url.rb
deas-0.39.1 lib/deas/url.rb
deas-0.39.0 lib/deas/url.rb
deas-0.38.0 lib/deas/url.rb
deas-0.37.1 lib/deas/url.rb
deas-0.37.0 lib/deas/url.rb
deas-0.36.0 lib/deas/url.rb
deas-0.35.0 lib/deas/url.rb