routing_filter_locale_unless_api 0.0.1 → 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +15 -1
- data/.travis.yml +6 -0
- data/.yardopts +8 -0
- data/Appraisals +10 -0
- data/Changelog.md +16 -0
- data/Gemfile +4 -1
- data/Guardfile +11 -0
- data/License.txt +22 -0
- data/README.md +79 -0
- data/Rakefile +31 -2
- data/lib/routing_filter_locale_unless_api/filter/locale_unless_api.rb +126 -0
- data/lib/routing_filter_locale_unless_api/version.rb +5 -2
- data/lib/routing_filter_locale_unless_api.rb +61 -3
- data/routing_filter_locale_unless_api.gemspec +20 -11
- data/spec/routing_filter_locale_unless_api/filter/locale_unless_api_spec.rb +145 -0
- data/spec/spec_helper.rb +14 -0
- metadata +177 -27
- data/README.rdoc +0 -54
- data/lib/routing_filter_locale_unless_api/locale_unless_api.rb +0 -95
- data/test/locale_unless_api_test.rb +0 -130
- data/test/test_helper.rb +0 -26
data/.gitignore
CHANGED
data/.travis.yml
ADDED
data/.yardopts
ADDED
data/Appraisals
ADDED
data/Changelog.md
ADDED
@@ -0,0 +1,16 @@
|
|
1
|
+
### Dev
|
2
|
+
|
3
|
+
[full changelog](https://github.com/ZenCocoon/routing_filter_locale_unless_api/compare/v0.1.0...master)
|
4
|
+
|
5
|
+
### 0.1.0 / 2011-07-04
|
6
|
+
|
7
|
+
[full changelog](https://github.com/ZenCocoon/routing_filter_locale_unless_api/compare/v0.0.1...v0.1.0)
|
8
|
+
|
9
|
+
* Enhancements
|
10
|
+
* Isolate the LocaleUnlessApi filter under it's own namespace
|
11
|
+
* Add [Appraisal](https://github.com/thoughtbot/appraisal) support to test with all ActionPack supported version.
|
12
|
+
* Move tests to RSpec.
|
13
|
+
|
14
|
+
### 0.0.1 / 2011-03-01
|
15
|
+
|
16
|
+
* Initial release.
|
data/Gemfile
CHANGED
@@ -1,4 +1,7 @@
|
|
1
1
|
source "http://rubygems.org"
|
2
2
|
|
3
|
-
# Specify your gem's dependencies in routing_filter_locale_unless_api.gemspec
|
4
3
|
gemspec
|
4
|
+
|
5
|
+
### MRI 1.8 and 1.9
|
6
|
+
gem "rb-fsevent", "~> 0.3.9", :platforms => [:mri_18, :mri_19]
|
7
|
+
gem "ruby-prof", "~> 0.9.2", :platforms => [:mri_18, :mri_19]
|
data/Guardfile
ADDED
@@ -0,0 +1,11 @@
|
|
1
|
+
guard 'rspec', :version => 2 do
|
2
|
+
watch(/^spec\/(.*)_spec.rb/)
|
3
|
+
watch(/^lib\/(.*)\.rb/) { |m| "spec/#{m[1]}_spec.rb" }
|
4
|
+
watch(/^spec\/spec_helper.rb/) { "spec" }
|
5
|
+
end
|
6
|
+
|
7
|
+
guard 'cucumber' do
|
8
|
+
watch(%r{^features/.+\.feature$})
|
9
|
+
watch(%r{^features/support/.+$}) { 'features' }
|
10
|
+
watch(%r{^features/step_definitions/(.+)_steps\.rb$}) { |m| Dir[File.join("**/#{m[1]}.feature")][0] || 'features' }
|
11
|
+
end
|
data/License.txt
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
(The MIT License)
|
2
|
+
|
3
|
+
Copyright (c) 2011 Sébastien Grosjean
|
4
|
+
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
6
|
+
a copy of this software and associated documentation files (the
|
7
|
+
"Software"), to deal in the Software without restriction, including
|
8
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
9
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
10
|
+
permit persons to whom the Software is furnished to do so, subject to
|
11
|
+
the following conditions:
|
12
|
+
|
13
|
+
The above copyright notice and this permission notice shall be
|
14
|
+
included in all copies or substantial portions of the Software.
|
15
|
+
|
16
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
17
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
18
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
|
19
|
+
IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
|
20
|
+
CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
|
21
|
+
TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
|
22
|
+
SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/README.md
ADDED
@@ -0,0 +1,79 @@
|
|
1
|
+
# Routing Filter, Locale Unless API [![build status](http://travis-ci.org/ZenCocoon/routing_filter_locale_unless_api.png)](http://travis-ci.org/ZenCocoon/routing_filter_locale_unless_api)
|
2
|
+
|
3
|
+
RoutingFilterLocaleUnlessAPI is a extension filter to Sven Fuchs’s routing-filter
|
4
|
+
|
5
|
+
http://github.com/svenfuchs/routing-filter
|
6
|
+
|
7
|
+
RoutingFilterLocaleUnlessAPI filter extracts segments matching `/:locale` from
|
8
|
+
the beginning of the recognized path and exposes the locale parameter
|
9
|
+
as `params[:locale]`. When a path is generated the filter adds the segments
|
10
|
+
to the path accordingly if the locale parameter is passed to the url helper.
|
11
|
+
|
12
|
+
It will not add the locale parameter as a url fragment if:
|
13
|
+
|
14
|
+
* the format is `XML` or `JSON` (or any defined API format)
|
15
|
+
* with the root url and default locale
|
16
|
+
|
17
|
+
## Documentation
|
18
|
+
|
19
|
+
The [RDoc](http://rubydoc.info/gems/routing_filter_locale_unless_api/0.1.0/frames) provides
|
20
|
+
additional information for contributors and/or extenders.
|
21
|
+
|
22
|
+
All of the documentation is open source and a work in progress. If you find it
|
23
|
+
lacking or confusing, you can help improve it by submitting requests and
|
24
|
+
patches to the [routing_filter_locale_unless_api issue
|
25
|
+
tracker](https://github.com/ZenCocoon/routing_filter_locale_unless_api/issues).
|
26
|
+
|
27
|
+
## Requirements
|
28
|
+
|
29
|
+
actionpack ~> 3.0.9
|
30
|
+
i18n >= 0.5.0
|
31
|
+
routing-filter ~> 0.2.3
|
32
|
+
|
33
|
+
## Installation
|
34
|
+
|
35
|
+
in your `Gemfile`
|
36
|
+
|
37
|
+
gem 'routing_filter_locale_unless_api'
|
38
|
+
|
39
|
+
then in `config/routes.rb`
|
40
|
+
|
41
|
+
Rails.application.routes.draw do
|
42
|
+
filter :locale_unless_api
|
43
|
+
end
|
44
|
+
|
45
|
+
## Usage
|
46
|
+
|
47
|
+
incoming url: /fr/products
|
48
|
+
filtered url: /products
|
49
|
+
params: params[:locale] = 'fr'
|
50
|
+
|
51
|
+
products_path(:locale => 'fr')
|
52
|
+
generated_path: /fr/products
|
53
|
+
|
54
|
+
products_path(:locale => 'fr', :format => 'xml')
|
55
|
+
generated_path: /products.xml
|
56
|
+
|
57
|
+
root_path(:locale => 'en')
|
58
|
+
generated_path: /
|
59
|
+
|
60
|
+
root_path(:locale => 'fr')
|
61
|
+
generated_path: /fr
|
62
|
+
|
63
|
+
More example visible in the tests cases
|
64
|
+
|
65
|
+
## Configuration
|
66
|
+
|
67
|
+
You can customize the API formats with
|
68
|
+
|
69
|
+
Rails.application.routes.draw do
|
70
|
+
filter :locale_unless_api, :api_formats => %w( xml json xls )
|
71
|
+
end
|
72
|
+
|
73
|
+
## Also see
|
74
|
+
|
75
|
+
* [http://github.com/svenfuchs/routing-filter](http://github.com/svenfuchs/routing-filter)
|
76
|
+
|
77
|
+
## License
|
78
|
+
|
79
|
+
MIT License. Copyright 2011 Sébastien Grosjean, sponsored by [BookingSync, Vacation Rental's Booking Calendar Software](http://www.bookingsync.com)
|
data/Rakefile
CHANGED
@@ -1,2 +1,31 @@
|
|
1
|
-
require 'bundler'
|
2
|
-
|
1
|
+
require 'bundler/setup'
|
2
|
+
require 'rake'
|
3
|
+
require 'rspec/core/rake_task'
|
4
|
+
# require 'cucumber/rake/task'
|
5
|
+
require 'appraisal'
|
6
|
+
|
7
|
+
desc "Default: Run all specs under all ActionPack supported versions."
|
8
|
+
task :default => ["appraisal:install"] do
|
9
|
+
exec('rake appraisal spec')
|
10
|
+
end
|
11
|
+
|
12
|
+
desc "Run all specs"
|
13
|
+
RSpec::Core::RakeTask.new(:spec) do |t|
|
14
|
+
t.rspec_opts = %w[--color]
|
15
|
+
end
|
16
|
+
|
17
|
+
# Cucumber::Rake::Task.new(:cucumber)
|
18
|
+
|
19
|
+
task :clobber do
|
20
|
+
rm_rf 'pkg'
|
21
|
+
rm_rf 'tmp'
|
22
|
+
rm_rf 'coverage'
|
23
|
+
rm 'coverage.data'
|
24
|
+
end
|
25
|
+
|
26
|
+
namespace :clobber do
|
27
|
+
desc "remove generated rbc files"
|
28
|
+
task :rbc do
|
29
|
+
Dir['**/*.rbc'].each {|f| File.delete(f)}
|
30
|
+
end
|
31
|
+
end
|
@@ -0,0 +1,126 @@
|
|
1
|
+
require 'i18n'
|
2
|
+
|
3
|
+
module RoutingFilterLocaleUnlessAPI
|
4
|
+
module Filter
|
5
|
+
class LocaleUnlessApi < RoutingFilter::Filter
|
6
|
+
@@api_formats = %w( xml json )
|
7
|
+
cattr_writer :api_formats
|
8
|
+
|
9
|
+
# Class Methods
|
10
|
+
class << self
|
11
|
+
# Returns +true+ if the given format is considered as an API, otherwise +false+.
|
12
|
+
#
|
13
|
+
# @param [String,Symbol] format
|
14
|
+
#
|
15
|
+
# @return [Boolean]
|
16
|
+
def api_format?(format)
|
17
|
+
format && @@api_formats.include?(format.to_s.downcase)
|
18
|
+
end
|
19
|
+
|
20
|
+
# Returns all available locales
|
21
|
+
#
|
22
|
+
# @return [Array]
|
23
|
+
def locales
|
24
|
+
@@locales ||= I18n.available_locales.map(&:to_sym)
|
25
|
+
end
|
26
|
+
|
27
|
+
# Set locales.
|
28
|
+
#
|
29
|
+
# @param [Array] locales
|
30
|
+
#
|
31
|
+
# @return [Array]
|
32
|
+
# locales as an Array of Symbols
|
33
|
+
def locales=(locales)
|
34
|
+
@@locales = locales.map(&:to_sym)
|
35
|
+
end
|
36
|
+
|
37
|
+
# Define the locales pattern.
|
38
|
+
#
|
39
|
+
# @return [Regexp]
|
40
|
+
def locales_pattern
|
41
|
+
@@locales_pattern ||= %r(^/(#{self.locales.map { |l| Regexp.escape(l.to_s) }.join('|')})(?=/|$))
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
# Extract locale segments from the URL.
|
46
|
+
#
|
47
|
+
# @param [String] path
|
48
|
+
# Current path to recognize, might have been modified by previous filters
|
49
|
+
#
|
50
|
+
# @param [Hash] env
|
51
|
+
# Current environment
|
52
|
+
#
|
53
|
+
# @yield
|
54
|
+
# Additional filters and finally routing
|
55
|
+
def around_recognize(path, env, &block)
|
56
|
+
locale = extract_segment!(self.class.locales_pattern, path) # remove the locale from the beginning of the path
|
57
|
+
yield.tap do |params| # invoke the given block (calls more filters and finally routing)
|
58
|
+
params[:locale] = locale if locale # set recognized locale to the resulting params hash
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
62
|
+
# Add locale segments to the generated URL if required.
|
63
|
+
#
|
64
|
+
# @param *args
|
65
|
+
# Resources and Params given for the route generation
|
66
|
+
#
|
67
|
+
# @yield
|
68
|
+
# Additional filters
|
69
|
+
def around_generate(*args, &block)
|
70
|
+
params = args.extract_options! # this is because we might get a call like forum_topics_path(forum, topic, :locale => :en)
|
71
|
+
|
72
|
+
format = params[:format] # save the current format
|
73
|
+
locale = params.delete(:locale) # extract the passed :locale option
|
74
|
+
locale = I18n.locale if locale.nil? # default to I18n.locale when locale is nil (could also be false)
|
75
|
+
locale = nil unless valid_locale?(locale) # reset to no locale when locale is not valid
|
76
|
+
|
77
|
+
args << params
|
78
|
+
|
79
|
+
yield.tap do |result|
|
80
|
+
prepend_segment!(result, locale) if prepend_locale?(result, locale, format)
|
81
|
+
end
|
82
|
+
end
|
83
|
+
|
84
|
+
protected
|
85
|
+
|
86
|
+
# Returns true if the locale is valid.
|
87
|
+
#
|
88
|
+
# @param [Symbol,String] locale
|
89
|
+
#
|
90
|
+
# @return [Boolean]
|
91
|
+
def valid_locale?(locale)
|
92
|
+
locale && self.class.locales.include?(locale.to_sym)
|
93
|
+
end
|
94
|
+
|
95
|
+
# Returns true if the locale is the default one.
|
96
|
+
#
|
97
|
+
# @param [Symbol,String] locale
|
98
|
+
#
|
99
|
+
# @return [Boolean]
|
100
|
+
def default_locale?(locale)
|
101
|
+
locale && locale.to_sym == I18n.default_locale.to_sym
|
102
|
+
end
|
103
|
+
|
104
|
+
# Returns true if root path.
|
105
|
+
#
|
106
|
+
# @param [String] path
|
107
|
+
#
|
108
|
+
# @return [Boolean]
|
109
|
+
def root_path?(path)
|
110
|
+
path == '/'
|
111
|
+
end
|
112
|
+
|
113
|
+
# Returns true if it should prepend the locale
|
114
|
+
#
|
115
|
+
# @param [String] path
|
116
|
+
# @param [Symbol,String] locale
|
117
|
+
# @param [String,Symbol] format
|
118
|
+
#
|
119
|
+
# @return [Boolean]
|
120
|
+
def prepend_locale?(path, locale, format)
|
121
|
+
locale && !self.class.api_format?(format) && !(root_path?(path) && default_locale?(locale))
|
122
|
+
end
|
123
|
+
|
124
|
+
end
|
125
|
+
end
|
126
|
+
end
|
@@ -1,3 +1,61 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
1
|
+
require 'routing_filter'
|
2
|
+
require 'action_controller'
|
3
|
+
require 'routing_filter_locale_unless_api/filter/locale_unless_api'
|
4
|
+
require 'routing_filter_locale_unless_api/version'
|
5
|
+
|
6
|
+
# RoutingFilterLocaleUnlessAPI is a extension filter to Sven Fuchs’s routing-filter
|
7
|
+
#
|
8
|
+
# http://github.com/svenfuchs/routing-filter
|
9
|
+
#
|
10
|
+
# RoutingFilter::LocaleUnlessAPI filter extracts segments matching +/:locale+ from
|
11
|
+
# the beginning of the recognized path and exposes the locale parameter
|
12
|
+
# as +params[:locale]+. When a path is generated the filter adds the segments
|
13
|
+
# to the path accordingly if the locale parameter is passed to the url helper.
|
14
|
+
#
|
15
|
+
# It will not add the locale parameter as a url fragment if:
|
16
|
+
#
|
17
|
+
# * the format is +XML+ or +JSON+ (or any defined API format)
|
18
|
+
# * with the root url and default locale
|
19
|
+
#
|
20
|
+
# === Install:
|
21
|
+
#
|
22
|
+
# in your +Gemfile+
|
23
|
+
#
|
24
|
+
# gem 'routing_filter_locale_unless_api'
|
25
|
+
#
|
26
|
+
# then in +config/routes.rb+
|
27
|
+
#
|
28
|
+
# Rails.application.routes.draw do
|
29
|
+
# filter :locale_unless_api
|
30
|
+
# end
|
31
|
+
#
|
32
|
+
# @example
|
33
|
+
# incoming url: /fr/products
|
34
|
+
# filtered url: /products
|
35
|
+
# params: params[:locale] = 'fr'
|
36
|
+
#
|
37
|
+
# products_path(:locale => 'fr')
|
38
|
+
# generated_path: /fr/products
|
39
|
+
#
|
40
|
+
# products_path(:locale => 'fr', :format => 'xml')
|
41
|
+
# generated_path: /products.xml
|
42
|
+
#
|
43
|
+
# root_path(:locale => 'en')
|
44
|
+
# generated_path: /
|
45
|
+
#
|
46
|
+
# root_path(:locale => 'fr')
|
47
|
+
# generated_path: /fr
|
48
|
+
#
|
49
|
+
# === Configuration
|
50
|
+
#
|
51
|
+
# You can customize the API formats with
|
52
|
+
#
|
53
|
+
# Rails.application.routes.draw do
|
54
|
+
# filter :locale_unless_api, :api_formats => %w( xml json xls )
|
55
|
+
# end
|
56
|
+
module RoutingFilterLocaleUnlessAPI
|
57
|
+
end
|
58
|
+
|
59
|
+
module RoutingFilter
|
60
|
+
include RoutingFilterLocaleUnlessAPI::Filter
|
61
|
+
end
|
@@ -1,24 +1,33 @@
|
|
1
1
|
# -*- encoding: utf-8 -*-
|
2
2
|
$:.push File.expand_path("../lib", __FILE__)
|
3
|
-
require
|
3
|
+
require 'routing_filter_locale_unless_api/version'
|
4
4
|
|
5
5
|
Gem::Specification.new do |s|
|
6
6
|
s.name = "routing_filter_locale_unless_api"
|
7
|
-
s.version =
|
7
|
+
s.version = RoutingFilterLocaleUnlessAPI::Version::STRING
|
8
8
|
s.platform = Gem::Platform::RUBY
|
9
|
-
s.authors =
|
10
|
-
s.email =
|
9
|
+
s.authors = "Sébastien Grosjean"
|
10
|
+
s.email = "public@zencocoon.com"
|
11
11
|
s.homepage = "https://github.com/ZenCocoon/routing_filter_locale_unless_api"
|
12
12
|
s.summary = %q{routing filter that add locale unless XML or JSON, or root_url with default locale}
|
13
13
|
s.description = %q{A routing-filter additional filter that add locale unless XML or JSON, or root_url with default locale}
|
14
14
|
|
15
|
-
s.
|
15
|
+
s.files = `git ls-files`.split("\n")
|
16
|
+
s.test_files = `git ls-files -- {spec,features}/*`.split("\n")
|
17
|
+
s.extra_rdoc_files = "README.md"
|
18
|
+
s.rdoc_options = "--charset=UTF-8"
|
19
|
+
s.require_path = "lib"
|
16
20
|
|
17
|
-
s.
|
18
|
-
s.
|
19
|
-
s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
|
20
|
-
s.require_paths = ["lib"]
|
21
|
-
|
21
|
+
s.add_dependency "actionpack", "~> 3.0.9"
|
22
|
+
s.add_dependency "i18n", ">= 0.5.0"
|
22
23
|
s.add_dependency "routing-filter", "~> 0.2.3"
|
23
|
-
|
24
|
+
|
25
|
+
s.add_development_dependency "rake", "~> 0.9"
|
26
|
+
s.add_development_dependency 'rspec', '~> 2.6.0'
|
27
|
+
s.add_development_dependency "cucumber", "1.0.0"
|
28
|
+
s.add_development_dependency "guard-rspec", "0.1.9"
|
29
|
+
s.add_development_dependency 'guard-cucumber', "~> 0.5.1"
|
30
|
+
s.add_development_dependency "growl", "1.0.3"
|
31
|
+
s.add_development_dependency 'yard', "~> 0.7.2"
|
32
|
+
s.add_development_dependency "appraisal", '~> 0.3.6'
|
24
33
|
end
|
@@ -0,0 +1,145 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
module RoutingFilterLocaleUnlessAPI::Filter
|
4
|
+
describe LocaleUnlessApi do
|
5
|
+
before do
|
6
|
+
I18n.locale = nil
|
7
|
+
I18n.default_locale = :en
|
8
|
+
I18n.available_locales = %w(fr en)
|
9
|
+
|
10
|
+
RoutingFilter::LocaleUnlessApi.api_formats = %w( xml json )
|
11
|
+
end
|
12
|
+
|
13
|
+
let(:root) { { :controller => 'some', :action => 'index' } }
|
14
|
+
let(:params) { { :controller => 'some', :action => 'show', :id => '1' } }
|
15
|
+
let(:routes) do
|
16
|
+
draw_routes do
|
17
|
+
filter :locale_unless_api
|
18
|
+
match 'products/:id', :to => 'some#show'
|
19
|
+
root :to => 'some#index'
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
context "path recognition" do
|
24
|
+
it 'should recognize /en/products/1' do
|
25
|
+
params.merge(:locale => 'en').should == routes.recognize_path('/en/products/1')
|
26
|
+
end
|
27
|
+
|
28
|
+
it 'should recognize /fr/products/1' do
|
29
|
+
params.merge(:locale => 'fr').should == routes.recognize_path('/fr/products/1')
|
30
|
+
end
|
31
|
+
|
32
|
+
it 'should recognize /products/1.xml' do
|
33
|
+
params.merge(:format => 'xml').should == routes.recognize_path('/products/1.xml')
|
34
|
+
end
|
35
|
+
|
36
|
+
it 'should recognize /products/1.json' do
|
37
|
+
params.merge(:format => 'json').should == routes.recognize_path('/products/1.json')
|
38
|
+
end
|
39
|
+
|
40
|
+
it 'should recognize /en' do
|
41
|
+
root.merge(:locale => 'en').should == routes.recognize_path('/en/')
|
42
|
+
end
|
43
|
+
|
44
|
+
it 'should recognize /fr' do
|
45
|
+
root.merge(:locale => 'fr').should == routes.recognize_path('/fr')
|
46
|
+
end
|
47
|
+
|
48
|
+
it 'should recognize /' do
|
49
|
+
root.should == routes.recognize_path('/')
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
context "route generation" do
|
54
|
+
context "with locale set" do
|
55
|
+
before(:each) do
|
56
|
+
I18n.locale = 'fr'
|
57
|
+
end
|
58
|
+
|
59
|
+
context "prepends the segments /:locale to the generated path" do
|
60
|
+
it 'if the current locale is not the default locale' do
|
61
|
+
routes.generate(params).should == '/fr/products/1'
|
62
|
+
end
|
63
|
+
|
64
|
+
it 'if the current locale is the default locale' do
|
65
|
+
I18n.locale = 'en'
|
66
|
+
routes.generate(params).should == '/en/products/1'
|
67
|
+
end
|
68
|
+
|
69
|
+
it 'if the current locale is not the default locale and with root url' do
|
70
|
+
routes.generate(root).should == '/fr'
|
71
|
+
end
|
72
|
+
|
73
|
+
it 'if the format XLS is not considered as api' do
|
74
|
+
routes.generate(params.merge(:format => 'xls')).should == '/fr/products/1.xls'
|
75
|
+
end
|
76
|
+
end
|
77
|
+
|
78
|
+
context "does not prepend the segments /:locale to the generated path" do
|
79
|
+
it 'if the current locale is the default locale and with root url' do
|
80
|
+
I18n.locale = 'en'
|
81
|
+
routes.generate(root).should == '/'
|
82
|
+
end
|
83
|
+
|
84
|
+
it 'if the format XML is considered as api' do
|
85
|
+
routes.generate(params.merge(:format => 'xml')).should == '/products/1.xml'
|
86
|
+
end
|
87
|
+
|
88
|
+
it 'if the format JSON is considered as api' do
|
89
|
+
routes.generate(params.merge(:format => 'json')).should == '/products/1.json'
|
90
|
+
end
|
91
|
+
|
92
|
+
it 'if the format XLS is considered as api' do
|
93
|
+
RoutingFilter::LocaleUnlessApi.api_formats = %w( xml json xls )
|
94
|
+
routes.generate(params.merge(:format => 'xls')).should == '/products/1.xls'
|
95
|
+
end
|
96
|
+
end
|
97
|
+
|
98
|
+
it 'should work with format as symbol' do
|
99
|
+
routes.generate(params.merge(:format => :xml)).should == '/products/1.xml'
|
100
|
+
end
|
101
|
+
end
|
102
|
+
|
103
|
+
context "with locale as param" do
|
104
|
+
let(:params) { { :controller => 'some', :action => 'show', :id => '1', :locale => 'fr' } }
|
105
|
+
|
106
|
+
context "prepends the segments /:locale to the generated path" do
|
107
|
+
it 'if the given locale is not the default locale' do
|
108
|
+
routes.generate(params).should == '/fr/products/1'
|
109
|
+
end
|
110
|
+
|
111
|
+
it 'if the given locale is the default locale' do
|
112
|
+
routes.generate(params.merge(:locale => 'en')).should == '/en/products/1'
|
113
|
+
end
|
114
|
+
|
115
|
+
it 'if the given locale is not the default locale and with root url' do
|
116
|
+
routes.generate(root.merge(:locale => 'fr')).should == '/fr'
|
117
|
+
end
|
118
|
+
|
119
|
+
it 'if a given locale and the format XLS is not considered as api' do
|
120
|
+
routes.generate(params.merge(:format => 'xls')).should == '/fr/products/1.xls'
|
121
|
+
end
|
122
|
+
end
|
123
|
+
|
124
|
+
context "does not prepend the segments /:locale to the generated path" do
|
125
|
+
it 'if a given locale is the default locale and with the root url' do
|
126
|
+
routes.generate(root.merge(:locale => 'en')).should == '/'
|
127
|
+
end
|
128
|
+
|
129
|
+
it 'if a given locale and the format XML is considered as api' do
|
130
|
+
routes.generate(params.merge(:format => 'xml')).should == '/products/1.xml'
|
131
|
+
end
|
132
|
+
|
133
|
+
it 'if a given locale and the format JSON is considered as api' do
|
134
|
+
routes.generate(params.merge(:format => 'json')).should == '/products/1.json'
|
135
|
+
end
|
136
|
+
|
137
|
+
it 'if a given locale and the format XLS is considered as api' do
|
138
|
+
RoutingFilter::LocaleUnlessApi.api_formats = %w( xml json xls )
|
139
|
+
routes.generate(params.merge(:format => 'xls')).should == '/products/1.xls'
|
140
|
+
end
|
141
|
+
end
|
142
|
+
end
|
143
|
+
end
|
144
|
+
end
|
145
|
+
end
|
data/spec/spec_helper.rb
ADDED
@@ -0,0 +1,14 @@
|
|
1
|
+
require 'routing_filter_locale_unless_api'
|
2
|
+
|
3
|
+
RSpec::configure do |config|
|
4
|
+
config.color_enabled = true
|
5
|
+
end
|
6
|
+
|
7
|
+
include RoutingFilter
|
8
|
+
|
9
|
+
class SomeController < ActionController::Base
|
10
|
+
end
|
11
|
+
|
12
|
+
def draw_routes(&block)
|
13
|
+
ActionDispatch::Routing::RouteSet.new.tap { |set| set.draw(&block) }
|
14
|
+
end
|
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: routing_filter_locale_unless_api
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
5
|
-
prerelease:
|
4
|
+
hash: 27
|
5
|
+
prerelease:
|
6
6
|
segments:
|
7
7
|
- 0
|
8
|
-
- 0
|
9
8
|
- 1
|
10
|
-
|
9
|
+
- 0
|
10
|
+
version: 0.1.0
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- "S\xC3\xA9bastien Grosjean"
|
@@ -15,13 +15,45 @@ autorequire:
|
|
15
15
|
bindir: bin
|
16
16
|
cert_chain: []
|
17
17
|
|
18
|
-
date: 2011-
|
18
|
+
date: 2011-07-04 00:00:00 +03:00
|
19
19
|
default_executable:
|
20
20
|
dependencies:
|
21
21
|
- !ruby/object:Gem::Dependency
|
22
|
-
name:
|
22
|
+
name: actionpack
|
23
23
|
prerelease: false
|
24
24
|
requirement: &id001 !ruby/object:Gem::Requirement
|
25
|
+
none: false
|
26
|
+
requirements:
|
27
|
+
- - ~>
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
hash: 21
|
30
|
+
segments:
|
31
|
+
- 3
|
32
|
+
- 0
|
33
|
+
- 9
|
34
|
+
version: 3.0.9
|
35
|
+
type: :runtime
|
36
|
+
version_requirements: *id001
|
37
|
+
- !ruby/object:Gem::Dependency
|
38
|
+
name: i18n
|
39
|
+
prerelease: false
|
40
|
+
requirement: &id002 !ruby/object:Gem::Requirement
|
41
|
+
none: false
|
42
|
+
requirements:
|
43
|
+
- - ">="
|
44
|
+
- !ruby/object:Gem::Version
|
45
|
+
hash: 11
|
46
|
+
segments:
|
47
|
+
- 0
|
48
|
+
- 5
|
49
|
+
- 0
|
50
|
+
version: 0.5.0
|
51
|
+
type: :runtime
|
52
|
+
version_requirements: *id002
|
53
|
+
- !ruby/object:Gem::Dependency
|
54
|
+
name: routing-filter
|
55
|
+
prerelease: false
|
56
|
+
requirement: &id003 !ruby/object:Gem::Requirement
|
25
57
|
none: false
|
26
58
|
requirements:
|
27
59
|
- - ~>
|
@@ -33,48 +65,166 @@ dependencies:
|
|
33
65
|
- 3
|
34
66
|
version: 0.2.3
|
35
67
|
type: :runtime
|
36
|
-
version_requirements: *
|
68
|
+
version_requirements: *id003
|
37
69
|
- !ruby/object:Gem::Dependency
|
38
|
-
name:
|
70
|
+
name: rake
|
39
71
|
prerelease: false
|
40
|
-
requirement: &
|
72
|
+
requirement: &id004 !ruby/object:Gem::Requirement
|
41
73
|
none: false
|
42
74
|
requirements:
|
43
|
-
- -
|
75
|
+
- - ~>
|
44
76
|
- !ruby/object:Gem::Version
|
45
|
-
hash:
|
77
|
+
hash: 25
|
46
78
|
segments:
|
47
79
|
- 0
|
48
|
-
|
80
|
+
- 9
|
81
|
+
version: "0.9"
|
49
82
|
type: :development
|
50
|
-
version_requirements: *
|
83
|
+
version_requirements: *id004
|
84
|
+
- !ruby/object:Gem::Dependency
|
85
|
+
name: rspec
|
86
|
+
prerelease: false
|
87
|
+
requirement: &id005 !ruby/object:Gem::Requirement
|
88
|
+
none: false
|
89
|
+
requirements:
|
90
|
+
- - ~>
|
91
|
+
- !ruby/object:Gem::Version
|
92
|
+
hash: 23
|
93
|
+
segments:
|
94
|
+
- 2
|
95
|
+
- 6
|
96
|
+
- 0
|
97
|
+
version: 2.6.0
|
98
|
+
type: :development
|
99
|
+
version_requirements: *id005
|
100
|
+
- !ruby/object:Gem::Dependency
|
101
|
+
name: cucumber
|
102
|
+
prerelease: false
|
103
|
+
requirement: &id006 !ruby/object:Gem::Requirement
|
104
|
+
none: false
|
105
|
+
requirements:
|
106
|
+
- - "="
|
107
|
+
- !ruby/object:Gem::Version
|
108
|
+
hash: 23
|
109
|
+
segments:
|
110
|
+
- 1
|
111
|
+
- 0
|
112
|
+
- 0
|
113
|
+
version: 1.0.0
|
114
|
+
type: :development
|
115
|
+
version_requirements: *id006
|
116
|
+
- !ruby/object:Gem::Dependency
|
117
|
+
name: guard-rspec
|
118
|
+
prerelease: false
|
119
|
+
requirement: &id007 !ruby/object:Gem::Requirement
|
120
|
+
none: false
|
121
|
+
requirements:
|
122
|
+
- - "="
|
123
|
+
- !ruby/object:Gem::Version
|
124
|
+
hash: 9
|
125
|
+
segments:
|
126
|
+
- 0
|
127
|
+
- 1
|
128
|
+
- 9
|
129
|
+
version: 0.1.9
|
130
|
+
type: :development
|
131
|
+
version_requirements: *id007
|
132
|
+
- !ruby/object:Gem::Dependency
|
133
|
+
name: guard-cucumber
|
134
|
+
prerelease: false
|
135
|
+
requirement: &id008 !ruby/object:Gem::Requirement
|
136
|
+
none: false
|
137
|
+
requirements:
|
138
|
+
- - ~>
|
139
|
+
- !ruby/object:Gem::Version
|
140
|
+
hash: 9
|
141
|
+
segments:
|
142
|
+
- 0
|
143
|
+
- 5
|
144
|
+
- 1
|
145
|
+
version: 0.5.1
|
146
|
+
type: :development
|
147
|
+
version_requirements: *id008
|
148
|
+
- !ruby/object:Gem::Dependency
|
149
|
+
name: growl
|
150
|
+
prerelease: false
|
151
|
+
requirement: &id009 !ruby/object:Gem::Requirement
|
152
|
+
none: false
|
153
|
+
requirements:
|
154
|
+
- - "="
|
155
|
+
- !ruby/object:Gem::Version
|
156
|
+
hash: 17
|
157
|
+
segments:
|
158
|
+
- 1
|
159
|
+
- 0
|
160
|
+
- 3
|
161
|
+
version: 1.0.3
|
162
|
+
type: :development
|
163
|
+
version_requirements: *id009
|
164
|
+
- !ruby/object:Gem::Dependency
|
165
|
+
name: yard
|
166
|
+
prerelease: false
|
167
|
+
requirement: &id010 !ruby/object:Gem::Requirement
|
168
|
+
none: false
|
169
|
+
requirements:
|
170
|
+
- - ~>
|
171
|
+
- !ruby/object:Gem::Version
|
172
|
+
hash: 7
|
173
|
+
segments:
|
174
|
+
- 0
|
175
|
+
- 7
|
176
|
+
- 2
|
177
|
+
version: 0.7.2
|
178
|
+
type: :development
|
179
|
+
version_requirements: *id010
|
180
|
+
- !ruby/object:Gem::Dependency
|
181
|
+
name: appraisal
|
182
|
+
prerelease: false
|
183
|
+
requirement: &id011 !ruby/object:Gem::Requirement
|
184
|
+
none: false
|
185
|
+
requirements:
|
186
|
+
- - ~>
|
187
|
+
- !ruby/object:Gem::Version
|
188
|
+
hash: 31
|
189
|
+
segments:
|
190
|
+
- 0
|
191
|
+
- 3
|
192
|
+
- 6
|
193
|
+
version: 0.3.6
|
194
|
+
type: :development
|
195
|
+
version_requirements: *id011
|
51
196
|
description: A routing-filter additional filter that add locale unless XML or JSON, or root_url with default locale
|
52
|
-
email:
|
53
|
-
- public@zencocoon.com
|
197
|
+
email: public@zencocoon.com
|
54
198
|
executables: []
|
55
199
|
|
56
200
|
extensions: []
|
57
201
|
|
58
|
-
extra_rdoc_files:
|
59
|
-
|
202
|
+
extra_rdoc_files:
|
203
|
+
- README.md
|
60
204
|
files:
|
61
205
|
- .gitignore
|
206
|
+
- .travis.yml
|
207
|
+
- .yardopts
|
208
|
+
- Appraisals
|
209
|
+
- Changelog.md
|
62
210
|
- Gemfile
|
63
|
-
-
|
211
|
+
- Guardfile
|
212
|
+
- License.txt
|
213
|
+
- README.md
|
64
214
|
- Rakefile
|
65
215
|
- lib/routing_filter_locale_unless_api.rb
|
66
|
-
- lib/routing_filter_locale_unless_api/locale_unless_api.rb
|
216
|
+
- lib/routing_filter_locale_unless_api/filter/locale_unless_api.rb
|
67
217
|
- lib/routing_filter_locale_unless_api/version.rb
|
68
218
|
- routing_filter_locale_unless_api.gemspec
|
69
|
-
-
|
70
|
-
-
|
219
|
+
- spec/routing_filter_locale_unless_api/filter/locale_unless_api_spec.rb
|
220
|
+
- spec/spec_helper.rb
|
71
221
|
has_rdoc: true
|
72
222
|
homepage: https://github.com/ZenCocoon/routing_filter_locale_unless_api
|
73
223
|
licenses: []
|
74
224
|
|
75
225
|
post_install_message:
|
76
|
-
rdoc_options:
|
77
|
-
|
226
|
+
rdoc_options:
|
227
|
+
- --charset=UTF-8
|
78
228
|
require_paths:
|
79
229
|
- lib
|
80
230
|
required_ruby_version: !ruby/object:Gem::Requirement
|
@@ -97,11 +247,11 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
97
247
|
version: "0"
|
98
248
|
requirements: []
|
99
249
|
|
100
|
-
rubyforge_project:
|
101
|
-
rubygems_version: 1.
|
250
|
+
rubyforge_project:
|
251
|
+
rubygems_version: 1.6.2
|
102
252
|
signing_key:
|
103
253
|
specification_version: 3
|
104
254
|
summary: routing filter that add locale unless XML or JSON, or root_url with default locale
|
105
255
|
test_files:
|
106
|
-
-
|
107
|
-
-
|
256
|
+
- spec/routing_filter_locale_unless_api/filter/locale_unless_api_spec.rb
|
257
|
+
- spec/spec_helper.rb
|
data/README.rdoc
DELETED
@@ -1,54 +0,0 @@
|
|
1
|
-
= Routing Filter : Locale Unless API
|
2
|
-
|
3
|
-
The LocaleUnlessAPI filter is an extension to Sven Fuchs's routing-filter
|
4
|
-
|
5
|
-
https://github.com/svenfuchs/routing-filter
|
6
|
-
|
7
|
-
LocaleUnlessAPI filter extracts segments matching /:locale from the beginning of
|
8
|
-
the recognized path and exposes the locale parameter as params[:locale]. When a
|
9
|
-
path is generated the filter adds the segments to the path accordingly if
|
10
|
-
the locale parameter is passed to the url helper.
|
11
|
-
|
12
|
-
It will not add the locale parameter as a url fragment if:
|
13
|
-
|
14
|
-
* the format is XML or JSON
|
15
|
-
* with the root url and default locale
|
16
|
-
|
17
|
-
== Requirements
|
18
|
-
|
19
|
-
routing-filter ~> 0.2.3
|
20
|
-
|
21
|
-
== Installation
|
22
|
-
|
23
|
-
in config/routes.rb
|
24
|
-
|
25
|
-
Rails.application.routes.draw do
|
26
|
-
filter :locale_unless_api
|
27
|
-
end
|
28
|
-
|
29
|
-
== Usage
|
30
|
-
|
31
|
-
incoming url: /fr/products
|
32
|
-
filtered url: /products
|
33
|
-
params: params[:locale] = 'fr'
|
34
|
-
|
35
|
-
products_path(:locale => 'fr')
|
36
|
-
generated_path: /fr/products
|
37
|
-
|
38
|
-
More example visible in the tests cases
|
39
|
-
|
40
|
-
== Configuration
|
41
|
-
|
42
|
-
You can customize the API formats with
|
43
|
-
|
44
|
-
Rails.application.routes.draw do
|
45
|
-
filter :locale_unless_api, :api_formats => %w( xml json xls )
|
46
|
-
end
|
47
|
-
|
48
|
-
== Maintainers
|
49
|
-
|
50
|
-
* Sébastien Grosjean (http://www.github.com/ZenCocoon)
|
51
|
-
|
52
|
-
== License
|
53
|
-
|
54
|
-
MIT License. Copyright 2011 Sébastien Grosjean, sponsored by {BookingSync Vacation Rental Booking Calendar Software}[http://www.bookingsync.com]
|
@@ -1,95 +0,0 @@
|
|
1
|
-
# The LocaleUnlessAPI filter is an extension to Sven Fuchs's routing-filter
|
2
|
-
#
|
3
|
-
# https://github.com/svenfuchs/routing-filter
|
4
|
-
#
|
5
|
-
# LocaleUnlessAPI filter extracts segments matching /:locale from the beginning of
|
6
|
-
# the recognized path and exposes the locale parameter as params[:locale]. When a
|
7
|
-
# path is generated the filter adds the segments to the path accordingly if
|
8
|
-
# the locale parameter is passed to the url helper.
|
9
|
-
#
|
10
|
-
# It will not add the locale parameter as a url fragment if:
|
11
|
-
#
|
12
|
-
# * the format is XML or JSON
|
13
|
-
# * with the root url and default locale
|
14
|
-
#
|
15
|
-
# incoming url: /fr/products
|
16
|
-
# filtered url: /products
|
17
|
-
# params: params[:locale] = 'fr'
|
18
|
-
#
|
19
|
-
# products_path(:locale => 'fr')
|
20
|
-
# generated_path: /fr/products
|
21
|
-
#
|
22
|
-
# You can install the filter like this:
|
23
|
-
#
|
24
|
-
# in config/routes.rb
|
25
|
-
#
|
26
|
-
# Rails.application.routes.draw do
|
27
|
-
# filter :locale_unless_api
|
28
|
-
# end
|
29
|
-
|
30
|
-
require 'i18n'
|
31
|
-
|
32
|
-
module RoutingFilter
|
33
|
-
class LocaleUnlessApi < Filter
|
34
|
-
@@api_formats = %w( xml json )
|
35
|
-
cattr_writer :api_formats
|
36
|
-
|
37
|
-
class << self
|
38
|
-
def api_format?(format)
|
39
|
-
format && @@api_formats.include?(format.to_s.downcase)
|
40
|
-
end
|
41
|
-
|
42
|
-
def locales
|
43
|
-
@@locales ||= I18n.available_locales.map(&:to_sym)
|
44
|
-
end
|
45
|
-
|
46
|
-
def locales=(locales)
|
47
|
-
@@locales = locales.map(&:to_sym)
|
48
|
-
end
|
49
|
-
|
50
|
-
def locales_pattern
|
51
|
-
@@locales_pattern ||= %r(^/(#{self.locales.map { |l| Regexp.escape(l.to_s) }.join('|')})(?=/|$))
|
52
|
-
end
|
53
|
-
end
|
54
|
-
|
55
|
-
def around_recognize(path, env, &block)
|
56
|
-
locale = extract_segment!(self.class.locales_pattern, path) # remove the locale from the beginning of the path
|
57
|
-
yield.tap do |params| # invoke the given block (calls more filters and finally routing)
|
58
|
-
params[:locale] = locale if locale # set recognized locale to the resulting params hash
|
59
|
-
end
|
60
|
-
end
|
61
|
-
|
62
|
-
def around_generate(*args, &block)
|
63
|
-
params = args.extract_options! # this is because we might get a call like forum_topics_path(forum, topic, :locale => :en)
|
64
|
-
|
65
|
-
format = params[:format] # save the current format
|
66
|
-
locale = params.delete(:locale) # extract the passed :locale option
|
67
|
-
locale = I18n.locale if locale.nil? # default to I18n.locale when locale is nil (could also be false)
|
68
|
-
locale = nil unless valid_locale?(locale) # reset to no locale when locale is not valid
|
69
|
-
|
70
|
-
args << params
|
71
|
-
|
72
|
-
yield.tap do |result|
|
73
|
-
prepend_segment!(result, locale) if prepend_locale?(result, locale, format)
|
74
|
-
end
|
75
|
-
end
|
76
|
-
|
77
|
-
protected
|
78
|
-
|
79
|
-
def valid_locale?(locale)
|
80
|
-
locale && self.class.locales.include?(locale.to_sym)
|
81
|
-
end
|
82
|
-
|
83
|
-
def default_locale?(locale)
|
84
|
-
locale && locale.to_sym == I18n.default_locale.to_sym
|
85
|
-
end
|
86
|
-
|
87
|
-
def root_path?(result)
|
88
|
-
result == '/'
|
89
|
-
end
|
90
|
-
|
91
|
-
def prepend_locale?(result, locale, format)
|
92
|
-
locale && !self.class.api_format?(format) && !(root_path?(result) && default_locale?(locale))
|
93
|
-
end
|
94
|
-
end
|
95
|
-
end
|
@@ -1,130 +0,0 @@
|
|
1
|
-
require File.expand_path('../test_helper', __FILE__)
|
2
|
-
|
3
|
-
class LocaleUnlessApiTest < Test::Unit::TestCase
|
4
|
-
attr_reader :routes, :root, :params
|
5
|
-
|
6
|
-
def setup
|
7
|
-
I18n.locale = nil
|
8
|
-
I18n.default_locale = :en
|
9
|
-
I18n.available_locales = %w(fr en)
|
10
|
-
|
11
|
-
RoutingFilter::LocaleUnlessApi.api_formats = %w( xml json )
|
12
|
-
|
13
|
-
@root = { :controller => 'some', :action => 'index' }
|
14
|
-
@params = { :controller => 'some', :action => 'show', :id => '1' }
|
15
|
-
|
16
|
-
@routes = draw_routes do
|
17
|
-
filter :locale_unless_api
|
18
|
-
match 'products/:id', :to => 'some#show'
|
19
|
-
root :to => 'some#index'
|
20
|
-
end
|
21
|
-
end
|
22
|
-
|
23
|
-
test 'recognizes the path /en/products/1' do
|
24
|
-
assert_equal params.merge(:locale => 'en'), routes.recognize_path('/en/products/1')
|
25
|
-
end
|
26
|
-
|
27
|
-
test 'recognizes the path /fr/products/1' do
|
28
|
-
assert_equal params.merge(:locale => 'fr'), routes.recognize_path('/fr/products/1')
|
29
|
-
end
|
30
|
-
|
31
|
-
test 'recognizes the path /products/1.xml' do
|
32
|
-
assert_equal params.merge(:format => 'xml'), routes.recognize_path('/products/1.xml')
|
33
|
-
end
|
34
|
-
|
35
|
-
test 'recognizes the path /products/1.json' do
|
36
|
-
assert_equal params.merge(:format => 'json'), routes.recognize_path('/products/1.json')
|
37
|
-
end
|
38
|
-
|
39
|
-
test 'recognizes the path /en' do
|
40
|
-
assert_equal root.merge(:locale => 'en'), routes.recognize_path('/en/')
|
41
|
-
end
|
42
|
-
|
43
|
-
test 'recognizes the path /fr' do
|
44
|
-
assert_equal root.merge(:locale => 'fr'), routes.recognize_path('/fr')
|
45
|
-
end
|
46
|
-
|
47
|
-
test 'recognizes the path /' do
|
48
|
-
assert_equal root, routes.recognize_path('/')
|
49
|
-
end
|
50
|
-
|
51
|
-
|
52
|
-
test 'prepends the segments /:locale to the generated path if the current locale is not the default locale' do
|
53
|
-
I18n.locale = 'fr'
|
54
|
-
assert_equal '/fr/products/1', routes.generate(params)
|
55
|
-
end
|
56
|
-
|
57
|
-
test 'prepends the segments /:locale to the generated path even if the current locale is not the default locale' do
|
58
|
-
I18n.locale = 'en'
|
59
|
-
assert_equal '/en/products/1', routes.generate(params)
|
60
|
-
end
|
61
|
-
|
62
|
-
test 'does not prepend the segments /:locale to the generated path if the current locale is the default locale and with root url' do
|
63
|
-
I18n.locale = 'en'
|
64
|
-
assert_equal '/', routes.generate(root)
|
65
|
-
end
|
66
|
-
|
67
|
-
test 'prepends the segments /:locale to the generated path if the current locale is not the default locale and with root url' do
|
68
|
-
I18n.locale = 'fr'
|
69
|
-
assert_equal '/fr', routes.generate(root)
|
70
|
-
end
|
71
|
-
|
72
|
-
test 'does not prepend the segments /:locale to the generated path if the format XML is considered as api' do
|
73
|
-
I18n.locale = 'fr'
|
74
|
-
assert_equal '/products/1.xml', routes.generate(params.merge(:format => 'xml'))
|
75
|
-
end
|
76
|
-
|
77
|
-
test 'does not prepend the segments /:locale to the generated path if the format JSON is considered as api' do
|
78
|
-
I18n.locale = 'fr'
|
79
|
-
assert_equal '/products/1.json', routes.generate(params.merge(:format => 'json'))
|
80
|
-
end
|
81
|
-
|
82
|
-
test 'prepends the segments /:locale to the generated path if the format XLS is not considered as api' do
|
83
|
-
I18n.locale = 'fr'
|
84
|
-
assert_equal '/fr/products/1.xls', routes.generate(params.merge(:format => 'xls'))
|
85
|
-
end
|
86
|
-
|
87
|
-
test 'does not prepend the segments /:locale to the generated path if the format XLS is considered as api' do
|
88
|
-
I18n.locale = 'fr'
|
89
|
-
RoutingFilter::LocaleUnlessApi.api_formats = %w( xml json xls )
|
90
|
-
assert_equal '/products/1.xls', routes.generate(params.merge(:format => 'xls'))
|
91
|
-
end
|
92
|
-
|
93
|
-
test 'should work with format as symbol' do
|
94
|
-
assert_equal '/products/1.xml', routes.generate(params.merge(:format => :xml))
|
95
|
-
end
|
96
|
-
|
97
|
-
|
98
|
-
test 'prepends the segments /:locale to the generated path if the given locale is not the default locale' do
|
99
|
-
assert_equal '/fr/products/1', routes.generate(params.merge(:locale => 'fr'))
|
100
|
-
end
|
101
|
-
|
102
|
-
test 'prepends the segments /:locale to the generated path even if the given locale is the default locale' do
|
103
|
-
assert_equal '/en/products/1', routes.generate(params.merge(:locale => 'en'))
|
104
|
-
end
|
105
|
-
|
106
|
-
test 'does not prepend the segments /:locale to the generated path if the given locale is the default locale and with root url' do
|
107
|
-
assert_equal '/', routes.generate(root.merge(:locale => 'en'))
|
108
|
-
end
|
109
|
-
|
110
|
-
test 'prepends the segments /:locale to the generated path if the given locale is not the default locale and with root url' do
|
111
|
-
assert_equal '/fr', routes.generate(root.merge(:locale => 'fr'))
|
112
|
-
end
|
113
|
-
|
114
|
-
test 'does not prepend the segments /:locale to the generated path if a given locale and the format XML is considered as api' do
|
115
|
-
assert_equal '/products/1.xml', routes.generate(params.merge(:format => 'xml', :locale => 'fr'))
|
116
|
-
end
|
117
|
-
|
118
|
-
test 'does not prepend the segments /:locale to the generated path if a given locale and the format JSON is considered as api' do
|
119
|
-
assert_equal '/products/1.json', routes.generate(params.merge(:format => 'json', :locale => 'fr'))
|
120
|
-
end
|
121
|
-
|
122
|
-
test 'prepends the segments /:locale to the generated path if a given locale and the format XLS is not considered as api' do
|
123
|
-
assert_equal '/fr/products/1.xls', routes.generate(params.merge(:format => 'xls', :locale => 'fr'))
|
124
|
-
end
|
125
|
-
|
126
|
-
test 'does not prepend the segments /:locale to the generated path if a given locale and the format XLS is considered as api' do
|
127
|
-
RoutingFilter::LocaleUnlessApi.api_formats = %w( xml json xls )
|
128
|
-
assert_equal '/products/1.xls', routes.generate(params.merge(:format => 'xls', :locale => 'fr'))
|
129
|
-
end
|
130
|
-
end
|
data/test/test_helper.rb
DELETED
@@ -1,26 +0,0 @@
|
|
1
|
-
ENV['RAILS_ENV'] = 'test'
|
2
|
-
|
3
|
-
$:.unshift File.expand_path('../../lib', __FILE__)
|
4
|
-
|
5
|
-
require 'rubygems'
|
6
|
-
|
7
|
-
require 'test/unit'
|
8
|
-
require 'i18n'
|
9
|
-
require 'action_pack'
|
10
|
-
require 'active_support'
|
11
|
-
require 'action_controller'
|
12
|
-
require 'active_support/core_ext/enumerable.rb'
|
13
|
-
require 'test_declarative'
|
14
|
-
require 'routing_filter'
|
15
|
-
require 'routing_filter_locale_unless_api'
|
16
|
-
|
17
|
-
include RoutingFilter
|
18
|
-
|
19
|
-
class SomeController < ActionController::Base
|
20
|
-
end
|
21
|
-
|
22
|
-
class Test::Unit::TestCase
|
23
|
-
def draw_routes(&block)
|
24
|
-
ActionDispatch::Routing::RouteSet.new.tap { |set| set.draw(&block) }
|
25
|
-
end
|
26
|
-
end
|