70 lines
1.7 KiB
Ruby
70 lines
1.7 KiB
Ruby
require 'travis/api/v3/routes/resource'
|
|
|
|
module Travis::API::V3
|
|
module Routes::DSL
|
|
def routes
|
|
@routes ||= {}
|
|
end
|
|
|
|
def resources
|
|
@resources ||= []
|
|
end
|
|
|
|
def current_resource
|
|
@current_resource ||= nil
|
|
end
|
|
|
|
def prefix
|
|
@prefix ||= ""
|
|
end
|
|
|
|
def resource(type, &block)
|
|
resource = Routes::Resource.new(type)
|
|
with_resource(resource, &block)
|
|
resources << resource
|
|
end
|
|
|
|
def with_resource(resource)
|
|
resource_was, @current_resource = current_resource, resource
|
|
prefix_was, @prefix = @prefix, resource_was.route if resource_was
|
|
yield
|
|
ensure
|
|
@prefix = prefix_was if resource_was
|
|
@current_resource = resource_was
|
|
end
|
|
|
|
def route(value)
|
|
current_resource.route = Mustermann.new(prefix) + Mustermann.new(value)
|
|
end
|
|
|
|
def get(*args)
|
|
current_resource.add_service('GET'.freeze, *args)
|
|
end
|
|
|
|
def post(*args)
|
|
current_resource.add_service('POST'.freeze, *args)
|
|
end
|
|
|
|
def draw_routes
|
|
resources.each do |resource|
|
|
prefix = resource.route
|
|
resource.services.each do |(request_method, sub_route), service|
|
|
route = sub_route ? prefix + sub_route : prefix
|
|
routes[route] ||= {}
|
|
routes[route][request_method] = Services[resource.identifier][service]
|
|
end
|
|
end
|
|
self.routes.replace(routes)
|
|
end
|
|
|
|
def factory_for(request_method, path)
|
|
routes.each do |route, method_map|
|
|
next unless params = route.params(path)
|
|
raise MethodNotAllowed unless factory = method_map[request_method]
|
|
return [factory, params]
|
|
end
|
|
nil # nothing matched
|
|
end
|
|
end
|
|
end
|