Sha256: fc5686a39e3a926b44e151b2c4593ccf347d086f9d7e652719c996237ba2ccad

Contents?: true

Size: 1.82 KB

Versions: 46

Compression:

Stored size: 1.82 KB

Contents

module Scrivito

class Route

  class << self
    VALID_ROUTE_NAMES = %i(homepage slug_id permalink).freeze

    def register(route_set, name)
      assert_valid_route_name(name)
      registry(route_set)[name] = new(name)
    end

    def find(given_context, name)
      available_contexts(given_context).each do |context|
        route = registry(context._routes)[name]

        if route && route.defined_in?(context)
          return route.apply_to(context)
        end
      end

      nil
    end

    private

    def registry(route_set)
      @registry ||= {}
      @registry[route_set] ||= {}
    end

    def assert_valid_route_name(name)
      unless VALID_ROUTE_NAMES.include?(name)
        valid_values = VALID_ROUTE_NAMES.join(', ')
        raise ScrivitoError,
            %("#{name}" is not a valid scrivito route name. Valid values are: #{valid_values}.)
      end
    end

    def available_contexts(context)
      [
        context,
        context.try(:main_app)
      ].compact
    end
  end

  def initialize(name)
    @name = name
  end

  def helper_name
    # use a random name to prevent users from getting the idea
    # that the internally unsed routing helpers might be a stable API
    @helper_name ||=
      begin
        random_segment = Digest::SHA1.hexdigest(@name.to_s)[0..15]
        "scrivito_#{random_segment}"
      end
  end

  def defined_in?(context)
    context.respond_to?("#{helper_name}_path")
  end

  def apply_to(context)
    RouteApplication.new(self, context)
  end

  class RouteApplication < Struct.new(:route, :context)
    def generate_path(options = {})
      generate(:path, options)
    end

    def generate_url(options = {})
      generate(:url, options)
    end

    def generate(path_or_url, options = {})
      context.public_send("#{route.helper_name}_#{path_or_url}", options)
    end
  end

end

end

Version data entries

46 entries across 46 versions & 1 rubygems

Version Path
scrivito_sdk-1.9.1 lib/scrivito/route.rb
scrivito_sdk-1.9.1.rc1 lib/scrivito/route.rb
scrivito_sdk-1.9.0 lib/scrivito/route.rb
scrivito_sdk-1.9.0.rc2 lib/scrivito/route.rb
scrivito_sdk-1.9.0.rc1 lib/scrivito/route.rb
scrivito_sdk-1.8.1 lib/scrivito/route.rb
scrivito_sdk-1.8.1.rc1 lib/scrivito/route.rb
scrivito_sdk-1.8.0 lib/scrivito/route.rb
scrivito_sdk-1.8.0.rc2 lib/scrivito/route.rb
scrivito_sdk-1.8.0.rc1 lib/scrivito/route.rb
scrivito_sdk-1.7.0 lib/scrivito/route.rb
scrivito_sdk-1.7.0.rc2 lib/scrivito/route.rb
scrivito_sdk-1.5.5 lib/scrivito/route.rb
scrivito_sdk-1.6.1 lib/scrivito/route.rb
scrivito_sdk-1.6.1.rc1 lib/scrivito/route.rb
scrivito_sdk-1.5.5.rc1 lib/scrivito/route.rb
scrivito_sdk-1.4.3 lib/scrivito/route.rb
scrivito_sdk-1.5.4 lib/scrivito/route.rb
scrivito_sdk-1.7.0.rc1 lib/scrivito/route.rb
scrivito_sdk-1.6.0 lib/scrivito/route.rb