restfulness 0.3.5 → 0.3.6

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: b8d0ae0d276f2bc7050b05eb6e5847dbdb806eb4
4
- data.tar.gz: 125d361645226748911052cddd7ffd754b868e31
3
+ metadata.gz: 5def9b04aa7a9bc0950574e5d1c05b831efd1119
4
+ data.tar.gz: 159796ac977c49ae23069175b52e3e452bdb2eb1
5
5
  SHA512:
6
- metadata.gz: 0f72e3f6622107325d6758bfcdc9e65706bdad87fa196800c900e8a570e16e8ed52863b3b715e7c3b45c7c53a02291eb79f5cdae7e5aafc550d50ab9d78c0757
7
- data.tar.gz: b38a2f978128b3962e4fa7d8fc27fdb1b322eceeb8d76b0da32d34ade8e6075429e6d84beb66ef1066a28ac4ad02878b24beb7ee091cf2d2b2cc75923372048a
6
+ metadata.gz: b8264abbb1f84368c3481d1f00eb22200a7d525ad9702dd19ccce78da1c77f9d4fa5cf0daa160abf14839a7006610ab490280c5c3401821e42078a27816ee9bf
7
+ data.tar.gz: 8dd35a50d84c0465df049d4bf1648eb13d7ecee684528d63713ba1de0964779e8fe7c0e6940558dc3d5a680bfbce75d89d68866f3dd46a592569ad2d7f8f3324
data/README.md CHANGED
@@ -698,14 +698,18 @@ The project is now awesome, thanks to contributions by:
698
698
 
699
699
  Restfulness is still a work in progress but at Cabify we are using it in production. Here is a list of things that we'd like to improve or fix:
700
700
 
701
- * Support for more serializers and content types, not just JSON.
701
+ * More generic support for custom serializers and content types.
702
702
  * Support path methods for automatic URL generation.
703
703
  * Support redirect exceptions.
704
704
  * Needs more functional testing.
705
- * Support for before and after filters in resources, although I'm slightly apprehensive about this.
706
705
 
707
706
  ## History
708
707
 
708
+ ### 0.3.6 - June 14, 2017
709
+
710
+ * Fixing issue for overriding response Content-Type headers (@samlown)
711
+ * Adding basic support for XML responses if requested in Accept headers (@samlown)
712
+
709
713
  ### 0.3.5 - February 21, 2017
710
714
 
711
715
  * Rewind body after reading (@pacoguzman)
@@ -60,6 +60,13 @@ module Restfulness
60
60
  false
61
61
  end
62
62
 
63
+ def text?
64
+ media_types.each do |mt|
65
+ return true if mt.text?
66
+ end
67
+ false
68
+ end
69
+
63
70
  end
64
71
 
65
72
  end
@@ -69,21 +69,49 @@ module Restfulness
69
69
  end
70
70
 
71
71
  def payload=(body)
72
- if body.nil? || body.is_a?(String)
73
- @payload = body.to_s
74
- update_content_headers(:text) unless @payload.empty?
72
+ type = content_type_from_accept_header
73
+ if body.nil?
74
+ @payload = ""
75
+ elsif body.is_a?(String)
76
+ # Implies that the body was already prepared, and we should rely on accept headers or assume text
77
+ @payload = body
78
+ update_content_headers(type || :text) unless @payload.empty?
79
+ elsif type && type == :xml
80
+ # Try to use a #to_xml if available, or just use to_s.
81
+ @payload = (body.respond_to?(:to_xml) ? body.to_xml : body).to_s
82
+ update_content_headers(:xml) unless @payload.empty?
75
83
  else
84
+ # DEFAULT: Assume we want JSON
76
85
  @payload = MultiJson.encode(body)
77
86
  update_content_headers(:json) unless @payload.empty?
78
87
  end
79
88
  end
80
89
 
90
+ def content_type_from_accept_header
91
+ accept = self.request.accept
92
+ if accept
93
+ if accept.json?
94
+ :json
95
+ elsif accept.xml?
96
+ :xml
97
+ elsif accept.text?
98
+ :text
99
+ end
100
+ else
101
+ nil
102
+ end
103
+ end
104
+
81
105
  def update_content_headers(type = :json)
82
- case type
83
- when :json
84
- headers['Content-Type'] = 'application/json; charset=utf-8'
85
- else # Assume text
86
- headers['Content-Type'] = 'text/plain; charset=utf-8'
106
+ if headers['Content-Type'].to_s.empty?
107
+ case type
108
+ when :json
109
+ headers['Content-Type'] = 'application/json; charset=utf-8'
110
+ when :xml
111
+ headers['Content-Type'] = 'application/xml; charset=utf-8'
112
+ else # Assume text
113
+ headers['Content-Type'] = 'text/plain; charset=utf-8'
114
+ end
87
115
  end
88
116
  headers['Content-Length'] = content_length
89
117
  end
@@ -1,3 +1,3 @@
1
1
  module Restfulness
2
- VERSION = "0.3.5"
2
+ VERSION = "0.3.6"
3
3
  end
@@ -26,4 +26,6 @@ Gem::Specification.new do |spec|
26
26
  spec.add_development_dependency "bundler", "~> 1.3"
27
27
  spec.add_development_dependency "rake"
28
28
  spec.add_development_dependency "rspec"
29
+ spec.add_development_dependency "builder"
30
+
29
31
  end
@@ -61,10 +61,21 @@ describe Restfulness::Headers::Accept do
61
61
  obj = klass.new("text/plain, application/xml; version=1, text/*")
62
62
  expect(obj.xml?).to be true
63
63
  end
64
- it "should confirm if json not accepted" do
64
+ it "should confirm if xml not accepted" do
65
65
  obj = klass.new("text/plain, application/json, text/*")
66
66
  expect(obj.xml?).to be false
67
67
  end
68
68
  end
69
69
 
70
+ describe "#text?" do
71
+ it "should confirm if content includes text" do
72
+ obj = klass.new("text/plain, text/*")
73
+ expect(obj.text?).to be true
74
+ end
75
+ it "should confirm if text not accepted" do
76
+ obj = klass.new("application/json")
77
+ expect(obj.text?).to be false
78
+ end
79
+ end
80
+
70
81
  end
@@ -4,6 +4,9 @@ require 'spec_helper'
4
4
  describe Restfulness::Response do
5
5
 
6
6
  class ResponseResource < Restfulness::Resource
7
+ def get
8
+ ""
9
+ end
7
10
  end
8
11
 
9
12
  let :klass do
@@ -170,4 +173,81 @@ describe Restfulness::Response do
170
173
 
171
174
  end
172
175
 
176
+ describe "content type handling" do
177
+ before :each do
178
+ request.uri = "http://localhost:3000/project"
179
+ request.action = :get
180
+ end
181
+ context "nil content" do
182
+ it "should not set content headers" do
183
+ allow_any_instance_of(ResponseResource).to receive(:get).and_return(nil)
184
+ obj.run
185
+ expect(obj.headers['Content-Type']).to be_nil
186
+ end
187
+ end
188
+ context "empty content" do
189
+ it "should not set content headers" do
190
+ allow_any_instance_of(ResponseResource).to receive(:get).and_return("")
191
+ obj.run
192
+ expect(obj.headers['Content-Type']).to be_nil
193
+ end
194
+ end
195
+ context "json requested with content" do
196
+ let :accept do
197
+ Restfulness::Headers::Accept.new("application/json")
198
+ end
199
+ it "should set json content headers" do
200
+ allow(request).to receive(:accept).and_return(accept)
201
+ allow_any_instance_of(ResponseResource).to receive(:get).and_return({foo: "bar"})
202
+ obj.run
203
+ expect(obj.headers['Content-Type']).to match(/application\/json/)
204
+ end
205
+ end
206
+ context "xml requested with content" do
207
+ let :accept do
208
+ Restfulness::Headers::Accept.new("application/xml")
209
+ end
210
+ it "should set xml content headers" do
211
+ allow(request).to receive(:accept).and_return(accept)
212
+ allow_any_instance_of(ResponseResource).to receive(:get).and_return({foo: "bar"})
213
+ obj.run
214
+ expect(obj.headers['Content-Type']).to match(/application\/xml/)
215
+ expect(obj.payload).to match("<?xml version=\"1.0\"")
216
+ end
217
+ it "should set xml content headers even if string provided by resource" do
218
+ allow(request).to receive(:accept).and_return(accept)
219
+ allow_any_instance_of(ResponseResource).to receive(:get).and_return({foo: "bar"}.to_xml.to_s)
220
+ obj.run
221
+ expect(obj.headers['Content-Type']).to match(/application\/xml/)
222
+ expect(obj.payload).to match("<?xml version=\"1.0\"")
223
+ end
224
+ end
225
+ context "string requested with content" do
226
+ let :accept do
227
+ Restfulness::Headers::Accept.new("text/plain")
228
+ end
229
+ it "should set xml content headers" do
230
+ allow(request).to receive(:accept).and_return(accept)
231
+ allow_any_instance_of(ResponseResource).to receive(:get).and_return({foo: "bar"}.to_s)
232
+ obj.run
233
+ expect(obj.headers['Content-Type']).to match("text/plain")
234
+ end
235
+ end
236
+ context "default with content" do
237
+ it "should set json content headers" do
238
+ allow_any_instance_of(ResponseResource).to receive(:get).and_return({foo: "bar"})
239
+ obj.run
240
+ expect(obj.headers['Content-Type']).to match(/application\/json/)
241
+ end
242
+ end
243
+ context "overriding" do
244
+ it "should allow the content type to be overriden" do
245
+ obj.headers['Content-Type'] = 'application/foo'
246
+ allow_any_instance_of(ResponseResource).to receive(:get).and_return({foo: "bar"})
247
+ obj.run
248
+ expect(obj.headers['Content-Type']).to match("application/foo")
249
+ end
250
+ end
251
+ end
252
+
173
253
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: restfulness
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.5
4
+ version: 0.3.6
5
5
  platform: ruby
6
6
  authors:
7
7
  - Sam Lown
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2017-02-22 00:00:00.000000000 Z
11
+ date: 2017-06-14 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rack
@@ -120,6 +120,20 @@ dependencies:
120
120
  - - ">="
121
121
  - !ruby/object:Gem::Version
122
122
  version: '0'
123
+ - !ruby/object:Gem::Dependency
124
+ name: builder
125
+ requirement: !ruby/object:Gem::Requirement
126
+ requirements:
127
+ - - ">="
128
+ - !ruby/object:Gem::Version
129
+ version: '0'
130
+ type: :development
131
+ prerelease: false
132
+ version_requirements: !ruby/object:Gem::Requirement
133
+ requirements:
134
+ - - ">="
135
+ - !ruby/object:Gem::Version
136
+ version: '0'
123
137
  description: Simple REST server that focuses on resources instead of routes.
124
138
  email:
125
139
  - me@samlown.com