Class: Grape::Middleware::Formatter
- Inherits:
-
Base
- Object
- Base
- Grape::Middleware::Formatter
show all
- Defined in:
- lib/grape/middleware/formatter.rb
Constant Summary
collapse
- CONTENT_TYPES =
{
:xml => 'application/xml',
:json => 'application/json',
:atom => 'application/atom+xml',
:rss => 'application/rss+xml',
:txt => 'text/plain'
}
Instance Attribute Summary
Attributes inherited from Base
#app, #env, #options
Instance Method Summary
collapse
Methods inherited from Base
#call, #call!, #initialize, #request, #response
Instance Method Details
#after ⇒ Object
76
77
78
79
80
81
82
83
84
85
86
87
88
89
|
# File 'lib/grape/middleware/formatter.rb', line 76
def after
status, , bodies = *@app_response
bodymap = []
bodies.each do |body|
bodymap << case env['api.format']
when :json
encode_json(body)
when :txt
encode_txt(body)
end
end
['Content-Type'] = 'application/json'
Rack::Response.new(bodymap, status, ).to_a
end
|
#before ⇒ Object
34
35
36
37
38
39
40
41
42
|
# File 'lib/grape/middleware/formatter.rb', line 34
def before
fmt = format_from_extension || || options[:default_format]
if content_types.key?(fmt)
env['api.format'] = fmt
else
throw :error, :status => 406, :message => 'The requested format is not supported.'
end
end
|
#content_types ⇒ Object
22
23
24
|
# File 'lib/grape/middleware/formatter.rb', line 22
def content_types
CONTENT_TYPES.merge(options[:content_types])
end
|
#default_options ⇒ Object
15
16
17
18
19
20
|
# File 'lib/grape/middleware/formatter.rb', line 15
def default_options
{
:default_format => :txt,
:content_types => {}
}
end
|
#encode_json(object) ⇒ Object
91
92
93
94
95
96
97
98
99
|
# File 'lib/grape/middleware/formatter.rb', line 91
def encode_json(object)
if object.respond_to? :serializable_hash
MultiJson.encode(object.serializable_hash)
elsif object.respond_to? :to_json
object.to_json
else
MultiJson.encode(object)
end
end
|
#encode_txt(object) ⇒ Object
101
102
103
|
# File 'lib/grape/middleware/formatter.rb', line 101
def encode_txt(object)
body.respond_to?(:to_txt) ? body.to_txt : body.to_s
end
|
44
45
46
47
48
49
50
51
52
53
|
# File 'lib/grape/middleware/formatter.rb', line 44
def format_from_extension
parts = request.path.split('.')
hit = parts.last.to_sym
if parts.size <= 1
nil
else
hit
end
end
|
55
56
57
58
59
60
61
62
|
# File 'lib/grape/middleware/formatter.rb', line 55
def
mime_array.each do |t|
if mime_types.key?(t)
return mime_types[t]
end
end
nil
end
|
30
31
32
|
# File 'lib/grape/middleware/formatter.rb', line 30
def
env.dup.inject({}){|h,(k,v)| h[k.downcase] = v; h}
end
|
#mime_array ⇒ Object
64
65
66
67
68
69
70
71
72
73
74
|
# File 'lib/grape/middleware/formatter.rb', line 64
def mime_array
accept = ['accept']
if accept
accept.gsub(/\b/,'').
scan(/(\w+\/[\w+]+)(?:;[^,]*q=([0-9.]+)[^,]*)?/i).
sort_by{|a| -a[1].to_f}.
map{|a| a[0]}
else
[]
end
end
|
#mime_types ⇒ Object
26
27
28
|
# File 'lib/grape/middleware/formatter.rb', line 26
def mime_types
content_types.invert
end
|