class GrapePathHelpers::DecoratedRoute

wrapper around Grape::Route that adds a helper method

Constants

PATH_SEGMENTS_REGEXP
PATH_SEGMENTS_WITH_WILDCARDS_REGEXP

Attributes

extension[R]
helper_arguments[R]
helper_names[R]
route[R]
route_options[R]

Public Class Methods

new(route) click to toggle source
# File lib/grape-path-helpers/decorated_route.rb, line 14
def initialize(route)
  @route = route
  @route_options = route.options
  @helper_names = []
  @helper_arguments = required_helper_segments
  @extension = default_extension
  define_path_helpers
end
sanitize_method_name(string) click to toggle source
# File lib/grape-path-helpers/decorated_route.rb, line 10
def self.sanitize_method_name(string)
  string.gsub(/\W|^[0-9]/, '_')
end

Public Instance Methods

default_extension() click to toggle source
# File lib/grape-path-helpers/decorated_route.rb, line 23
def default_extension
  pattern = /\((\.\:?\w+)\)$/
  match = route_path.match(pattern)
  return '' unless match
  ext = match.captures.first
  if ext == '.:format'
    ''
  else
    ext
  end
end
define_path_helper(method_name, route_attributes) click to toggle source
# File lib/grape-path-helpers/decorated_route.rb, line 44
    def define_path_helper(method_name, route_attributes)
      method_body = <<-RUBY
        def #{method_name}(attributes = {}, include_wildcard_segments = false)
          attrs = #{route_attributes}.merge(attributes)

          query_params = attrs.delete(:params)
          content_type = attrs.delete(:format)
          path = '/' + path_segments_with_values(attrs, include_wildcard_segments).join('/')

          path + content_type + query_string(query_params)
        end
      RUBY
      instance_eval method_body
    end
define_path_helpers() click to toggle source
# File lib/grape-path-helpers/decorated_route.rb, line 35
def define_path_helpers
  route_versions.each do |version|
    route_attributes = { version: version, format: extension }
    method_name = path_helper_name(route_attributes)
    @helper_names << method_name
    define_path_helper(method_name, route_attributes)
  end
end
dynamic_path_segments() click to toggle source
# File lib/grape-path-helpers/decorated_route.rb, line 121
def dynamic_path_segments
  segments = path_segments.select do |segment|
    dynamic_segment?(segment)
  end
  segments.map { |s| s.slice(1..-1) }
end
dynamic_segment?(segment) click to toggle source
# File lib/grape-path-helpers/decorated_route.rb, line 128
def dynamic_segment?(segment)
  segment.start_with?(':', '*')
end
optional_segment?(segment) click to toggle source
# File lib/grape-path-helpers/decorated_route.rb, line 132
def optional_segment?(segment)
  segment.start_with?('(')
end
path_helper_name(opts = {}) click to toggle source
# File lib/grape-path-helpers/decorated_route.rb, line 78
def path_helper_name(opts = {})
  if route_options[:as]
    name = route_options[:as].to_s
  else
    segments = path_segments_with_values(opts)

    name = if segments.empty?
             'root'
           else
             segments.join('_')
           end
  end

  sanitized_name = self.class.sanitize_method_name(name)
  sanitized_name + '_path'
end
path_segments(include_wildcard_segments = false) click to toggle source
# File lib/grape-path-helpers/decorated_route.rb, line 112
def path_segments(include_wildcard_segments = false)
  pattern = if include_wildcard_segments
              PATH_SEGMENTS_WITH_WILDCARDS_REGEXP
            else
              PATH_SEGMENTS_REGEXP
            end
  route_path.split(pattern).reject(&:blank?)
end
path_segments_with_values(opts, include_wildcard_segments = false) click to toggle source
# File lib/grape-path-helpers/decorated_route.rb, line 105
def path_segments_with_values(opts, include_wildcard_segments = false)
  segments = path_segments(include_wildcard_segments).map do |s|
    segment_to_value(s, opts)
  end
  segments.reject(&:blank?)
end
query_string(params) click to toggle source
# File lib/grape-path-helpers/decorated_route.rb, line 59
def query_string(params)
  if params.nil?
    ''
  else
    '?' + params.to_param
  end
end
required_helper_segments() click to toggle source
# File lib/grape-path-helpers/decorated_route.rb, line 136
def required_helper_segments
  segments_in_options = dynamic_path_segments.select do |segment|
    route.options[segment.to_sym]
  end
  dynamic_path_segments - segments_in_options
end
route_method() click to toggle source
# File lib/grape-path-helpers/decorated_route.rb, line 169
def route_method
  route.request_method
end
route_namespace() click to toggle source
# File lib/grape-path-helpers/decorated_route.rb, line 165
def route_namespace
  route.namespace
end
route_path() click to toggle source
# File lib/grape-path-helpers/decorated_route.rb, line 157
def route_path
  route.path
end
route_version() click to toggle source
# File lib/grape-path-helpers/decorated_route.rb, line 161
def route_version
  route.version
end
route_versions() click to toggle source
# File lib/grape-path-helpers/decorated_route.rb, line 67
def route_versions
  return [nil] if route_version.nil? || route_version.empty?

  if route_version.is_a?(String)
    version_pattern = /[^\[",\]\s]+/
    route_version.scan(version_pattern)
  else
    route_version
  end
end
segment_to_value(segment, opts = {}) click to toggle source
# File lib/grape-path-helpers/decorated_route.rb, line 95
def segment_to_value(segment, opts = {})
  if dynamic_segment?(segment)
    options = route.options.merge(stringify_keys(opts))
    key = segment.slice(1..-1).to_sym
    options[key]
  else
    segment
  end
end
special_keys() click to toggle source
# File lib/grape-path-helpers/decorated_route.rb, line 143
def special_keys
  %w[format params]
end
uses_segments_in_path_helper?(segments) click to toggle source
# File lib/grape-path-helpers/decorated_route.rb, line 147
def uses_segments_in_path_helper?(segments)
  segments = segments.reject { |x| special_keys.include?(x) }

  if helper_arguments.empty? && segments.any?
    false
  else
    helper_arguments.all? { |x| segments.include?(x) }
  end
end

Private Instance Methods

stringify_keys(original) click to toggle source
# File lib/grape-path-helpers/decorated_route.rb, line 175
def stringify_keys(original)
  original.each_with_object({}) do |(key, value), hash|
    hash[key.to_sym] = value
  end
end