Sha256: 2bdebd5fd56aad279280b433c1f92b78cc49d93ae4c6ce8743c93e3942ba1ab0

Contents?: true

Size: 1.31 KB

Versions: 28

Compression:

Stored size: 1.31 KB

Contents

require 'uri_template'

module Spyke
  class InvalidPathError < StandardError; end
  class Path

    def initialize(pattern, params = {})
      @pattern = pattern
      @params = params.symbolize_keys
    end

    def join(other_path)
      self.class.new File.join(path, other_path.to_s), @params
    end

    def to_s
      path
    end

    def variables
      @variables ||= uri_template.variables.map(&:to_sym)
    end

    private

      def uri_template
        @uri_template ||= URITemplate.new(:colon, pattern_with_rfc_style_parens)
      end

      def pattern_with_rfc_style_parens
        @pattern.gsub('(', '{').gsub(')', '}')
      end

      def path
        validate_required_params!
        uri_template.expand(@params).chomp('/')
      end

      def validate_required_params!
        if missing_required_params.any?
          raise Spyke::InvalidPathError, "Missing required params: #{missing_required_params.join(', ')} in #{@pattern}. Mark optional params with parens eg: (:param)"
        end
      end

      def missing_required_params
        required_params - params_with_values
      end

      def params_with_values
        @params.map do |key, value|
          key if value.present?
        end.compact
      end

      def required_params
        @pattern.scan(/\/:(\w+)/).flatten.map(&:to_sym)
      end
  end
end

Version data entries

28 entries across 28 versions & 1 rubygems

Version Path
spyke-5.0.0 lib/spyke/path.rb
spyke-4.1.1 lib/spyke/path.rb
spyke-4.1.0 lib/spyke/path.rb
spyke-4.0.1 lib/spyke/path.rb
spyke-4.0.0 lib/spyke/path.rb
spyke-3.1.5 lib/spyke/path.rb
spyke-3.1.4 lib/spyke/path.rb
spyke-3.1.3 lib/spyke/path.rb
spyke-3.1.2 lib/spyke/path.rb
spyke-3.1.1 lib/spyke/path.rb
spyke-3.1.0 lib/spyke/path.rb
spyke-3.0.0 lib/spyke/path.rb
spyke-2.0.1 lib/spyke/path.rb
spyke-2.0.0 lib/spyke/path.rb
spyke-1.8.11 lib/spyke/path.rb
spyke-1.8.10 lib/spyke/path.rb
spyke-1.8.9 lib/spyke/path.rb
spyke-1.8.8 lib/spyke/path.rb
spyke-1.8.7 lib/spyke/path.rb
spyke-1.8.6 lib/spyke/path.rb