angelo 0.3.1 → 0.3.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.travis.yml +1 -0
- data/CHANGELOG.md +7 -0
- data/Gemfile +2 -2
- data/README.md +13 -0
- data/lib/angelo/base.rb +3 -2
- data/lib/angelo/responder.rb +4 -0
- data/lib/angelo/tilt/erb.rb +39 -18
- data/lib/angelo/version.rb +1 -1
- data/lib/angelo.rb +4 -1
- data/test/angelo/erb_spec.rb +179 -14
- data/test/angelo/mustermann_spec.rb +1 -1
- data/test/angelo/static_spec.rb +28 -3
- data/test/test_app_root/views/index.js.erb +2 -0
- data/test/test_app_root/views/index.json.erb +1 -0
- data/test/test_app_root/views/index.xml.erb +1 -0
- data/test/test_app_root/views/layout.js.erb +3 -0
- metadata +7 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 6f5dba260998174e061615d20082882201023653
|
4
|
+
data.tar.gz: 95f76832e3a797bc886e93a822ee541640f18df7
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 1cda696fa0204160276711d8927393d680b28149af53d564421a227768e57601e30f6d9e70876c1fb805ffc96df534785965ccee4fa9c825db751ee6af390e0d
|
7
|
+
data.tar.gz: 1d062a3d517d8c3a463ca339f8344c6b4b501a89d187a201f6ccb6fd243f8559d236605254ec2baae190b62adef5fb9df069dab71eb7f90988d6d3077146643b
|
data/.travis.yml
CHANGED
data/CHANGELOG.md
CHANGED
@@ -1,6 +1,13 @@
|
|
1
1
|
changelog
|
2
2
|
=========
|
3
3
|
|
4
|
+
### 0.3.2 27 nov 2014 ¡gracias!
|
5
|
+
|
6
|
+
thanks: @mighe, @artworx
|
7
|
+
|
8
|
+
* send_file now accepts both full paths and paths relative to app file's dir (#20)
|
9
|
+
* erb templates now sorted by type, finer control of response template type (#19)
|
10
|
+
|
4
11
|
### 0.3.1 10 nov 2014 yep, same day - jeez
|
5
12
|
|
6
13
|
* refactor views dir and public dir setting into top level DSLish methods
|
data/Gemfile
CHANGED
data/README.md
CHANGED
@@ -433,6 +433,19 @@ class Foo < Angelo::Base
|
|
433
433
|
end
|
434
434
|
```
|
435
435
|
|
436
|
+
The Angleo::Tilt::ERB module and the `erb` method do some extra work for you:
|
437
|
+
|
438
|
+
* templates are pre-compiled, sorted by type.
|
439
|
+
* template type is determined by word between name and .erb (ex: `index.html.erb`
|
440
|
+
is `:index` name and `:html` type)
|
441
|
+
* the template chosen to render is determined based on:
|
442
|
+
* `:type` option passed to `erb` helper
|
443
|
+
* `Accept` request header value
|
444
|
+
* `Content-Type` response header value
|
445
|
+
* default to `:html`
|
446
|
+
|
447
|
+
See [views](https://github.com/kenichi/angelo/tree/master/test/test_app_root/views) for examples.
|
448
|
+
|
436
449
|
### [Mustermann](https://github.com/rkh/mustermann)
|
437
450
|
|
438
451
|
To make routes blocks match path with Mustermann patterns
|
data/lib/angelo/base.rb
CHANGED
@@ -258,7 +258,7 @@ module Angelo
|
|
258
258
|
block[socket]
|
259
259
|
rescue Reel::SocketError, IOError, SystemCallError => e
|
260
260
|
# probably closed on client
|
261
|
-
warn e.message if report_errors
|
261
|
+
warn e.message if report_errors?
|
262
262
|
socket.close unless socket.closed?
|
263
263
|
rescue => e
|
264
264
|
error e.inspect
|
@@ -271,7 +271,8 @@ module Angelo
|
|
271
271
|
end
|
272
272
|
|
273
273
|
def send_file local_file, opts = {}
|
274
|
-
lp = self.class.
|
274
|
+
lp = local_file[0] == File::SEPARATOR ? local_file : File.expand_path(File.join(self.class.root, local_file))
|
275
|
+
halt 404 unless File.exist? lp
|
275
276
|
|
276
277
|
# Content-Type
|
277
278
|
#
|
data/lib/angelo/responder.rb
CHANGED
@@ -7,6 +7,7 @@ module Angelo
|
|
7
7
|
|
8
8
|
attr_writer :default_headers
|
9
9
|
|
10
|
+
# top-level setter
|
10
11
|
def content_type type
|
11
12
|
dhs = self.default_headers
|
12
13
|
case type
|
@@ -102,6 +103,7 @@ module Angelo
|
|
102
103
|
@headers
|
103
104
|
end
|
104
105
|
|
106
|
+
# route handler helper
|
105
107
|
def content_type type
|
106
108
|
case type
|
107
109
|
when :json
|
@@ -110,6 +112,8 @@ module Angelo
|
|
110
112
|
headers CONTENT_TYPE_HEADER_KEY => HTML_TYPE
|
111
113
|
when :js
|
112
114
|
headers CONTENT_TYPE_HEADER_KEY => JS_TYPE
|
115
|
+
when :xml
|
116
|
+
headers CONTENT_TYPE_HEADER_KEY => XML_TYPE
|
113
117
|
else
|
114
118
|
raise ArgumentError.new "invalid content_type: #{type}"
|
115
119
|
end
|
data/lib/angelo/tilt/erb.rb
CHANGED
@@ -5,6 +5,11 @@ module Angelo
|
|
5
5
|
module Tilt
|
6
6
|
module ERB
|
7
7
|
|
8
|
+
DEFAULT_LAYOUT = 'layout.%s.erb'
|
9
|
+
DEFAULT_TYPE = :html
|
10
|
+
LAYOUTS_DIR = 'layouts'
|
11
|
+
ACCEPT_ALL = '*/*'
|
12
|
+
|
8
13
|
# hrm, sneaky
|
9
14
|
#
|
10
15
|
def self.included base
|
@@ -13,67 +18,83 @@ module Angelo
|
|
13
18
|
|
14
19
|
module ClassMethods
|
15
20
|
|
16
|
-
DEFAULT_LAYOUT = 'layout.html.erb'
|
17
|
-
|
18
21
|
def view_glob *glob
|
19
22
|
File.join views_dir, *glob
|
20
23
|
end
|
21
24
|
|
22
25
|
def templatify *glob
|
23
26
|
Dir[view_glob *glob].reduce({}) do |h,v|
|
24
|
-
sym = v.gsub views_dir +
|
27
|
+
sym = v.gsub views_dir + File::SEPARATOR, ''
|
25
28
|
return h if (block_given? && yield(v))
|
26
|
-
sym.gsub!
|
27
|
-
sym.gsub! /\.\w+?\.erb$/,
|
29
|
+
sym.gsub! File::SEPARATOR, UNDERSCORE
|
30
|
+
sym.gsub! /\.\w+?\.erb$/, EMPTY_STRING
|
28
31
|
h[sym.to_sym] = ::Tilt::ERBTemplate.new v
|
29
32
|
h
|
30
33
|
end
|
31
34
|
end
|
32
35
|
|
33
|
-
def templates
|
34
|
-
@templates ||=
|
36
|
+
def templates type = DEFAULT_TYPE
|
37
|
+
@templates ||= {}
|
38
|
+
@templates[type] ||= templatify('**', "*.#{type}.erb") do |v|
|
39
|
+
v =~ /^#{LAYOUTS_DIR}#{File::SEPARATOR}/
|
40
|
+
end
|
35
41
|
end
|
36
42
|
|
37
|
-
def layout_templates
|
38
|
-
@layout_templates ||= templatify
|
43
|
+
def layout_templates type = DEFAULT_TYPE
|
44
|
+
@layout_templates ||= templatify LAYOUTS_DIR, "*.#{type}.erb"
|
39
45
|
end
|
40
46
|
|
41
|
-
def default_layout
|
42
|
-
|
43
|
-
|
44
|
-
|
47
|
+
def default_layout type = DEFAULT_TYPE
|
48
|
+
@default_layout ||= {}
|
49
|
+
if @default_layout[type].nil?
|
50
|
+
l = view_glob(DEFAULT_LAYOUT % type)
|
51
|
+
@default_layout[type] = ::Tilt::ERBTemplate.new l if File.exist? l
|
45
52
|
end
|
46
|
-
@default_layout
|
53
|
+
@default_layout[type]
|
47
54
|
end
|
48
55
|
|
49
56
|
end
|
50
57
|
|
51
58
|
def erb view, opts = {locals: {}}
|
59
|
+
type = opts[:type] || template_type
|
60
|
+
content_type type
|
52
61
|
locals = Hash === opts[:locals] ? opts[:locals] : {}
|
53
62
|
render = case view
|
54
63
|
when String
|
55
64
|
->{ view }
|
56
65
|
when Symbol
|
57
|
-
->{self.class.templates[view].render self, locals}
|
66
|
+
->{self.class.templates(type)[view].render self, locals}
|
58
67
|
end
|
59
68
|
case opts[:layout]
|
60
69
|
when false
|
61
70
|
render[]
|
62
71
|
when Symbol
|
63
|
-
if lt = self.class.layout_templates[opts[:layout]]
|
72
|
+
if lt = self.class.layout_templates(type)[opts[:layout]]
|
64
73
|
lt.render self, locals, &render
|
65
74
|
else
|
66
75
|
raise ArgumentError.new "unknown layout - :#{opts[:layout]}"
|
67
76
|
end
|
68
77
|
else
|
69
|
-
if self.class.default_layout
|
70
|
-
self.class.default_layout.render self, locals, &render
|
78
|
+
if self.class.default_layout(type)
|
79
|
+
self.class.default_layout(type).render self, locals, &render
|
71
80
|
else
|
72
81
|
render[]
|
73
82
|
end
|
74
83
|
end
|
75
84
|
end
|
76
85
|
|
86
|
+
def template_type
|
87
|
+
accept = request.headers[ACCEPT_REQUEST_HEADER_KEY]
|
88
|
+
mt = if accept.nil? or accept == ACCEPT_ALL
|
89
|
+
MIME::Types[headers[CONTENT_TYPE_HEADER_KEY]]
|
90
|
+
else
|
91
|
+
MIME::Types[request.headers[ACCEPT_REQUEST_HEADER_KEY]]
|
92
|
+
end
|
93
|
+
mt.first.extensions.first.to_sym
|
94
|
+
rescue
|
95
|
+
DEFAULT_TYPE
|
96
|
+
end
|
97
|
+
|
77
98
|
end
|
78
99
|
end
|
79
100
|
end
|
data/lib/angelo/version.rb
CHANGED
data/lib/angelo.rb
CHANGED
@@ -18,6 +18,8 @@ module Angelo
|
|
18
18
|
HTTPABLE = [:get, :post, :put, :delete, :options]
|
19
19
|
STATICABLE = [:get, :head]
|
20
20
|
|
21
|
+
ACCEPT_REQUEST_HEADER_KEY = 'Accept'
|
22
|
+
|
21
23
|
CONTENT_TYPE_HEADER_KEY = 'Content-Type'
|
22
24
|
CONTENT_DISPOSITION_HEADER_KEY = 'Content-Disposition'
|
23
25
|
CONTENT_LENGTH_HEADER_KEY = 'Content-Length'
|
@@ -31,7 +33,8 @@ module Angelo
|
|
31
33
|
JSON_TYPE = 'application/json'
|
32
34
|
FORM_TYPE = 'application/x-www-form-urlencoded'
|
33
35
|
FILE_TYPE = 'application/octet-stream'
|
34
|
-
JS_TYPE = '
|
36
|
+
JS_TYPE = 'application/javascript'
|
37
|
+
XML_TYPE = 'application/xml'
|
35
38
|
|
36
39
|
DEFAULT_ADDR = '127.0.0.1'
|
37
40
|
DEFAULT_PORT = 4567
|
data/test/angelo/erb_spec.rb
CHANGED
@@ -4,6 +4,54 @@ require 'angelo/tilt/erb'
|
|
4
4
|
describe Angelo::Base do
|
5
5
|
describe Angelo::Tilt::ERB do
|
6
6
|
|
7
|
+
expected_html = <<HTML
|
8
|
+
<!doctype html>
|
9
|
+
<html>
|
10
|
+
<head>
|
11
|
+
<title>test</title>
|
12
|
+
</head>
|
13
|
+
<body>
|
14
|
+
foo - asdf
|
15
|
+
locals :bar - bat
|
16
|
+
|
17
|
+
</body>
|
18
|
+
</html>
|
19
|
+
HTML
|
20
|
+
|
21
|
+
expected_xml = <<XML
|
22
|
+
<foo bar="bat">asdf</foo>
|
23
|
+
XML
|
24
|
+
|
25
|
+
expected_json = <<JSON
|
26
|
+
{"foo": "asdf", "bar": ["bat"]}
|
27
|
+
JSON
|
28
|
+
|
29
|
+
expected_javascript = <<JS
|
30
|
+
(function() {
|
31
|
+
var foo = "asdf";
|
32
|
+
var bar = "bat";
|
33
|
+
|
34
|
+
})();
|
35
|
+
JS
|
36
|
+
|
37
|
+
expected_html_nl = <<HTML
|
38
|
+
foo - asdf
|
39
|
+
locals :bar - bat
|
40
|
+
HTML
|
41
|
+
|
42
|
+
expected_xml_nl = <<XML
|
43
|
+
<foo bar="bat">asdf</foo>
|
44
|
+
XML
|
45
|
+
|
46
|
+
expected_json_nl = <<JSON
|
47
|
+
{"foo": "asdf", "bar": ["bat"]}
|
48
|
+
JSON
|
49
|
+
|
50
|
+
expected_javascript_nl = <<JS
|
51
|
+
var foo = "asdf";
|
52
|
+
var bar = "bat";
|
53
|
+
JS
|
54
|
+
|
7
55
|
define_app do
|
8
56
|
|
9
57
|
include Angelo::Tilt::ERB
|
@@ -25,24 +73,40 @@ describe Angelo::Base do
|
|
25
73
|
erb :index, layout: false, locals: {bar: 'bat'}
|
26
74
|
end
|
27
75
|
|
76
|
+
get '/index.html' do
|
77
|
+
set_vars
|
78
|
+
content_type :html
|
79
|
+
erb :index, locals: {bar: 'bat'}, layout: !!params[:layout]
|
80
|
+
end
|
81
|
+
|
82
|
+
get '/index.json' do
|
83
|
+
set_vars
|
84
|
+
content_type :json
|
85
|
+
erb :index, locals: {bar: 'bat'}, layout: !!params[:layout]
|
86
|
+
end
|
87
|
+
|
88
|
+
get '/index.js' do
|
89
|
+
set_vars
|
90
|
+
content_type :js
|
91
|
+
erb :index, locals: {bar: 'bat'}, layout: !!params[:layout]
|
92
|
+
end
|
93
|
+
|
94
|
+
get '/index.xml' do
|
95
|
+
set_vars
|
96
|
+
content_type :xml
|
97
|
+
erb :index, locals: {bar: 'bat'}, layout: !!params[:layout]
|
98
|
+
end
|
99
|
+
|
100
|
+
get '/by_type' do
|
101
|
+
set_vars
|
102
|
+
erb :index, locals: {bar: 'bat'}, type: params[:type].to_sym
|
103
|
+
end
|
104
|
+
|
28
105
|
end
|
29
106
|
|
30
107
|
it 'renders templates with layout' do
|
31
108
|
get '/', foo: 'asdf'
|
32
|
-
|
33
|
-
<!doctype html>
|
34
|
-
<html>
|
35
|
-
<head>
|
36
|
-
<title>test</title>
|
37
|
-
</head>
|
38
|
-
<body>
|
39
|
-
foo - asdf
|
40
|
-
locals :bar - bat
|
41
|
-
|
42
|
-
</body>
|
43
|
-
</html>
|
44
|
-
HTML
|
45
|
-
last_response_must_be_html expected
|
109
|
+
last_response_must_be_html expected_html
|
46
110
|
end
|
47
111
|
|
48
112
|
it 'renders templates without layout' do
|
@@ -54,5 +118,106 @@ HTML
|
|
54
118
|
last_response_must_be_html expected
|
55
119
|
end
|
56
120
|
|
121
|
+
it 'renders templates by Accept header html' do
|
122
|
+
get '/', {foo: 'asdf'}, {'Accept' => 'text/html'}
|
123
|
+
last_response_must_be_html expected_html
|
124
|
+
end
|
125
|
+
|
126
|
+
it 'renders templates by Accept header xml' do
|
127
|
+
get '/', {foo: 'asdf'}, {'Accept' => 'application/xml'}
|
128
|
+
last_response.body.must_equal expected_xml
|
129
|
+
last_response.headers['Content-Type'].must_equal 'application/xml'
|
130
|
+
end
|
131
|
+
|
132
|
+
it 'renders templates by Accept header javascript' do
|
133
|
+
get '/', {foo: 'asdf'}, {'Accept' => 'application/javascript'}
|
134
|
+
last_response.body.must_equal expected_javascript
|
135
|
+
last_response.headers['Content-Type'].must_equal 'application/javascript'
|
136
|
+
end
|
137
|
+
|
138
|
+
it 'renders templates by Accept header json' do
|
139
|
+
get '/', {foo: 'asdf'}, {'Accept' => 'application/json'}
|
140
|
+
last_response.body.must_equal expected_json
|
141
|
+
last_response.headers['Content-Type'].must_equal 'application/json'
|
142
|
+
end
|
143
|
+
|
144
|
+
it 'renders html template when unknown Accept header type' do
|
145
|
+
get '/', {foo: 'asdf'}, {'Accept' => 'forget/about/it'}
|
146
|
+
last_response_must_be_html expected_html
|
147
|
+
end
|
148
|
+
|
149
|
+
# content_type
|
150
|
+
|
151
|
+
it 'renders templates by content_type :html' do
|
152
|
+
get '/index.html', foo: 'asdf', layout: true
|
153
|
+
last_response_must_be_html expected_html
|
154
|
+
end
|
155
|
+
|
156
|
+
it 'renders templates by content_type :xml' do
|
157
|
+
get '/index.xml', foo: 'asdf', layout: true
|
158
|
+
last_response.body.must_equal expected_xml
|
159
|
+
last_response.headers['Content-Type'].must_equal 'application/xml'
|
160
|
+
end
|
161
|
+
|
162
|
+
it 'renders templates by content_type :javascript' do
|
163
|
+
get '/index.js', foo: 'asdf', layout: true
|
164
|
+
last_response.body.must_equal expected_javascript
|
165
|
+
last_response.headers['Content-Type'].must_equal 'application/javascript'
|
166
|
+
end
|
167
|
+
|
168
|
+
it 'renders templates by content_type :json' do
|
169
|
+
get '/index.json', foo: 'asdf', layout: true
|
170
|
+
last_response.body.must_equal expected_json
|
171
|
+
last_response.headers['Content-Type'].must_equal 'application/json'
|
172
|
+
end
|
173
|
+
|
174
|
+
it 'renders templates by content_type :html' do
|
175
|
+
get '/index.html', foo: 'asdf'
|
176
|
+
last_response_must_be_html expected_html_nl
|
177
|
+
end
|
178
|
+
|
179
|
+
it 'renders templates by content_type :xml' do
|
180
|
+
get '/index.xml', foo: 'asdf'
|
181
|
+
last_response.body.must_equal expected_xml_nl
|
182
|
+
last_response.headers['Content-Type'].must_equal 'application/xml'
|
183
|
+
end
|
184
|
+
|
185
|
+
it 'renders templates by content_type :javascript' do
|
186
|
+
get '/index.js', foo: 'asdf'
|
187
|
+
last_response.body.must_equal expected_javascript_nl
|
188
|
+
last_response.headers['Content-Type'].must_equal 'application/javascript'
|
189
|
+
end
|
190
|
+
|
191
|
+
it 'renders templates by content_type :json' do
|
192
|
+
get '/index.json', foo: 'asdf'
|
193
|
+
last_response.body.must_equal expected_json_nl
|
194
|
+
last_response.headers['Content-Type'].must_equal 'application/json'
|
195
|
+
end
|
196
|
+
|
197
|
+
# opts[:type]
|
198
|
+
|
199
|
+
it 'renders templates by opts[:type] :html' do
|
200
|
+
get '/by_type', foo: 'asdf', type: 'html'
|
201
|
+
last_response_must_be_html expected_html
|
202
|
+
end
|
203
|
+
|
204
|
+
it 'renders templates by opts[:type] :xml' do
|
205
|
+
get '/by_type', foo: 'asdf', type: 'xml'
|
206
|
+
last_response.body.must_equal expected_xml
|
207
|
+
last_response.headers['Content-Type'].must_equal 'application/xml'
|
208
|
+
end
|
209
|
+
|
210
|
+
it 'renders templates by opts[:type] :javascript' do
|
211
|
+
get '/by_type', foo: 'asdf', type: 'js'
|
212
|
+
last_response.body.must_equal expected_javascript
|
213
|
+
last_response.headers['Content-Type'].must_equal 'application/javascript'
|
214
|
+
end
|
215
|
+
|
216
|
+
it 'renders templates by opts[:type] :json' do
|
217
|
+
get '/by_type', foo: 'asdf', type: 'json'
|
218
|
+
last_response.body.must_equal expected_json
|
219
|
+
last_response.headers['Content-Type'].must_equal 'application/json'
|
220
|
+
end
|
221
|
+
|
57
222
|
end
|
58
223
|
end
|
data/test/angelo/static_spec.rb
CHANGED
@@ -19,15 +19,23 @@ describe Angelo::Server do
|
|
19
19
|
end
|
20
20
|
|
21
21
|
get '/img' do
|
22
|
-
send_file 'what.png'
|
22
|
+
send_file 'public/what.png'
|
23
23
|
end
|
24
24
|
|
25
25
|
get '/what' do
|
26
|
-
send_file 'what.png', disposition: :attachment
|
26
|
+
send_file 'public/what.png', disposition: :attachment
|
27
27
|
end
|
28
28
|
|
29
29
|
get '/attachment.png' do
|
30
|
-
send_file 'what.png', filename: 'attachment.png'
|
30
|
+
send_file 'public/what.png', filename: 'attachment.png'
|
31
|
+
end
|
32
|
+
|
33
|
+
get '/does_not_exist' do
|
34
|
+
send_file 'does_not_exist'
|
35
|
+
end
|
36
|
+
|
37
|
+
get '/etc/passwd' do
|
38
|
+
send_file '/etc/passwd'
|
31
39
|
end
|
32
40
|
|
33
41
|
end
|
@@ -100,5 +108,22 @@ describe Angelo::Server do
|
|
100
108
|
last_response.headers['Content-Disposition'].must_equal 'attachment; filename="attachment.png"'
|
101
109
|
end
|
102
110
|
|
111
|
+
it '404s when send_file is called with a non-existent file' do
|
112
|
+
get '/does_not_exist'
|
113
|
+
last_response.status.must_equal 404
|
114
|
+
end
|
115
|
+
|
116
|
+
it 'sends fully pathed fileds' do
|
117
|
+
get '/etc/passwd'
|
118
|
+
if File.exist?('/etc/passwd')
|
119
|
+
last_response.status.must_equal 200
|
120
|
+
last_response.headers['Content-Type'].must_equal 'text/html'
|
121
|
+
last_response.headers['Content-Disposition'].must_be_nil
|
122
|
+
last_response.body.must_equal File.read('/etc/passwd')
|
123
|
+
else
|
124
|
+
last_response.status.must_equal 404
|
125
|
+
end
|
126
|
+
end
|
127
|
+
|
103
128
|
end
|
104
129
|
end
|
@@ -0,0 +1 @@
|
|
1
|
+
{"foo": "<%= @foo %>", "bar": ["<%= bar %>"]}
|
@@ -0,0 +1 @@
|
|
1
|
+
<foo bar="<%= bar %>"><%= @foo %></foo>
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: angelo
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.3.
|
4
|
+
version: 0.3.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Kenichi Nakamura
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-11-
|
11
|
+
date: 2014-11-27 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: reel
|
@@ -82,7 +82,11 @@ files:
|
|
82
82
|
- test/test_app_root/public/test.js
|
83
83
|
- test/test_app_root/public/what.png
|
84
84
|
- test/test_app_root/views/index.html.erb
|
85
|
+
- test/test_app_root/views/index.js.erb
|
86
|
+
- test/test_app_root/views/index.json.erb
|
87
|
+
- test/test_app_root/views/index.xml.erb
|
85
88
|
- test/test_app_root/views/layout.html.erb
|
89
|
+
- test/test_app_root/views/layout.js.erb
|
86
90
|
homepage: https://github.com/kenichi/angelo
|
87
91
|
licenses:
|
88
92
|
- apache
|
@@ -103,7 +107,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
103
107
|
version: '0'
|
104
108
|
requirements: []
|
105
109
|
rubyforge_project:
|
106
|
-
rubygems_version: 2.4.
|
110
|
+
rubygems_version: 2.4.4
|
107
111
|
signing_key:
|
108
112
|
specification_version: 4
|
109
113
|
summary: A Sinatra-esque DSL for Reel
|