i18n-inflector-rails 0.2.0 → 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
data.tar.gz.sig CHANGED
Binary file
data/ChangeLog CHANGED
@@ -1,3 +1,45 @@
1
+ commit 5ee55b3ea54cfa86e541a47f27cbe321932c3820
2
+ Author: Paweł Wilk <siefca@gnu.org>
3
+ Date: Tue Feb 15 01:38:13 2011 +0100
4
+
5
+ Release 1.0.0
6
+
7
+ commit 46377c25557637e0f576a637b6abd203555989da
8
+ Author: Paweł Wilk <siefca@gnu.org>
9
+ Date: Tue Feb 15 01:09:46 2011 +0100
10
+
11
+ Documentation updated
12
+
13
+ commit f3419fd70560927aec82813e25d6dd4d33e6e629
14
+ Author: Paweł Wilk <siefca@gnu.org>
15
+ Date: Tue Feb 15 01:09:07 2011 +0100
16
+
17
+ Specification updated
18
+
19
+ commit 8c2907f62a9273a66bc5be0e90da92c0299d1e72
20
+ Author: Paweł Wilk <siefca@gnu.org>
21
+ Date: Tue Feb 15 01:07:53 2011 +0100
22
+
23
+ ClassMethods and InflectedTranslate refactored
24
+
25
+ - There are no additional Procs support, but Inflector's inflection methods may take arguments.
26
+ - Translation method now makes use of lazy methods feature of I18n Inflector.
27
+ - The internal hash is now i18n_inflector_kinds and it's indexed by kinds.
28
+ - Rewritten argument parsing for inflection_method.
29
+ - Added no_inflection_method_for (aka no_inflection_kind).
30
+
31
+ commit aee2f6f484bee1812ecf8765b28d910adc8412e5
32
+ Author: Paweł Wilk <siefca@gnu.org>
33
+ Date: Tue Feb 15 00:58:53 2011 +0100
34
+
35
+ New switches are now added by opening the InflectionOptions class, added new switch :lazy_methods
36
+
37
+ commit 938f7bf971d8c00710b2202dc15e37929f8391dc
38
+ Author: Paweł Wilk <siefca@gnu.org>
39
+ Date: Mon Jan 17 15:01:07 2011 +0100
40
+
41
+ Link in documentation fixed
42
+
1
43
  commit 15e330e957f34579fa95aa2036f0c06fd168ab54
2
44
  Author: Paweł Wilk <siefca@gnu.org>
3
45
  Date: Sun Jan 16 07:06:57 2011 +0100
data/Gemfile CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
  source :gemcutter
4
4
 
5
- gem "i18n-inflector", "~>2.0"
5
+ gem "i18n-inflector", "~>2.3"
6
6
  gem "railties", "~>3.0"
7
7
  gem "actionpack", "~>3.0"
8
8
 
data/README.rdoc CHANGED
@@ -1,6 +1,6 @@
1
1
  = Simple I18n Inflector for Rails
2
2
 
3
- <b>i18n-inflector-rails version <tt>0.1</tt></b> (<b><tt>Sexparty</tt></b>)
3
+ <b>i18n-inflector-rails version <tt>1.0</tt></b> (<b><tt>Rain</tt></b>)
4
4
 
5
5
 
6
6
 
@@ -11,7 +11,7 @@
11
11
  == Summary
12
12
 
13
13
  This Rails plug-in contains bindings for the I18n Inflector module for Ruby's I18n.
14
- It overwrites the translate() method from Rails in a way that it will
14
+ It overwrites the <tt>translate()</tt> method from Rails in a way that it will
15
15
  interpolate additional inflection tokens present in translations.
16
16
  These tokens may appear in *patterns* which are contained within
17
17
  <tt>@{</tt> and <tt>}</tt> symbols.
@@ -19,15 +19,15 @@ These tokens may appear in *patterns* which are contained within
19
19
  == Why?
20
20
 
21
21
  It's intended to be used in a projects where tranlations are performed
22
- by many people, yet there is a need to substitute fragments of text
23
- depending on user's gender, person or other data.
22
+ by many people, yet there is a need to inflect sentences or words by
23
+ user's gender, person or other data.
24
24
 
25
25
  To achieve similar functionality lambdas can be used but including
26
- proc objects in translations may be considered as the unsafe idea.
26
+ Proc objects in translations may be considered unsafe.
27
27
 
28
28
  If you have a troop of happy translators that shouldn't have the
29
29
  ability to execute any code yet you need some simple inflection
30
- then you should use this module.
30
+ then this plug-in might help you.
31
31
 
32
32
  == Synopsis
33
33
 
@@ -50,7 +50,7 @@ then you should use this module.
50
50
  @neuter: @n
51
51
  man: @male
52
52
  woman: @female
53
- default: neuter
53
+ default: n
54
54
 
55
55
  ===== In a controller:
56
56
 
@@ -78,26 +78,26 @@ then you should use this module.
78
78
 
79
79
  == Description
80
80
 
81
- You can choose different kinds (gender, title, person, time, author, etc.)
82
- of tokens to group them in a meaningful, semantical sets. That means you can
83
- apply I18n Inflector to do simple inflection by a gender or a person, when some
84
- language requires it.
81
+ You can create your own kinds (gender, title, person, time, author, etc.)
82
+ of tokens to group them in a meaningful, semantical sets.
85
83
 
86
- This module adds +inflection_method+ clause that can be used
87
- in controllers and views. Using that clause makes it easy to register
88
- methods that will be called to obtain mentioned inflection options.
84
+ This plug-in adds {I18n::Inflector::Rails::ClassMethods#inflection_method inflection_method},
85
+ {I18n::Inflector::Rails::ClassMethods#no_inflection_method no_inflection_method}
86
+ and {I18n::Inflector::Rails::ClassMethods#no_inflection_method_for no_inflection_method_for} clauses
87
+ that can be used in controllers and views. Using that clauses makes it easy to register
88
+ methods that will be called to obtain certain inflection options.
89
+ It is also possible to set up an inflection method for a so called
90
+ strict kind commonly used in a so called named and complex patterns.
89
91
 
90
- This module uses i18n-inflector[https://rubygems.org/gems/i18n-inflector]
92
+ This plug-in uses i18n-inflector[https://rubygems.org/gems/i18n-inflector]
91
93
  module which allows passing inflection options to the translate method.
92
- You may find i18n-inflector default objects very helpful since they
93
- allow you to read inflection data in many different ways. You may, for
94
- example, use it to generate forms containing languages that are using inflection,
95
- all known inflection kinds or tokens assigned to them. To access default inflector
96
- bound to default I18n backend use:
97
- I18n.inflector
94
+ You may find I18n Inflector's API and a default object very helpful since
95
+ they allow you to read inflection data in many different ways. You might,
96
+ for example, use it to generate forms containing lists of languages that are using
97
+ inflection, or to view all known inflection kinds or tokens assigned to them.
98
98
 
99
- See {whole documentation}[http://rubydoc.info/gems/i18n-inflector-rails/] for more info about the usage.
100
- To understand how the I18n Inflector works please read {I18n Inflector documentation}[http://rubydoc.info/gems/i18n-inflector/file/README.rdoc].
99
+ To access the Inflector object bound to default I18n backend use:
100
+ I18n.inflector
101
101
 
102
102
  == Requirements
103
103
 
@@ -119,7 +119,7 @@ To understand how the I18n Inflector works please read {I18n Inflector documenta
119
119
 
120
120
  == Installation
121
121
 
122
- * <tt>sudo gem install i18n-inflector-rails</tt>
122
+ * <tt>gem install i18n-inflector-rails</tt>
123
123
 
124
124
  == Specs
125
125
 
@@ -130,9 +130,16 @@ You can run RSpec examples both with
130
130
 
131
131
  == More information
132
132
 
133
- See {whole documentation}[http://rubydoc.info/gems/i18n-inflector-rails/] for more info about the usage.
133
+ See {I18n::Inflector::Rails::ClassMethods} to learn how to use +inflection_method+ and +no_inflection_method+.
134
+
135
+ See {I18n::Inflector::Rails::InflectedTranslate} to learn about using the translation wrapper.
136
+
137
+ See {I18n::Inflector::InflectionOptions} to know more about switches that can be used to control the engine.
138
+
139
+ See the {whole documentation}[http://rubydoc.info/gems/i18n-inflector-rails/] for more information.
134
140
 
135
- See {I18n::Inflector::Rails} module documentation for detailed information.
141
+ To know how the basics and to learn more about Inflector that is used by this plug-in
142
+ see {I18n Inflector documentation}[http://rubydoc.info/gems/i18n-inflector].
136
143
 
137
144
  == Credits
138
145
 
data/Rakefile CHANGED
@@ -1,6 +1,6 @@
1
1
  # encoding: utf-8
2
2
  # -*- ruby -*-
3
-
3
+
4
4
  $:.unshift File.join(File.dirname(__FILE__), "lib")
5
5
 
6
6
  require 'rubygems'
@@ -40,15 +40,15 @@ Hoe.spec 'i18n-inflector-rails' do
40
40
  self.rsync_args << '--chmod=a+rX'
41
41
  self.readme_file = 'README.rdoc'
42
42
  self.history_file = 'docs/HISTORY'
43
-
44
- extra_deps << ['i18n-inflector', '~> 2.0'] <<
43
+
44
+ extra_deps << ['i18n-inflector', '~> 2.3'] <<
45
45
  ['railties', '~> 3.0'] <<
46
46
  ['actionpack', '~> 3.0']
47
47
  extra_dev_deps << ['rspec', '>= 2.3.0'] <<
48
48
  ['yard', '>= 0.6.4'] <<
49
49
  ['bundler', '>= 1.0.7'] <<
50
50
  ['hoe-bundler', '>= 1.0.0']
51
-
51
+
52
52
  unless extra_dev_deps.flatten.include?('hoe-yard')
53
53
  extra_dev_deps << ['hoe-yard', '>= 0.1.2']
54
54
  end
data/docs/HISTORY CHANGED
@@ -1,3 +1,20 @@
1
+ === 1.0.0 / 2011-02-14
2
+
3
+ * major enhancements
4
+
5
+ * Inflection methods evaluation is now lazy; passing Method objects to the Inflector
6
+ * Added strict kinds (named patterns) better support
7
+ * Added no_inflection_method_for (alias no_inflection_kind) clause
8
+ * Changed way that associations are stored from (method => kind) to (kind => method)
9
+ * Removed block passing support from inflection_method since I18n Inflector supports inflection methods with arguments
10
+
11
+ * minor enhancements
12
+
13
+ * Removed magic symbols from code
14
+ * Improved arguments parsing in inflection_method
15
+ * Added auto_helper global switch
16
+ * Added lazy_methods global switch
17
+
1
18
  === 0.2.0 / 2011-01-15
2
19
 
3
20
  * 1 major enhancement
data/docs/TODO CHANGED
@@ -1,3 +1,2 @@
1
1
 
2
2
  * write more real specs with full Rails 3 stack simulation
3
-
@@ -25,7 +25,7 @@ Gem::Specification.new do |s|
25
25
  s.required_rubygems_version = '>= 1.3.5'
26
26
  s.specification_version = 3
27
27
 
28
- s.add_dependency 'i18n-inflector', '~> 2.0'
28
+ s.add_dependency 'i18n-inflector', '~> 2.3'
29
29
  s.add_dependency 'railties', '~> 3.0'
30
30
  s.add_dependency 'actionpack', '~> 3.0'
31
31
  s.add_development_dependency 'rspec', '>= 2.3.0'
@@ -6,8 +6,6 @@ require 'i18n-inflector-rails/errors'
6
6
  require 'i18n-inflector-rails/options'
7
7
  require 'i18n-inflector-rails/inflector'
8
8
 
9
- I18n::Inflector::InflectionOptions.send(:include, I18n::Inflector::Rails::AdditionalOptions)
10
-
11
9
  if defined? Rails::Engine
12
10
 
13
11
  require 'i18n-inflector-rails/railtie'
@@ -9,7 +9,9 @@
9
9
  module I18n
10
10
  module Inflector
11
11
  module Rails
12
-
12
+
13
+ # This class is for reporting bad inflection method
14
+ # in the given assignment.
13
15
  class BadInflectionMethod < I18n::ArgumentError
14
16
  attr_reader :assignment
15
17
  def initialize(assignment)
@@ -17,7 +19,7 @@ module I18n
17
19
  super "The given assignment is invalid: #{assignment}"
18
20
  end
19
21
  end
20
-
22
+
21
23
  end
22
24
  end
23
25
  end
@@ -10,38 +10,40 @@
10
10
  # inflection tokens defined in translation data.
11
11
 
12
12
  module I18n
13
+
14
+ # @abstract It is defined in {I18n Inflector library}[http://rubydoc.info/gems/i18n-inflector].
13
15
  module Inflector
14
16
  module Rails
15
-
17
+
16
18
  # This module contains instance methods for ActionController.
17
19
  module InstanceMethods
18
-
19
- # This method calls the class method {I18n::Inflector::Rails::ClassMethods#i18n_inflector_methods}
20
- def i18n_inflector_methods
21
- self.class.i18n_inflector_methods
20
+
21
+ # This method calls the class method {I18n::Inflector::Rails::ClassMethods#i18n_inflector_kinds}
22
+ def i18n_inflector_kinds
23
+ self.class.i18n_inflector_kinds
22
24
  end
23
25
 
24
26
  # @private
25
27
  def self.included(base)
26
- base.helper_method(:i18n_inflector_methods)
28
+ base.helper_method(:i18n_inflector_kinds)
27
29
  end
28
-
30
+
29
31
  end # instance methods
30
-
32
+
31
33
  # This module contains class methods for ActionController.
32
34
  module ClassMethods
33
-
34
- # This method reads the internal Hash +i18n_inflector_methods+ containing registered
35
+
36
+ # This method reads the internal Hash +i18n_inflector_kinds+ containing registered
35
37
  # inflection methods and the assigned kinds. It also reads any methods
36
38
  # assignments that were defined earlier in the inheritance path and
37
39
  # merges them with current results; the most current entries will
38
40
  # override the entries defined before.
39
41
  #
40
42
  # @api public
41
- # @return [Hash] the Hash containing assignments made by using {inflection_method}
42
- def i18n_inflector_methods
43
- prev = superclass.respond_to?(:i18n_inflector_methods) ? superclass.i18n_inflector_methods : {}
44
- return @i18n_inflector_methods.nil? ? prev : prev.merge(@i18n_inflector_methods)
43
+ # @return [Hash] the Hash containing assignments made by using {#inflection_method}
44
+ def i18n_inflector_kinds
45
+ prev = superclass.respond_to?(:i18n_inflector_kinds) ? superclass.i18n_inflector_kinds : {}
46
+ return @i18n_inflector_kinds.nil? ? prev : prev.merge(@i18n_inflector_kinds)
45
47
  end
46
48
 
47
49
  # This method allows to assign methods (typically attribute readers)
@@ -52,96 +54,248 @@ module I18n
52
54
  # given then method assumes that the name of a kind is the same as the given
53
55
  # name of a method.
54
56
  #
57
+ # If the given kind begins with +@+ then strict kind is assumed. If there is
58
+ # no kind given but the given method name begins with +@+ character then
59
+ # also strict kind of the same name is assumed but method name is memorized
60
+ # without the leading symbol.
61
+ #
62
+ # Registering method for feeding an inflection option describing a strict
63
+ # kind might be good idea when using some regular kind of the same name,
64
+ # but note that regular kind inflection option is also tried by the
65
+ # translation method when strict kind is in use.
66
+ #
67
+ # In case of registering two methods of different
68
+ # names but assigned to kind and to a strict kind using the same base name,
69
+ # a named inflection pattern will first use an inflection option obtained
70
+ # from a method assigned to a strict kind. Note that it is impossible
71
+ # to use short formed +inflection_method+ calls to register a method for both
72
+ # strict and regular inflection kind, since the method names will be the
73
+ # same and the second call will overwrite the first one.
74
+ #
75
+ # @example Registering an inflection method for the kind gender visible in a whole application
76
+ # class ApplicationController < ActionController::Base
77
+ # inflection_method :gender
78
+ # […]
79
+ # end
80
+ #
81
+ # @example Registering an inflection method for the strict kind @gender visible in a whole application
82
+ # class ApplicationController < ActionController::Base
83
+ # inflection_method :@gender
84
+ # […]
85
+ # end
86
+ #
87
+ # @example Registering a custom-named inflection method for the kind gender
88
+ # class ApplicationController < ActionController::Base
89
+ # inflection_method :get_user_gender => :gender
90
+ # […]
91
+ # end
92
+ #
93
+ # @example Registering a custom-named inflection methods for the kinds gender and tense
94
+ # class ApplicationController < ActionController::Base
95
+ # inflection_method :get_user_gender => :gender, :get_tense => :tense
96
+ # […]
97
+ # end
98
+ #
99
+ # @example Registering inflection methods for the kinds gender and tense
100
+ # class ApplicationController < ActionController::Base
101
+ # inflection_method :gender, :tense
102
+ # […]
103
+ # end
104
+ #
105
+ # @example Registering inflection methods for the kind gender and the strict kind @tense
106
+ # class ApplicationController < ActionController::Base
107
+ # inflection_method :gender, :@tense
108
+ # […]
109
+ # end
110
+ #
111
+ # @example Registering a custom-named inflection methods for the kinds gender and @gender
112
+ # # in case of named patterns the method get_strict_gender and the
113
+ # # strict kind @gender will have priority; the regular kind gender
114
+ # # and its method would be used if there would be no strict variants
115
+ # class ApplicationController < ActionController::Base
116
+ # inflection_method :get_gender => :gender, :get_strict_gender => :@gender
117
+ # […]
118
+ # end
119
+ #
120
+ # @example Registering a method for the kind gender and the custom-named method for the kind @gender
121
+ # class ApplicationController < ActionController::Base
122
+ # inflection_method :gender, :get_strict_gender => :@gender
123
+ # […]
124
+ # end
125
+ #
126
+ # @example Registering a method for the kind gender visible in whole app and a variant for some controller
127
+ # class ApplicationController < ActionController::Base
128
+ # inflection_method :gender
129
+ # […]
130
+ # end
131
+ #
132
+ # # In this controller the method gender will be called
133
+ # # to obtain inflection option's value for the kind gender
134
+ # class UsersController < ApplicationController
135
+ # end
136
+ #
137
+ # # In this controller the method getit will be called
138
+ # # to obtain inflection option's value for the kind gender
139
+ # class OtherController < ApplicationController
140
+ # inflection_method :getit => :gender
141
+ # end
142
+ #
143
+ # # In this controller no method will be called
144
+ # # to obtain inflection option's value for the kind gender
145
+ # class FlowersController < ApplicationController
146
+ # no_inflection_method :getit
147
+ # end
148
+ #
55
149
  # @api public
56
- # @note Any added method will become helper!
57
- # @raise [I18n::Inflector::Rails::BadInflectionMethod] when name or value is malformed
58
- # @param [Hash,Array,Symbol,String] assignment the methods and inflection kinds assigned to them
150
+ # @note Any added method will become a helper unless {I18n::Inflector::InflectionOptions#auto_helper} swtich is set to +false+!
151
+ # @raise [I18n::Inflector::Rails::BadInflectionMethod] when the given name or value are malformed
152
+ # @param [Hash{Symbol => Symbol},Array<Symbol>,Symbol,String] *args the methods and inflection kinds assigned to them
59
153
  # @return [void]
60
- # @yield [method, kind, value, caller] optional block that will be executed
61
- # each time the registered method is called. Its result will replace
62
- # the original returning value of the method that is assigned to a kind
63
- # @yieldparam [Symbol] method the name of an assigned method
64
- # @yieldparam [Symbol] kind the name of an inflection kind assigned to that +method+
65
- # @yieldparam [Object] value the original result of calling the +method+ that will be assigned to a +kind+ as a token
66
- # @yieldparam [Object] caller the object that made a call to {translate} method
67
- # @yieldreturn [String] the new +value+ (token name) that will be assigned to a +kind+
68
- def inflection_method(assignment, &block)
69
- if assignment.is_a?(Array)
70
- new_assignment = {}
71
- assignment.flatten.each{|e| new_assignment[e]=new_assignment}
72
- assignment = new_assignment
73
- elsif (assignment.is_a?(String) || assignment.is_a?(Symbol))
74
- assignment = { assignment => assignment }
154
+ def inflection_method(*args)
155
+ args = args.flatten
156
+ if args.empty?
157
+ raise I18n::Inflector::Rails::BadInflectionMethod.new(assignment)
75
158
  end
76
159
 
77
- if (assignment.nil? || !assignment.is_a?(Hash) || assignment.empty?)
78
- raise I18n::Inflector::Rails::BadInflectionMethod.new(assignment)
160
+ assignment = {}
161
+ args.each do |e|
162
+ if (e.is_a?(Symbol) || e.is_a?(String))
163
+ assignment[e] = e
164
+ elsif e.is_a?(Hash)
165
+ raise I18n::Inflector::Rails::BadInflectionMethod.new(assignment) if e.empty?
166
+ assignment.merge!(e)
167
+ else
168
+ raise I18n::Inflector::Rails::BadInflectionMethod.new(assignment)
169
+ end
79
170
  end
80
171
 
81
- @i18n_inflector_methods ||= {}
82
- assignment.each_pair do |k,v|
83
- k = k.to_s
84
- v = v.to_s
85
- if (k.empty? || v.empty?)
86
- raise I18n::Inflector::Rails::BadInflectionMethod.new("#{k.inspect} => #{v.inspect}")
172
+ @i18n_inflector_kinds ||= {}
173
+ assignment.each_pair do |method, kind|
174
+ method = method.to_s
175
+ if (method.empty? || I18n::Inflector::Config::Reserved::Kinds.invalid?(kind, :OPTION))
176
+ raise I18n::Inflector::Rails::BadInflectionMethod.new("#{method.inspect} => #{kind.inspect}")
87
177
  end
88
- k = k.to_sym
89
- helper_method(k)
90
- @i18n_inflector_methods[k] ||= {}
91
- @i18n_inflector_methods[k][:kind] = v.to_sym
92
- @i18n_inflector_methods[k][:proc] = block
178
+ kind = kind.to_s
179
+ method = method[1..-1] if (method[0..0] == I18n::Inflector::Config::Markers::PATTERN && method == kind)
180
+ kind = kind.to_sym
181
+ method = method.to_sym
182
+ helper_method(method) if I18n.backend.inflector.options.auto_helper
183
+ @i18n_inflector_kinds[kind] = method
93
184
  end
94
185
  end
95
186
  alias_method :inflection_methods, :inflection_method
96
187
 
97
- # This method allows to remove methods from sets
98
- # created using {inflection_method}. It is useful
188
+ # This method unregisters inflection kinds from assignments
189
+ # created by {inflection_method}. It is useful
99
190
  # when there is a need to break inheritance in some controller,
100
- # but a method has been marked as inflection method by
191
+ # but there was a method assigned to some inflection kind in
101
192
  # a parrent class.
102
193
  #
103
194
  # @api public
104
- # @raise [I18n::Inflector::Rails::BadInflectionMethod] when name or value is malformed
105
- # @param [Array] names the method names that should be marked as removed in this controller
195
+ # @raise [I18n::Inflector::Rails::BadInflectionMethod] when name or value is bad or malformed
196
+ # @param [Array<Symbol>] names the method names for which the assigned kinds should be marked as not
197
+ # supported in a current controller and all derivative controllers
106
198
  # @return [void]
107
199
  def no_inflection_method(*names)
108
200
  names = names.flatten
109
201
  if (names.nil? || names.empty?)
110
202
  raise I18n::Inflector::Rails::BadInflectionMethod.new(names)
111
203
  end
112
- @i18n_inflector_methods ||= {}
204
+ @i18n_inflector_kinds ||= {}
113
205
  names.each do |meth|
114
206
  unless (meth.is_a?(Symbol) || meth.is_a?(String))
115
207
  raise I18n::Inflector::Rails::BadInflectionMethod.new(meth)
116
208
  end
117
209
  meth = meth.to_s
210
+ meth = meth[1..-1] if meth[0..0] == I18n::Inflector::Config::Markers::PATTERN # for dummies
118
211
  raise I18n::Inflector::Rails::BadInflectionMethod.new(meth) if meth.empty?
119
- @i18n_inflector_methods[meth.to_sym] = nil
120
- end
212
+ meth = meth.to_sym
213
+ i18n_inflector_kinds.each_pair do |kind, obj|
214
+ if obj == meth
215
+ @i18n_inflector_kinds[kind] = nil
216
+ end
217
+ end
218
+ end
121
219
  end
122
220
  alias_method :no_inflection_methods, :no_inflection_method
123
221
 
222
+ # This method unregisters the given inflection kinds from assignments
223
+ # created by {inflection_method}. It is useful
224
+ # when there is a need to break inheritance in some controller,
225
+ # but there was a method assigned to some inflection kind in
226
+ # a parrent class.
227
+ #
228
+ # @api public
229
+ # @raise [I18n::Inflector::Rails::BadInflectionMethod] when name or value is malformed
230
+ # @param [String,Symbol,Array<Symbol>] kinds the kind for which the method names should be marked
231
+ # as not supported in a current controller and all derivative controllers
232
+ # @return [void]
233
+ def no_inflection_method_for(*names)
234
+ names = names.flatten
235
+ if (names.nil? || names.empty?)
236
+ raise I18n::Inflector::Rails::BadInflectionMethod.new(names)
237
+ end
238
+ @i18n_inflector_kinds ||= {}
239
+ names.each do |kind|
240
+ unless (kind.is_a?(Symbol) || kind.is_a?(String))
241
+ raise I18n::Inflector::Rails::BadInflectionKind.new(kind)
242
+ end
243
+ if (I18n::Inflector::Config::Reserved::Kinds.invalid?(kind, :OPTION) ||
244
+ kind.to_s == I18n::Inflector::Config::Markers::PATTERN)
245
+ raise I18n::Inflector::Rails::BadInflectionKind.new(kind)
246
+ end
247
+ @i18n_inflector_kinds[kind.to_sym] = nil
248
+ end
249
+ end
250
+ alias_method :no_inflection_methods_for, :no_inflection_method_for
251
+ alias_method :no_inflection_kind, :no_inflection_method_for
252
+
124
253
  end # class methods
125
-
126
- # This module contains a version of {translate} method that
127
- # tries to use +i18n_inflector_methods+ available in the current context.
254
+
255
+ # This module contains a variant of the +translate+ method that
256
+ # uses {I18n::Inflector::Rails::ClassMethods#i18n_inflector_kinds i18n_inflector_kinds}
257
+ # available in the current context.
128
258
  # The method from this module will wrap the
129
259
  # {ActionView::Helpers::TranslationHelper#translate} method.
130
260
  module InflectedTranslate
131
-
261
+
132
262
  # This method tries to feed itself with the data coming
133
- # from +i18n_inflector_methods+ available in the current context.
134
- # The data from the last method should contain options
135
- # of inflection pairs (<tt>kind => value</tt>) that will
136
- # be passed to {I18n::Backend::Inflector#translate} through
263
+ # from {I18n::Inflector::Rails::ClassMethods#i18n_inflector_kinds i18n_inflector_kinds}
264
+ # available in the current context.
265
+ # That data contains inflection pairs (<tt>kind => value</tt>) that will
266
+ # be passed to the interpolation method from {I18n::Inflector} through
137
267
  # {ActionView::Helpers::TranslationHelper#translate}.
138
268
  #
269
+ # You may also pass inflection options directly, along with other options,
270
+ # without registering methods responsible for delivering tokens.
271
+ # See {I18n Inflector documentation}[http://rubydoc.info/gems/i18n-inflector]
272
+ # for more info about inflection options.
273
+ #
139
274
  # @api public
140
- # @param [String] key translation key
141
- # @param [Hash] options a set of options to pass to the
142
- # translation routines
143
- # @return [String] the translated string with inflection patterns
144
- # interpolated
275
+ # @raise {I18n::InvalidInflectionKind}
276
+ # @raise {I18n::InvalidInflectionOption}
277
+ # @raise {I18n::InvalidInflectionToken}
278
+ # @raise {I18n::MisplacedInflectionToken}
279
+ # @overload translate(key, options)
280
+ # @param [String] key translation key
281
+ # @param [Hash] options a set of options to pass to the
282
+ # translation routines
283
+ # @option options [Boolean] :inflector_verify_methods (false) local switch
284
+ # that overrides global setting (see {I18n::Inflector::InflectionOptions#verify_methods})
285
+ # @option options [Boolean] :inflector_lazy_methods (true) local switch
286
+ # that overrides global setting (see {I18n::Inflector::InflectionOptions#lazy_methods})
287
+ # @option options [Boolean] :inflector_excluded_defaults (false) local switch
288
+ # that overrides global setting (see {I18n Inflector documentation}[http://rubydoc.info/gems/i18n-inflector])
289
+ # @option options [Boolean] :inflector_unknown_defaults (true) local switch
290
+ # that overrides global setting (see {I18n Inflector documentation}[http://rubydoc.info/gems/i18n-inflector])
291
+ # @option options [Boolean] :inflector_raises (false) local switch
292
+ # that overrides global setting (see {I18n Inflector documentation}[http://rubydoc.info/gems/i18n-inflector])
293
+ # @option options [Boolean] :inflector_aliased_patterns (false) local switch
294
+ # that overrides global setting (see {I18n Inflector documentation}[http://rubydoc.info/gems/i18n-inflector])
295
+ # @option options [Boolean] :inflector_cache_aware (false) local switch
296
+ # that overrides global setting (see {I18n Inflector documentation}[http://rubydoc.info/gems/i18n-inflector])
297
+ # @return [String] the translated string with inflection patterns
298
+ # interpolated
145
299
  def translate(*args)
146
300
  opts_present = args.last.is_a?(Hash)
147
301
  if opts_present
@@ -153,16 +307,12 @@ module I18n
153
307
  test_locale ||= I18n.locale
154
308
  inflector = I18n.backend.inflector
155
309
 
156
- # use standard translate if the locale is not supported
310
+ # return immediately if the locale is not supported
157
311
  return super unless inflector.inflected_locale?(test_locale)
158
312
 
159
- # read switch
160
- verifies = options.delete(:inflector_verify_methods)
161
- verifies = verifies.nil? ? inflector.options.verify_methods : verifies
162
-
163
313
  # collect inflection variables that are present in this context
164
- subopts = t_prepare_inflection_options(inflector, verifies)
165
-
314
+ subopts = t_prepare_inflection_options(inflector, locale, options)
315
+
166
316
  # jump to original translate if no variables are present
167
317
  return super if subopts.empty?
168
318
 
@@ -173,29 +323,34 @@ module I18n
173
323
  end
174
324
 
175
325
  alias_method :t, :translate
176
-
326
+
177
327
  protected
178
-
179
- # This method tries to read +i18n_inflector_methods+ available in the current context.
328
+
329
+ # This method tries to read +i18n_inflector_kinds+ available in the current context.
180
330
  #
181
331
  # @return [Hash] the inflection options (<tt>kind => value</tt>)
182
- def t_prepare_inflection_options(inflector, verifies)
332
+ def t_prepare_inflection_options(inflector, locale, options)
183
333
  subopts = {}
184
- return subopts if (verifies && !respond_to?(:i18n_inflector_methods))
185
- i18n_inflector_methods.each_pair do |m, obj|
186
- next if obj.nil? # method registered but disabled from usage
187
- next if (verifies && !respond_to?(m)) # verify_methods enabled
188
- value = method(m).call
189
- proca = obj[:proc]
190
- kind = obj[:kind]
191
- value = proca.call(m, kind, value, self) unless proca.nil?
192
- subopts[kind] = value.to_s
334
+
335
+ verifies = options[:inflector_verify_methods]
336
+ verifies = inflector.options.verify_methods if verifies.nil?
337
+ is_lazy = options[:inflector_lazy_methods]
338
+ is_lazy = inflector.options.lazy_methods if is_lazy.nil?
339
+
340
+ return subopts if (verifies && !respond_to?(:i18n_inflector_kinds))
341
+
342
+ i18n_inflector_kinds.each_pair do |kind, meth|
343
+ next if meth.nil? # kind is registered but disabled from usage
344
+ next if verifies && !respond_to?(meth)
345
+ obj = method(meth)
346
+ obj = obj.call { next kind, locale } unless is_lazy # lazy_methods is disabled
347
+ subopts[kind] = obj
193
348
  end
194
349
  return subopts
195
350
  end
196
-
197
- end # Translate
198
-
199
- end
200
- end
201
- end
351
+
352
+ end # module InflectedTranslate
353
+
354
+ end # module Rails
355
+ end # module Inflector
356
+ end # module I18n
@@ -10,43 +10,95 @@
10
10
 
11
11
  module I18n
12
12
  module Inflector
13
- module Rails
14
-
15
- # This module adds options to {I18n::Inflector::InflectionOptions}
16
- module AdditionalOptions
17
-
18
- attr_writer :verify_methods
19
-
20
- # When this is set to +true+ then
21
- # inflection works a bit slower but
22
- # checks whether any method exists before
23
- # calling it. This switch is by default set
24
- # to +false+.
25
- #
26
- # By turning this switch on you're sure that
27
- # there will be no +NameError+ (no method) exception
28
- # raised during translation.
29
- #
30
- # Alternatively you can turn this locally,
31
- # for the specified translate call, by setting
32
- # <tt>:inflector_verify_methods</tt> option to +true+.
33
- #
34
- # @example Globally enabling methods verification
35
- # I18n.inflector.options.verify_methods = true
36
- # @example Locally enabling methods verification
37
- # translate('welcome', :inflector_verify_methods => true)
38
- def verify_methods
39
- @verify_methods || false
40
- end
41
-
42
- # This method resets inflector's
43
- # switches to default values.
44
- def reset
45
- @verify_methods = false
46
- super
47
- end
48
13
 
14
+ # This module adds options to {I18n::Inflector::InflectionOptions}
15
+ class InflectionOptions
16
+
17
+ # When this is set to +true+ then
18
+ # inflection works a bit slower but
19
+ # checks whether any method exists before
20
+ # calling it.
21
+ #
22
+ # This switch is by default set
23
+ # to +false+.
24
+ #
25
+ # By turning this switch on you're sure that
26
+ # there will be no +NameError+ (no method) exception
27
+ # raised during translation.
28
+ #
29
+ # Alternatively you can turn this on locally,
30
+ # for the specified translation call, by setting
31
+ # <tt>:inflector_verify_methods</tt> option to +true+.
32
+ #
33
+ # @example Globally enabling methods verification
34
+ # I18n.inflector.options.verify_methods = true
35
+ # @example Locally enabling methods verification
36
+ # translate('welcome', :inflector_verify_methods => true)
37
+ attr_accessor :verify_methods
38
+
39
+ # When this is set to +true+ then
40
+ # each time infleciton method is registered
41
+ # it becomes a helper method so it's available in
42
+ # a view.
43
+ #
44
+ # This switch is by default set
45
+ # to +true+.
46
+ #
47
+ # Setting this switch locally,
48
+ # for the specified translation call, using
49
+ # <tt>:inflector_auto_helper</tt> option will
50
+ # have no effect.
51
+ #
52
+ # @example Globally disabling automatic setting of helpers
53
+ # I18n.inflector.options.auto_helper = false
54
+ attr_accessor :auto_helper
55
+
56
+ # When this is set to +true+ then
57
+ # each time an infleciton method is used to obtain
58
+ # value for the associated kind it evaluates lazy.
59
+ # That means the method object is passed to the
60
+ # translation routines and it is evaluated when there
61
+ # is a need. If this is set to +false+ then
62
+ # evaluation takes place before calling Inflector's
63
+ # translation method and inflection options are passed
64
+ # as symbols, not as method objects.
65
+ #
66
+ # This switch is by default set
67
+ # to +true+. By disabling it you may experience
68
+ # some negative performance impact when many
69
+ # inflection methods are registered. That is because
70
+ # the lazy evaluation causes calling only those methods
71
+ # that are needed by internal interpolation routines
72
+ # of the Inflector. For instance, if in some pattern
73
+ # only the kind "gender" is used then there is no
74
+ # need to call inflection methods for other kinds.
75
+ # When lazy evaluation is disabled then all inflection
76
+ # methods have to be called before passing control
77
+ # to translation routines, since this plug-in does not
78
+ # analyze contents of inflection patterns or keys.
79
+ #
80
+ # Alternatively you can turn this off locally,
81
+ # for the specified translation call, by setting
82
+ # <tt>:inflector_lazy_methods</tt> option to +false+.
83
+ #
84
+ # @example Globally disabling lazy evaluation of kinds
85
+ # I18n.inflector.options.lazy_methods = false
86
+ # @example Locally disabling lazy evaluation of kinds
87
+ # translate('welcome', :inflector_lazy_methods => false)
88
+ attr_accessor :lazy_methods
89
+
90
+ # @private
91
+ alias_method :_rai_orig_reset, :reset
92
+
93
+ # This method resets inflector's
94
+ # switches to default values.
95
+ def reset
96
+ @verify_methods = false
97
+ @auto_helper = true
98
+ @lazy_methods = true
99
+ _rai_orig_reset
49
100
  end
50
- end
51
- end
52
- end
101
+
102
+ end # class InflectionOptions
103
+ end # module Inflector
104
+ end # module I18n
@@ -15,7 +15,7 @@ module I18n
15
15
  # @private
16
16
  EMAIL = 'pw@gnu.org'
17
17
  # @private
18
- VERSION = '0.2.0'
18
+ VERSION = '1.0.0'
19
19
  # @private
20
20
  NAME = 'i18n-inflector-rails'
21
21
  # @private
@@ -2,6 +2,7 @@ require 'spec_helper'
2
2
 
3
3
  class ApplicationController < ActionController::Base; end
4
4
  class InflectedTranslateController < ApplicationController; end
5
+ class InflectedStrictController < ApplicationController; end
5
6
 
6
7
  describe I18n.inflector.options.class do
7
8
 
@@ -25,28 +26,47 @@ describe ApplicationController do
25
26
 
26
27
  I18n.locale = :xx
27
28
  I18n.backend.store_translations(:xx, :i18n => { :inflections => {
28
- :gender => {
29
+ :gender => {
30
+ :m => 'male',
31
+ :f => 'female',
32
+ :n => 'neuter',
33
+ :s => 'strange',
34
+ :masculine => '@m',
35
+ :feminine => '@f',
36
+ :neuter => '@n',
37
+ :neutral => '@neuter',
38
+ :default => 'neutral' },
39
+ :time => {
40
+ :present => 'present',
41
+ :past => 'past',
42
+ :future => 'future'},
43
+ :@gender => {
29
44
  :m => 'male',
30
45
  :f => 'female',
46
+ :d => 'dude',
47
+ :x => 'tester',
31
48
  :n => 'neuter',
32
- :s => 'strange',
33
- :masculine => '@m',
34
- :feminine => '@f',
35
- :neuter => '@n',
36
- :neutral => '@neuter',
37
- :default => 'neutral' },
49
+ :default => 'n'},
38
50
  :person => {
39
51
  :i => 'I',
40
52
  :you => 'You',
41
- :it => 'It'}
53
+ :it => 'It'},
54
+ :@person => {
55
+ :i => 'I',
56
+ :you => 'You',
57
+ :it => 'It'},
42
58
  } })
43
- I18n.backend.store_translations(:xx, 'welcome' => 'Dear @{f:Lady|m:Sir|n:You|All}!')
44
- I18n.backend.store_translations(:xx, 'to_be' => 'Oh @{i:I am|you:You are|it:It is}')
59
+
60
+ I18n.backend.store_translations(:xx, 'welcome' => 'Dear @{f:Lady|m:Sir|n:You|All}!')
61
+ I18n.backend.store_translations(:xx, 'welcome_strict' => 'Dear @gender{f:Lady|m:Sir|d:Dude|n:You|All}!')
62
+ I18n.backend.store_translations(:xx, 'to_be' => 'Oh @{i:I am|you:You are|it:It is}')
63
+ I18n.backend.store_translations(:xx, 'to_be_strict' => 'Oh @person{i:me|you:You are|it:It is}')
64
+ I18n.backend.store_translations(:xx, 'hitime' => '@{present,past,future:~}!')
45
65
 
46
66
  end
47
67
 
48
68
  describe ".inflection_method" do
49
-
69
+
50
70
  before do
51
71
  class AnotherController < InflectedTranslateController; end
52
72
  end
@@ -54,28 +74,33 @@ describe ApplicationController do
54
74
  it "should be albe to assign a mehtod to the inflection kind" do
55
75
  lambda{AnotherController.inflection_method(:users_gender => :gender)}.should_not raise_error
56
76
  end
57
-
77
+
78
+ it "should be albe to assign a mehtod to the strict inflection kind" do
79
+ lambda{AnotherController.inflection_method(:users_gender => :@gender)}.should_not raise_error
80
+ end
81
+
58
82
  it "should be albe to accept single Symbol argument" do
59
83
  lambda{AnotherController.inflection_method(:time)}.should_not raise_error
84
+ lambda{AnotherController.inflection_method(:@time)}.should_not raise_error
60
85
  end
61
86
 
62
87
  it "should be albe to accept single String argument" do
63
88
  lambda{AnotherController.inflection_method('time')}.should_not raise_error
89
+ lambda{AnotherController.inflection_method('@time')}.should_not raise_error
64
90
  end
65
91
 
66
92
  it "should be albe to accept Array<Symbol> argument" do
67
93
  lambda{AnotherController.inflection_method([:time])}.should_not raise_error
68
- end
69
-
70
- it "should be albe to assign a mehtod to the inflection kind with proc" do
71
- lambda{AnotherController.inflection_method(:users_gender => :gender){|a,b,c,d,e| :m} }.should_not raise_error
72
- lambda{AnotherController.inflection_method(:time){|a,b,c,d,e| :m} }.should_not raise_error
94
+ lambda{AnotherController.inflection_method([:@time])}.should_not raise_error
73
95
  end
74
96
 
75
97
  it "should raise an error when method name is wrong" do
76
98
  lambda{AnotherController.inflection_method}.should raise_error
77
99
  lambda{AnotherController.inflection_method(nil => :blabla)}.should raise_error
78
100
  lambda{AnotherController.inflection_method(:blabla => nil)}.should raise_error
101
+ lambda{AnotherController.inflection_method(nil => :@blabla)}.should raise_error
102
+ lambda{AnotherController.inflection_method(:@blabla => nil)}.should raise_error
103
+ lambda{AnotherController.inflection_method(:"@")}.should raise_error
79
104
  lambda{AnotherController.inflection_method({''=>''})}.should raise_error
80
105
  lambda{AnotherController.inflection_method(nil => nil)}.should raise_error
81
106
  lambda{AnotherController.inflection_method(nil)}.should raise_error
@@ -88,99 +113,155 @@ describe ApplicationController do
88
113
  end
89
114
 
90
115
  describe ".no_inflection_method" do
91
-
116
+
92
117
  before do
93
118
  class AnotherController < InflectedTranslateController; end
94
119
  end
95
120
 
96
- it "should be albe to spit a mehtod of the inflection kind" do
121
+ it "should be albe to split a mehtod of the inflection kind" do
97
122
  lambda{AnotherController.no_inflection_method(:users_gender)}.should_not raise_error
98
123
  end
99
-
124
+
100
125
  it "should be albe to accept single Symbol argument" do
101
126
  lambda{AnotherController.no_inflection_method(:time)}.should_not raise_error
127
+ lambda{AnotherController.no_inflection_method(:@time)}.should_not raise_error
102
128
  end
103
129
 
104
130
  it "should be albe to accept single String argument" do
105
131
  lambda{AnotherController.no_inflection_method('time')}.should_not raise_error
132
+ lambda{AnotherController.no_inflection_method('@time')}.should_not raise_error
106
133
  end
107
134
 
108
135
  it "should be albe to accept Array<Symbol> argument" do
109
136
  lambda{AnotherController.no_inflection_method([:time])}.should_not raise_error
137
+ lambda{AnotherController.no_inflection_method([:@time])}.should_not raise_error
138
+ end
139
+
140
+ it "should raise an error when method name is wrong" do
141
+ lambda{AnotherController.no_inflection_method}.should raise_error
142
+ lambda{AnotherController.no_inflection_method(nil)}.should raise_error
143
+ lambda{AnotherController.no_inflection_method([nil])}.should raise_error
144
+ lambda{AnotherController.no_inflection_method(:"@")}.should raise_error
145
+ lambda{AnotherController.no_inflection_method([''])}.should raise_error
146
+ lambda{AnotherController.no_inflection_method([])}.should raise_error
147
+ lambda{AnotherController.no_inflection_method({})}.should raise_error
148
+ end
149
+
150
+ end
151
+
152
+ describe ".no_inflection_kind" do
153
+
154
+ before do
155
+ class AnotherController < InflectedTranslateController; end
156
+ end
157
+
158
+ it "should be albe to spit a mehtod of the inflection kind" do
159
+ lambda{AnotherController.no_inflection_kind(:gender)}.should_not raise_error
160
+ lambda{AnotherController.no_inflection_kind(:@gender)}.should_not raise_error
161
+ end
162
+
163
+ it "should be albe to accept single Symbol argument" do
164
+ lambda{AnotherController.no_inflection_kind(:time)}.should_not raise_error
165
+ lambda{AnotherController.no_inflection_kind(:@time)}.should_not raise_error
166
+ end
167
+
168
+ it "should be albe to accept single String argument" do
169
+ lambda{AnotherController.no_inflection_kind('time')}.should_not raise_error
170
+ lambda{AnotherController.no_inflection_kind('@time')}.should_not raise_error
171
+ end
172
+
173
+ it "should be albe to accept Array<Symbol> argument" do
174
+ lambda{AnotherController.no_inflection_kind([:time])}.should_not raise_error
175
+ lambda{AnotherController.no_inflection_kind([:@time])}.should_not raise_error
110
176
  end
111
177
 
112
178
  it "should raise an error when method name is wrong" do
113
- lambda{AnotherController.no_inflection_method}.should raise_error
114
- lambda{AnotherController.no_inflection_method(nil)}.should raise_error
115
- lambda{AnotherController.no_inflection_method([nil])}.should raise_error
116
- lambda{AnotherController.no_inflection_method([''])}.should raise_error
117
- lambda{AnotherController.no_inflection_method([])}.should raise_error
118
- lambda{AnotherController.no_inflection_method({})}.should raise_error
179
+ lambda{AnotherController.no_inflection_kind}.should raise_error
180
+ lambda{AnotherController.no_inflection_kind(nil)}.should raise_error
181
+ lambda{AnotherController.no_inflection_kind(:"@")}.should raise_error
182
+ lambda{AnotherController.no_inflection_kind([nil])}.should raise_error
183
+ lambda{AnotherController.no_inflection_kind([''])}.should raise_error
184
+ lambda{AnotherController.no_inflection_kind([])}.should raise_error
185
+ lambda{AnotherController.no_inflection_kind({})}.should raise_error
119
186
  end
120
187
 
121
188
  end
122
189
 
123
- describe ".i18n_inflector_methods" do
190
+ describe ".i18n_inflector_kinds" do
124
191
 
125
192
  before do
126
193
  InflectedTranslateController.inflection_method(:users_gender => :gender)
127
194
  InflectedTranslateController.inflection_method(:time)
128
- @expected_hash = {:users_gender=>{:kind=>:gender, :proc=>nil},
129
- :time=>{:kind=>:time, :proc=>nil}}
195
+ @expected_hash = { :gender => :users_gender, :time => :time }
130
196
  end
131
197
 
132
198
  it "should be callable" do
133
- lambda{InflectedTranslateController.i18n_inflector_methods}.should_not raise_error
199
+ lambda{InflectedTranslateController.i18n_inflector_kinds}.should_not raise_error
134
200
  end
135
201
 
136
202
  it "should be able to read methods assigned to inflection kinds" do
137
- InflectedTranslateController.i18n_inflector_methods.should == @expected_hash
203
+ InflectedTranslateController.i18n_inflector_kinds.should == @expected_hash
138
204
  end
139
205
 
140
206
  end
141
-
207
+
142
208
  describe "controller instance methods" do
143
-
209
+
144
210
  before do
145
211
 
146
212
  class InflectedTranslateController
147
- inflection_method :users_gender => :gender
148
- def users_gender; :m end
149
- def time; :present end
150
- def translated_male; translate('welcome') end
151
- def t_male; t('welcome') end
213
+ def trn(*args); translate(*args) end
214
+ def t_male; t('welcome') end
215
+ def users_gender; :m end
216
+ def time
217
+ kind, locale = yield
218
+ kind == :time ? :past : nil
219
+ end
152
220
  end
153
221
 
154
- class InflectedLambdedController < InflectedTranslateController
155
- inflection_method(:person) {:it}
156
- def person; :you end
157
- def translated_person; translate('to_be') end
222
+ class InflectedStrictController
223
+ inflection_method :@gender
224
+
225
+ def gender; :m end
226
+ def trn(*args); translate(*args) end
158
227
  end
159
228
 
160
- class InflectedLambdedPrimController < InflectedLambdedController
161
- inflection_method :person
229
+ class InflectedStrictOverrideController < InflectedTranslateController
230
+ inflection_method :users_dude => :@gender
231
+ inflection_method :users_female => :gender
232
+ inflection_method :person_i => :person
233
+
234
+ no_inflection_method_for :@person
235
+
236
+ def users_female; :f end
237
+ def users_dude; :d end
238
+ def person_i; :i end
162
239
  end
163
240
 
164
241
  class NomethodController < InflectedTranslateController
165
242
  inflection_method :nonexistent => :gender
166
- def translate_male; translate('welcome') end
167
- def translate_male_opt; translate('welcome', :inflector_verify_methods => true) end
243
+ end
244
+
245
+ class MethodDisabledController < InflectedTranslateController
246
+ no_inflection_method :users_gender
168
247
  end
169
248
 
170
249
  @controller = InflectedTranslateController.new
171
- @person_controller = InflectedLambdedController.new
172
- @personprim_controller = InflectedLambdedPrimController.new
250
+ @strict_controller = InflectedStrictController.new
251
+ @strict_over_controller = InflectedStrictOverrideController.new
252
+ @disabled_controller = MethodDisabledController.new
173
253
  @nomethod_controller = NomethodController.new
174
254
 
175
- @expected_hash = {:users_gender=>{:kind=>:gender, :proc=>nil},
176
- :time=>{:kind=>:time, :proc=>nil}}
177
-
178
255
  end
179
256
 
180
- describe "#i18n_inflector_methods" do
257
+ describe "#i18n_inflector_kinds" do
258
+
259
+ before do
260
+ @expected_hash = {:gender => :users_gender, :time => :time }
261
+ end
181
262
 
182
263
  it "should be able to read methods assigned to inflection kinds" do
183
- @controller.i18n_inflector_methods.should == @expected_hash
264
+ @controller.i18n_inflector_kinds.should == @expected_hash
184
265
  end
185
266
 
186
267
  end
@@ -188,25 +269,35 @@ describe ApplicationController do
188
269
  describe "#translate" do
189
270
 
190
271
  it "should translate using inflection patterns and pick up the right value" do
191
- @controller.translated_male.should == 'Dear Sir!'
272
+ @controller.trn('welcome').should == 'Dear Sir!'
273
+ @controller.trn('welcome_strict').should == 'Dear Sir!'
274
+ @strict_controller.trn('welcome_strict').should == 'Dear Sir!'
192
275
  end
193
276
 
194
- it "should make use of blocks if assigned to inflection methods" do
195
- @person_controller.translated_person.should == 'Oh It is'
277
+ it "should make use of a block passed to inflection method" do
278
+ @controller.trn('hitime').should == 'past!'
196
279
  end
197
280
 
198
281
  it "should make use of inherited inflection method assignments" do
199
- @person_controller.translated_male.should == 'Dear Sir!'
282
+ @strict_over_controller.trn('hitime').should == 'past!'
200
283
  end
201
284
 
202
285
  it "should make use of overriden inflection method assignments" do
203
- @personprim_controller.translated_person.should == 'Oh You are'
286
+ @strict_over_controller.trn('welcome').should == 'Dear Lady!'
287
+ end
288
+
289
+ it "should prioritize strict kinds when both inflection options are passed" do
290
+ @strict_over_controller.trn('welcome_strict').should == 'Dear Dude!'
291
+ @strict_over_controller.trn('welcome').should == 'Dear Lady!'
292
+ end
293
+
294
+ it "should use regular kind option when strict kind option is missing" do
295
+ @strict_over_controller.trn('to_be').should == 'Oh I am'
296
+ @strict_over_controller.trn('to_be_strict').should == 'Oh me'
204
297
  end
205
-
298
+
206
299
  it "should make use of disabled inflection method assignments" do
207
- InflectedLambdedPrimController.no_inflection_method :person
208
- @personprim_controller.translated_person.should == 'Oh '
209
- @person_controller.translated_person.should == 'Oh It is'
300
+ @disabled_controller.trn('welcome').should == 'Dear You!'
210
301
  end
211
302
 
212
303
  it "should raise exception when method does not exists" do
@@ -214,19 +305,23 @@ describe ApplicationController do
214
305
  end
215
306
 
216
307
  it "should not raise when method does not exists and verify_methods is enabled" do
217
- lambda{@nomethod_controller.translate_male_opt}.should_not raise_error(NameError)
308
+ lambda{@nomethod_controller.trn('welcome', :inflector_verify_methods => true)}.should_not raise_error(NameError)
218
309
  I18n.inflector.options.verify_methods = true
219
- lambda{@nomethod_controller.translate_male}.should_not raise_error(NameError)
310
+ lambda{@nomethod_controller.trn('welcome')}.should_not raise_error(NameError)
311
+ end
312
+
313
+ it "should translate with the :inflector_lazy_methods switch turned off" do
314
+ @strict_over_controller.trn('welcome', :inflector_lazy_methods => false).should == 'Dear Lady!'
220
315
  end
221
316
 
222
317
  end
223
-
318
+
224
319
  describe "#t" do
225
-
320
+
226
321
  it "should call translate" do
227
322
  @controller.t_male.should == 'Dear Sir!'
228
323
  end
229
-
324
+
230
325
  end
231
326
 
232
327
  end
metadata CHANGED
@@ -3,10 +3,10 @@ name: i18n-inflector-rails
3
3
  version: !ruby/object:Gem::Version
4
4
  prerelease: false
5
5
  segments:
6
+ - 1
6
7
  - 0
7
- - 2
8
8
  - 0
9
- version: 0.2.0
9
+ version: 1.0.0
10
10
  platform: ruby
11
11
  authors:
12
12
  - "Pawe\xC5\x82 Wilk"
@@ -34,7 +34,7 @@ cert_chain:
34
34
  NK3TIZaPCh1S2/ES6wXNvjQ+5EnEEL9j/pSEop9DYEBPaM2WDVR5i0jJTAaRWw==
35
35
  -----END CERTIFICATE-----
36
36
 
37
- date: 2011-01-16 00:00:00 +01:00
37
+ date: 2011-02-15 00:00:00 +01:00
38
38
  default_executable:
39
39
  dependencies:
40
40
  - !ruby/object:Gem::Dependency
@@ -46,8 +46,8 @@ dependencies:
46
46
  - !ruby/object:Gem::Version
47
47
  segments:
48
48
  - 2
49
- - 0
50
- version: "2.0"
49
+ - 3
50
+ version: "2.3"
51
51
  type: :runtime
52
52
  prerelease: false
53
53
  version_requirements: *id001
@@ -219,7 +219,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
219
219
  requirements:
220
220
  - - ">="
221
221
  - !ruby/object:Gem::Version
222
- hash: 2397947838501194867
222
+ hash: 2455851808387903881
223
223
  segments:
224
224
  - 0
225
225
  version: "0"
@@ -228,7 +228,6 @@ required_rubygems_version: !ruby/object:Gem::Requirement
228
228
  requirements:
229
229
  - - ">="
230
230
  - !ruby/object:Gem::Version
231
- hash: 2397947838501194867
232
231
  segments:
233
232
  - 0
234
233
  version: "0"
metadata.gz.sig CHANGED
Binary file