module Grape::DSL::InsideRoute::PostBeforeFilter

Methods which should not be available in filters until the before filter has completed

Public Instance Methods

declared(passed_params, options = {}, declared_params = nil, params_nested_path = []) click to toggle source
# File lib/grape/dsl/inside_route.rb, line 31
def declared(passed_params, options = {}, declared_params = nil, params_nested_path = [])
  options = options.reverse_merge(include_missing: true, include_parent_namespaces: true)
  declared_params ||= optioned_declared_params(**options)

  if passed_params.is_a?(Array)
    declared_array(passed_params, options, declared_params, params_nested_path)
  else
    declared_hash(passed_params, options, declared_params, params_nested_path)
  end
end

Private Instance Methods

declared_array(passed_params, options, declared_params, params_nested_path) click to toggle source
# File lib/grape/dsl/inside_route.rb, line 44
def declared_array(passed_params, options, declared_params, params_nested_path)
  passed_params.map do |passed_param|
    declared(passed_param || {}, options, declared_params, params_nested_path)
  end
end
declared_hash(passed_params, options, declared_params, params_nested_path) click to toggle source
# File lib/grape/dsl/inside_route.rb, line 50
def declared_hash(passed_params, options, declared_params, params_nested_path)
  renamed_params = route_setting(:renamed_params) || {}

  declared_params.each_with_object(passed_params.class.new) do |declared_param, memo|
    if declared_param.is_a?(Hash)
      declared_param.each_pair do |declared_parent_param, declared_children_params|
        params_nested_path_dup = params_nested_path.dup
        params_nested_path_dup << declared_parent_param.to_s
        next unless options[:include_missing] || passed_params.key?(declared_parent_param)

        rename_path = params_nested_path + [declared_parent_param.to_s]
        renamed_param_name = renamed_params[rename_path]

        memo_key = optioned_param_key(renamed_param_name || declared_parent_param, options)
        passed_children_params = passed_params[declared_parent_param] || passed_params.class.new

        memo[memo_key] = handle_passed_param(params_nested_path_dup, passed_children_params.any?) do
          declared(passed_children_params, options, declared_children_params, params_nested_path_dup)
        end
      end
    else
      # If it is not a Hash then it does not have children.
      # Find its value or set it to nil.
      next unless options[:include_missing] || passed_params.key?(declared_param)

      rename_path = params_nested_path + [declared_param.to_s]
      renamed_param_name = renamed_params[rename_path]

      memo_key = optioned_param_key(renamed_param_name || declared_param, options)
      passed_param = passed_params[declared_param]

      params_nested_path_dup = params_nested_path.dup
      params_nested_path_dup << declared_param.to_s
      memo[memo_key] = passed_param || handle_passed_param(params_nested_path_dup) do
        passed_param
      end
    end
  end
end
handle_passed_param(params_nested_path, has_passed_children = false) { || ... } click to toggle source
# File lib/grape/dsl/inside_route.rb, line 90
def handle_passed_param(params_nested_path, has_passed_children = false, &_block)
  return yield if has_passed_children

  key = params_nested_path[0]
  key += "[#{params_nested_path[1..-1].join('][')}]" if params_nested_path.size > 1

  route_options_params = options[:route_options][:params] || {}
  type = route_options_params.dig(key, :type)
  has_children = route_options_params.keys.any? { |k| k != key && k.start_with?(key) }

  if type == 'Hash' && !has_children
    {}
  elsif type == 'Array' || (type&.start_with?('[') && !type&.include?(','))
    []
  elsif type == 'Set' || type&.start_with?('#<Set')
    Set.new
  else
    yield
  end
end
optioned_declared_params(**options) click to toggle source
# File lib/grape/dsl/inside_route.rb, line 115
def optioned_declared_params(**options)
  declared_params = if options[:include_parent_namespaces]
                      # Declared params including parent namespaces
                      route_setting(:declared_params)
                    else
                      # Declared params at current namespace
                      namespace_stackable(:declared_params).last || []
                    end

  raise ArgumentError, 'Tried to filter for declared parameters but none exist.' unless declared_params

  declared_params
end
optioned_param_key(declared_param, options) click to toggle source
# File lib/grape/dsl/inside_route.rb, line 111
def optioned_param_key(declared_param, options)
  options[:stringify] ? declared_param.to_s : declared_param.to_sym
end