module Hanami::Extensions::View::Context

View context for views in Hanami apps.

@api public @since 2.1.0

Public Class Methods

context_class(slice) click to toggle source

Returns a context class for the given slice. If a context class is not defined, defines a class named ‘Views::Context` within the slice’s namespace.

@api private @since 2.1.0

# File lib/hanami/extensions/view/context.rb, line 19
def context_class(slice)
  views_namespace = views_namespace(slice)

  if views_namespace.const_defined?(:Context)
    return views_namespace.const_get(:Context)
  end

  views_namespace.const_set(:Context, Class.new(context_superclass(slice)).tap { |klass|
    klass.configure_for_slice(slice)
  })
end

Private Class Methods

context_superclass(slice) click to toggle source

@api private @since 2.1.0

# File lib/hanami/extensions/view/context.rb, line 35
def context_superclass(slice)
  return Hanami::View::Context if Hanami.app.equal?(slice)

  begin
    slice.inflector.constantize(
      slice.inflector.camelize("#{slice.app.slice_name.name}/views/context")
    )
  rescue NameError => e
    raise e unless %i[Views Context].include?(e.name)

    Hanami::View::Context
  end
end
views_namespace(slice) click to toggle source

@api private @since 2.1.0

# File lib/hanami/extensions/view/context.rb, line 51
def views_namespace(slice)
  # TODO: this could be moved into the top-level Extensions::View
  if slice.namespace.const_defined?(:Views)
    slice.namespace.const_get(:Views)
  else
    slice.namespace.const_set(:Views, Module.new)
  end
end