module Tom::Routes

Takes care of registering adapters and mergers for routes, and then matching routes and methods to adapters and mergers.

Public Class Methods

adapters() click to toggle source

@return [Hash] See what {Tom::Routes.register_adapter} returns

# File lib/tom/routes.rb, line 68
def self.adapters
  @adapters
end
mergers() click to toggle source

@return [Hash] See what {Tom::Routes.register_merger} returns

# File lib/tom/routes.rb, line 73
def self.mergers
  @mergers
end
register(opts) click to toggle source

Registers a opts or opts for the given opts.

This method should not be called directly in your app, you would use {Tom::Adapter.register_route} or {Tom::Merger.register_route} in your subclass of {Tom::Adapter} or {Tom::Merger}

@param opts [Hash] Needs to have at least :route and

either :adapter or :merger set, depending on what you
are registering. But you don't need to use this method
directly, Adapter and Merger provide convenience methods
for you.

@return [Hash] See {Tom::Routes.register_adapter} or

{Tom::Routes.register_merger}
# File lib/tom/routes.rb, line 23
def self.register(opts)
  return register_adapter(opts) if opts[:adapter]
  return register_merger(opts)  if opts[:merger]
  raise "You need to supply opts[:adapter] or opts[:merger]"
end
register_adapter(opts) click to toggle source

Registers an {Adapter} for a given route and request method

@param opts [Hash] Needs to have the :route and :adapter

keys set with a regular expression and a subclass of
{Tom::Adapter}

@return [Hash] First level are the HTTP methods, second

level are the regular expressions for routes, and the
values are arrays of Adapters for the combination of
request method and route.
# File lib/tom/routes.rb, line 39
def self.register_adapter(opts)
  validate_type(opts[:adapter], Adapter)
  methods = get_methods(opts)
  @adapters ||= default_methods_hash
  methods.each do |method|
    @adapters[method][opts[:route]] ||= []
    @adapters[method][opts[:route]] << opts[:adapter]
  end
  @adapters
end
register_merger(opts) click to toggle source

Registers a {Merger} for a given route and request method

@return [Hash] First level are the HTTP methods, second

level are the regular expressions for routes, and the
values are arrays of Mergers for the combination of
request method and route.
# File lib/tom/routes.rb, line 56
def self.register_merger(opts)
  validate_type(opts[:merger], Merger)
  methods = get_methods(opts)
  @mergers ||= default_methods_hash
  methods.each do |method|
    @mergers[method][opts[:route]] ||= []
    @mergers[method][opts[:route]] << opts[:merger]
  end
  @mergers
end

Private Class Methods

adapters_for_route(route, method) click to toggle source

Find the right adapter for a route

# File lib/tom/routes.rb, line 106
def self.adapters_for_route(route, method)
  @adapters ||= default_methods_hash
  matches = []
  @adapters[method].map do |reg_route, adapters|
    next unless reg_route.match(route)
    matches += adapters
  end
  matches.uniq
end
default_methods_hash() click to toggle source

Just some defaults to initialize thing

# File lib/tom/routes.rb, line 94
def self.default_methods_hash
  { head:   {},
    get:    {},
    put:    {},
    post:   {},
    delete: {}
  }
end
get_methods(opts) click to toggle source

Fetches the methods from the options hash, defaults to all methods.

@param opts [Hash] We're looking for :methods in this hash

@return [Hash] Returns what's in :methods, and defaults to

[:head, :get, :put, :post, :delete]
# File lib/tom/routes.rb, line 86
def self.get_methods(opts)
  return opts[:methods] unless opts[:methods].empty?
  [:head, :get, :put, :post, :delete]
end
merger_for_route(route, method) click to toggle source

Find the right merger for a route

# File lib/tom/routes.rb, line 119
def self.merger_for_route(route, method)
  @mergers ||= default_methods_hash
  @mergers[method].each do |reg_route, mergers|
    next unless reg_route.match(route)
    return mergers.first
  end
  nil
end
validate_type(c, expected) click to toggle source

Make sure one class is a subclass of another class

# File lib/tom/routes.rb, line 131
def self.validate_type(c, expected)
  return if c < expected
  raise "Invalid type. Expected #{expected} got #{c}"
end