Class: Grape::Middleware::Formatter

Inherits:
Base
  • Object
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

Constructor Details

This class inherits a constructor from Grape::Middleware::Base

Instance Method Details

#afterObject



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, headers, 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
  headers['Content-Type'] = 'application/json'
  Rack::Response.new(bodymap, status, headers).to_a
end

#beforeObject



34
35
36
37
38
39
40
41
42
# File 'lib/grape/middleware/formatter.rb', line 34

def before
  fmt = format_from_extension || format_from_header || 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_typesObject



22
23
24
# File 'lib/grape/middleware/formatter.rb', line 22

def content_types
  CONTENT_TYPES.merge(options[:content_types])
end

#default_optionsObject



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

#format_from_extensionObject



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

#format_from_headerObject



55
56
57
58
59
60
61
62
# File 'lib/grape/middleware/formatter.rb', line 55

def format_from_header
  mime_array.each do |t| 
    if mime_types.key?(t)
      return mime_types[t]
    end
  end
  nil
end

#headersObject



30
31
32
# File 'lib/grape/middleware/formatter.rb', line 30

def headers
  env.dup.inject({}){|h,(k,v)| h[k.downcase] = v; h}
end

#mime_arrayObject



64
65
66
67
68
69
70
71
72
73
74
# File 'lib/grape/middleware/formatter.rb', line 64

def mime_array
  accept = headers['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_typesObject



26
27
28
# File 'lib/grape/middleware/formatter.rb', line 26

def mime_types
  content_types.invert
end