ru_propisju 2.0.0 → 2.1.0

Sign up to get free protection for your applications and to get access to all the features.
data/History.txt CHANGED
@@ -1,3 +1,8 @@
1
+ === 2.1.0 / 2011-12-28
2
+
3
+ * Восстановлен старый API для choose_plural
4
+ * Добавлено исключение UnknownLocale
5
+
1
6
  === 2.0.0 / 2011-11-15
2
7
 
3
8
  * Добавлена поддержка украинского языка - iz65535
data/lib/ru_propisju.rb CHANGED
@@ -6,7 +6,7 @@ $KCODE = 'u' if RUBY_VERSION < '1.9.0'
6
6
  # RuPropisju.rublej(123) # "сто двадцать три рубля"
7
7
  module RuPropisju
8
8
 
9
- VERSION = '2.0.0'
9
+ VERSION = '2.1.0'
10
10
 
11
11
  # http://www.xe.com/symbols.php
12
12
  # (лица, приближенные форексам и всяким там валютам и курсам)
@@ -136,11 +136,17 @@ module RuPropisju
136
136
  # Кидается при запросе неизвестной валюты
137
137
  class UnknownCurrency < ArgumentError
138
138
  end
139
-
139
+
140
+ # Кидается при запросе неизвестного языка
141
+ class UnknownLocale < ArgumentError
142
+ end
143
+
140
144
  # Выбирает нужный падеж существительного в зависимости от числа
141
145
  #
142
146
  # choose_plural(3, "штука", "штуки", "штук") #=> "штуки"
143
- def choose_plural(amount, variants)
147
+ def choose_plural(amount, *variants)
148
+ variants = variants.flatten
149
+
144
150
  mod_ten = amount % 10
145
151
  mod_hundred = amount % 100
146
152
  variant = if (mod_ten == 1 && mod_hundred != 11)
@@ -171,27 +177,27 @@ module RuPropisju
171
177
  #
172
178
  # rublej(345.2) #=> "триста сорок пять рублей 20 копеек"
173
179
  def rublej(amount, locale = :ru)
174
- pts = []
175
- locale_root = TRANSLATIONS[locale.to_s]
176
-
180
+ parts = []
181
+ locale_root = pick_locale(TRANSLATIONS, locale)
182
+
177
183
  integrals = locale_root[:rub_integral]
178
184
  fractions = locale_root[:rub_fraction]
179
185
 
180
- pts << propisju_shtuk(amount.to_i, 1, integrals, locale) unless amount.to_i == 0
186
+ parts << propisju_shtuk(amount.to_i, 1, integrals, locale) unless amount.to_i == 0
181
187
 
182
188
  if amount.kind_of?(Float)
183
189
  remainder = (amount.divmod(1)[1]*100).round
184
190
  if remainder == 100
185
- pts = [propisju_shtuk(amount.to_i+1, 1, integrals, locale)]
191
+ parts = [propisju_shtuk(amount.to_i+1, 1, integrals, locale)]
186
192
  else
187
193
  kop = remainder.to_i
188
194
  unless kop.zero?
189
- pts << kop << choose_plural(kop, fractions)
195
+ parts << kop << choose_plural(kop, fractions)
190
196
  end
191
197
  end
192
198
  end
193
199
 
194
- pts.join(' ')
200
+ parts.join(' ')
195
201
  end
196
202
 
197
203
  # Выбирает корректный вариант числительного в зависимости от рода и числа и оформляет сумму прописью
@@ -210,68 +216,68 @@ module RuPropisju
210
216
  #
211
217
  # griven(32) #=> "тридцать две гривны"
212
218
  def griven(amount, locale = 'ru')
213
- locale_root = TRANSLATIONS[locale.to_s]
214
-
219
+ locale_root = pick_locale(TRANSLATIONS, locale)
220
+
215
221
  integrals = locale_root[:uah_integral]
216
222
  fractions = locale_root[:uah_fraction]
217
223
 
218
- pts = []
219
- pts << propisju_int(amount.to_i, 2, integrals, locale) unless amount.to_i == 0
224
+ parts = []
225
+ parts << propisju_int(amount.to_i, 2, integrals, locale) unless amount.to_i == 0
220
226
  if amount.kind_of? Float
221
227
  remainder = (amount.divmod(1)[1]*100).round
222
228
  if remainder == 100
223
- pts = [propisju_int(amount.to_i + 1, 2, integrals, locale)]
229
+ parts = [propisju_int(amount.to_i + 1, 2, integrals, locale)]
224
230
  else
225
- pts << propisju_int(remainder.to_i, 2, fractions, locale)
231
+ parts << propisju_int(remainder.to_i, 2, fractions, locale)
226
232
  end
227
233
  end
228
- pts.join(' ')
234
+ parts.join(' ')
229
235
  end
230
236
 
231
237
  # Выводит целое или дробное число как сумму в долларах прописью
232
238
  #
233
239
  # dollarov(32) #=> "тридцать два доллара"
234
240
  def dollarov(amount, locale = 'ru')
235
- pts = []
236
- locale_root = TRANSLATIONS[locale.to_s]
237
-
241
+ parts = []
242
+ locale_root = pick_locale(TRANSLATIONS, locale)
243
+
238
244
  integrals = locale_root[:usd_integral]
239
245
  fractions = locale_root[:usd_fraction]
240
246
 
241
- pts << propisju_int(amount.to_i, 1, integrals, locale) unless amount.to_i == 0
247
+ parts << propisju_int(amount.to_i, 1, integrals, locale) unless amount.to_i == 0
242
248
  if amount.kind_of?(Float)
243
249
  remainder = (amount.divmod(1)[1]*100).round
244
250
  if (remainder == 100)
245
- pts = [propisju_int(amount.to_i + 1, 1, integrals, locale)]
251
+ parts = [propisju_int(amount.to_i + 1, 1, integrals, locale)]
246
252
  else
247
- pts << propisju_int(remainder.to_i, 1, fractions, locale)
253
+ parts << propisju_int(remainder.to_i, 1, fractions, locale)
248
254
  end
249
255
  end
250
256
 
251
- pts.join(' ')
257
+ parts.join(' ')
252
258
  end
253
259
 
254
260
  # Выводит целое или дробное число как сумму в евро прописью
255
261
  #
256
262
  # evro(32) #=> "тридцать два евро"
257
263
  def evro(amount, locale = 'ru')
258
- pts = []
259
- locale = locale.to_sym
260
-
261
- integrals = TRANSLATIONS[locale.to_s][:eur_integral]
262
- fractions = TRANSLATIONS[locale.to_s][:eur_fraction]
264
+ parts = []
265
+ locale_data = pick_locale(TRANSLATIONS, locale)
266
+
267
+ integrals = locale_data[:eur_integral]
268
+ fractions = locale_data[:eur_fraction]
263
269
 
264
- pts << propisju_int(amount.to_i, 1, integrals, locale) unless amount.to_i == 0
270
+ parts << propisju_int(amount.to_i, 1, integrals, locale) unless amount.to_i == 0
265
271
  if amount.kind_of?(Float)
266
272
  remainder = (amount.divmod(1)[1]*100).round
267
273
  if (remainder == 100)
268
- pts = [propisju_int(amount.to_i + 1, 1, integrals, locale)]
274
+ parts = [propisju_int(amount.to_i + 1, 1, integrals, locale)]
269
275
  else
270
- pts << propisju_int(remainder.to_i, 1, fractions, locale)
276
+ parts << propisju_int(remainder.to_i, 1, fractions, locale)
271
277
  end
272
278
  end
273
279
 
274
- pts.join(' ')
280
+ parts.join(' ')
275
281
  end
276
282
 
277
283
  # Выводит сумму прописью в рублях по количеству копеек
@@ -300,8 +306,8 @@ module RuPropisju
300
306
  # ранее интерфейс был похож на интерфейс внешний (one_item, two_items, five_items),
301
307
  # однако списковая форма строк выглядит предпочтительнее, поэтому интерфейс изменен.
302
308
  # по хорошему надо менять также внешний интерфейс, но это может сломать совместимость
303
- def compose_ordinal(into, remaining_amount, gender, item_forms=[], locale = :ru)
304
- locale = locale.to_sym
309
+ def compose_ordinal(into, remaining_amount, gender, item_forms = [], locale = :ru)
310
+ locale = locale.to_s
305
311
 
306
312
  rest, rest1, chosen_ordinal, ones, tens, hundreds = [nil]*6
307
313
  #
@@ -313,7 +319,7 @@ module RuPropisju
313
319
  return [into, remaining_amount]
314
320
  end
315
321
 
316
- locale_root = TRANSLATIONS[locale.to_s]
322
+ locale_root = pick_locale(TRANSLATIONS, locale)
317
323
  # начинаем подсчет с Rest
318
324
  # сотни
319
325
  hundreds = locale_root[(rest / 100).to_i * 100]
@@ -347,7 +353,7 @@ module RuPropisju
347
353
  end
348
354
 
349
355
  DECIMALS = {
350
- :ru =>{
356
+ 'ru' =>{
351
357
  :source_words => [
352
358
  'целая',
353
359
  'десятая',
@@ -365,7 +371,7 @@ module RuPropisju
365
371
  ],
366
372
  :prefix => ["ая", 'ых'],
367
373
  },
368
- :ua => {
374
+ 'ua' => {
369
375
  :source_words => [
370
376
  'ціла',
371
377
  'десята',
@@ -395,8 +401,8 @@ module RuPropisju
395
401
  # Выдает сумму прописью с учетом дробной доли. Дробная доля округляется до миллионной, или (если
396
402
  # дробная доля оканчивается на нули) до ближайшей доли ( 500 тысячных округляется до 5 десятых).
397
403
  # Дополнительный аргумент - род существительного (1 - мужской, 2- женский, 3-средний)
398
- def propisju_float(num, locale = :ru)
399
- locale_root = DECIMALS[locale.to_sym]
404
+ def propisju_float(num, locale = 'ru')
405
+ locale_root = pick_locale(DECIMALS, locale)
400
406
  source_expression = locale_root[:prefix][0]
401
407
  target_prefix = locale_root[:prefix][1]
402
408
  words = locale_root[:source_words].map do |e|
@@ -431,7 +437,7 @@ module RuPropisju
431
437
  # propisju(42, 1, "сволочь", "сволочи", "сволочей") # => "сорок две сволочи"
432
438
  def propisju_int(amount, gender = 1, item_forms = [], locale = :ru)
433
439
 
434
- locale_root = TRANSLATIONS[locale.to_s]
440
+ locale_root = pick_locale(TRANSLATIONS, locale)
435
441
 
436
442
  return locale_root['0'] + ' ' + item_forms[2] if amount.zero?
437
443
 
@@ -452,7 +458,12 @@ module RuPropisju
452
458
  end
453
459
 
454
460
  end
455
-
461
+
462
+ def pick_locale(from_hash, locale)
463
+ return from_hash[locale.to_s] if from_hash.has_key?(locale.to_s)
464
+ raise UnknownLocale, "Unknown locale #{locale.inspect}"
465
+ end
466
+
456
467
  alias_method :rublja, :rublej
457
468
  alias_method :rubl, :rublej
458
469
 
@@ -467,5 +478,5 @@ module RuPropisju
467
478
 
468
479
  public_instance_methods(true).map{|m| module_function(m) }
469
480
 
470
- module_function :propisju_int, :propisju_float, :compose_ordinal
481
+ module_function :propisju_int, :propisju_float, :compose_ordinal, :pick_locale
471
482
  end
data/ru_propisju.gemspec CHANGED
@@ -5,11 +5,11 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = "ru_propisju"
8
- s.version = "2.0.0"
8
+ s.version = "2.1.0"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["Julik Tarkhanov"]
12
- s.date = "2011-12-19"
12
+ s.date = "2011-12-28"
13
13
  s.email = "me@julik.nl"
14
14
  s.extra_rdoc_files = [
15
15
  "README.rdoc"
@@ -92,17 +92,23 @@ class TestRuPropisju < Test::Unit::TestCase
92
92
  assert_equal "триста сорок одна ціла двісті сорок п'ять тисячних", RuPropisju.propisju(341.245, 1, :ua)
93
93
  assert_equal "двісті три цілих сорок одна сота", RuPropisju.propisju(203.41, 1, :ua)
94
94
  assert_equal "чотиреста сорок дві цілих п'ять десятих", RuPropisju.propisju(442.50000, 1, :ua)
95
-
95
+
96
+ # unknown locale
97
+ assert_raise(RuPropisju::UnknownLocale) do
98
+ assert_equal "чотиреста сорок дві цілих п'ять десятих", RuPropisju.propisju(442.50000, 1, :kg)
99
+ end
96
100
  end
97
-
101
+
98
102
  def test_choose_plural
99
103
  assert_equal "чемодана", RuPropisju.choose_plural(523, ["чемодан", "чемодана", "чемоданов"])
100
104
  assert_equal "партий", RuPropisju.choose_plural(6727, ["партия", "партии", "партий"])
101
105
  assert_equal "козлов", RuPropisju.choose_plural(45, ["козел", "козла", "козлов"])
102
106
  assert_equal "колес", RuPropisju.choose_plural(260, ["колесо", "колеса", "колес"])
103
-
107
+
108
+ # splat args
109
+ assert_equal "колес", RuPropisju.choose_plural(260, "колесо", "колеса", "колес")
110
+
104
111
  # ua locale
105
-
106
112
  assert_equal "валізи", RuPropisju.choose_plural(523, ["валіза", "валізи", "валіз"])
107
113
  assert_equal "партій", RuPropisju.choose_plural(6727, ["партія", "партії", "партій"])
108
114
  assert_equal "козлів", RuPropisju.choose_plural(45, ["козел", "козла", "козлів"])
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ru_propisju
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.0.0
4
+ version: 2.1.0
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,11 +9,11 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2011-12-19 00:00:00.000000000 Z
12
+ date: 2011-12-28 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: jeweler
16
- requirement: &10698430 !ruby/object:Gem::Requirement
16
+ requirement: &10722980 !ruby/object:Gem::Requirement
17
17
  none: false
18
18
  requirements:
19
19
  - - ! '>='
@@ -21,10 +21,10 @@ dependencies:
21
21
  version: '0'
22
22
  type: :development
23
23
  prerelease: false
24
- version_requirements: *10698430
24
+ version_requirements: *10722980
25
25
  - !ruby/object:Gem::Dependency
26
26
  name: rake
27
- requirement: &10698180 !ruby/object:Gem::Requirement
27
+ requirement: &10722720 !ruby/object:Gem::Requirement
28
28
  none: false
29
29
  requirements:
30
30
  - - ! '>='
@@ -32,7 +32,7 @@ dependencies:
32
32
  version: '0'
33
33
  type: :development
34
34
  prerelease: false
35
- version_requirements: *10698180
35
+ version_requirements: *10722720
36
36
  description:
37
37
  email: me@julik.nl
38
38
  executables: []