roda-route_list 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/CHANGELOG +3 -0
- data/MIT-LICENSE +20 -0
- data/README.rdoc +98 -0
- data/Rakefile +69 -0
- data/bin/roda-parse_routes +25 -0
- data/lib/roda-route_parser.rb +33 -0
- data/lib/roda/plugins/route_list.rb +147 -0
- data/spec/roda-route_list_spec.rb +119 -0
- metadata +96 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 22860ddac7c2f5805445a274c59217bfd1b829f1
|
4
|
+
data.tar.gz: 75976d49b266e7f6a4783ba4a4e8376ce7807873
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 676bb12a6726a91ea0c782e18bcb7f0d4c925748129e706abec2ae0e3d3a4b19c14c1aa52125b11c10fbd01a3240dbc3899a93fb29caec8de6370f2f15f46cdf
|
7
|
+
data.tar.gz: f026084da9cd254125f26abd4e3efe7b45703cdbd1ed0436669c9ef10aac413a0c8f57a727630fab3b4f2ba0561d45d53cbd6a2869fdfe228ceab45406e68c1e
|
data/CHANGELOG
ADDED
data/MIT-LICENSE
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
Copyright (c) 2015 Jeremy Evans
|
2
|
+
|
3
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
4
|
+
a copy of this software and associated documentation files (the
|
5
|
+
"Software"), to deal in the Software without restriction, including
|
6
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
7
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
8
|
+
permit persons to whom the Software is furnished to do so, subject to
|
9
|
+
the following conditions:
|
10
|
+
|
11
|
+
The above copyright notice and this permission notice shall be
|
12
|
+
included in all copies or substantial portions of the Software.
|
13
|
+
|
14
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
15
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
16
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
17
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
18
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
19
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
20
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/README.rdoc
ADDED
@@ -0,0 +1,98 @@
|
|
1
|
+
= roda-route_list
|
2
|
+
|
3
|
+
The Roda route_list plugin reads route information from a json
|
4
|
+
file, and then makes the route metadata available for
|
5
|
+
introspection. This provides a workaround to the general
|
6
|
+
issue of routing trees being unable to introspect the routes.
|
7
|
+
|
8
|
+
== Installation
|
9
|
+
|
10
|
+
gem install roda-route_list
|
11
|
+
|
12
|
+
== Source Code
|
13
|
+
|
14
|
+
Source code is available on GitHub at https://github.com/jeremyevans/roda-route_list
|
15
|
+
|
16
|
+
== Basic Usage
|
17
|
+
|
18
|
+
This plugin assumes that a json file containing the routes
|
19
|
+
metadata has already been created. The recommended way to
|
20
|
+
create one is to add comments above each route in the Roda
|
21
|
+
app, in one of the following formats:
|
22
|
+
|
23
|
+
# route: /path/to/foo
|
24
|
+
# route: GET /path/to/foo
|
25
|
+
# route: GET|POST /path/to/foo/:foo_id
|
26
|
+
# route[route_name]: /path/to/foo
|
27
|
+
# route[route_name]: GET /path/to/foo
|
28
|
+
# route[foo]: GET|POST /path/to/foo/:foo_id
|
29
|
+
|
30
|
+
As you can see, the general style is a comment followed by
|
31
|
+
the word route. If you want to name the route, you can
|
32
|
+
put the name in brackets. Then you have a colon. Optionally
|
33
|
+
after that you can have the method for the route, or multiple
|
34
|
+
methods separated by pipes if the path works with multiple
|
35
|
+
methods. The end is the path for the route.
|
36
|
+
|
37
|
+
Assuming you have added the appropriate comments as explained
|
38
|
+
above, you can create the json file using the roda-parse_routes
|
39
|
+
executable that came with the roda-route_list gem:
|
40
|
+
|
41
|
+
roda-parse_routes -f routes.json app.rb
|
42
|
+
|
43
|
+
Assuming you have the necessary json file created, you can then
|
44
|
+
get route information:
|
45
|
+
|
46
|
+
plugin :route_list
|
47
|
+
|
48
|
+
# Array of route metadata hashes
|
49
|
+
route_list # => [{:path=>'/path/to/foo', :methods=>['GET', 'POST']}]
|
50
|
+
|
51
|
+
# path for the route with the given name
|
52
|
+
named_route(:route_name) # => '/path/to/foo'
|
53
|
+
|
54
|
+
# path for the route with the given name, supplying hash for placeholders
|
55
|
+
named_route(:foo, :foo_id=>3) # => '/path/to/foo/3'
|
56
|
+
|
57
|
+
# path for the route with the given name, supplying array for placeholders
|
58
|
+
named_route(:foo, [3]) # => '/path/to/foo/3'
|
59
|
+
|
60
|
+
The +named_route+ method is also available at the instance level to make it
|
61
|
+
easier to use inside the route block.
|
62
|
+
|
63
|
+
=== Automatically Updating the Routes Metadata
|
64
|
+
|
65
|
+
==== On Heroku
|
66
|
+
|
67
|
+
You can get this to work on Heroku by hooking into the facility for
|
68
|
+
precompiling assets. If this consider your route list an asset, this
|
69
|
+
makes sense. You just need to add an assets:precompile task, similar to
|
70
|
+
this (or add the code an existing assets:precompile task):
|
71
|
+
|
72
|
+
namespace :assets do
|
73
|
+
desc "Update the routes metadata"
|
74
|
+
task :precompile do
|
75
|
+
sh 'roda-parse_routes -f routes.json app.rb'
|
76
|
+
end
|
77
|
+
end
|
78
|
+
|
79
|
+
==== Otherwise
|
80
|
+
|
81
|
+
At the top of your Roda app file, or at least before you create the Roda app
|
82
|
+
subclass, just call the <tt>roda-parse_routes</tt> program:
|
83
|
+
|
84
|
+
# app.rb
|
85
|
+
system 'roda-parse_routes', '-f', 'routes.json', __FILE__
|
86
|
+
require 'roda'
|
87
|
+
|
88
|
+
class App < Roda
|
89
|
+
# ...
|
90
|
+
end
|
91
|
+
|
92
|
+
== License
|
93
|
+
|
94
|
+
MIT
|
95
|
+
|
96
|
+
== Maintainer
|
97
|
+
|
98
|
+
Jeremy Evans <code@jeremyevans.net>
|
data/Rakefile
ADDED
@@ -0,0 +1,69 @@
|
|
1
|
+
require "rake"
|
2
|
+
require "rake/clean"
|
3
|
+
|
4
|
+
CLEAN.include ["rdoc", "roda-route_list-*.gem"]
|
5
|
+
|
6
|
+
desc "Build roda-route_list gem"
|
7
|
+
task :package=>[:clean] do |p|
|
8
|
+
sh %{#{FileUtils::RUBY} -S gem build roda-route_list.gemspec}
|
9
|
+
end
|
10
|
+
|
11
|
+
### Specs
|
12
|
+
|
13
|
+
begin
|
14
|
+
begin
|
15
|
+
# RSpec 1
|
16
|
+
require "spec/rake/spectask"
|
17
|
+
spec_class = Spec::Rake::SpecTask
|
18
|
+
spec_files_meth = :spec_files=
|
19
|
+
rescue LoadError
|
20
|
+
# RSpec 2
|
21
|
+
require "rspec/core/rake_task"
|
22
|
+
spec_class = RSpec::Core::RakeTask
|
23
|
+
spec_files_meth = :pattern=
|
24
|
+
end
|
25
|
+
|
26
|
+
spec = lambda do |name, files, d|
|
27
|
+
lib_dir = File.join(File.dirname(File.expand_path(__FILE__)), 'lib')
|
28
|
+
ENV['RUBYLIB'] ? (ENV['RUBYLIB'] += ":#{lib_dir}") : (ENV['RUBYLIB'] = lib_dir)
|
29
|
+
desc d
|
30
|
+
spec_class.new(name) do |t|
|
31
|
+
ENV['RUBY'] = FileUtils::RUBY
|
32
|
+
t.send(spec_files_meth, files)
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
task :default => [:spec]
|
37
|
+
spec.call("spec", Dir["spec/*_spec.rb"], "Run specs")
|
38
|
+
rescue LoadError
|
39
|
+
task :default do
|
40
|
+
puts "Must install rspec to run the default task (which runs specs)"
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
### RDoc
|
45
|
+
|
46
|
+
RDOC_DEFAULT_OPTS = ["--quiet", "--line-numbers", "--inline-source", '--title', 'roda-route_list: List routes when using Roda']
|
47
|
+
|
48
|
+
begin
|
49
|
+
gem 'hanna-nouveau'
|
50
|
+
RDOC_DEFAULT_OPTS.concat(['-f', 'hanna'])
|
51
|
+
rescue Gem::LoadError
|
52
|
+
end
|
53
|
+
|
54
|
+
rdoc_task_class = begin
|
55
|
+
require "rdoc/task"
|
56
|
+
RDoc::Task
|
57
|
+
rescue LoadError
|
58
|
+
require "rake/rdoctask"
|
59
|
+
Rake::RDocTask
|
60
|
+
end
|
61
|
+
|
62
|
+
RDOC_OPTS = RDOC_DEFAULT_OPTS + ['--main', 'README.rdoc']
|
63
|
+
|
64
|
+
rdoc_task_class.new do |rdoc|
|
65
|
+
rdoc.rdoc_dir = "rdoc"
|
66
|
+
rdoc.options += RDOC_OPTS
|
67
|
+
rdoc.rdoc_files.add %w"README.rdoc CHANGELOG MIT-LICENSE lib/**/*.rb"
|
68
|
+
end
|
69
|
+
|
@@ -0,0 +1,25 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
require 'optparse'
|
4
|
+
require 'json'
|
5
|
+
require File.join(File.dirname(File.dirname(File.expand_path(__FILE__))), 'lib', 'roda-route_parser')
|
6
|
+
|
7
|
+
file = $stdout
|
8
|
+
options = OptionParser.new do |opts|
|
9
|
+
opts.banner = "roda-parse_routes: Parse route comments from roda app files"
|
10
|
+
opts.define_head "Usage: roda-parse_routes [options] [file] ..."
|
11
|
+
opts.separator "Options:"
|
12
|
+
|
13
|
+
opts.on_tail("-h", "-?", "--help", "Show this message") do
|
14
|
+
puts opts
|
15
|
+
exit
|
16
|
+
end
|
17
|
+
|
18
|
+
opts.on("-f", "--file ", "output to given file instead of stdout") do |v|
|
19
|
+
file = File.open(v, 'wb')
|
20
|
+
end
|
21
|
+
end
|
22
|
+
opts = options
|
23
|
+
opts.parse!
|
24
|
+
|
25
|
+
file.puts(RodaRouteParser.parse(ARGF).to_json)
|
@@ -0,0 +1,33 @@
|
|
1
|
+
class RodaRouteParser
|
2
|
+
def self.parse(input)
|
3
|
+
new.parse(input)
|
4
|
+
end
|
5
|
+
|
6
|
+
def parse(input)
|
7
|
+
if input.is_a?(String)
|
8
|
+
require 'stringio'
|
9
|
+
return parse(StringIO.new(input))
|
10
|
+
end
|
11
|
+
|
12
|
+
routes = []
|
13
|
+
regexp = /\A\s*#\s*route(?:\[(\w+)\])?:\s+(?:([A-Z|]+)?\s+)?(\S+)\s*\z/
|
14
|
+
input.each_line do |line|
|
15
|
+
if md = regexp.match(line)
|
16
|
+
name, methods, route = md.captures
|
17
|
+
route = {'path'=>route}
|
18
|
+
|
19
|
+
if methods
|
20
|
+
route['methods'] = methods.split('|').compact
|
21
|
+
end
|
22
|
+
|
23
|
+
if name
|
24
|
+
route['name'] = name
|
25
|
+
end
|
26
|
+
|
27
|
+
routes << route
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
routes
|
32
|
+
end
|
33
|
+
end
|
@@ -0,0 +1,147 @@
|
|
1
|
+
require 'json'
|
2
|
+
|
3
|
+
class Roda
|
4
|
+
module RodaPlugins
|
5
|
+
# The route_list plugin reads route information from a json
|
6
|
+
# file, and then makes the route metadata available for
|
7
|
+
# introspection. This provides a workaround to the general
|
8
|
+
# issue of routing trees being unable to introspect the routes.
|
9
|
+
#
|
10
|
+
# This plugin assumes that a json file containing the routes
|
11
|
+
# metadata has already been created. The recommended way to
|
12
|
+
# create one is to add comments above each route in the Roda
|
13
|
+
# app, in one of the following formats:
|
14
|
+
#
|
15
|
+
# # route: /path/to/foo
|
16
|
+
# # route: GET /path/to/foo
|
17
|
+
# # route: GET|POST /path/to/foo/:foo_id
|
18
|
+
# # route[route_name]: /path/to/foo
|
19
|
+
# # route[route_name]: GET /path/to/foo
|
20
|
+
# # route[foo]: GET|POST /path/to/foo/:foo_id
|
21
|
+
#
|
22
|
+
# As you can see, the general style is a comment followed by
|
23
|
+
# the word route. If you want to name the route, you can
|
24
|
+
# put the name in brackets. Then you have a colon. Optionally
|
25
|
+
# after that you can have the method for the route, or multiple
|
26
|
+
# methods separated by pipes if the path works with multiple
|
27
|
+
# methods. The end is the path for the route.
|
28
|
+
#
|
29
|
+
# Assuming you have added the appropriate comments as explained
|
30
|
+
# above, you can create the json file using the roda-route_parser
|
31
|
+
# executable that came with the roda-route_list gem:
|
32
|
+
#
|
33
|
+
# roda-route_parser -f routes.json app.rb
|
34
|
+
#
|
35
|
+
# Assuming you have the necessary json file created, you can then
|
36
|
+
# get route information:
|
37
|
+
#
|
38
|
+
# plugin :route_list
|
39
|
+
#
|
40
|
+
# # Array of route metadata hashes
|
41
|
+
# route_list # => [{:path=>'/path/to/foo', :methods=>['GET', 'POST']}]
|
42
|
+
#
|
43
|
+
# # path for the route with the given name
|
44
|
+
# named_route(:route_name) # => '/path/to/foo'
|
45
|
+
#
|
46
|
+
# # path for the route with the given name, supplying hash for placeholders
|
47
|
+
# named_route(:foo, :foo_id=>3) # => '/path/to/foo/3'
|
48
|
+
#
|
49
|
+
# # path for the route with the given name, supplying array for placeholders
|
50
|
+
# named_route(:foo, [3]) # => '/path/to/foo/3'
|
51
|
+
#
|
52
|
+
# The +named_route+ method is also available at the instance level to make it
|
53
|
+
# easier to use inside the route block.
|
54
|
+
module RouteList
|
55
|
+
# Set the file to load the routes metadata from. Options:
|
56
|
+
# :file :: The JSON file containing the routes metadata (default: 'routes.json')
|
57
|
+
def self.configure(app, opts={})
|
58
|
+
file = File.expand_path(opts.fetch(:file, 'routes.json'), app.opts[:root])
|
59
|
+
app.send(:load_routes, file)
|
60
|
+
end
|
61
|
+
|
62
|
+
module ClassMethods
|
63
|
+
# Array of route metadata hashes.
|
64
|
+
attr_reader :route_list
|
65
|
+
|
66
|
+
# Return the path for the given named route. If args is not given,
|
67
|
+
# this returns the path directly. If args is a hash, any placeholder
|
68
|
+
# values in the path are replaced with the matching values in args.
|
69
|
+
# If args is an array, placeholder values are taken from the array
|
70
|
+
# in order.
|
71
|
+
def named_route(name, args=nil)
|
72
|
+
unless path = @route_list_names[name]
|
73
|
+
raise RodaError, "no route exists with the name: #{name.inspect}"
|
74
|
+
end
|
75
|
+
|
76
|
+
if args
|
77
|
+
if args.is_a?(Hash)
|
78
|
+
range = 1..-1
|
79
|
+
path = path.gsub(/:[^\/]+/) do |match|
|
80
|
+
unless value = args[match[range].to_sym]
|
81
|
+
raise RodaError, "no matching value exists in the hash for named route #{name}: #{match}"
|
82
|
+
end
|
83
|
+
value
|
84
|
+
end
|
85
|
+
else
|
86
|
+
values = args.dup
|
87
|
+
path = path.gsub(/:[^\/]+/) do |match|
|
88
|
+
if values.empty?
|
89
|
+
raise RodaError, "not enough placeholder values provided for named route #{name}: #{match}"
|
90
|
+
end
|
91
|
+
values.shift
|
92
|
+
end
|
93
|
+
|
94
|
+
unless values.empty?
|
95
|
+
raise RodaError, "too many placeholder values provided for named route #{name}"
|
96
|
+
end
|
97
|
+
end
|
98
|
+
end
|
99
|
+
|
100
|
+
path
|
101
|
+
end
|
102
|
+
|
103
|
+
private
|
104
|
+
|
105
|
+
# Load the route metadata from the given json file.
|
106
|
+
def load_routes(file)
|
107
|
+
@route_list_names = {}
|
108
|
+
|
109
|
+
routes = JSON.parse(File.read(file))
|
110
|
+
@route_list = routes.map do |r|
|
111
|
+
path = r['path'].freeze
|
112
|
+
route = {:path=>path}
|
113
|
+
|
114
|
+
if methods = r['methods']
|
115
|
+
route[:methods] = methods.map{|x| x.to_sym}
|
116
|
+
end
|
117
|
+
|
118
|
+
if name = r['name']
|
119
|
+
name = name.to_sym
|
120
|
+
route[:name] = name.to_sym
|
121
|
+
@route_list_names[name] = path
|
122
|
+
end
|
123
|
+
|
124
|
+
route.freeze
|
125
|
+
end.freeze
|
126
|
+
|
127
|
+
@route_list_names.freeze
|
128
|
+
|
129
|
+
nil
|
130
|
+
end
|
131
|
+
end
|
132
|
+
|
133
|
+
module InstanceMethods
|
134
|
+
# Calls the app's named_route method. If the app's :add_script_name option
|
135
|
+
# has been setting, prefixes the resulting path with the script name.
|
136
|
+
def named_route(name, args=nil)
|
137
|
+
app = self.class
|
138
|
+
path = app.named_route(name, args)
|
139
|
+
path = request.script_name.to_s + path if app.opts[:add_script_name]
|
140
|
+
path
|
141
|
+
end
|
142
|
+
end
|
143
|
+
end
|
144
|
+
|
145
|
+
register_plugin(:route_list, RouteList)
|
146
|
+
end
|
147
|
+
end
|
@@ -0,0 +1,119 @@
|
|
1
|
+
require 'roda'
|
2
|
+
require 'json'
|
3
|
+
|
4
|
+
if defined?(RSpec)
|
5
|
+
require 'rspec/version'
|
6
|
+
if RSpec::Version::STRING >= '2.11.0'
|
7
|
+
RSpec.configure do |config|
|
8
|
+
config.expect_with :rspec do |c|
|
9
|
+
c.syntax = :should
|
10
|
+
end
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
describe 'roda-route_list plugin' do
|
16
|
+
def req(path='/', env={})
|
17
|
+
if path.is_a?(Hash)
|
18
|
+
env = path
|
19
|
+
else
|
20
|
+
env['PATH_INFO'] = path
|
21
|
+
end
|
22
|
+
|
23
|
+
env = {"REQUEST_METHOD" => "GET", "PATH_INFO" => "/", "SCRIPT_NAME" => ""}.merge(env)
|
24
|
+
@app.call(env)
|
25
|
+
end
|
26
|
+
|
27
|
+
def body(path='/', env={})
|
28
|
+
s = ''
|
29
|
+
b = req(path, env)[2]
|
30
|
+
b.each{|x| s << x}
|
31
|
+
b.close if b.respond_to?(:close)
|
32
|
+
s
|
33
|
+
end
|
34
|
+
|
35
|
+
before do
|
36
|
+
@app = Class.new(Roda)
|
37
|
+
@app.plugin :route_list, :file=>'spec/routes.json'
|
38
|
+
@app.route do |r|
|
39
|
+
named_route(env['PATH_INFO'].to_sym)
|
40
|
+
end
|
41
|
+
@app
|
42
|
+
end
|
43
|
+
|
44
|
+
after do
|
45
|
+
File.delete('routes.json') if File.exist?('routes.json')
|
46
|
+
end
|
47
|
+
|
48
|
+
it "should correctly parse the routes from the json file" do
|
49
|
+
@app.route_list.should == [
|
50
|
+
{:path=>'/foo'},
|
51
|
+
{:path=>'/foo/bar', :name=>:bar},
|
52
|
+
{:path=>'/foo/baz', :methods=>[:GET]},
|
53
|
+
{:path=>'/foo/baz/quux/:quux_id', :name=>:quux, :methods=>[:GET, :POST]},
|
54
|
+
]
|
55
|
+
end
|
56
|
+
|
57
|
+
it "should respect :root option when parsing json file" do
|
58
|
+
@app = Class.new(Roda)
|
59
|
+
@app.opts[:root] = 'spec'
|
60
|
+
@app.plugin :route_list, :file=>'routes2.json'
|
61
|
+
@app.route_list.should == [{:path=>'/foo'}]
|
62
|
+
end
|
63
|
+
|
64
|
+
it ".named_route should return path for route" do
|
65
|
+
@app.named_route(:bar).should == '/foo/bar'
|
66
|
+
@app.named_route(:quux).should == '/foo/baz/quux/:quux_id'
|
67
|
+
end
|
68
|
+
|
69
|
+
it ".named_route should return path for route when given a values hash" do
|
70
|
+
@app.named_route(:quux, :quux_id=>3).should == '/foo/baz/quux/3'
|
71
|
+
end
|
72
|
+
|
73
|
+
it ".named_route should return path for route when given a values array" do
|
74
|
+
@app.named_route(:quux, [3]).should == '/foo/baz/quux/3'
|
75
|
+
end
|
76
|
+
|
77
|
+
it ".named_route should raise RodaError if there is no matching route" do
|
78
|
+
proc{@app.named_route(:foo)}.should raise_error(Roda::RodaError)
|
79
|
+
end
|
80
|
+
|
81
|
+
it ".named_route should raise RodaError if there is no matching value when using a values hash" do
|
82
|
+
proc{@app.named_route(:quux, {})}.should raise_error(Roda::RodaError)
|
83
|
+
end
|
84
|
+
|
85
|
+
it ".named_route should raise RodaError if there is no matching value when using a values array" do
|
86
|
+
proc{@app.named_route(:quux, [])}.should raise_error(Roda::RodaError)
|
87
|
+
end
|
88
|
+
|
89
|
+
it ".named_route should raise RodaError if there are too many values when using a values array" do
|
90
|
+
proc{@app.named_route(:quux, [3, 1])}.should raise_error(Roda::RodaError)
|
91
|
+
end
|
92
|
+
|
93
|
+
it "should allow parsing routes from a separate file" do
|
94
|
+
@app.plugin :route_list, :file=>'spec/routes2.json'
|
95
|
+
@app.route_list.should == [{:path=>'/foo'}]
|
96
|
+
end
|
97
|
+
|
98
|
+
it "#named_route should work" do
|
99
|
+
body('bar').should == '/foo/bar'
|
100
|
+
end
|
101
|
+
|
102
|
+
it "#named_route should respect :add_script_name option" do
|
103
|
+
@app.opts[:add_script_name] = true
|
104
|
+
body('bar').should == '/foo/bar'
|
105
|
+
body('bar', 'SCRIPT_NAME'=>'/a').should == '/a/foo/bar'
|
106
|
+
end
|
107
|
+
end
|
108
|
+
|
109
|
+
describe 'roda-route_parser executable' do
|
110
|
+
after do
|
111
|
+
File.delete "spec/routes-example.json"
|
112
|
+
end
|
113
|
+
|
114
|
+
it "should correctly parse the routes" do
|
115
|
+
system(ENV['RUBY'], "bin/roda-parse_routes", "-f", "spec/routes-example.json", "spec/routes.example")
|
116
|
+
File.file?("spec/routes-example.json").should == true
|
117
|
+
JSON.parse(File.read('spec/routes-example.json')).should == JSON.parse(File.read('spec/routes.json'))
|
118
|
+
end
|
119
|
+
end
|
metadata
ADDED
@@ -0,0 +1,96 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: roda-route_list
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 1.0.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Jeremy Evans
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2015-03-09 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: roda
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - ">="
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '0'
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - ">="
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '0'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: rspec
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - ">="
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '1.3'
|
34
|
+
type: :development
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - ">="
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '1.3'
|
41
|
+
description: |
|
42
|
+
Roda, like other routing tree web frameworks, doesn't have the ability
|
43
|
+
to introspect routes. roda-route_list offers a way to specify a json
|
44
|
+
file containing the route metadata, which the route_list plugin will
|
45
|
+
read. It also offers a roda-parse_routes binary that can parse routes
|
46
|
+
out of roda app files, if those app files contain comments specifying
|
47
|
+
the routes.
|
48
|
+
email: code@jeremyevans.net
|
49
|
+
executables:
|
50
|
+
- roda-parse_routes
|
51
|
+
extensions: []
|
52
|
+
extra_rdoc_files:
|
53
|
+
- README.rdoc
|
54
|
+
- CHANGELOG
|
55
|
+
- MIT-LICENSE
|
56
|
+
files:
|
57
|
+
- CHANGELOG
|
58
|
+
- MIT-LICENSE
|
59
|
+
- README.rdoc
|
60
|
+
- Rakefile
|
61
|
+
- bin/roda-parse_routes
|
62
|
+
- lib/roda-route_parser.rb
|
63
|
+
- lib/roda/plugins/route_list.rb
|
64
|
+
- spec/roda-route_list_spec.rb
|
65
|
+
homepage: http://github.com/jeremyevans/roda-route_list
|
66
|
+
licenses:
|
67
|
+
- MIT
|
68
|
+
metadata: {}
|
69
|
+
post_install_message:
|
70
|
+
rdoc_options:
|
71
|
+
- "--quiet"
|
72
|
+
- "--line-numbers"
|
73
|
+
- "--inline-source"
|
74
|
+
- "--title"
|
75
|
+
- 'roda-route_list: List routes when using Roda'
|
76
|
+
- "--main"
|
77
|
+
- README.rdoc
|
78
|
+
require_paths:
|
79
|
+
- lib
|
80
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
81
|
+
requirements:
|
82
|
+
- - ">="
|
83
|
+
- !ruby/object:Gem::Version
|
84
|
+
version: 1.8.7
|
85
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
86
|
+
requirements:
|
87
|
+
- - ">="
|
88
|
+
- !ruby/object:Gem::Version
|
89
|
+
version: '0'
|
90
|
+
requirements: []
|
91
|
+
rubyforge_project:
|
92
|
+
rubygems_version: 2.4.5
|
93
|
+
signing_key:
|
94
|
+
specification_version: 4
|
95
|
+
summary: List routes when using Roda
|
96
|
+
test_files: []
|