route_translator 1.0.2 → 2.0.0

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.
@@ -2,7 +2,10 @@ require 'active_support'
2
2
  require 'action_controller'
3
3
  require 'action_mailer'
4
4
  require 'action_dispatch'
5
+
5
6
  require 'route_translator/route_set'
7
+ require 'route_translator/routes_reloader'
8
+ require 'route_translator/railtie' if defined?(Rails::Railtie)
6
9
 
7
10
  module RouteTranslator
8
11
 
@@ -15,10 +18,16 @@ module RouteTranslator
15
18
  ActionDispatch::Routing::UrlFor
16
19
  ].freeze
17
20
 
21
+ Configuration = Struct.new(:force_locale, :generate_unlocalized_routes, :translation_file)
22
+
18
23
  def self.locale_suffix locale
19
24
  locale.to_s.underscore
20
25
  end
21
26
 
27
+ def self.config
28
+ @config ||= Configuration.new
29
+ end
30
+
22
31
  # Attributes
23
32
 
24
33
  module Controller
@@ -40,6 +49,7 @@ module RouteTranslator
40
49
  end
41
50
  end
42
51
 
52
+ ActiveSupport.run_load_hooks(:route_translator, self)
43
53
  end
44
54
 
45
55
  # Add locale_suffix to controllers, views and mailers
@@ -0,0 +1,23 @@
1
+ module RouteTranslator
2
+ class Railtie < ::Rails::Railtie
3
+ config.route_translator = ActiveSupport::OrderedOptions.new
4
+
5
+ initializer "route_translator.set_configs" do |app|
6
+ options = app.config.route_translator
7
+ options.force_locale ||= false
8
+ options.generate_unlocalized_routes ||= false
9
+ options.translation_file ||= File.join(%w[config i18n-routes.yml])
10
+
11
+ ActiveSupport.on_load :route_translator do
12
+ options.each do |k, v|
13
+ k = "#{k}="
14
+ if config.respond_to?(k)
15
+ config.send k, v
16
+ else
17
+ raise "Invalid option key: #{k}"
18
+ end
19
+ end
20
+ end
21
+ end
22
+ end
23
+ end
@@ -24,11 +24,25 @@ module RouteTranslator
24
24
 
25
25
  #Use the translations from the specified file
26
26
  def translate_from_file(file_path = nil)
27
- file_path ||= defined?(Rails) && File.join(Rails.root, %w(config i18n-routes.yml))
28
- load_dictionary_from_file(file_path)
27
+ file_path = absolute_path(file_path)
28
+
29
+ reset_dictionary
30
+ Dir[file_path].each do |file|
31
+ add_dictionary_from_file(file)
32
+ end
29
33
  translate
30
34
  end
31
35
 
36
+ private
37
+
38
+ def absolute_path (file_path)
39
+ file_path ||= RouteTranslator.config.translation_file
40
+ file_path = Rails.root.join(file_path) if defined?(Rails)
41
+ file_path
42
+ end
43
+
44
+ public
45
+
32
46
  include Helpers
33
47
  include Translator
34
48
  include DictionaryManagement
@@ -10,9 +10,12 @@ module RouteTranslator
10
10
  original_routes = routes.dup
11
11
  original_named_routes = named_routes.routes.dup # Hash {:name => :route}
12
12
 
13
+ # The filter method exists if the "routing-filter" gem is used
14
+ original_filters = set.respond_to?(:filters) ? set.filters.dup : []
15
+
13
16
  routes_to_create = []
14
17
  original_routes.each do |original_route|
15
- if localized_routes && localized_routes.include?(original_route.to_s) then
18
+ if localized_routes && localized_routes.include?(original_route.to_s)
16
19
  translations_for(original_route).each do |translated_route_args|
17
20
  routes_to_create << translated_route_args
18
21
  end
@@ -20,6 +23,11 @@ module RouteTranslator
20
23
  route = untranslated_route original_route
21
24
  routes_to_create << route
22
25
  end
26
+ # Always generate unlocalized routes?
27
+ if RouteTranslator.config.generate_unlocalized_routes
28
+ route = untranslated_route original_route
29
+ routes_to_create << route
30
+ end
23
31
  end
24
32
 
25
33
  reset!
@@ -28,6 +36,10 @@ module RouteTranslator
28
36
  add_route(*r)
29
37
  end
30
38
 
39
+ if original_filters.any?
40
+ set.filters << original_filters
41
+ set.filters.flatten!
42
+ end
31
43
 
32
44
  Hash[original_named_routes.select{|k,v| localized_routes && localized_routes.include?(v.to_s)}].each_key do |route_name|
33
45
  named_routes.helpers.concat add_untranslated_helpers_to_controllers_and_views(route_name)
@@ -105,7 +117,16 @@ module RouteTranslator
105
117
  def translate_path(path, locale)
106
118
  final_optional_segments = path.slice!(/(\(.+\))$/)
107
119
  new_path = path.split("/").map{|seg| translate_path_segment(seg, locale)}.join('/')
108
- new_path = "/#{locale.downcase}#{new_path}" unless default_locale?(locale)
120
+
121
+ # Add locale prefix if it's not the default locale,
122
+ # or forcing locale to all routes,
123
+ # or already generating actual unlocalized routes
124
+ if !default_locale?(locale) ||
125
+ RouteTranslator.config.force_locale ||
126
+ RouteTranslator.config.generate_unlocalized_routes
127
+ new_path = "/#{locale.downcase}#{new_path}"
128
+ end
129
+
109
130
  new_path = "/" if new_path.blank?
110
131
  "#{new_path}#{final_optional_segments}"
111
132
  end
@@ -0,0 +1,15 @@
1
+ require "rails"
2
+
3
+ module Rails
4
+ class Application
5
+ alias :reload_routes_without_translator! :reload_routes!
6
+ def reload_routes!
7
+ result = reload_routes_without_translator!
8
+
9
+ self.routes.default_locale = I18n.default_locale
10
+ self.routes.translate_from_file
11
+
12
+ result
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,11 @@
1
+ module ActionDispatch
2
+ class TestRequest < Request
3
+ def initialize(env = {})
4
+ super(DEFAULT_ENV.merge(env))
5
+
6
+ self.host = 'test.host'
7
+ self.remote_addr = '0.0.0.0'
8
+ self.user_agent = 'Rails Testing'
9
+ end
10
+ end
11
+ end
@@ -1,3 +1,3 @@
1
1
  module RouteTranslator
2
- VERSION = '1.0.2'
2
+ VERSION = '2.0.0'
3
3
  end
@@ -1,11 +1,14 @@
1
1
  require 'test/unit'
2
2
  require 'mocha'
3
3
 
4
+ require "rails"
5
+ require "action_controller/railtie"
6
+
4
7
  require 'route_translator'
8
+ require "route_translator/test_request"
5
9
 
6
10
  require File.expand_path(File.join(File.dirname(__FILE__), 'test_helper'))
7
11
 
8
-
9
12
  class PeopleController < ActionController::Base; end
10
13
  class ProductsController < ActionController::Base; end
11
14
 
@@ -17,12 +20,34 @@ class TranslateRoutesTest < ActionController::TestCase
17
20
  I18n.default_locale = locale
18
21
  end
19
22
 
23
+ def config_force_locale(boolean)
24
+ RouteTranslator.config.force_locale = boolean
25
+ end
26
+
27
+ def config_generate_unlocalized_routes(boolean)
28
+ RouteTranslator.config.generate_unlocalized_routes = boolean
29
+ end
30
+
31
+ def config_translation_file (file)
32
+ RouteTranslator.config.translation_file = file
33
+ end
34
+
20
35
  def setup
36
+ setup_application
37
+
21
38
  @controller = ActionController::Base.new
22
39
  @view = ActionView::Base.new
23
40
  @routes = ActionDispatch::Routing::RouteSet.new
24
41
  end
25
42
 
43
+ def teardown
44
+ config_force_locale false
45
+ config_generate_unlocalized_routes false
46
+ config_default_locale_settings("en")
47
+ routes_file ""
48
+ FileUtils.rm_rf "#{tmp_path}/log"
49
+ end
50
+
26
51
  def test_unnamed_root_route
27
52
  @routes.draw do
28
53
  localized do
@@ -313,6 +338,77 @@ class TranslateRoutesTest < ActionController::TestCase
313
338
  assert_unrecognized_route '/es/productos', :controller => 'products', :action => 'index', :locale => 'es'
314
339
  end
315
340
 
341
+ def test_force_locale
342
+ @routes.draw do
343
+ localized do
344
+ match 'people', :to => 'people#index', :as => 'people'
345
+ end
346
+ end
347
+
348
+ config_default_locale_settings 'en'
349
+ config_force_locale true
350
+
351
+ @routes.translate_from_file(File.expand_path('locales/routes.yml', File.dirname(__FILE__)))
352
+
353
+ assert_routing '/en/people', :controller => 'people', :action => 'index', :locale => 'en'
354
+ assert_unrecognized_route '/people', :controller => 'people', :action => 'index'
355
+ end
356
+
357
+ def test_generate_unlocalized_routes
358
+ @routes.draw do
359
+ localized do
360
+ match 'people', :to => 'people#index', :as => 'people'
361
+ end
362
+ end
363
+
364
+ config_default_locale_settings 'en'
365
+ config_generate_unlocalized_routes true
366
+
367
+ @routes.translate_from_file(File.expand_path('locales/routes.yml', File.dirname(__FILE__)))
368
+
369
+ assert_routing '/en/people', :controller => 'people', :action => 'index', :locale => 'en'
370
+ assert_routing '/people', :controller => 'people', :action => 'index'
371
+ end
372
+
373
+ def test_config_translation_file
374
+ @routes.draw do
375
+ localized do
376
+ root :to => 'people#index'
377
+ end
378
+ end
379
+
380
+ config_default_locale_settings 'es'
381
+ config_translation_file File.expand_path('locales/routes.yml', File.dirname(__FILE__))
382
+
383
+ @routes.translate_from_file
384
+
385
+ assert_routing '/', :controller => 'people', :action => 'index', :locale => 'es'
386
+ assert_routing '/en', :controller => 'people', :action => 'index', :locale => 'en'
387
+ assert_unrecognized_route '/es', :controller => 'people', :action => 'index', :locale => 'es'
388
+ end
389
+
390
+ def test_auto_translate
391
+
392
+ routes_file <<-RUBY
393
+ Rails.application.routes.draw do
394
+ localized do
395
+ root :to => 'people#index'
396
+ end
397
+ end
398
+ RUBY
399
+
400
+ config_default_locale_settings 'es'
401
+ config_translation_file File.expand_path('locales/routes.yml', File.dirname(__FILE__))
402
+
403
+ app.reload_routes!
404
+
405
+ @routes = app.routes
406
+
407
+ assert_routing '/', :controller => 'people', :action => 'index', :locale => 'es'
408
+ assert_routing '/en', :controller => 'people', :action => 'index', :locale => 'en'
409
+ assert_unrecognized_route '/es', :controller => 'people', :action => 'index', :locale => 'es'
410
+ end
411
+
316
412
  def test_action_controller_gets_locale_setter
317
413
  ActionController::Base.instance_methods.include?('set_locale_from_url')
318
414
  end
data/test/test_helper.rb CHANGED
@@ -1,3 +1,4 @@
1
+
1
2
  class StubbedI18nBackend
2
3
  @@translations = {
3
4
  'es' => { 'people' => 'gente'},
@@ -13,8 +14,6 @@ class StubbedI18nBackend
13
14
  def self.available_locales
14
15
  @@translations.keys
15
16
  end
16
-
17
-
18
17
  end
19
18
 
20
19
  module RouteTranslator
@@ -32,6 +31,49 @@ module RouteTranslator
32
31
  !(defined?(ActionPack) && ActionPack::VERSION::MAJOR == 3 && ActionPack::VERSION::MINOR > 0)
33
32
  end
34
33
 
34
+ def setup_application
35
+ return if defined?(@@app)
36
+
37
+ app = @@app = Class.new(Rails::Application)
38
+ app.config.active_support.deprecation = :stderr
39
+ app.paths["log"] = "#{tmp_path}/log/test.log"
40
+ app.initialize!
41
+ Rails.application = app
42
+ end
43
+
44
+ def app
45
+ @@app
46
+ end
47
+
48
+ def tmp_path(*args)
49
+ @tmp_path ||= File.join(File.dirname(__FILE__), "tmp")
50
+ File.join(@tmp_path, *args)
51
+ end
52
+
53
+ def app_path(*args)
54
+ tmp_path(*%w[app] + args)
55
+ end
56
+
57
+ def routes_file(contents)
58
+ fn = File.join(app_path, routes_config)
59
+ FileUtils.mkdir_p File.dirname(fn)
60
+ File.open(fn, 'w') do |f|
61
+ f.puts contents
62
+ end
63
+ app.routes_reloader.paths.unshift(fn)
64
+ end
65
+
66
+ def routes_config
67
+ @@routes_config ||= File.join("config", "routes.rb")
68
+ end
69
+
70
+ def print_routes (route_set)
71
+ require 'rails/application/route_inspector'
72
+ inspector = Rails::Application::RouteInspector.new
73
+ puts inspector.format(route_set.routes, ENV['CONTROLLER']).join "\n"
74
+ rescue LoadError
75
+ end
76
+
35
77
  def assert_helpers_include(*helpers)
36
78
  helpers.each do |helper|
37
79
  ['url', 'path'].each do |suffix|
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: route_translator
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.2
4
+ version: 2.0.0
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -10,7 +10,7 @@ authors:
10
10
  autorequire:
11
11
  bindir: bin
12
12
  cert_chain: []
13
- date: 2012-07-11 00:00:00.000000000 Z
13
+ date: 2012-10-10 00:00:00.000000000 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: mocha
@@ -20,7 +20,23 @@ dependencies:
20
20
  - - ! '>='
21
21
  - !ruby/object:Gem::Version
22
22
  version: '0'
23
- type: :runtime
23
+ type: :development
24
+ prerelease: false
25
+ version_requirements: !ruby/object:Gem::Requirement
26
+ none: false
27
+ requirements:
28
+ - - ! '>='
29
+ - !ruby/object:Gem::Version
30
+ version: '0'
31
+ - !ruby/object:Gem::Dependency
32
+ name: guard-test
33
+ requirement: !ruby/object:Gem::Requirement
34
+ none: false
35
+ requirements:
36
+ - - ! '>='
37
+ - !ruby/object:Gem::Version
38
+ version: '0'
39
+ type: :development
24
40
  prerelease: false
25
41
  version_requirements: !ruby/object:Gem::Requirement
26
42
  none: false
@@ -36,10 +52,13 @@ extensions: []
36
52
  extra_rdoc_files: []
37
53
  files:
38
54
  - lib/route_translator.rb
55
+ - lib/route_translator/railtie.rb
39
56
  - lib/route_translator/route_set.rb
40
57
  - lib/route_translator/route_set/dictionary_management.rb
41
58
  - lib/route_translator/route_set/helpers.rb
42
59
  - lib/route_translator/route_set/translator.rb
60
+ - lib/route_translator/routes_reloader.rb
61
+ - lib/route_translator/test_request.rb
43
62
  - lib/route_translator/version.rb
44
63
  - lib/tasks/route_translator.rake
45
64
  - test/locales/routes.yml
@@ -65,7 +84,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
65
84
  version: '0'
66
85
  requirements: []
67
86
  rubyforge_project:
68
- rubygems_version: 1.8.24
87
+ rubygems_version: 1.8.23
69
88
  signing_key:
70
89
  specification_version: 3
71
90
  summary: Translate your Rails routes in a simple manner