helmet 0.1.3 → 0.2.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/Gemfile +4 -0
- data/HISTORY.md +7 -0
- data/LICENSE +18 -0
- data/README.md +46 -0
- data/Rakefile +10 -0
- data/examples/hello_world.rb +10 -0
- data/examples/helper.rb +17 -0
- data/examples/misc.rb +23 -0
- data/examples/public/css/helmet.css +15 -0
- data/examples/runner.rb +17 -0
- data/examples/views/index.erb +7 -0
- data/examples/views/layout.erb +13 -0
- data/helmet.gemspec +24 -0
- data/lib/helmet.rb +1 -0
- data/lib/helmet/api.rb +45 -37
- data/lib/helmet/version.rb +3 -0
- data/test/api_test.rb +15 -1
- metadata +108 -50
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: a879ae7efe16ee0b0697501f4075fea37abe07b1
|
4
|
+
data.tar.gz: 448ee6bb790963c0cd5b5b2faabc7ad1fa585b19
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 15ec47ac0967d6492915529c865507451bb62e1236ec10fdf7c7c5a89af1d0e351bf0e75bfe190a4ebda7409de922a19a7b9961a3c2b536adb6dec979774c9b4
|
7
|
+
data.tar.gz: 495a7c1a4006bc21d140f226744983b68d09ea7c021839521c16a20b17714870a50047b275840d93eaaf99427a9172571ff96b142a6abd1828261988f1538d14
|
data/Gemfile
ADDED
data/HISTORY.md
ADDED
data/LICENSE
ADDED
@@ -0,0 +1,18 @@
|
|
1
|
+
Copyright (c) 2012 Thiago Lewin.
|
2
|
+
|
3
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
4
|
+
of this software and associated documentation files (the "Software"), to
|
5
|
+
deal in the Software without restriction, including without limitation the
|
6
|
+
rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
|
7
|
+
sell copies of the Software, and to permit persons to whom the Software is
|
8
|
+
furnished to do so, subject to the following conditions:
|
9
|
+
|
10
|
+
The above copyright notice and this permission notice shall be included in
|
11
|
+
all copies or substantial portions of the Software.
|
12
|
+
|
13
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
14
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
15
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
16
|
+
THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
|
17
|
+
IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
18
|
+
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/README.md
ADDED
@@ -0,0 +1,46 @@
|
|
1
|
+
Helmet
|
2
|
+
======
|
3
|
+
|
4
|
+
Simple web framework for Goliath web server.
|
5
|
+
|
6
|
+
Helmet is **very** inspired on Sinatra framework (https://github.com/bmizerany/sinatra) without losing the Goliath API design.
|
7
|
+
The framework tries some functionalities that Goliath doesn't provide out of the box, like:
|
8
|
+
|
9
|
+
- Session management
|
10
|
+
- Simplified template support
|
11
|
+
- Simple notation for HTTP verbs and filters
|
12
|
+
|
13
|
+
This is the very first version, all the APIand code will be reviewed.
|
14
|
+
|
15
|
+
Example
|
16
|
+
=======
|
17
|
+
|
18
|
+
```ruby
|
19
|
+
require 'helmet'
|
20
|
+
|
21
|
+
class Misc < Helmet::API
|
22
|
+
|
23
|
+
use Rack::Static,
|
24
|
+
:root => public_folder, # Default: ./public
|
25
|
+
:urls => ['/css']
|
26
|
+
|
27
|
+
get '/' do
|
28
|
+
erb(:index, {:layout => :layout}, {:data => session[:data]})
|
29
|
+
end
|
30
|
+
|
31
|
+
post '/session' do |env|
|
32
|
+
erb(:index, {:layout => :layout}, {:data => session[:data]})
|
33
|
+
end
|
34
|
+
|
35
|
+
end
|
36
|
+
```
|
37
|
+
See examples directory
|
38
|
+
|
39
|
+
License
|
40
|
+
=======
|
41
|
+
Goliath License, (https://github.com/postrank-labs/goliath/blob/master/LICENSE)
|
42
|
+
|
43
|
+
Credits
|
44
|
+
=======
|
45
|
+
|
46
|
+
Helmet is copyright Thiago Lewin <thiago_lewin@yahoo.com.br>
|
data/Rakefile
ADDED
data/examples/helper.rb
ADDED
@@ -0,0 +1,17 @@
|
|
1
|
+
$LOAD_PATH.unshift File.join(File.dirname(__FILE__), '..', 'lib')
|
2
|
+
require 'helmet'
|
3
|
+
|
4
|
+
class Helper < Helmet::API
|
5
|
+
|
6
|
+
helpers do
|
7
|
+
def xs(num)
|
8
|
+
'x' * num
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
get '/' do
|
13
|
+
num = (params['x'] || 0).to_i
|
14
|
+
xs(num)
|
15
|
+
end
|
16
|
+
|
17
|
+
end
|
data/examples/misc.rb
ADDED
@@ -0,0 +1,23 @@
|
|
1
|
+
$LOAD_PATH.unshift File.join(File.dirname(__FILE__), '..', 'lib')
|
2
|
+
require 'helmet'
|
3
|
+
|
4
|
+
class Misc < Helmet::API
|
5
|
+
|
6
|
+
use Rack::Static,
|
7
|
+
:root => config(:public_folder),
|
8
|
+
:urls => ['/css']
|
9
|
+
|
10
|
+
get '/' do
|
11
|
+
erb(:index,
|
12
|
+
{:layout => :layout},
|
13
|
+
{:data => session[:data]})
|
14
|
+
end
|
15
|
+
|
16
|
+
post '/session' do
|
17
|
+
session[:data] = env['params']['session']
|
18
|
+
erb(:index,
|
19
|
+
{:layout => :layout},
|
20
|
+
{:data => session[:data]})
|
21
|
+
end
|
22
|
+
|
23
|
+
end
|
data/examples/runner.rb
ADDED
@@ -0,0 +1,17 @@
|
|
1
|
+
$LOAD_PATH.unshift File.join(File.dirname(__FILE__), '..', 'lib')
|
2
|
+
require 'helmet/api'
|
3
|
+
require 'goliath/runner'
|
4
|
+
|
5
|
+
class Test < Helmet::API
|
6
|
+
|
7
|
+
get '/' do
|
8
|
+
'test'
|
9
|
+
end
|
10
|
+
|
11
|
+
end
|
12
|
+
|
13
|
+
runner = Goliath::Runner.new(ARGV, nil)
|
14
|
+
runner.api = Test.new
|
15
|
+
runner.app = Goliath::Rack::Builder.build(Test, runner.api)
|
16
|
+
runner.run
|
17
|
+
|
@@ -0,0 +1,13 @@
|
|
1
|
+
<!DOCTYPE html>
|
2
|
+
<html>
|
3
|
+
<head>
|
4
|
+
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
|
5
|
+
<link rel="stylesheet" href="/css/helmet.css" type="text/css" media="screen">
|
6
|
+
<title>Helmet - Test</title>
|
7
|
+
</head>
|
8
|
+
<body>
|
9
|
+
<div class="container">
|
10
|
+
<%= yield %>
|
11
|
+
</div>
|
12
|
+
</body>
|
13
|
+
</html>
|
data/helmet.gemspec
ADDED
@@ -0,0 +1,24 @@
|
|
1
|
+
require './lib/helmet/version'
|
2
|
+
|
3
|
+
Gem::Specification.new do |s|
|
4
|
+
s.name = 'helmet'
|
5
|
+
s.version = Helmet::VERSION
|
6
|
+
s.platform = Gem::Platform::RUBY
|
7
|
+
s.date = Time.now
|
8
|
+
s.summary = 'Simple web framework for Goliath web server.'
|
9
|
+
s.description = s.summary
|
10
|
+
s.authors = ['Thiago Lewin']
|
11
|
+
s.email = 'thiago_lewin@yahoo.com.br'
|
12
|
+
s.require_path = 'lib'
|
13
|
+
s.files = Dir['{lib/**/*,examples/**/*,test/**/*}', 'README.md', 'Rakefile', 'HISTORY.md', 'Gemfile', 'helmet.gemspec', 'LICENSE']
|
14
|
+
s.test_files = Dir['test/**/*']
|
15
|
+
s.homepage = 'https://github.com/tlewin/helmet'
|
16
|
+
s.license = 'MIT'
|
17
|
+
|
18
|
+
s.add_dependency 'goliath'
|
19
|
+
s.add_dependency 'http_router'
|
20
|
+
s.add_dependency 'tilt'
|
21
|
+
|
22
|
+
s.add_development_dependency 'yard'
|
23
|
+
s.add_development_dependency 'shoulda'
|
24
|
+
end
|
data/lib/helmet.rb
CHANGED
data/lib/helmet/api.rb
CHANGED
@@ -1,7 +1,11 @@
|
|
1
1
|
require 'goliath/api'
|
2
|
+
require 'goliath/constants'
|
3
|
+
require 'http_router'
|
2
4
|
|
3
5
|
require 'helmet/handler'
|
4
6
|
|
7
|
+
require 'pry'
|
8
|
+
|
5
9
|
module Helmet
|
6
10
|
class API < Goliath::API
|
7
11
|
|
@@ -15,8 +19,8 @@ module Helmet
|
|
15
19
|
@config[key.to_sym]
|
16
20
|
end
|
17
21
|
|
18
|
-
def before(route, &block)
|
19
|
-
@before_filters
|
22
|
+
def before(route, opts = {}, &block)
|
23
|
+
@before_filters.add(route, opts, &block)
|
20
24
|
end
|
21
25
|
|
22
26
|
def routes
|
@@ -36,24 +40,36 @@ module Helmet
|
|
36
40
|
@helpers
|
37
41
|
end
|
38
42
|
|
39
|
-
def get(route, &block)
|
40
|
-
register_route(
|
41
|
-
|
42
|
-
|
43
|
-
def post(route, &block) register_route('POST', route, &block); end
|
44
|
-
def put(route, &block) register_route('PUT', route, &block); end
|
45
|
-
def delete(route, &block) register_route('DELETE', route, &block); end
|
46
|
-
def head(route, &block) register_route('HEAD', route, &block); end
|
47
|
-
|
48
|
-
def register_route(method, route, &block)
|
49
|
-
sig = API.signature(method, route)
|
50
|
-
@routes[sig] = block
|
43
|
+
def get(route, opts = {}, &block)
|
44
|
+
register_route(:GET, route, opts, &block);
|
45
|
+
# HttpRouter already include head
|
46
|
+
# register_route('HEAD', route, opts, &block);
|
51
47
|
end
|
52
48
|
|
53
|
-
def
|
54
|
-
|
55
|
-
end
|
49
|
+
def connect(route, opts = {}, &block) register_route(:CONNECT, route, opts, &block); end
|
50
|
+
def delete(route, opts = {}, &block) register_route(:DELETE, route, opts, &block); end
|
51
|
+
# def head(route, opts = {}, &block) register_route(:HEAD, route, opts, &block); end
|
52
|
+
# def options(route, opts = {}, &block) register_route(:OPTIONS, route, opts, &block); end
|
53
|
+
def post(route, opts = {}, &block) register_route(:POST, route, opts, &block); end
|
54
|
+
def put(route, opts = {}, &block) register_route(:PUT, route, opts, &block); end
|
56
55
|
|
56
|
+
def register_route(method, route, opts = {}, &block)
|
57
|
+
case method
|
58
|
+
when :GET
|
59
|
+
@routes.get(route, opts, &block)
|
60
|
+
when :CONNECT
|
61
|
+
@routes.connect(route, opts, &block)
|
62
|
+
when :DELETE
|
63
|
+
@routes.delete(route, opts, &block)
|
64
|
+
when :OPTIONS
|
65
|
+
@routes.options(route, opts, &block)
|
66
|
+
when :POST
|
67
|
+
@routes.post(route, opts, &block)
|
68
|
+
when :PUT
|
69
|
+
@routes.put(route, opts, &block)
|
70
|
+
end
|
71
|
+
end
|
72
|
+
|
57
73
|
def inherited(klass)
|
58
74
|
klass.init
|
59
75
|
|
@@ -70,10 +86,10 @@ module Helmet
|
|
70
86
|
|
71
87
|
def init
|
72
88
|
# Handle application routes
|
73
|
-
@routes =
|
89
|
+
@routes = HttpRouter.new
|
74
90
|
|
75
91
|
# Handle before filters
|
76
|
-
@before_filters =
|
92
|
+
@before_filters = HttpRouter.new
|
77
93
|
|
78
94
|
@config = {}
|
79
95
|
|
@@ -83,17 +99,12 @@ module Helmet
|
|
83
99
|
private
|
84
100
|
|
85
101
|
def setup_middlewares(klass)
|
86
|
-
# support for session
|
87
|
-
klass.use Rack::Session::Cookie
|
88
102
|
# support for forms
|
89
103
|
klass.use Goliath::Rack::Params
|
90
104
|
end
|
91
105
|
end
|
92
106
|
|
93
107
|
def response(env)
|
94
|
-
# request path
|
95
|
-
path = env['REQUEST_PATH']
|
96
|
-
|
97
108
|
# request handler
|
98
109
|
handler = Handler.new(env, self.class)
|
99
110
|
|
@@ -101,20 +112,16 @@ module Helmet
|
|
101
112
|
handler.extend(self.class.get_helpers)
|
102
113
|
|
103
114
|
catch(:halt) do
|
104
|
-
# evaluate
|
105
|
-
self.class.before_filters.
|
106
|
-
|
107
|
-
|
108
|
-
handler.handle! &route[1] if route.first == path
|
109
|
-
when Regexp
|
110
|
-
handler.handle! &route[1] if route.first =~ path
|
111
|
-
end
|
115
|
+
# evaluate any route match
|
116
|
+
filters = self.class.before_filters.recognize(env).first || []
|
117
|
+
filters.each do |f|
|
118
|
+
handler.handle! &f.route.dest
|
112
119
|
end
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
handler.handle!
|
120
|
+
|
121
|
+
routes_recognized = self.class.routes.recognize(env).first
|
122
|
+
if routes_recognized
|
123
|
+
# Use the first matched route
|
124
|
+
handler.handle! &routes_recognized.first.route.dest
|
118
125
|
else
|
119
126
|
handler.handle! do
|
120
127
|
status 404
|
@@ -122,6 +129,7 @@ module Helmet
|
|
122
129
|
end
|
123
130
|
end
|
124
131
|
end
|
132
|
+
|
125
133
|
handler.response.format_response
|
126
134
|
end
|
127
135
|
end
|
data/test/api_test.rb
CHANGED
@@ -3,8 +3,10 @@ require File.join(File.dirname(__FILE__), 'test_helper')
|
|
3
3
|
require 'uri'
|
4
4
|
|
5
5
|
class Simple < Helmet::API
|
6
|
+
|
7
|
+
use Rack::Session::Cookie, :secret => 'remove_security_warning'
|
6
8
|
|
7
|
-
before
|
9
|
+
before '/xx' do
|
8
10
|
halt 'filtered!'
|
9
11
|
end
|
10
12
|
|
@@ -23,6 +25,10 @@ class Simple < Helmet::API
|
|
23
25
|
delete '/' do
|
24
26
|
'delete'
|
25
27
|
end
|
28
|
+
|
29
|
+
get '/raise' do
|
30
|
+
raise 'Error'
|
31
|
+
end
|
26
32
|
|
27
33
|
get '/redirect' do
|
28
34
|
redirect '/redirected'
|
@@ -86,5 +92,13 @@ class APITest < Test::Unit::TestCase
|
|
86
92
|
end
|
87
93
|
end
|
88
94
|
end
|
95
|
+
|
96
|
+
# def test_raise
|
97
|
+
# with_api(Simple) do
|
98
|
+
# get_request({:path => '/raise'}, @err) do |c|
|
99
|
+
# assert_equal 'get', c.response
|
100
|
+
# end
|
101
|
+
# end
|
102
|
+
# end
|
89
103
|
|
90
104
|
end
|
metadata
CHANGED
@@ -1,85 +1,143 @@
|
|
1
|
-
--- !ruby/object:Gem::Specification
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
2
|
name: helmet
|
3
|
-
version: !ruby/object:Gem::Version
|
4
|
-
|
5
|
-
version: 0.1.3
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.2.0
|
6
5
|
platform: ruby
|
7
|
-
authors:
|
6
|
+
authors:
|
8
7
|
- Thiago Lewin
|
9
8
|
autorequire:
|
10
9
|
bindir: bin
|
11
10
|
cert_chain: []
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
- !ruby/object:Gem::Dependency
|
11
|
+
date: 2013-09-20 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
16
14
|
name: goliath
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - '>='
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '0'
|
20
|
+
type: :runtime
|
17
21
|
prerelease: false
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
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: http_router
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - '>='
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '0'
|
24
34
|
type: :runtime
|
25
|
-
version_requirements: *id001
|
26
|
-
- !ruby/object:Gem::Dependency
|
27
|
-
name: tilt
|
28
35
|
prerelease: false
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - '>='
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '0'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: tilt
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - '>='
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '0'
|
35
48
|
type: :runtime
|
36
|
-
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - '>='
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '0'
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: yard
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - '>='
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '0'
|
62
|
+
type: :development
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - '>='
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '0'
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: shoulda
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - '>='
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: '0'
|
76
|
+
type: :development
|
77
|
+
prerelease: false
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - '>='
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: '0'
|
37
83
|
description: Simple web framework for Goliath web server.
|
38
84
|
email: thiago_lewin@yahoo.com.br
|
39
85
|
executables: []
|
40
|
-
|
41
86
|
extensions: []
|
42
|
-
|
43
87
|
extra_rdoc_files: []
|
44
|
-
|
45
|
-
files:
|
88
|
+
files:
|
46
89
|
- lib/helmet/api.rb
|
47
90
|
- lib/helmet/handler.rb
|
48
91
|
- lib/helmet/response.rb
|
49
92
|
- lib/helmet/templates.rb
|
93
|
+
- lib/helmet/version.rb
|
50
94
|
- lib/helmet.rb
|
95
|
+
- examples/hello_world.rb
|
96
|
+
- examples/helper.rb
|
97
|
+
- examples/misc.rb
|
98
|
+
- examples/public/css/helmet.css
|
99
|
+
- examples/runner.rb
|
100
|
+
- examples/views/index.erb
|
101
|
+
- examples/views/layout.erb
|
51
102
|
- test/api_test.rb
|
52
103
|
- test/helper_test.rb
|
53
104
|
- test/template_test.rb
|
54
105
|
- test/test_helper.rb
|
55
106
|
- test/views/test.erb
|
107
|
+
- README.md
|
108
|
+
- Rakefile
|
109
|
+
- HISTORY.md
|
110
|
+
- Gemfile
|
111
|
+
- helmet.gemspec
|
112
|
+
- LICENSE
|
56
113
|
homepage: https://github.com/tlewin/helmet
|
57
|
-
licenses:
|
58
|
-
|
114
|
+
licenses:
|
115
|
+
- MIT
|
116
|
+
metadata: {}
|
59
117
|
post_install_message:
|
60
118
|
rdoc_options: []
|
61
|
-
|
62
|
-
require_paths:
|
119
|
+
require_paths:
|
63
120
|
- lib
|
64
|
-
required_ruby_version: !ruby/object:Gem::Requirement
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
- !ruby/object:Gem::Version
|
75
|
-
version: "0"
|
121
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
122
|
+
requirements:
|
123
|
+
- - '>='
|
124
|
+
- !ruby/object:Gem::Version
|
125
|
+
version: '0'
|
126
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
127
|
+
requirements:
|
128
|
+
- - '>='
|
129
|
+
- !ruby/object:Gem::Version
|
130
|
+
version: '0'
|
76
131
|
requirements: []
|
77
|
-
|
78
132
|
rubyforge_project:
|
79
|
-
rubygems_version:
|
133
|
+
rubygems_version: 2.0.3
|
80
134
|
signing_key:
|
81
|
-
specification_version:
|
135
|
+
specification_version: 4
|
82
136
|
summary: Simple web framework for Goliath web server.
|
83
|
-
test_files:
|
84
|
-
|
137
|
+
test_files:
|
138
|
+
- test/api_test.rb
|
139
|
+
- test/helper_test.rb
|
140
|
+
- test/template_test.rb
|
141
|
+
- test/test_helper.rb
|
142
|
+
- test/views/test.erb
|
85
143
|
has_rdoc:
|