yard-sinatra 0.2.5 → 0.4.0
Sign up to get free protection for your applications and to get access to all the features.
- data/README.md +59 -0
- data/lib/yard/sinatra.rb +105 -0
- data/spec/example_app.rb +26 -0
- data/spec/yard/sinatra_spec.rb +21 -0
- metadata +45 -19
- data/lib/big_band/version.rb +0 -3
- data/lib/yard-sinatra.rb +0 -2
- data/yard-sinatra.gemspec +0 -24
data/README.md
ADDED
@@ -0,0 +1,59 @@
|
|
1
|
+
YARD::Sinatra
|
2
|
+
=============
|
3
|
+
|
4
|
+
This plugin adds [Sinatra](http://sinatrarb.com) routes to [YARD](http://yardoc.org/) output.
|
5
|
+
|
6
|
+
BigBand
|
7
|
+
-------
|
8
|
+
|
9
|
+
YARD::Sinatra is part of the [BigBand](http://github.com/rkh/big_band) stack.
|
10
|
+
Check it out if you are looking for fancy Sinatra extensions.
|
11
|
+
|
12
|
+
Usage
|
13
|
+
-----
|
14
|
+
|
15
|
+
Install via gemcutter:
|
16
|
+
|
17
|
+
gem install yard-sinatra
|
18
|
+
|
19
|
+
Add comments to your routes (well, that's optional):
|
20
|
+
|
21
|
+
require "sinatra/base"
|
22
|
+
require "user"
|
23
|
+
|
24
|
+
class ExampleApp < Sinatra::Base
|
25
|
+
|
26
|
+
# Settings for a given user
|
27
|
+
#
|
28
|
+
# @param [User] some user
|
29
|
+
# @return [Hash] settings for that user
|
30
|
+
def settings(some_user)
|
31
|
+
raise NotImplementedMethod
|
32
|
+
end
|
33
|
+
|
34
|
+
# Displays a settings page for the current user
|
35
|
+
#
|
36
|
+
# @see ExampleApp#settings
|
37
|
+
get "/settings" do
|
38
|
+
haml :settings, {}, :settings => settings(current_user)
|
39
|
+
end
|
40
|
+
|
41
|
+
end
|
42
|
+
|
43
|
+
The you're ready to go:
|
44
|
+
|
45
|
+
yardoc example_app.rb
|
46
|
+
|
47
|
+
YARD will automatically detect the yard-sinatra plugin and load it.
|
48
|
+
|
49
|
+
Other use cases
|
50
|
+
---------------
|
51
|
+
|
52
|
+
As with yard, this can be used for other means besides documentation.
|
53
|
+
For instance, you might want a list of all routes defined in a given list of files without executing those files:
|
54
|
+
|
55
|
+
require "yard/sinatra"
|
56
|
+
YARD::Registry.load Dir.glob("lib/**/*.rb")
|
57
|
+
YARD::Sinatra.routes.each do |route|
|
58
|
+
puts route.http_verb, route.http_path, route.file, route.docstring
|
59
|
+
end
|
data/lib/yard/sinatra.rb
ADDED
@@ -0,0 +1,105 @@
|
|
1
|
+
require "yard"
|
2
|
+
|
3
|
+
module YARD
|
4
|
+
|
5
|
+
module Sinatra
|
6
|
+
def self.routes
|
7
|
+
YARD::Handlers::Sinatra::AbstractRouteHandler.routes
|
8
|
+
end
|
9
|
+
end
|
10
|
+
|
11
|
+
module CodeObjects
|
12
|
+
class RouteObject < MethodObject
|
13
|
+
attr_accessor :http_verb, :http_path, :real_name
|
14
|
+
|
15
|
+
def name(prefix = false)
|
16
|
+
return super unless show_real_name?
|
17
|
+
prefix ? (sep == ISEP ? "#{sep}#{real_name}" : real_name.to_s) : real_name.to_sym
|
18
|
+
end
|
19
|
+
|
20
|
+
# @see YARD::Handlers::Sinatra::AbstractRouteHandler#register_route
|
21
|
+
# @see #name
|
22
|
+
def show_real_name?
|
23
|
+
real_name and caller[1] =~ /`signature'/
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
module Handlers
|
29
|
+
|
30
|
+
# Displays Sinatra routes in YARD documentation.
|
31
|
+
# Can also be used to parse routes from files without executing those files.
|
32
|
+
module Sinatra
|
33
|
+
|
34
|
+
# Logic both handlers have in common.
|
35
|
+
module AbstractRouteHandler
|
36
|
+
def self.routes
|
37
|
+
@routes ||= []
|
38
|
+
end
|
39
|
+
|
40
|
+
def process
|
41
|
+
path = http_path
|
42
|
+
path = $1 if path =~ /^"(.*)"$/
|
43
|
+
register_route(http_verb, path)
|
44
|
+
register_route('HEAD', path) if http_verb == 'GET'
|
45
|
+
end
|
46
|
+
|
47
|
+
def register_route(verb, path, doc = nil)
|
48
|
+
# HACK: Removing some illegal letters.
|
49
|
+
method_name = "" << verb << "_" << path.gsub(/[^\w_]/, "_")
|
50
|
+
real_name = "" << verb << " " << path
|
51
|
+
route = register CodeObjects::RouteObject.new(namespace, method_name, :instance) do |o|
|
52
|
+
o.visibility = "public"
|
53
|
+
o.source = statement.source
|
54
|
+
o.signature = real_name
|
55
|
+
o.explicit = true
|
56
|
+
o.scope = scope
|
57
|
+
o.docstring = statement.comments
|
58
|
+
o.http_verb = verb
|
59
|
+
o.http_path = path
|
60
|
+
o.real_name = real_name
|
61
|
+
o.add_file(parser.file, statement.line)
|
62
|
+
end
|
63
|
+
AbstractRouteHandler.routes << route
|
64
|
+
yield(route) if block_given?
|
65
|
+
end
|
66
|
+
end
|
67
|
+
|
68
|
+
# Route handler for YARD's source parser.
|
69
|
+
class RouteHandler < Ruby::Base
|
70
|
+
include AbstractRouteHandler
|
71
|
+
|
72
|
+
handles method_call(:get)
|
73
|
+
handles method_call(:post)
|
74
|
+
handles method_call(:put)
|
75
|
+
handles method_call(:delete)
|
76
|
+
handles method_call(:head)
|
77
|
+
|
78
|
+
def http_verb
|
79
|
+
statement.method_name(true).to_s.upcase
|
80
|
+
end
|
81
|
+
|
82
|
+
def http_path
|
83
|
+
statement.parameters.first.source
|
84
|
+
end
|
85
|
+
end
|
86
|
+
|
87
|
+
# Route handler for YARD's legacy parser.
|
88
|
+
module Legacy
|
89
|
+
class RouteHandler < Ruby::Legacy::Base
|
90
|
+
include AbstractRouteHandler
|
91
|
+
handles /\A(get|post|put|delete|head)[\s\(].*/m
|
92
|
+
|
93
|
+
def http_verb
|
94
|
+
statement.tokens.first.text.upcase
|
95
|
+
end
|
96
|
+
|
97
|
+
def http_path
|
98
|
+
statement.tokens[2].text
|
99
|
+
end
|
100
|
+
end
|
101
|
+
end
|
102
|
+
|
103
|
+
end
|
104
|
+
end
|
105
|
+
end
|
data/spec/example_app.rb
ADDED
@@ -0,0 +1,26 @@
|
|
1
|
+
require "sinatra/base"
|
2
|
+
require "user"
|
3
|
+
|
4
|
+
class ExampleApp < Sinatra::Base
|
5
|
+
|
6
|
+
# Settings for a given user
|
7
|
+
#
|
8
|
+
# @param [User] some user
|
9
|
+
# @return [Hash] settings for that user
|
10
|
+
def settings(some_user)
|
11
|
+
raise NotImplementedMethod
|
12
|
+
end
|
13
|
+
|
14
|
+
# Displays a settings page for the current user
|
15
|
+
#
|
16
|
+
# @see ExampleApp#settings
|
17
|
+
get "/settings" do
|
18
|
+
haml :settings, {}, :settings => settings(current_user)
|
19
|
+
end
|
20
|
+
|
21
|
+
put("/settings") { }
|
22
|
+
delete("/settings") { }
|
23
|
+
post("/settings") { }
|
24
|
+
head("/settings") { }
|
25
|
+
|
26
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
require "yard/sinatra"
|
2
|
+
|
3
|
+
describe YARD::Sinatra do
|
4
|
+
before(:all) do
|
5
|
+
$NO_CONTINUATION_WARNING = true
|
6
|
+
YARD::Registry.load [File.expand_path("../../example_app.rb", __FILE__)], true
|
7
|
+
end
|
8
|
+
|
9
|
+
it "reads sinatra routes" do
|
10
|
+
YARD::Sinatra.routes.size.should == 6
|
11
|
+
end
|
12
|
+
|
13
|
+
it "sets properties correctly" do
|
14
|
+
YARD::Sinatra.routes.each do |route|
|
15
|
+
%w[GET HEAD POST PUT DELETE].should include(route.http_verb)
|
16
|
+
route.http_path.should == "/settings"
|
17
|
+
route.file.should =~ /example_app\.rb$/
|
18
|
+
route.docstring.should =~ /Displays a settings page for the current user/ if route.http_verb == "GET"
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
metadata
CHANGED
@@ -1,7 +1,12 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: yard-sinatra
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
|
4
|
+
prerelease: false
|
5
|
+
segments:
|
6
|
+
- 0
|
7
|
+
- 4
|
8
|
+
- 0
|
9
|
+
version: 0.4.0
|
5
10
|
platform: ruby
|
6
11
|
authors:
|
7
12
|
- Konstantin Haase
|
@@ -9,20 +14,38 @@ autorequire:
|
|
9
14
|
bindir: bin
|
10
15
|
cert_chain: []
|
11
16
|
|
12
|
-
date: 2010-
|
17
|
+
date: 2010-03-02 00:00:00 +01:00
|
13
18
|
default_executable:
|
14
19
|
dependencies:
|
15
20
|
- !ruby/object:Gem::Dependency
|
16
|
-
name:
|
21
|
+
name: yard
|
22
|
+
prerelease: false
|
23
|
+
requirement: &id001 !ruby/object:Gem::Requirement
|
24
|
+
requirements:
|
25
|
+
- - ~>
|
26
|
+
- !ruby/object:Gem::Version
|
27
|
+
segments:
|
28
|
+
- 0
|
29
|
+
- 5
|
30
|
+
- 3
|
31
|
+
version: 0.5.3
|
17
32
|
type: :runtime
|
18
|
-
|
19
|
-
|
33
|
+
version_requirements: *id001
|
34
|
+
- !ruby/object:Gem::Dependency
|
35
|
+
name: rspec
|
36
|
+
prerelease: false
|
37
|
+
requirement: &id002 !ruby/object:Gem::Requirement
|
20
38
|
requirements:
|
21
|
-
- - "
|
39
|
+
- - ">="
|
22
40
|
- !ruby/object:Gem::Version
|
23
|
-
|
24
|
-
|
25
|
-
|
41
|
+
segments:
|
42
|
+
- 1
|
43
|
+
- 3
|
44
|
+
- 0
|
45
|
+
version: 1.3.0
|
46
|
+
type: :development
|
47
|
+
version_requirements: *id002
|
48
|
+
description: Displays Sinatra routes (including comments) in YARD output (part of BigBand).
|
26
49
|
email: konstantin.mailinglists@googlemail.com
|
27
50
|
executables: []
|
28
51
|
|
@@ -31,11 +54,12 @@ extensions: []
|
|
31
54
|
extra_rdoc_files: []
|
32
55
|
|
33
56
|
files:
|
34
|
-
- yard
|
35
|
-
-
|
36
|
-
-
|
37
|
-
|
38
|
-
|
57
|
+
- lib/yard/sinatra.rb
|
58
|
+
- spec/example_app.rb
|
59
|
+
- spec/yard/sinatra_spec.rb
|
60
|
+
- README.md
|
61
|
+
has_rdoc: yard
|
62
|
+
homepage: http://github.com/rkh/yard-sinatra
|
39
63
|
licenses: []
|
40
64
|
|
41
65
|
post_install_message:
|
@@ -47,20 +71,22 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
47
71
|
requirements:
|
48
72
|
- - ">="
|
49
73
|
- !ruby/object:Gem::Version
|
74
|
+
segments:
|
75
|
+
- 0
|
50
76
|
version: "0"
|
51
|
-
version:
|
52
77
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
53
78
|
requirements:
|
54
79
|
- - ">="
|
55
80
|
- !ruby/object:Gem::Version
|
81
|
+
segments:
|
82
|
+
- 0
|
56
83
|
version: "0"
|
57
|
-
version:
|
58
84
|
requirements: []
|
59
85
|
|
60
86
|
rubyforge_project:
|
61
|
-
rubygems_version: 1.3.
|
87
|
+
rubygems_version: 1.3.6
|
62
88
|
signing_key:
|
63
|
-
specification_version:
|
64
|
-
summary: YARD
|
89
|
+
specification_version: 3
|
90
|
+
summary: Displays Sinatra routes (including comments) in YARD output (part of BigBand).
|
65
91
|
test_files: []
|
66
92
|
|
data/lib/big_band/version.rb
DELETED
data/lib/yard-sinatra.rb
DELETED
data/yard-sinatra.gemspec
DELETED
@@ -1,24 +0,0 @@
|
|
1
|
-
$LOAD_PATH.unshift "lib"
|
2
|
-
require "lib/big_band/version"
|
3
|
-
|
4
|
-
YARD_SINATRA_SPEC = Gem::Specification.new do |s|
|
5
|
-
|
6
|
-
s.name = "yard-sinatra"
|
7
|
-
s.version = BigBand::VERSION
|
8
|
-
s.date = BigBand::DATE
|
9
|
-
s.author = "Konstantin Haase"
|
10
|
-
s.email = "konstantin.mailinglists@googlemail.com"
|
11
|
-
s.homepage = "http://github.com/rkh/big_band"
|
12
|
-
s.platform = Gem::Platform::RUBY
|
13
|
-
s.summary = "YARD plugin for parsing sinatra routes"
|
14
|
-
s.files = ["yard-sinatra.gemspec", "lib/yard-sinatra.rb", "lib/big_band/version.rb"]
|
15
|
-
s.require_paths = ['lib']
|
16
|
-
s.description = s.summary + " See README.rdoc for more infos."
|
17
|
-
s.has_rdoc = false
|
18
|
-
|
19
|
-
s.add_dependency "big_band", "= #{BigBand::VERSION}"
|
20
|
-
|
21
|
-
s.specification_version = 2 if s.respond_to? :specification_version=
|
22
|
-
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
23
|
-
|
24
|
-
end
|