Class: Jets::Router
- Inherits:
-
Object
- Object
- Jets::Router
- Defined in:
- lib/jets/router.rb,
lib/jets/router/scope.rb
Defined Under Namespace
Classes: Scope
Constant Summary collapse
- @@drawn_router =
nil
Instance Attribute Summary collapse
-
#routes ⇒ Object
readonly
Returns the value of attribute routes.
Class Method Summary collapse
-
.all_paths ⇒ Object
Returns all paths including subpaths.
- .all_routes_valid ⇒ Object
- .clear! ⇒ Object
-
.draw ⇒ Object
Class methods.
- .drawn_router ⇒ Object
- .has_controller?(name) ⇒ Boolean
- .invalid_routes ⇒ Object
- .routes ⇒ Object
- .routes_help ⇒ Object
Instance Method Summary collapse
- #add_namespace(path) ⇒ Object
-
#all_paths ⇒ Object
Useful for creating API Gateway Resources.
- #api_mode? ⇒ Boolean
-
#check_collision! ⇒ Object
Validate routes that deployable.
- #create_route(options) ⇒ Object
- #draw(&block) ⇒ Object
-
#initialize ⇒ Router
constructor
A new instance of Router.
- #namespace(ns, &block) ⇒ Object
-
#ordered_routes ⇒ Object
Useful for RouterMatcher.
-
#resources(name) ⇒ Object
resources macro expands to all the routes.
-
#root(to, options = {}) ⇒ Object
root “posts#index”.
- #scope(options = {}) ⇒ Object
Constructor Details
#initialize ⇒ Router
Returns a new instance of Router.
6 7 8 |
# File 'lib/jets/router.rb', line 6 def initialize @routes = [] end |
Instance Attribute Details
#routes ⇒ Object (readonly)
Returns the value of attribute routes.
5 6 7 |
# File 'lib/jets/router.rb', line 5 def routes @routes end |
Class Method Details
.all_paths ⇒ Object
Returns all paths including subpaths. Example: Input: [“posts/:id/edit”] Output: [“posts”, “posts/:id”, “posts/:id/edit”]
154 155 156 |
# File 'lib/jets/router.rb', line 154 def self.all_paths drawn_router.all_paths end |
.all_routes_valid ⇒ Object
169 170 171 |
# File 'lib/jets/router.rb', line 169 def self.all_routes_valid invalid_routes.empty? end |
.clear! ⇒ Object
142 143 144 |
# File 'lib/jets/router.rb', line 142 def self.clear! @@drawn_router = nil end |
.draw ⇒ Object
Class methods
130 131 132 |
# File 'lib/jets/router.rb', line 130 def self.draw drawn_router end |
.drawn_router ⇒ Object
135 136 137 138 139 140 |
# File 'lib/jets/router.rb', line 135 def self.drawn_router return @@drawn_router if @@drawn_router router = Jets.application.routes @@drawn_router = router end |
.has_controller?(name) ⇒ Boolean
125 126 127 |
# File 'lib/jets/router.rb', line 125 def self.has_controller?(name) routes.detect { |r| r.controller_name == name } end |
.invalid_routes ⇒ Object
173 174 175 |
# File 'lib/jets/router.rb', line 173 def self.invalid_routes routes.select { |r| !r.valid? } end |
.routes ⇒ Object
146 147 148 |
# File 'lib/jets/router.rb', line 146 def self.routes drawn_router.routes end |
.routes_help ⇒ Object
158 159 160 161 162 163 164 165 166 167 |
# File 'lib/jets/router.rb', line 158 def self.routes_help return "Your routes table is empty." if routes.empty? table = Text::Table.new table.head = %w[Verb Path Controller#action] routes.each do |route| table.rows << [route.method, route.path, route.to] end table end |
Instance Method Details
#add_namespace(path) ⇒ Object
38 39 40 41 42 43 |
# File 'lib/jets/router.rb', line 38 def add_namespace(path) return path unless @scope ns = @scope.full_namespace return path unless ns "#{ns}/#{path}" end |
#all_paths ⇒ Object
Useful for creating API Gateway Resources
92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 |
# File 'lib/jets/router.rb', line 92 def all_paths results = [] paths = routes.map(&:path) paths.each do |p| sub_paths = [] parts = p.split('/') until parts.empty? parts.pop sub_path = parts.join('/') sub_paths << sub_path unless sub_path == '' end results += sub_paths end @all_paths = (results + paths).sort.uniq end |
#api_mode? ⇒ Boolean
70 71 72 73 74 75 76 77 78 79 80 81 82 |
# File 'lib/jets/router.rb', line 70 def api_mode? if Jets.config.key?(:api_mode) || Jets.config.key?(:api_generator) puts <<~EOL.color(:yellow) DEPRECATED: Jets.config.api_generator Instead, please update your config/application.rb to use: Jets.config.mode = 'api' You can also run: jets upgrade EOL end api_mode = Jets.config.mode == 'api' || Jets.config.api_mode || Jets.config.api_generator api_mode end |
#check_collision! ⇒ Object
Validate routes that deployable
16 17 18 19 20 21 |
# File 'lib/jets/router.rb', line 16 def check_collision! paths = self.routes.map(&:path) collision = Jets::Resource::ApiGateway::RestApi::Routes::Collision.new collide = collision.collision?(paths) raise collision.exception if collide end |
#create_route(options) ⇒ Object
30 31 32 33 34 35 36 |
# File 'lib/jets/router.rb', line 30 def create_route() # Currently only using scope to add namespace # TODO: Can use it to add additional things like authorization_type # Would be good to add authorization_type at the controller level also [:path] = add_namespace([:path]) @routes << Route.new() end |
#draw(&block) ⇒ Object
10 11 12 13 |
# File 'lib/jets/router.rb', line 10 def draw(&block) instance_eval(&block) check_collision! end |
#namespace(ns, &block) ⇒ Object
45 46 47 |
# File 'lib/jets/router.rb', line 45 def namespace(ns, &block) scope(namespace: ns, &block) end |
#ordered_routes ⇒ Object
Useful for RouterMatcher
Precedence:
-
Routes with no captures get highest precedence: posts/new
-
Then consider the routes with captures: post/:id
-
Last consider the routes with wildcards: *catchall
Within these 2 groups we consider the routes with the longest path first since posts/:id and posts/:id/edit can both match.
117 118 119 120 121 122 123 |
# File 'lib/jets/router.rb', line 117 def ordered_routes length = Proc.new { |r| r.path.length * -1 } capture_routes = routes.select { |r| r.path.include?(':') }.sort_by(&length) wildcard_routes = routes.select { |r| r.path.include?('*') }.sort_by(&length) simple_routes = (routes - capture_routes - wildcard_routes).sort_by(&length) simple_routes + capture_routes + wildcard_routes end |
#resources(name) ⇒ Object
resources macro expands to all the routes
58 59 60 61 62 63 64 65 66 67 68 |
# File 'lib/jets/router.rb', line 58 def resources(name) get "#{name}", to: "#{name}#index" get "#{name}/new", to: "#{name}#new" unless api_mode? get "#{name}/:id", to: "#{name}#show" post "#{name}", to: "#{name}#create" get "#{name}/:id/edit", to: "#{name}#edit" unless api_mode? put "#{name}/:id", to: "#{name}#update" post "#{name}/:id", to: "#{name}#update" # for binary uploads patch "#{name}/:id", to: "#{name}#update" delete "#{name}/:id", to: "#{name}#delete" end |