ru_propisju 2.0.0 → 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.
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: []