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
@return [Hash] See what {Tom::Routes.register_adapter} returns
# File lib/tom/routes.rb, line 68 def self.adapters @adapters end
@return [Hash] See what {Tom::Routes.register_merger} returns
# File lib/tom/routes.rb, line 73 def self.mergers @mergers end
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
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
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
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
Just some defaults to initialize thing
# File lib/tom/routes.rb, line 94 def self.default_methods_hash { head: {}, get: {}, put: {}, post: {}, delete: {} } end
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
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
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