rack-i18n_routes 0.1 → 0.2
Sign up to get free protection for your applications and to get access to all the features.
- data/Rakefile +1 -1
- data/lib/rack/i18n_routes/alias_mapping.rb +34 -8
- data/lib/rack/i18n_routes/alias_mapping_updater.rb +16 -3
- data/spec/i18n_routes_spec.rb +46 -15
- metadata +3 -3
data/Rakefile
CHANGED
@@ -76,24 +76,42 @@ class Rack::I18nRoutes::AliasMapping
|
|
76
76
|
# use Rack::I18nRoutes, MAPPING
|
77
77
|
#
|
78
78
|
# @param [Hash] aliases the aliases
|
79
|
+
# @param [Hash] opts extra options for the mapping
|
80
|
+
# @option opts [Foo] :default the language key associated with the
|
81
|
+
# normalized paths
|
79
82
|
|
80
|
-
def initialize(aliases)
|
83
|
+
def initialize(aliases, opts = {})
|
81
84
|
@aliases = aliases
|
85
|
+
@default_lang = opts[:default]
|
82
86
|
end
|
83
87
|
|
88
|
+
# @return [String]
|
89
|
+
|
84
90
|
def map(path)
|
91
|
+
normalized_path, found_langs = map_with_langs(path)
|
92
|
+
|
93
|
+
return normalized_path
|
94
|
+
end
|
95
|
+
|
96
|
+
# @return [(String, Array<Object>)]
|
97
|
+
|
98
|
+
def map_with_langs(path)
|
85
99
|
orig_pieces = path.split('/')
|
100
|
+
|
86
101
|
normalized_pieces = []
|
102
|
+
found_langs = []
|
87
103
|
|
88
104
|
normalized_pieces << orig_pieces.shift
|
105
|
+
found_langs << @default_lang
|
89
106
|
|
90
107
|
aliases = @aliases
|
91
108
|
|
92
109
|
orig_pieces.each do |orig_piece|
|
93
|
-
normalized = normalization_for(orig_piece, aliases)
|
110
|
+
normalized, lang = normalization_for(orig_piece, aliases)
|
94
111
|
replacement = (normalized || orig_piece)
|
95
112
|
|
96
113
|
normalized_pieces << replacement
|
114
|
+
found_langs << lang
|
97
115
|
|
98
116
|
if !aliases.nil?
|
99
117
|
subaliases = aliases[replacement]
|
@@ -103,28 +121,36 @@ class Rack::I18nRoutes::AliasMapping
|
|
103
121
|
|
104
122
|
if path.end_with?('/')
|
105
123
|
normalized_pieces << ""
|
124
|
+
found_langs << @default_lang
|
106
125
|
end
|
107
126
|
|
108
|
-
|
127
|
+
normalized_path = normalized_pieces.join('/')
|
128
|
+
|
129
|
+
return normalized_path, found_langs
|
109
130
|
end
|
110
131
|
|
132
|
+
# @return [(String, Object)]
|
133
|
+
|
111
134
|
def normalization_for(piece, aliases)
|
112
135
|
if aliases.nil?
|
113
|
-
return nil
|
136
|
+
return nil, @default_lang
|
114
137
|
end
|
115
138
|
|
116
139
|
entities = aliases.keys
|
117
140
|
entities.each do |entity|
|
118
141
|
if piece == entity
|
119
|
-
return entity
|
142
|
+
return entity, @default_lang
|
120
143
|
end
|
121
144
|
|
122
145
|
subentities = aliases[entity].values.reject { |e| e.is_a? Hash }
|
123
|
-
|
124
|
-
|
146
|
+
subentity = subentities.find { |s| Array(s).any? { |sube| piece == sube } }
|
147
|
+
if !subentity.nil?
|
148
|
+
return entity, aliases[entity].index(subentity)
|
125
149
|
end
|
126
150
|
end
|
127
151
|
|
128
|
-
|
152
|
+
# the piece is not present in the aliases
|
153
|
+
|
154
|
+
return nil, @default_lang
|
129
155
|
end
|
130
156
|
end
|
@@ -46,15 +46,28 @@ class Rack::I18nRoutes::AliasMappingUpdater
|
|
46
46
|
#
|
47
47
|
# @param [Proc] new_aliases_fn a parameter-less function that returns
|
48
48
|
# the new aliases
|
49
|
+
# @param [Hash] opts the options to be passed to the underlying
|
50
|
+
# AliasMapping object
|
49
51
|
|
50
|
-
def initialize(new_aliases_fn)
|
52
|
+
def initialize(new_aliases_fn, opts = {})
|
51
53
|
@new_aliases_fn = new_aliases_fn
|
54
|
+
@opts = opts
|
52
55
|
end
|
53
56
|
|
57
|
+
# @return [String]
|
58
|
+
|
54
59
|
def map(path)
|
60
|
+
normalized_path, found_langs = map_with_langs(path)
|
61
|
+
|
62
|
+
return normalized_path
|
63
|
+
end
|
64
|
+
|
65
|
+
# @return [(String, Array<Object>)]
|
66
|
+
|
67
|
+
def map_with_langs(path)
|
55
68
|
aliases = @new_aliases_fn[]
|
56
|
-
alias_mapping = Rack::I18nRoutes::AliasMapping.new(aliases)
|
69
|
+
alias_mapping = Rack::I18nRoutes::AliasMapping.new(aliases, @opts)
|
57
70
|
|
58
|
-
return alias_mapping.
|
71
|
+
return alias_mapping.map_with_langs(path)
|
59
72
|
end
|
60
73
|
end
|
data/spec/i18n_routes_spec.rb
CHANGED
@@ -25,29 +25,35 @@ TEST_ALIASES = {
|
|
25
25
|
'paintings' => {
|
26
26
|
'fra' => 'peintures',
|
27
27
|
'spa' => 'pinturas',
|
28
|
+
|
29
|
+
:children => {
|
30
|
+
'gioconda' => {
|
31
|
+
'fra' => 'joconde',
|
32
|
+
}
|
33
|
+
}
|
28
34
|
}
|
29
35
|
}
|
30
36
|
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
use Rack::Lint
|
37
|
-
|
38
|
-
run lambda { |env| [200, {"Content-Type" => "text/plain"}, [""]] }
|
39
|
-
end
|
37
|
+
def app(*opts)
|
38
|
+
builder = Rack::Builder.new do
|
39
|
+
use Rack::Lint
|
40
|
+
use Rack::I18nRoutes, *opts
|
41
|
+
use Rack::Lint
|
40
42
|
|
41
|
-
|
43
|
+
run lambda { |env| [200, {"Content-Type" => "text/plain"}, [""]] }
|
42
44
|
end
|
43
45
|
|
44
|
-
|
45
|
-
|
46
|
-
session.request(path)
|
46
|
+
return builder.to_app
|
47
|
+
end
|
47
48
|
|
48
|
-
|
49
|
-
|
49
|
+
def request_with(path, mapping_fn)
|
50
|
+
session = Rack::Test::Session.new(Rack::MockSession.new(app(mapping_fn)))
|
51
|
+
session.request(path)
|
52
|
+
|
53
|
+
return session.last_request
|
54
|
+
end
|
50
55
|
|
56
|
+
describe Rack::I18nRoutes do
|
51
57
|
context "with an AliasMapping" do
|
52
58
|
let(:mapping) { Rack::I18nRoutes::AliasMapping.new(TEST_ALIASES) }
|
53
59
|
|
@@ -113,3 +119,28 @@ describe Rack::I18nRoutes do
|
|
113
119
|
end
|
114
120
|
end
|
115
121
|
|
122
|
+
describe Rack::I18nRoutes::AliasMapping do
|
123
|
+
let(:default_lang) { 'test-lang' }
|
124
|
+
let(:mapping) { Rack::I18nRoutes::AliasMapping.new(TEST_ALIASES, :default => default_lang) }
|
125
|
+
|
126
|
+
context "with a :default option set" do
|
127
|
+
it "returns the default key for normalized paths" do
|
128
|
+
ph, found_langs = mapping.map_with_langs('/paintings/gioconda/')
|
129
|
+
|
130
|
+
found_langs.should == [default_lang]*4
|
131
|
+
end
|
132
|
+
|
133
|
+
it "returns the non-default key when set" do
|
134
|
+
ph, found_langs = mapping.map_with_langs('/articulos/la-victoire/')
|
135
|
+
|
136
|
+
found_langs.should == [default_lang, 'spa', 'fra', default_lang]
|
137
|
+
end
|
138
|
+
|
139
|
+
it "returns the default key for unknown paths" do
|
140
|
+
ph, found_langs = mapping.map_with_langs('/articulos/fancy/')
|
141
|
+
|
142
|
+
found_langs.should == [default_lang, 'spa', default_lang, default_lang]
|
143
|
+
end
|
144
|
+
end
|
145
|
+
end
|
146
|
+
|
metadata
CHANGED
@@ -1,12 +1,12 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rack-i18n_routes
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 15
|
5
5
|
prerelease:
|
6
6
|
segments:
|
7
7
|
- 0
|
8
|
-
-
|
9
|
-
version: "0.
|
8
|
+
- 2
|
9
|
+
version: "0.2"
|
10
10
|
platform: ruby
|
11
11
|
authors:
|
12
12
|
- Gioele Barabucci
|