class SkinnyControllers::Lookup

This class provides a way to determine all names / classes of operations and policies based on he given information.

The class methods show what is required for each scenario

Public Class Methods

from_controller(controller_class:, verb:, model_class:) click to toggle source
# File lib/skinny_controllers/lookup.rb, line 12
def from_controller(controller_class:, verb:, model_class:)
  Lookup.new(
    controller_class_name: controller_class.name,
    verb:                  verb,
    model_class:           model_class
  )
end
from_operation(operation_class:, model_class:) click to toggle source
# File lib/skinny_controllers/lookup.rb, line 20
def from_operation(operation_class:, model_class:)
  qualified_name = operation_class.name
  parts = qualified_name.split('::')
  operation_name = parts[-2]
  operation_parts = operation_name.split(SkinnyControllers.operations_suffix)

  Lookup.new(
    verb:            parts.last,
    # namespace:       parts[0..-3],
    operation_name:  operation_name,
    operation_class: operation_class,
    model_class:     model_class,
    namespace:       qualified_name.deconstantize.deconstantize
  )
end
new(args = {}) click to toggle source

@param [Hash] args - all possible parameters

# File lib/skinny_controllers/lookup.rb, line 45
def initialize(args = {})
  @controller_class_name = args[:controller_class_name]
  @controller_class = args[:controller_class]
  @verb_for_action = args[:verb]
  @operation_name = args[:operation_name]
  @operation_class = args[:operation_class]
  @model_name = args[:model_name]
  @namespace = args[:namespace]
  @model_class = args[:model_class]
  @policy_method_name = args[:policy_method_name]
  @options = args[:options] || {}
end

Public Instance Methods

controller_class_name() click to toggle source
# File lib/skinny_controllers/lookup.rb, line 145
def controller_class_name
  @controller_class_name ||= @controller_class&.name
end
model_class() click to toggle source
# File lib/skinny_controllers/lookup.rb, line 85
def model_class
  @model_class ||= @options[:model_class] || model_name.safe_constantize
end
model_name() click to toggle source
# File lib/skinny_controllers/lookup.rb, line 89
def model_name
  @model_name ||= @model_class.try(:name) || resource_name
end
namespace() click to toggle source

@return [String] the namespace

# File lib/skinny_controllers/lookup.rb, line 120
def namespace
  @namespace ||= begin
    resource_parts.length > 1 ? resource_parts[0..-2].join('::') : ''
  end
end
namespace_lookup(qualified_name) click to toggle source
# File lib/skinny_controllers/lookup/ensure_existence.rb, line 47
def namespace_lookup(qualified_name)
  klass = class_for_qualified_name(qualified_name)
  # Return if the constant exists, or if we can't travel
  # up any higher.
  return klass if klass
  return unless qualified_name.include?('::')

  parts = qualified_name.split('::')

  # Api::V2::CategoriesNamespace
  # => Api::CategoriesNamespace
  demodulized = qualified_name.demodulize
  namespace = parts[0..-3]
  next_lookup = [namespace, demodulized].reject(&:blank?).join('::')
  result = namespace_lookup(next_lookup)
  return result if result

  # Api::V2::CategoriesNamespace
  # => V2::CategoriesNamespace
  next_lookup = parts[1..-1].join('::')
  namespace_lookup(next_lookup)
end
namespaced_operation_name() click to toggle source

@return [String] name of the supposed operation class

# File lib/skinny_controllers/lookup.rb, line 94
def namespaced_operation_name
  @namespaced_operation_name ||= [
    operation_namespace,
    @verb_for_action
  ].reject(&:blank?).join('::')
end
namespaced_policy_name() click to toggle source
# File lib/skinny_controllers/lookup.rb, line 101
def namespaced_policy_name
  @namespaced_policy_name ||= [
    namespace,
    "#{resource_name}#{SkinnyControllers.policy_suffix}"
  ].reject(&:blank?).join('::')
end
operation_class() click to toggle source

PostsController

> PostOperations::Verb

Api::V2::PostsController

> Api::V2::PostOperations::Verb

# File lib/skinny_controllers/lookup.rb, line 63
def operation_class
  @operation_class ||= begin
    found_namespace = ensure_namespace!(operation_namespace)

    operation = namespaced_operation_name.split(found_namespace.name).last
    qualified_name = found_namespace ? found_namespace.name + operation : namespaced_operation_name

    ensure_operation_class!(qualified_name)
  end
end
operation_lookup(qualified_name) click to toggle source
# File lib/skinny_controllers/lookup/ensure_existence.rb, line 90
def operation_lookup(qualified_name)
  klass = class_for_qualified_name(qualified_name)
  # Return if the constant exists, or if we can't travel
  # up any higher.
  return klass if klass
  return unless qualified_name.scan(/::/).count > 1

  # "Api::V1::CategoryOperations::Create"
  # => "CategorOperations::Create"
  parts = qualified_name.split('::')
  target = parts[-2..-1]

  # TODO: Lookup Chopping of namespaces going ->
  # "Api::V1::CategoryOperations::Create"
  # => "V1::CategoryOperaitons::Create"

  # Lookup Chopping of namespaces going <-
  # "Api::V1::CategoryOperations::Create"
  # => "Api::CategoryOperations::Create"
  namespace = parts[0..-4]
  next_lookup = [namespace, target].reject(&:blank?).join('::')

  # recurse
  operation_lookup(next_lookup)
end
operation_name() click to toggle source
# File lib/skinny_controllers/lookup.rb, line 115
def operation_name
  @operation_name ||= "#{resource_name}#{SkinnyControllers.operations_suffix}"
end
operation_namespace() click to toggle source
# File lib/skinny_controllers/lookup.rb, line 108
def operation_namespace
  @operation_namespace ||= [
    namespace,
    operation_name
  ].reject(&:blank?).join('::')
end
operation_parts() click to toggle source
# File lib/skinny_controllers/lookup.rb, line 141
def operation_parts
  @operation_parts ||= operation_namespace&.split(/::|Operations/)
end
policy_class() click to toggle source
# File lib/skinny_controllers/lookup.rb, line 74
def policy_class
  @policy_class ||= begin
    ensure_namespace!(namespace) if namespace.present?
    ensure_policy_class!(namespaced_policy_name)
  end
end
policy_lookup(qualified_name) click to toggle source
# File lib/skinny_controllers/lookup/ensure_existence.rb, line 70
def policy_lookup(qualified_name)
  klass = class_for_qualified_name(qualified_name)
  # Return if the constant exists, or if we can't travel
  # up any higher.
  return klass if klass
  return unless qualified_name.include?('::')

  # "Api::V1::CategoryPolicy"
  # => "CategorPolicy"
  target = qualified_name.demodulize

  # "Api::V1::CategoryPolicy"
  # => "Api"
  namespace = qualified_name.deconstantize.deconstantize
  next_lookup = [namespace, target].reject(&:blank?).join('::')

  # recurse
  policy_lookup(next_lookup)
end
policy_method_name() click to toggle source
# File lib/skinny_controllers/lookup.rb, line 81
def policy_method_name
  @policy_method_name ||= @verb_for_action.underscore + POLICY_METHOD_SUFFIX
end
resource_name() click to toggle source
# File lib/skinny_controllers/lookup.rb, line 126
def resource_name
  @resource_name ||= resource_parts && resource_parts[-1].singularize ||
    @model_class&.name ||
    operation_parts && operation_parts[-1].singularize
end
resource_parts() click to toggle source

PostsController

> Posts

Api::V2::PostsController

> Api, V2, Posts

# File lib/skinny_controllers/lookup.rb, line 137
def resource_parts
  @resource_parts ||= controller_class_name&.split(/::|Controller/)
end

Private Instance Methods

class_for_qualified_name(qualified_name) click to toggle source
# File lib/skinny_controllers/lookup/ensure_existence.rb, line 118
def class_for_qualified_name(qualified_name)
  # Validate the name.
  return if qualified_name.blank?

  qualified_name.safe_constantize
end