restfulness 0.2.3 → 0.2.4

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: fec45922d74ec00c62042cfa323627cb5e23d925
4
- data.tar.gz: 87679a0dd96e313a113f24e85e35c4130285cb01
3
+ metadata.gz: cfa898034332002c6aca448027bc52cf29abfbd7
4
+ data.tar.gz: 17961f1c4475131c07321a775575b7c32f66360a
5
5
  SHA512:
6
- metadata.gz: a818c4417a58a9a84fe108b5a0c0a57e02f6342ccd47810e571e6d2f6d49ec0c736a111a1ac9b82ec1a67eeecc644908af1fbb869cf0f67f4a31335112e44fb6
7
- data.tar.gz: 568d63dc34ffa86bd6e8f59c5d278ac54426ad7b95648c79252fd1475c93c80cd17611245f8d2e7d926dda22bdc5fc9bad929249cc4cef5aa2e62a9842a35057
6
+ metadata.gz: 493a6d814a922764739e3698bea3a8bf16573bb207f940b0f240f7e70a27c50a9607cc2a3e5d7ad2053ddad95593109fd8370e591e07669cbbd0f6ec23d6185c
7
+ data.tar.gz: a62d90e70f22d2db78e0df083ecaf77c8fa769b6c2372874ad0b88b544cd963a95d8d5ac35d6d064f2aac6d6c56afcba6a7ce1969f20f27b493394c4723ae109
data/README.md CHANGED
@@ -255,6 +255,30 @@ class ProjectResource < Restfulness::Resource
255
255
  end
256
256
  ```
257
257
 
258
+ #### I18n in Resources
259
+
260
+ Restfulness uses the [http_accept_language](https://github.com/iain/http_accept_language) gem to automatically handle the `Accept-Language` header coming in from a client. After trying to make a match between the available locales, it will automatically set the `I18n.locale`. You can access the http_accept_language parser via the `request.http_accept_language` method.
261
+
262
+ For most APIs this should work great, especially for mobile applications where this header is automatically set by the phone. There may however be situations where you need a bit more control. If a user has a preferred language setting for example.
263
+
264
+ Resources contain two protected methods that can be overwritten if you need more precise control. This is what they look like in the Restfulness code:
265
+
266
+ ```ruby
267
+ protected
268
+
269
+ def locale
270
+ request.http_accept_language.compatible_language_from(I18n.available_locales)
271
+ end
272
+
273
+ def set_locale
274
+ I18n.locale = locale
275
+ end
276
+ ```
277
+
278
+ The `Resource#set_locale` method is called before any of the other callbacks are handled. This is important as it allows the locale to be set before returning any translatable error messages.
279
+
280
+ Most users will probably just want to override the `Resource#locale` method and provide the appropriate locale for the request. If you are using a User object or similar, double check your authentication process as the default `authorized?` method will be called *after* the locale is prepared.
281
+
258
282
 
259
283
  ### Requests
260
284
 
@@ -565,7 +589,11 @@ Restfulness is still a work in progress but at Cabify we are using it in product
565
589
 
566
590
  ## History
567
591
 
568
- ### 0.2.3 - pending
592
+ ### 0.2.4 - February 7, 2014
593
+
594
+ * Added I18n support with the help of the http_accept_language gem. (@samlown)
595
+
596
+ ### 0.2.3 - February 6, 2014
569
597
 
570
598
  * Fixing issue where query parameters are set as Hash instead of HashWithIndifferentAccess.
571
599
  * Rewinding the body, incase rails got there first.
@@ -73,6 +73,11 @@ module Restfulness
73
73
  @sanitized_params ||= @params ? Sanitizer.sanitize_hash(@params) : nil
74
74
  end
75
75
 
76
+ # Provide a wrapper for the http_accept_language parser
77
+ def http_accept_language
78
+ @http_accept_language = HttpAcceptLanguage::Parser.new(headers[:accept_language])
79
+ end
80
+
76
81
  [:get, :post, :put, :patch, :delete, :head, :options].each do |m|
77
82
  define_method("#{m}?") do
78
83
  action == m
@@ -51,6 +51,9 @@ module Restfulness
51
51
  end
52
52
 
53
53
  def check_callbacks
54
+ # Locale Handling
55
+ set_locale
56
+
54
57
  # Access control
55
58
  method_not_allowed! unless method_allowed?
56
59
  unauthorized! unless authorized?
@@ -70,6 +73,14 @@ module Restfulness
70
73
 
71
74
  protected
72
75
 
76
+ def locale
77
+ request.http_accept_language.compatible_language_from(I18n.available_locales)
78
+ end
79
+
80
+ def set_locale
81
+ I18n.locale = locale
82
+ end
83
+
73
84
  def logger
74
85
  Restfulness.logger
75
86
  end
@@ -1,3 +1,3 @@
1
1
  module Restfulness
2
- VERSION = "0.2.3"
2
+ VERSION = "0.2.4"
3
3
  end
data/lib/restfulness.rb CHANGED
@@ -9,6 +9,8 @@ require 'rack/commonlogger'
9
9
  require 'rack/showexceptions'
10
10
  require 'rack/builder'
11
11
 
12
+ require 'http_accept_language/parser'
13
+
12
14
  require "restfulness/resources/events"
13
15
 
14
16
  require "restfulness/application"
data/restfulness.gemspec CHANGED
@@ -21,6 +21,7 @@ Gem::Specification.new do |spec|
21
21
  spec.add_dependency "rack", "~> 1.4"
22
22
  spec.add_dependency "multi_json", "~> 1.8"
23
23
  spec.add_dependency "activesupport", ">= 3.1"
24
+ spec.add_dependency "http_accept_language", "~> 2.0"
24
25
 
25
26
  spec.add_development_dependency "bundler", "~> 1.3"
26
27
  spec.add_development_dependency "rake"
data/spec/spec_helper.rb CHANGED
@@ -6,6 +6,9 @@ require 'restfulness' # and any other gems you need
6
6
 
7
7
  RSpec.configure do |config|
8
8
  config.color_enabled = true
9
+
10
+ # Avoid deprication messages with this:
11
+ I18n.config.enforce_available_locales = false
9
12
  end
10
13
 
11
14
  # Disable any logger output
@@ -169,6 +169,17 @@ describe Restfulness::Request do
169
169
  end
170
170
  end
171
171
 
172
+ describe "#http_accept_language" do
173
+ it "should provide an instance of Parser" do
174
+ obj.http_accept_language.should be_a(HttpAcceptLanguage::Parser)
175
+ end
176
+ it "should use the accept_language header" do
177
+ header = "en-us,en-gb;q=0.8,en"
178
+ obj.headers[:accept_language] = header
179
+ obj.http_accept_language.header.should eql(header)
180
+ end
181
+ end
182
+
172
183
  describe "method helpers" do
173
184
  it "should respond to method questions" do
174
185
  [:get?, :post?, :put?, :delete?, :head?, :options?].each do |q|
@@ -121,7 +121,7 @@ describe Restfulness::Resource do
121
121
 
122
122
  let :obj do
123
123
  request.action = :get
124
- obj = resource.new(request, response)
124
+ resource.new(request, response)
125
125
  end
126
126
 
127
127
  it "should all be good by default" do
@@ -130,6 +130,11 @@ describe Restfulness::Resource do
130
130
  }.to_not raise_error
131
131
  end
132
132
 
133
+ it "should try to set the locale" do
134
+ obj.should_receive(:set_locale)
135
+ obj.check_callbacks
136
+ end
137
+
133
138
  it "should raise error on invalid method" do
134
139
  obj.stub(:method_allowed?).and_return(false)
135
140
  expect {
@@ -227,4 +232,38 @@ describe Restfulness::Resource do
227
232
  end
228
233
  end
229
234
 
235
+ describe "Locale handling" do
236
+
237
+ let :resource do
238
+ Class.new(GetPostResource) do
239
+ def head; nil; end
240
+ def put; nil; end
241
+ def delete; nil; end
242
+ end
243
+ end
244
+
245
+ let :obj do
246
+ request.headers[:accept_language] = "nl, es, en"
247
+ request.action = :get
248
+ resource.new(request, response)
249
+ end
250
+
251
+ describe "#locale" do
252
+ it "should return acceptable locale" do
253
+ I18n.available_locales = ['es']
254
+ obj.send(:locale).should eql(:es)
255
+ end
256
+ end
257
+
258
+ describe "#set_locale" do
259
+ it "should set the global locale value" do
260
+ I18n.available_locales = ['en', 'es']
261
+ I18n.locale.should_not eql(:es)
262
+ obj.send(:set_locale)
263
+ I18n.locale.should eql(:es)
264
+ end
265
+ end
266
+
267
+ end
268
+
230
269
  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.2.3
4
+ version: 0.2.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - Sam Lown
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-02-06 00:00:00.000000000 Z
11
+ date: 2014-02-07 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rack
@@ -52,6 +52,20 @@ dependencies:
52
52
  - - '>='
53
53
  - !ruby/object:Gem::Version
54
54
  version: '3.1'
55
+ - !ruby/object:Gem::Dependency
56
+ name: http_accept_language
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ~>
60
+ - !ruby/object:Gem::Version
61
+ version: '2.0'
62
+ type: :runtime
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ~>
67
+ - !ruby/object:Gem::Version
68
+ version: '2.0'
55
69
  - !ruby/object:Gem::Dependency
56
70
  name: bundler
57
71
  requirement: !ruby/object:Gem::Requirement