i18n-inflector 2.0.1 → 2.1.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.
@@ -4,8 +4,8 @@
4
4
  # Copyright:: (c) 2011 by Paweł Wilk
5
5
  # License:: This program is licensed under the terms of {file:LGPL GNU Lesser General Public License} or {file:COPYING Ruby License}.
6
6
  #
7
- # This file contains utility methods,
8
- # that are used by I18n::Inflector and I18n::Backend::Inflector.
7
+ # This file contains class that is used to keep
8
+ # inflection data.
9
9
 
10
10
  # @abstract This namespace is shared with I18n subsystem.
11
11
  module I18n
@@ -13,38 +13,50 @@ module I18n
13
13
 
14
14
  # This class contains structures for keeping parsed translation data
15
15
  # and basic operations for performing on them.
16
- class InflectionData
16
+ class InflectionData < InflectionData_Strict
17
17
 
18
18
  # Initializes internal structures.
19
+ #
20
+ # @param [Symbol,nil] locale the locale identifier for the object to be labeled with
19
21
  def initialize(locale=nil)
20
- dummy_token = {:kind=>nil,:target=>nil,:description=>nil}
21
- @kinds = Hash.new(false)
22
- @tokens = Hash.new(dummy_token)
23
- @defaults = {}
24
- @locale = locale
22
+ @kinds = Hash.new(false)
23
+ @tokens = Hash.new(DUMMY_TOKEN)
24
+ @defaults = Hash.new
25
+ @lazy_tokens = LazyHashEnumerator.new(@tokens)
26
+ @locale = locale
25
27
  end
26
28
 
27
- # Locale that this database works on.
28
- attr_reader :locale
29
-
30
- # Adds an alias (overwriting existing alias).
29
+ # Adds an alias (overwriting an existing alias).
31
30
  #
32
- # @param [Symbol] name the name of an alias
33
- # @param [Symbol] target the target token for the given +alias+
34
31
  # @return [Boolean] +true+ if everything went ok, +false+ otherwise
35
- # (in case of bad or +nil+ names or non-existent targets)
36
- def add_alias(name, target)
32
+ # (in case of bad or +nil+ names or non-existent targets)
33
+ # @overload add_alias(name, target)
34
+ # Adds an alias (overwriting an existing alias).
35
+ # @param [Symbol] name the name of an alias
36
+ # @param [Symbol] target the target token for the given +alias+
37
+ # @return [Boolean] +true+ if everything went ok, +false+ otherwise
38
+ # (in case of bad or +nil+ names or non-existent targets)
39
+ # @overload add_alias(name, target, kind)
40
+ # Adds an alias (overwriting an existing alias) if the given
41
+ # +kind+ matches the kind of the given target.
42
+ # @param [Symbol] name the name of an alias
43
+ # @param [Symbol] target the target token for the given +alias+
44
+ # @param [Symbol] kind the optional kind of a taget
45
+ # @return [Boolean] +true+ if everything went ok, +false+ otherwise
46
+ # (in case of bad or +nil+ names or non-existent targets)
47
+ def add_alias(name, target, kind=nil)
37
48
  target = target.to_s
38
49
  name = name.to_s
39
50
  return false if (name.empty? || target.empty?)
51
+ kind = nil if kind.to_s.empty? unless kind.nil?
40
52
  name = name.to_sym
41
53
  target = target.to_sym
42
- kind = get_kind(target)
43
- return false if kind.nil?
54
+ t_kind = get_kind(target)
55
+ return false if (t_kind.nil? || (!kind.nil? && t_kind != kind))
44
56
  @tokens[name] = {}
45
- @tokens[name][:kind] = kind
46
- @tokens[name][:target] = target
47
- @tokens[name][:description] = @tokens[target][:description]
57
+ @tokens[name][:kind] = kind
58
+ @tokens[name][:target] = target
59
+ @tokens[name][:description] = @tokens[target][:description]
48
60
  true
49
61
  end
50
62
 
@@ -53,8 +65,10 @@ module I18n
53
65
  # @param [Symbol] token the name of a token to add
54
66
  # @param [Symbol] kind the kind of a token
55
67
  # @param [String] description the description of a token
56
- # @return [void]
68
+ # @return [Boolean] +true+ if everything went ok, +false+ otherwise
69
+ # (in case of bad names or non-existent targets)
57
70
  def add_token(token, kind, description)
71
+ return false if (token.to_s.empty? || kind.to_s.empty? || description.nil?)
58
72
  token = token.to_sym
59
73
  @tokens[token] = {}
60
74
  @tokens[token][:kind] = kind.to_sym
@@ -62,16 +76,6 @@ module I18n
62
76
  @kinds[kind] = true
63
77
  end
64
78
 
65
- # Sets the default token for a kind.
66
- #
67
- # @param [Symbol] kind the kind to which the default
68
- # token should be assigned
69
- # @param [Symbol] target the token to set
70
- # @return [void]
71
- def set_default_token(kind, target)
72
- @defaults[kind.to_sym] = target.to_sym
73
- end
74
-
75
79
  # Tests if the token is a true token.
76
80
  #
77
81
  # @overload has_true_token?(token)
@@ -81,6 +85,7 @@ module I18n
81
85
  # a token and not an alias, +false+ otherwise
82
86
  # @overload has_true_token?(token, kind)
83
87
  # Tests if the token is a true token.
88
+ # The kind will work as the expectation filter.
84
89
  # @param [Symbol] token the identifier of a token
85
90
  # @param [Symbol] kind the identifier of a kind
86
91
  # @return [Boolean] +true+ if the given +token+ is
@@ -102,6 +107,7 @@ module I18n
102
107
  # (which may be an alias) exists
103
108
  # @overload has_token(token, kind)
104
109
  # Tests if a token (or alias) is present.
110
+ # The kind will work as the expectation filter.
105
111
  # @param [Symbol] token the identifier of a token
106
112
  # @param [Symbol] kind the identifier of a kind
107
113
  # @return [Boolean] +true+ if the given +token+
@@ -129,15 +135,16 @@ module I18n
129
135
  @defaults.has_key?(kind)
130
136
  end
131
137
 
132
- # Tests if a given alias is really an alias.
138
+ # Tests if the given alias is really an alias.
133
139
  #
134
140
  # @overload has_alias?(alias_name)
135
- # Tests if a given alias is really an alias.
141
+ # Tests if the given alias is really an alias.
136
142
  # @param [Symbol] alias_name the identifier of an alias
137
143
  # @return [Boolean] +true+ if the given alias is really an alias,
138
144
  # +false+ otherwise
139
145
  # @overload has_alias?(alias_name, kind)
140
- # Tests if a given alias is really an alias.
146
+ # Tests if the given alias is really an alias.
147
+ # The kind will work as the expectation filter.
141
148
  # @param [Symbol] alias_name the identifier of an alias
142
149
  # @param [Symbol] kind the identifier of a kind
143
150
  # @return [Boolean] +true+ if the given alias is really an alias
@@ -148,45 +155,49 @@ module I18n
148
155
  kind.nil? ? true : o[:kind] == kind
149
156
  end
150
157
 
151
- # Reads the all the true tokens (not aliases).
158
+ # Reads all the true tokens (not aliases).
152
159
  #
153
160
  # @return [Hash] the true tokens in a
154
161
  # form of Hash (<tt>token => description</tt>)
155
- # @overload get_true_tokens(kind)
156
- # Reads the all the true tokens (not aliases).
162
+ # @overload get_true_tokens
163
+ # Reads all the true tokens (not aliases).
157
164
  # @return [Hash] the true tokens in a
158
165
  # form of Hash (<tt>token => description</tt>)
159
166
  # @overload get_true_tokens(kind)
160
- # Reads the all the true tokens (not aliases).
167
+ # Reads all the true tokens (not aliases) of the given +kind+.
161
168
  # @param [Symbol] kind the identifier of a kind
162
- # @return [Hash] the true tokens of the given kind in a
169
+ # @return [Hash] the true tokens in a
163
170
  # form of Hash (<tt>token => description</tt>)
164
171
  def get_true_tokens(kind=nil)
165
- tokens = @tokens.reject{|k,v| !v[:target].nil?}
166
- tokens = tokens.reject{|k,v| v[:kind]!=kind} unless kind.nil?
167
- tokens.merge(tokens){|k,v| v[:description]}
172
+ t = @lazy_tokens
173
+ t = t.select { |token,data| data[:kind] == kind } unless kind.nil?
174
+ t.select { |token,data| data[:target].nil? }.
175
+ map { |token,data| data[:description] }.
176
+ to_h
168
177
  end
169
178
 
170
- # Reads the all the aliases.
179
+ # Reads all the aliases.
171
180
  #
172
181
  # @return [Hash] the aliases in a
173
182
  # form of Hash (<tt>alias => target</tt>)
174
- # @overload get_aliases(kind)
175
- # Reads the all the aliases.
183
+ # @overload get_aliases
184
+ # Reads all the aliases.
176
185
  # @return [Hash] the aliases in a
177
186
  # form of Hash (<tt>alias => target</tt>)
178
187
  # @overload get_aliases(kind)
179
- # Reads the all the aliases.
188
+ # Reads all the aliases of the given +kind+.
180
189
  # @param [Symbol] kind the identifier of a kind
181
- # @return [Hash] the aliases of the given kind in a
190
+ # @return [Hash] the aliases in a
182
191
  # form of Hash (<tt>alias => target</tt>)
183
192
  def get_aliases(kind=nil)
184
- aliases = @tokens.reject{|k,v| v[:target].nil?}
185
- aliases = aliases.reject{|k,v| v[:kind]!=kind} unless kind.nil?
186
- aliases.merge(aliases){|k,v| v[:target]}
193
+ t = @lazy_tokens
194
+ t = t.select { |token,data| data[:kind] == kind } unless kind.nil?
195
+ t.reject { |token,data| data[:target].nil? }.
196
+ map { |token,data| data[:target] }.
197
+ to_h
187
198
  end
188
199
 
189
- # Reads the all the tokens in a way that it is possible to
200
+ # Reads all the tokens in a way that it is possible to
190
201
  # distinguish true tokens from aliases.
191
202
  #
192
203
  # @note True tokens have descriptions (String) and aliases
@@ -194,55 +205,85 @@ module I18n
194
205
  # @return [Hash] the tokens in a
195
206
  # form of Hash (<tt>token => description|target</tt>)
196
207
  # @overload get_raw_tokens
197
- # Reads the all the tokens.
208
+ # Reads all the tokens in a way that it is possible to
209
+ # distinguish true tokens from aliases.
198
210
  # @return [Hash] the tokens in a
199
211
  # form of Hash (<tt>token => description|target</tt>)
200
212
  # @overload get_raw_tokens(kind)
201
- # Reads the all the tokens.
213
+ # Reads all the tokens of the given +kind+ in a way
214
+ # that it is possible to distinguish true tokens from aliases.
202
215
  # @param [Symbol] kind the identifier of a kind
203
- # @return [Hash] the tokens of the given kind in a
216
+ # @return [Hash] the tokens in a
204
217
  # form of Hash (<tt>token => description|target</tt>)
205
218
  def get_raw_tokens(kind=nil)
206
- get_true_tokens(kind).merge(get_aliases(kind))
219
+ t = @lazy_tokens
220
+ t = t.select { |token,data| data[:kind] == kind } unless kind.nil?
221
+ t.map { |token,data| data[:target] || data[:description] }.
222
+ to_h
207
223
  end
208
224
 
209
- # Reads the all the tokens (including aliases).
225
+ # Reads all the tokens (including aliases).
210
226
  #
211
- # @note Use {get_raw_tokens} if you want to distinguish
227
+ # @note Use {#get_raw_tokens} if you want to distinguish
212
228
  # true tokens from aliases.
213
229
  # @return [Hash] the tokens in a
214
230
  # form of Hash (<tt>token => description</tt>)
215
- # @overload get_raw_tokens(kind)
216
- # Reads the all the tokens (including aliases).
231
+ # @overload get_tokens
232
+ # Reads all the tokens (including aliases).
217
233
  # @return [Hash] the tokens in a
218
234
  # form of Hash (<tt>token => description</tt>)
219
- # @overload get_raw_tokens(kind)
220
- # Reads the all the tokens (including aliases).
235
+ # @overload get_tokens(kind)
236
+ # Reads all the tokens (including aliases) of the
237
+ # given +kind+.
221
238
  # @param [Symbol] kind the identifier of a kind
222
- # @return [Hash] the tokens of the given kind in a
239
+ # @return [Hash] the tokens in a
223
240
  # form of Hash (<tt>token => description</tt>)
224
241
  def get_tokens(kind=nil)
225
- tokens = @tokens
226
- tokens = tokens.reject{|k,v| v[:kind]!=kind} unless kind.nil?
227
- tokens.merge(tokens){|k,v| v[:description]}
242
+ t = @lazy_tokens
243
+ t = t.select { |token,data| data[:kind] == kind } unless kind.nil?
244
+ t.map { |token,data| data[:description] }.
245
+ to_h
228
246
  end
229
247
 
230
248
  # Gets a target token for the alias.
231
249
  #
232
- # @param [Symbol] alias_name the identifier of an alias
233
250
  # @return [Symbol,nil] the token that the given alias points to
234
251
  # or +nil+ if it isn't really an alias
235
- def get_target_for_alias(alias_name)
252
+ # @overload get_target_for_alias(alias_name)
253
+ # Gets a target token for the alias.
254
+ # @param [Symbol] alias_name the identifier of an alias
255
+ # @return [Symbol,nil] the token that the given alias points to
256
+ # or +nil+ if it isn't really an alias
257
+ # @overload get_target_for_alias(alias_name, kind)
258
+ # Gets a target token for the alias that's +kind+ is given.
259
+ # @param [Symbol] alias_name the identifier of an alias
260
+ # @param [Symbol] kind the identifier of a kind
261
+ # @return [Symbol,nil] the token that the given alias points to
262
+ # or +nil+ if it isn't really an alias
263
+ def get_target_for_alias(alias_name, kind=nil)
236
264
  @tokens[alias_name][:target]
237
265
  end
238
266
 
239
267
  # Gets a kind of the given token or alias.
240
268
  #
241
- # @param [Symbol] token identifier of a token
242
269
  # @return [Symbol,nil] the kind of the given +token+
243
270
  # or +nil+ if the token is unknown
244
- def get_kind(token)
245
- @tokens[token][:kind]
271
+ # @overload get_kind(token)
272
+ # Gets a kind of the given token or alias.
273
+ # @param [Symbol] token identifier of a token
274
+ # @return [Symbol,nil] the kind of the given +token+
275
+ # or +nil+ if the token is unknown
276
+ # @overload get_kind(token, kind)
277
+ # Gets a kind of the given token or alias.
278
+ # The kind will work as the expectation filter.
279
+ # @param [Symbol] token identifier of a token
280
+ # @param [Symbol] kind the identifier of a kind
281
+ # @return [Symbol,nil] the kind of the given +token+
282
+ # or +nil+ if the token is unknown
283
+ def get_kind(token, kind=nil)
284
+ k = @tokens[token][:kind]
285
+ return k if (kind.nil? || kind == k)
286
+ nil
246
287
  end
247
288
 
248
289
  # Gets a true token for the given identifier.
@@ -250,19 +291,21 @@ module I18n
250
291
  # @note If the given +token+ is really an alias it will
251
292
  # be resolved and the real token pointed by that alias
252
293
  # will be returned.
294
+ # @return [Symbol,nil] the true token for the given +token+
295
+ # or +nil+
253
296
  # @overload get_true_token(token)
254
- # Gets a true token for the given token identifier.
297
+ # Gets a true token for the given +token+ identifier.
255
298
  # @param [Symbol] token the identifier of a token
256
299
  # @return [Symbol,nil] the true token for the given +token+
257
300
  # or +nil+ if the token is unknown
258
301
  # @overload get_true_token(token, kind)
259
- # Gets a true token for the given token identifier and the
260
- # given kind.
302
+ # Gets a true token for the given +token+ identifier and the
303
+ # given +kind+. The kind will work as the expectation filter.
261
304
  # @param [Symbol] token the identifier of a token
262
305
  # @param [Symbol] kind the identifier of a kind
263
306
  # @return [Symbol,nil] the true token for the given +token+
264
- # or +nil+ if the token is unknown or is not kind of the
265
- # given kind
307
+ # or +nil+ if the token is unknown or is not a kind of the
308
+ # given +kind+
266
309
  def get_true_token(token, kind=nil)
267
310
  o = @tokens[token]
268
311
  k = o[:kind]
@@ -289,38 +332,23 @@ module I18n
289
332
  @defaults[kind]
290
333
  end
291
334
 
292
- # Gets a description of a token or alias.
293
- #
335
+ # Gets a description of a token or an alias.
294
336
  # @note If the token is really an alias it will resolve the alias first.
295
- # @param [Symbol] token the identifier of a token
296
337
  # @return [String,nil] the string containing description of the given
297
338
  # token (which may be an alias) or +nil+ if the token is unknown
298
- def get_description(token)
299
- @tokens[token][:description]
300
- end
301
-
302
- # This method validates default tokens assigned
303
- # for kinds and replaces targets with true tokens
304
- # if they are aliases.
305
- #
306
- # @return [nil,Array<Symbol>] +nil+ if everything went fine,
307
- # two dimensional array containing kind and target
308
- # in case of error while geting a token
309
- def validate_default_tokens
310
- @defaults.each_pair do |kind, pointer|
311
- ttok = get_true_token(pointer)
312
- return [kind, pointer] if ttok.nil?
313
- set_default_token(kind, ttok)
314
- end
315
- return nil
316
- end
317
-
318
- # Test if the inflection data have no elements.
319
- #
320
- # @return [Boolean] +true+ if the inflection data
321
- # have no elements
322
- def empty?
323
- @tokens.empty?
339
+ # @overload get_description(token)
340
+ # Gets a description of a token or an alias.
341
+ # @param [Symbol] token the identifier of a token
342
+ # @return [String,nil] the string containing description of the given
343
+ # token (which may be an alias) or +nil+ if the token is unknown
344
+ # @overload get_description(token, kind)
345
+ # Gets a description of a token or an alias of the given +kind+
346
+ # @param [Symbol] token the identifier of a token
347
+ # @param [Symbol] kind the identifier of a kind
348
+ # @return [String,nil] the string containing description of the given
349
+ # token (which may be an alias) or +nil+ if the token is unknown
350
+ def get_description(token, kind=nil)
351
+ @tokens[token][:description] if (kind.nil? || @tokens[token][:kind] == kind)
324
352
  end
325
353
 
326
354
  end # InflectionData
@@ -0,0 +1,290 @@
1
+ # encoding: utf-8
2
+ #
3
+ # Author:: Paweł Wilk (mailto:pw@gnu.org)
4
+ # Copyright:: (c) 2011 by Paweł Wilk
5
+ # License:: This program is licensed under the terms of {file:LGPL GNU Lesser General Public License} or {file:COPYING Ruby License}.
6
+ #
7
+ # This file contains class that is used to keep
8
+ # inflection data for strict kinds.
9
+
10
+ # @abstract This namespace is shared with I18n subsystem.
11
+ module I18n
12
+ module Inflector
13
+
14
+ # This class contains structures for keeping parsed translation data
15
+ # and basic operations for strict kinds and tokens assigned to them.
16
+ # Methods in this class vary from methods from {I18n::Inflector::InflectionData}
17
+ # in a way that +kind+ argument is usually required, not optional, since
18
+ # managing the strict kinds requires a kind of any token to be always known.
19
+ class InflectionData_Strict
20
+
21
+ # This constant contains a dummy hash for an empty token. It makes
22
+ # chaining calls to internal data easier.
23
+ DUMMY_TOKEN = {:kind=>nil, :target=>nil, :description=>nil}.freeze
24
+
25
+ # This constant contains a dummy hash of hashes for tokens collection.
26
+ # It makes chaining calls to internal data easier.
27
+ DUMMY_TOKENS = Hash.new(DUMMY_TOKEN).freeze
28
+
29
+ # This constant contains a dummy iterator for hash of hashes.
30
+ # It makes chaining calls to internal data easier.
31
+ DUMMY_T_LAZY = LazyHashEnumerator.new(DUMMY_TOKENS).freeze
32
+
33
+ # This constant contains a dummy hash. It makes
34
+ # chaining calls to internal data easier.
35
+ DUMMY_HASH = Hash.new.freeze
36
+
37
+ # Locale that this database works for.
38
+ attr_reader :locale
39
+
40
+ # Initializes internal structures.
41
+ #
42
+ # @param [Symbol,nil] locale the locale identifier for
43
+ # the object to be labeled with
44
+ def initialize(locale=nil)
45
+ @tokens = Hash.new(DUMMY_TOKENS)
46
+ @lazy_tokens = Hash.new(DUMMY_T_LAZY)
47
+ @defaults = Hash.new
48
+ @locale = locale
49
+ end
50
+
51
+ # Adds an alias (overwriting existing alias).
52
+ #
53
+ # @param [Symbol] name the name of an alias
54
+ # @param [Symbol] target the target token for the created alias
55
+ # @param [Symbol] kind the identifier of a kind
56
+ # @return [Boolean] +true+ if everything went ok, +false+ otherwise
57
+ # (in case of bad names or non-existent targets)
58
+ def add_alias(name, target, kind)
59
+ return false if (name.nil? || target.nil? || kind.nil?)
60
+ return false if (name.to_s.empty? || target.to_s.empty? || kind.to_s.empty?)
61
+ name = name.to_sym
62
+ target = target.to_sym
63
+ kind = kind.to_sym
64
+ k = @tokens[kind]
65
+ return false unless k.has_key?(target)
66
+ token = k[name] = {}
67
+ token[:description] = k[target][:description]
68
+ token[:target] = target
69
+ true
70
+ end
71
+
72
+ # Adds a token (overwriting existing token).
73
+ #
74
+ # @param [Symbol] token the name of a token to add
75
+ # @param [Symbol] kind the identifier of a kind
76
+ # @param [String] description the description of a token
77
+ # @return [Boolean] +true+ if everything went ok, +false+ otherwise
78
+ # (in case of bad names)
79
+ def add_token(token, kind, description)
80
+ return false if (token.to_s.empty? || kind.to_s.empty? || description.nil?)
81
+ token = token.to_sym
82
+ kind = kind.to_sym
83
+ kind_tree = @tokens[kind]
84
+ if kind_tree.equal?(DUMMY_TOKENS)
85
+ kind_tree = @tokens[kind] = Hash.new(DUMMY_TOKEN)
86
+ @lazy_tokens[kind] = LazyHashEnumerator.new(kind_tree)
87
+ end
88
+ token = kind_tree[token] = {}
89
+ token[:description] = description.to_s
90
+ true
91
+ end
92
+
93
+ # Sets the default token for the given strict kind.
94
+ #
95
+ # @param [Symbol] kind the kind to which the default
96
+ # token should be assigned
97
+ # @param [Symbol] target the token to set
98
+ # @return [void]
99
+ def set_default_token(kind, target)
100
+ @defaults[kind.to_sym] = target.to_sym
101
+ end
102
+
103
+ # Tests if the given token of the given
104
+ # strict kind is a true token.
105
+ #
106
+ # @param [Symbol] token the identifier of a token
107
+ # @param [Symbol] kind the identifier of a kind
108
+ # @return [Boolean] +true+ if the given +token+ is
109
+ # a token and not an alias, and is a kind of
110
+ # the given kind, +false+ otherwise
111
+ def has_true_token?(token, kind)
112
+ @tokens[kind].has_key?(token) && @tokens[kind][token][:target].nil?
113
+ end
114
+
115
+ # Tests if the given token (or alias) of the
116
+ # given strict kind is present.
117
+ #
118
+ # @param [Symbol] token the identifier of a token
119
+ # @param [Symbol] kind the identifier of a kind
120
+ # @return [Boolean] +true+ if the given +token+
121
+ # (which may be an alias) exists and if kind of
122
+ # the given kind
123
+ def has_token?(token, kind)
124
+ @tokens[kind].has_key?(token)
125
+ end
126
+
127
+ # Tests if a strict kind exists.
128
+ #
129
+ # @param [Symbol] kind the identifier of a kind
130
+ # @return [Boolean] +true+ if the given +kind+ exists
131
+ def has_kind?(kind)
132
+ @tokens.has_key?(kind)
133
+ end
134
+
135
+ # Tests if the given strict kind has a default
136
+ # token assigned.
137
+ #
138
+ # @param [Symbol] kind the identifier of a kind
139
+ # @return [Boolean] +true+ if there is a default
140
+ # token of the given kind
141
+ def has_default_token?(kind)
142
+ @defaults.has_key?(kind)
143
+ end
144
+
145
+ # Tests if the given alias of the given strict
146
+ # kind is really an alias.
147
+ #
148
+ # @param [Symbol] alias_name the identifier of an alias
149
+ # @param [Symbol] kind the identifier of a kind
150
+ # @return [Boolean] +true+ if the given alias is really an alias
151
+ # being a kind of the given kind, +false+ otherwise
152
+ def has_alias?(alias_name, kind)
153
+ not @tokens[kind][alias_name][:target].nil?
154
+ end
155
+
156
+ # Reads all the true tokens (not aliases) of the
157
+ # given strict kind.
158
+ #
159
+ # @param [Symbol] kind the identifier of a kind
160
+ # @return [Hash] the true tokens of the given kind in a
161
+ # form of Hash (<tt>token => description</tt>)
162
+ def get_true_tokens(kind)
163
+ @lazy_tokens[kind].
164
+ reject { |token,data| !data[:target].nil? }.
165
+ map { |token,data| data[:description] }.
166
+ to_h
167
+ end
168
+
169
+ # Reads all the aliases of the given strict kind.
170
+ #
171
+ # @param [Symbol] kind the identifier of a kind
172
+ # @return [Hash] the aliases of the given kind in a
173
+ # form of Hash (<tt>alias => target</tt>)
174
+ def get_aliases(kind)
175
+ @lazy_tokens[kind].
176
+ reject { |token,data| data[:target].nil? }.
177
+ map { |token,data| data[:target] }.
178
+ to_h
179
+ end
180
+
181
+ # Reads all the tokens of the given strict kind
182
+ # in a way that it is possible to
183
+ # distinguish true tokens from aliases.
184
+ #
185
+ # @note True tokens have descriptions (String) and aliases
186
+ # have targets (Symbol) assigned.
187
+ # @param [Symbol] kind the identifier of a kind
188
+ # @return [Hash] the tokens of the given kind in a
189
+ # form of Hash (<tt>token => description|target</tt>)
190
+ def get_raw_tokens(kind)
191
+ @lazy_tokens[kind].
192
+ map { |token,data| data[:target] || data[:description] }.
193
+ to_h
194
+ end
195
+
196
+ # Reads all the tokens (including aliases) of the given
197
+ # strict kind.
198
+ #
199
+ # @note Use {#get_raw_tokens} if you want to distinguish
200
+ # true tokens from aliases.
201
+ # @param [Symbol] kind the identifier of a kind
202
+ # @return [Hash] the tokens of the given kind in a
203
+ # form of Hash (<tt>token => description</tt>)
204
+ def get_tokens(kind)
205
+ @lazy_tokens[kind].map{ |token,data| data[:description] }.to_h
206
+ end
207
+
208
+ # Gets a target token for the given alias of a strict kind.
209
+ #
210
+ # @param [Symbol] alias_name the identifier of an alias
211
+ # @param [Symbol] kind the identifier of a kind
212
+ # @return [Symbol,nil] the token that the given alias points to
213
+ # or +nil+ if it isn't really an alias
214
+ def get_target_for_alias(alias_name, kind)
215
+ @tokens[kind][alias_name][:target]
216
+ end
217
+
218
+ # Gets a strict kind of the given token or alias.
219
+ #
220
+ # @note This method may be concidered dummy since there is a
221
+ # need to give the inflection kind, but it's here in order
222
+ # to preserve compatibility with the same method from
223
+ # {I18n::Inflector::InflectionData} which guesses the kind.
224
+ # @param [Symbol] token identifier of a token
225
+ # @param [Symbol] kind the identifier of a kind (expectations filter)
226
+ # @return [Symbol,nil] the kind of the given +token+
227
+ # or +nil+ if the token is unknown or is not of the given kind
228
+ def get_kind(token, kind)
229
+ @tokens[kind].has_key?(token) ? kind : nil
230
+ end
231
+
232
+ # Gets a true token (of the given strict kind) for the given
233
+ # identifier.
234
+ #
235
+ # @note If the given +token+ is really an alias it will
236
+ # be resolved and the real token pointed by that alias
237
+ # will be returned.
238
+ # @param [Symbol] token the identifier of a token
239
+ # @param [Symbol] kind the identifier of a kind
240
+ # @return [Symbol,nil] the true token for the given +token+
241
+ # or +nil+ if the token is unknown or is not a kind of the
242
+ # given +kind+
243
+ def get_true_token(token, kind)
244
+ o = @tokens[kind]
245
+ return nil unless o.has_key?(token)
246
+ o = o[token]
247
+ o[:target].nil? ? token : o[:target]
248
+ end
249
+
250
+ # Gets all known strict kinds.
251
+ #
252
+ # @return [Array<Symbol>] an array containing all the known strict
253
+ # kinds
254
+ def get_kinds
255
+ @tokens.keys
256
+ end
257
+
258
+ # Reads the default token of a strict kind.
259
+ #
260
+ # @note It will always return true token (not an alias).
261
+ # @param [Symbol] kind the identifier of a kind
262
+ # @return [Symbol,nil] the default token of the given +kind+
263
+ # or +nil+ if there is no default token set
264
+ def get_default_token(kind)
265
+ @defaults[kind]
266
+ end
267
+
268
+ # Gets a description of a token or alias belonging to a strict kind.
269
+ #
270
+ # @note If the token is really an alias it will resolve the alias first.
271
+ # @param [Symbol] token the identifier of a token
272
+ # @param [Symbol] kind the identifier of a kind
273
+ # @return [String,nil] the string containing description of the given
274
+ # token (which may be an alias) or +nil+ if the token is unknown
275
+ def get_description(token, kind)
276
+ @tokens[kind][token][:description]
277
+ end
278
+
279
+ # Test if the inflection data have no elements.
280
+ #
281
+ # @return [Boolean] +true+ if the inflection data
282
+ # have no elements
283
+ def empty?
284
+ @tokens.empty?
285
+ end
286
+
287
+ end # InflectionData_Strict
288
+
289
+ end
290
+ end