1
0
Fork 0
mirror of https://github.com/rails/rails.git synced 2022-11-09 12:12:34 -05:00
rails--rails/actionpack/lib/action_dispatch/journey/routes.rb
Andrew White 56fee39c39 Integrate Journey into Action Dispatch
Move the Journey code underneath the ActionDispatch namespace so
that we don't pollute the global namespace with names that may
be used for models.

Fixes rails/journey#49.
2012-12-19 22:13:08 +00:00

77 lines
1.7 KiB
Ruby

module ActionDispatch
module Journey
###
# The Routing table. Contains all routes for a system. Routes can be
# added to the table by calling Routes#add_route
class Routes
include Enumerable
attr_reader :routes, :named_routes
def initialize
@routes = []
@named_routes = {}
@ast = nil
@partitioned_routes = nil
@simulator = nil
end
def length
@routes.length
end
alias :size :length
def last
@routes.last
end
def each(&block)
routes.each(&block)
end
def clear
routes.clear
end
def partitioned_routes
@partitioned_routes ||= routes.partition { |r|
r.path.anchored && r.ast.grep(Nodes::Symbol).all? { |n| n.default_regexp? }
}
end
def ast
return @ast if @ast
return if partitioned_routes.first.empty?
asts = partitioned_routes.first.map { |r| r.ast }
@ast = Nodes::Or.new(asts)
end
def simulator
return @simulator if @simulator
gtg = GTG::Builder.new(ast).transition_table
@simulator = GTG::Simulator.new gtg
end
###
# Add a route to the routing table.
def add_route app, path, conditions, defaults, name = nil
route = Route.new(name, app, path, conditions, defaults)
route.precedence = routes.length
routes << route
named_routes[name] = route if name && !named_routes[name]
clear_cache!
route
end
private
def clear_cache!
@ast = nil
@partitioned_routes = nil
@simulator = nil
end
end
end
end