lib/hanami/view/scope_builder.rb in hanami-view-2.0.0.alpha8 vs lib/hanami/view/scope_builder.rb in hanami-view-2.1.0.beta1
- old
+ new
@@ -1,98 +1,62 @@
# frozen_string_literal: true
-require "dry/core/cache"
-require "dry/core/equalizer"
-require_relative "scope"
-
module Hanami
class View
# Builds scope objects via matching classes
#
# @api private
class ScopeBuilder
- extend Dry::Core::Cache
- include Dry::Equalizer(:namespace)
+ class << self
+ # Returns a new scope using a class matching the name
+ #
+ # @param name [Symbol, Class] scope name
+ # @param locals [Hash<Symbol, Object>] locals hash
+ #
+ # @return [Hanami::View::Scope]
+ #
+ # @api private
+ def call(name = nil, locals:, rendering:) # rubocop:disable Style/OptionalArguments
+ klass = scope_class(name, rendering: rendering)
- # The view's configured `scope_namespace`
- #
- # @api private
- attr_reader :namespace
+ klass.new(name: name, locals: locals, rendering: rendering)
+ end
- # @return [RenderEnvironment]
- #
- # @api private
- attr_reader :render_env
+ private
- # Returns a new instance of ScopeBuilder
- #
- # @api private
- def initialize(namespace: nil, render_env: nil)
- @namespace = namespace
- @render_env = render_env
- end
-
- # @api private
- def for_render_env(render_env)
- return self if render_env == self.render_env
-
- self.class.new(namespace: namespace, render_env: render_env)
- end
-
- # Returns a new scope using a class matching the name
- #
- # @param name [Symbol, Class] scope name
- # @param locals [Hash<Symbol, Object>] locals hash
- #
- # @return [Hanami::View::Scope]
- #
- # @api private
- def call(name = nil, locals) # rubocop:disable Style/OptionalArguments
- scope_class(name).new(
- name: name,
- locals: locals,
- render_env: render_env
- )
- end
-
- private
-
- DEFAULT_SCOPE_CLASS = Scope
-
- 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)
+ def scope_class(name = nil, rendering:)
+ if name.nil?
+ rendering.config.scope_class
+ elsif name.is_a?(Class)
+ name
+ else
+ View.cache.fetch_or_store(:scope_class, rendering.config) do
+ resolve_scope_class(name: name, rendering: rendering)
+ end
end
end
- end
- def resolve_scope_class(name:)
- name = inflector.camelize(name.to_s)
+ def resolve_scope_class(name:, rendering:)
+ name = rendering.inflector.camelize(name.to_s)
- # Give autoloaders a chance to act
- begin
- klass = namespace.const_get(name)
- rescue NameError # rubocop:disable Lint/HandleExceptions
- end
+ namespace = rendering.config.scope_namespace
- if !klass && namespace.const_defined?(name, false)
- klass = namespace.const_get(name)
- end
+ # Give autoloaders a chance to act
+ begin
+ klass = namespace.const_get(name)
+ rescue NameError # rubocop:disable Lint/HandleExceptions
+ end
- if klass && klass < Scope
- klass
- else
- DEFAULT_SCOPE_CLASS
- end
- end
+ if !klass && namespace.const_defined?(name, false)
+ klass = namespace.const_get(name)
+ end
- def inflector
- render_env.inflector
+ if klass && klass < Scope
+ klass
+ else
+ rendering.config.scope_class
+ end
+ end
end
end
end
end