class Dry::View::ScopeBuilder

Builds scope objects via matching classes

@api private

Constants

DEFAULT_SCOPE_CLASS

Evaluation context for templates (including layouts and partials) and provides a place to encapsulate view-specific behaviour alongside a template and its locals.

@abstract Subclass this and provide your own methods adding view-specific

behavior. You should not override `#initialize`

@see dry-rb.org/gems/dry-view/templates/ @see dry-rb.org/gems/dry-view/scopes/

@api public

Attributes

namespace[R]

The view's configured `scope_namespace`

@api private

render_env[R]

@return [RenderEnvironment]

@api private

Public Class Methods

new(namespace: nil, render_env: nil) click to toggle source

Returns a new instance of ScopeBuilder

@api private

# File lib/dry/view/scope_builder.rb, line 29
def initialize(namespace: nil, render_env: nil)
  @namespace = namespace
  @render_env = render_env
end

Public Instance Methods

call(name = nil, locals) click to toggle source

Returns a new scope using a class matching the name

@param name [Symbol, Class] scope name @param locals [Hash<Symbol, Object>] locals hash

@return [Dry::View::Scope]

@api private

# File lib/dry/view/scope_builder.rb, line 49
def call(name = nil, locals) # rubocop:disable Style/OptionalArguments
  scope_class(name).new(
    name: name,
    locals: locals,
    render_env: render_env
  )
end
for_render_env(render_env) click to toggle source

@api private

# File lib/dry/view/scope_builder.rb, line 35
def for_render_env(render_env)
  return self if render_env == self.render_env

  self.class.new(namespace: namespace, render_env: render_env)
end

Private Instance Methods

inflector() click to toggle source
# File lib/dry/view/scope_builder.rb, line 93
def inflector
  render_env.inflector
end
resolve_scope_class(name:) click to toggle source
# File lib/dry/view/scope_builder.rb, line 73
def resolve_scope_class(name:)
  name = inflector.camelize(name.to_s)

  # Give autoloaders a chance to act
  begin
    klass = namespace.const_get(name)
  rescue NameError # rubocop:disable Lint/HandleExceptions
  end

  if !klass && namespace.const_defined?(name, false)
    klass = namespace.const_get(name)
  end

  if klass && klass < Scope
    klass
  else
    DEFAULT_SCOPE_CLASS
  end
end
scope_class(name = nil) click to toggle source
# File lib/dry/view/scope_builder.rb, line 61
def scope_class(name = nil)
  if name.nil?
    DEFAULT_SCOPE_CLASS
  elsif name.is_a?(Class)
    name
  else
    fetch_or_store(namespace, name) do
      resolve_scope_class(name: name)
    end
  end
end