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