Class: Praxis::Router

Inherits:
Object
  • Object
show all
Defined in:
lib/praxis/router.rb

Defined Under Namespace

Classes: RequestRouter, VersionMatcher

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(application, request_class: Praxis::Request) ⇒ Router

Returns a new instance of Router.



42
43
44
45
46
47
48
# File 'lib/praxis/router.rb', line 42

def initialize(application, request_class: Praxis::Request)
  @routes = Hash.new do |hash, verb|
      hash[verb] = RequestRouter.new
  end
  @request_class = request_class
  @application = application
end

Instance Attribute Details

#applicationObject (readonly)

Returns the value of attribute application.



6
7
8
# File 'lib/praxis/router.rb', line 6

def application
  @application
end

#request_classObject (readonly)

Returns the value of attribute request_class.



6
7
8
# File 'lib/praxis/router.rb', line 6

def request_class
  @request_class
end

Instance Method Details

#add_route(target, route) ⇒ Object



50
51
52
53
54
# File 'lib/praxis/router.rb', line 50

def add_route(target, route)
  warn 'other conditions not supported yet' if route.options.any?
  version_wrapper = VersionMatcher.new(target, version: route.version)    
  @routes[route.verb].on(route.path, call: version_wrapper)
end

#call(env_or_request) ⇒ Object



56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
# File 'lib/praxis/router.rb', line 56

def call(env_or_request)
  request = case env_or_request
  when Hash
    request_class.new(env_or_request)
  when request_class
    env_or_request
  else
    raise ArgumentError, "received #{env_or_request.class}"
  end

  version = request.version
  verb = request.verb
  result = @routes[verb].call(request)
  if result == :not_found
    
    attempted_versions = request.unmatched_versions
    body = "NotFound"
    unless attempted_versions.empty? || (attempted_versions.size == 1 && attempted_versions.first == 'n/a')
      body += if request.version == 'n/a' 
                ". Your request did not specify an API version.".freeze 
              else 
                ". Your request speficied API version = \"#{request.version}\"."
              end
      pretty_versions = attempted_versions.collect(&:inspect).join(', ')
      body += " Available versions = #{pretty_versions}."
    end
    result = [404, {"Content-Type" => "text/plain", }, [body]] 
  end
  result
end