module Pakyow::Reflection::Builders::Helpers::Controller

Constants

RESOURCE_ENDPOINTS

Public Instance Methods

controller_at_path(path, state = @app.state(:controller)) click to toggle source
# File lib/pakyow/reflection/builders/helpers/controller.rb, line 16
def controller_at_path(path, state = @app.state(:controller))
  if state.any?
    state.find { |controller|
      String.normalize_path(String.collapse_path(controller.path_to_self)) == String.normalize_path(path)
    } || controller_at_path(path, state.flat_map(&:children))
  else
    nil
  end
end
controller_closest_to_path(path, state = @app.state(:controller)) click to toggle source
# File lib/pakyow/reflection/builders/helpers/controller.rb, line 26
def controller_closest_to_path(path, state = @app.state(:controller))
  if state.any?
    controller_closest_to_path(path, state.flat_map(&:children)) || state.find { |controller|
      String.normalize_path(path).start_with?(String.normalize_path(String.collapse_path(controller.path_to_self)))
    }
  else
    nil
  end
end
controller_path(view_path) click to toggle source
# File lib/pakyow/reflection/builders/helpers/controller.rb, line 71
def controller_path(view_path)
  if view_path_directory?(view_path)
    view_path
  else
    view_path.split("/")[0..-2].to_a.join("/")
  end
end
define_controller_at_path(path, within: nil) click to toggle source
# File lib/pakyow/reflection/builders/helpers/controller.rb, line 36
def define_controller_at_path(path, within: nil)
  nested_state = if within
    within.children
  else
    @app.state(:controller)
  end

  path = String.normalize_path(path)

  if controller = controller_closest_to_path(path, nested_state)
    context = controller
    path = path.gsub(
      /^#{String.normalize_path(String.collapse_path(controller.path_to_self))}/, ""
    )
  else
    context = within || @app
  end

  controller_name = if path == "/"
    :root
  else
    String.normalize_path(path)[1..-1].gsub("/", "_").to_sym
  end

  method = if context.is_a?(Class) && context.ancestors.include?(Pakyow::Routing::Controller)
    :namespace
  else
    :controller
  end

  context.send(method, controller_name, String.normalize_path(path)) do
    # intentionally empty
  end
end
define_resource_for_scope_at_path(scope, path) click to toggle source
# File lib/pakyow/reflection/builders/helpers/controller.rb, line 163
def define_resource_for_scope_at_path(scope, path)
  context = if resource_namespace_path = resource_namespace_path_for_scope_at_path(scope, path)
    if within_resource?(resource_namespace_path)
      ensure_controller_has_helpers(
        find_or_define_resource_for_scope_at_path(
          resource_source_at_path(resource_namespace_path), resource_namespace_path
        )
      )
    else
      ensure_controller_has_helpers(
        find_or_define_controller_at_path(resource_namespace_path)
      )
    end
  else
    @app
  end

  context.resource resource_name_for_scope(scope), resource_path_for_scope(scope) do
    # intentionally empty
  end
end
ensure_controller_has_helpers(controller) click to toggle source
# File lib/pakyow/reflection/builders/helpers/controller.rb, line 203
def ensure_controller_has_helpers(controller)
  unless controller.ancestors.include?(Extension::Controller)
    controller.include Extension::Controller
  end

  controller
end
find_or_define_controller_at_path(path) click to toggle source
# File lib/pakyow/reflection/builders/helpers/controller.rb, line 12
def find_or_define_controller_at_path(path)
  controller_at_path(path) || define_controller_at_path(path)
end
find_or_define_resource_for_scope_at_path(scope, path, endpoint_type = nil) click to toggle source
# File lib/pakyow/reflection/builders/helpers/controller.rb, line 121
def find_or_define_resource_for_scope_at_path(scope, path, endpoint_type = nil)
  resource = resource_for_scope_at_path(scope, path) || define_resource_for_scope_at_path(scope, path)

  if path.end_with?(resource_path_for_scope(scope)) || endpoint_type.nil? || RESOURCE_ENDPOINTS.include?(path.split("/").last.to_sym)
    return resource
  else
    controller_for_endpoint_type = resource.send(endpoint_type)

    nested_path = if view_path_directory?(path)
      path
    else
      path.split("/")[0..-2].join("/")
    end

    nested_path = nested_path.gsub(
      /^#{String.normalize_path(String.collapse_path(controller_for_endpoint_type.path_to_self))}/, ""
    )

    if current_controller = controller_at_path(nested_path, resource.children)
      return current_controller
    else
      if nested_path.empty?
        controller_for_endpoint_type
      else
        define_controller_at_path(nested_path, within: controller_for_endpoint_type)
      end
    end
  end
end
find_or_define_resource_for_scope_in_resource(scope, resource) click to toggle source
# File lib/pakyow/reflection/builders/helpers/controller.rb, line 211
def find_or_define_resource_for_scope_in_resource(scope, resource)
  resource.children.find { |child|
    child.path == resource_path_for_scope(scope)
  } || resource.resource(resource_name_for_scope(scope), resource_path_for_scope(scope)) do
    # intentionally empty
  end
end
full_resource_path_for_scope_at_path(scope, path) click to toggle source
# File lib/pakyow/reflection/builders/helpers/controller.rb, line 219
def full_resource_path_for_scope_at_path(scope, path)
  String.normalize_path(
    File.join(
      resource_namespace_path_for_scope_at_path(scope, path).to_s,
      scope.plural_name.to_s
    )
  )
end
resource_for_scope_at_path(scope, path, state = @app.state(:controller)) click to toggle source
# File lib/pakyow/reflection/builders/helpers/controller.rb, line 151
def resource_for_scope_at_path(scope, path, state = @app.state(:controller))
  if state.any?
    state.select { |controller|
      controller.expansions.include?(:resource)
    }.find { |controller|
      String.normalize_path(String.collapse_path(controller.path_to_self)) == full_resource_path_for_scope_at_path(scope, path)
    } || resource_for_scope_at_path(scope, path, state.flat_map(&:children))
  else
    nil
  end
end
resource_name_for_scope(scope) click to toggle source
# File lib/pakyow/reflection/builders/helpers/controller.rb, line 195
def resource_name_for_scope(scope)
  scope.plural_name
end
resource_namespace_path_for_scope_at_path(scope, path) click to toggle source
# File lib/pakyow/reflection/builders/helpers/controller.rb, line 185
def resource_namespace_path_for_scope_at_path(scope, path)
  resource_path = resource_path_for_scope(scope)

  if path.start_with?(resource_path)
    nil
  elsif path.include?(resource_path)
    path.split(resource_path, 2)[0]
  end
end
resource_path_for_scope(scope) click to toggle source
# File lib/pakyow/reflection/builders/helpers/controller.rb, line 199
def resource_path_for_scope(scope)
  String.normalize_path(scope.plural_name)
end
resource_source_at_path(view_path) click to toggle source
# File lib/pakyow/reflection/builders/helpers/controller.rb, line 103
def resource_source_at_path(view_path)
  view_path.split("/").reverse.each do |view_path_part|
    @app.state(:source).each do |source|
      if source.plural_name == view_path_part.to_sym
        return source
      end
    end
  end
end
route_name(view_path) click to toggle source
# File lib/pakyow/reflection/builders/helpers/controller.rb, line 87
def route_name(view_path)
  if view_path_directory?(view_path)
    :default
  else
    view_path.split("/").last.to_sym
  end
end
route_path(view_path) click to toggle source
# File lib/pakyow/reflection/builders/helpers/controller.rb, line 95
def route_path(view_path)
  if view_path_directory?(view_path)
    "/"
  else
    "/#{view_path.split("/").last}"
  end
end
view_path_directory?(view_path) click to toggle source
# File lib/pakyow/reflection/builders/helpers/controller.rb, line 113
def view_path_directory?(view_path)
  @app.state(:templates).any? { |templates|
    File.directory?(File.join(templates.path, templates.config[:paths][:pages], view_path))
  }
end
within_resource?(view_path) click to toggle source
# File lib/pakyow/reflection/builders/helpers/controller.rb, line 79
def within_resource?(view_path)
  view_path.split("/").any? { |view_path_part|
    @app.state(:source).any? { |source|
      source.plural_name == view_path_part.to_sym
    }
  }
end