twitter_cldr 3.0.0.beta1 → 3.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (698) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile +16 -2
  3. data/History.txt +9 -1
  4. data/README.md +297 -113
  5. data/Rakefile +97 -17
  6. data/lib/twitter_cldr/collation/collator.rb +12 -3
  7. data/lib/twitter_cldr/collation/trie_builder.rb +1 -1
  8. data/lib/twitter_cldr/{tokenizers/calendars → data_readers}/additional_date_format_selector.rb +6 -4
  9. data/lib/twitter_cldr/data_readers/calendar_data_reader.rb +91 -0
  10. data/lib/twitter_cldr/data_readers/data_reader.rb +32 -0
  11. data/lib/twitter_cldr/data_readers/date_data_reader.rb +26 -0
  12. data/lib/twitter_cldr/data_readers/date_time_data_reader.rb +41 -0
  13. data/lib/twitter_cldr/data_readers/number_data_reader.rb +142 -0
  14. data/lib/twitter_cldr/data_readers/time_data_reader.rb +26 -0
  15. data/lib/twitter_cldr/data_readers/timespan_data_reader.rb +122 -0
  16. data/lib/twitter_cldr/data_readers.rb +17 -0
  17. data/lib/twitter_cldr/formatters/calendars/{datetime_formatter.rb → date_time_formatter.rb} +27 -42
  18. data/lib/twitter_cldr/formatters/calendars/timespan_formatter.rb +3 -64
  19. data/lib/twitter_cldr/formatters/formatter.rb +39 -0
  20. data/lib/twitter_cldr/formatters/list_formatter.rb +22 -12
  21. data/lib/twitter_cldr/formatters/numbers/abbreviated/abbreviated_number_formatter.rb +5 -26
  22. data/lib/twitter_cldr/formatters/numbers/currency_formatter.rb +2 -11
  23. data/lib/twitter_cldr/formatters/numbers/decimal_formatter.rb +4 -2
  24. data/lib/twitter_cldr/formatters/numbers/number_formatter.rb +45 -27
  25. data/lib/twitter_cldr/formatters/numbers/percent_formatter.rb +3 -13
  26. data/lib/twitter_cldr/formatters/numbers/rbnf/formatters.rb +224 -0
  27. data/lib/twitter_cldr/formatters/numbers/rbnf/post_processors/chinese.rb +122 -0
  28. data/lib/twitter_cldr/formatters/numbers/rbnf/rule.rb +93 -0
  29. data/lib/twitter_cldr/formatters/numbers/rbnf/rule_group.rb +20 -0
  30. data/lib/twitter_cldr/formatters/numbers/rbnf/rule_parser.rb +86 -0
  31. data/lib/twitter_cldr/formatters/numbers/rbnf/rule_set.rb +259 -0
  32. data/lib/twitter_cldr/formatters/numbers/rbnf/substitution.rb +30 -0
  33. data/lib/twitter_cldr/formatters/numbers/rbnf.rb +127 -0
  34. data/lib/twitter_cldr/formatters/plurals/plural_formatter.rb +18 -6
  35. data/lib/twitter_cldr/formatters.rb +4 -5
  36. data/lib/twitter_cldr/localized/localized_array.rb +1 -1
  37. data/lib/twitter_cldr/localized/localized_date.rb +6 -3
  38. data/lib/twitter_cldr/localized/localized_datetime.rb +38 -15
  39. data/lib/twitter_cldr/localized/localized_number.rb +40 -24
  40. data/lib/twitter_cldr/localized/localized_object.rb +4 -4
  41. data/lib/twitter_cldr/localized/localized_string.rb +40 -7
  42. data/lib/twitter_cldr/localized/localized_time.rb +9 -2
  43. data/lib/twitter_cldr/localized/localized_timespan.rb +50 -5
  44. data/lib/twitter_cldr/normalization.rb +8 -19
  45. data/lib/twitter_cldr/parsers/parser.rb +50 -0
  46. data/lib/twitter_cldr/parsers/segmentation_parser.rb +137 -0
  47. data/lib/twitter_cldr/parsers/symbol_table.rb +30 -0
  48. data/lib/twitter_cldr/parsers/unicode_regex/character_class.rb +91 -0
  49. data/lib/twitter_cldr/parsers/unicode_regex/character_range.rb +39 -0
  50. data/lib/twitter_cldr/parsers/unicode_regex/character_set.rb +65 -0
  51. data/lib/twitter_cldr/parsers/unicode_regex/component.rb +50 -0
  52. data/lib/twitter_cldr/parsers/unicode_regex/literal.rb +83 -0
  53. data/lib/twitter_cldr/parsers/unicode_regex/unicode_string.rb +41 -0
  54. data/lib/twitter_cldr/parsers/unicode_regex_parser.rb +262 -0
  55. data/lib/twitter_cldr/parsers.rb +5 -1
  56. data/lib/twitter_cldr/resources/casefolder.rb.erb +64 -0
  57. data/lib/twitter_cldr/resources/casefolder_class_generator.rb +75 -0
  58. data/lib/twitter_cldr/resources/download.rb +10 -4
  59. data/lib/twitter_cldr/resources/icu_based_importer.rb +18 -0
  60. data/lib/twitter_cldr/resources/locales_resources_importer.rb +24 -13
  61. data/lib/twitter_cldr/resources/normalization_quick_check_importer.rb +1 -14
  62. data/lib/twitter_cldr/resources/rbnf_test_importer.rb +107 -0
  63. data/lib/twitter_cldr/resources/readme_renderer.rb +115 -0
  64. data/lib/twitter_cldr/resources/tailoring_importer.rb +2 -8
  65. data/lib/twitter_cldr/resources/uli/segment_exceptions_importer.rb +62 -0
  66. data/lib/twitter_cldr/resources/uli.rb +12 -0
  67. data/lib/twitter_cldr/resources/unicode_data_importer.rb +84 -14
  68. data/lib/twitter_cldr/resources/unicode_importer.rb +37 -0
  69. data/lib/twitter_cldr/resources/unicode_properties_importer.rb +79 -0
  70. data/lib/twitter_cldr/resources.rb +8 -1
  71. data/lib/twitter_cldr/shared/break_iterator.rb +213 -0
  72. data/lib/twitter_cldr/shared/calendar.rb +38 -14
  73. data/lib/twitter_cldr/shared/casefolder.rb +210 -0
  74. data/lib/twitter_cldr/shared/code_point.rb +103 -16
  75. data/lib/twitter_cldr/shared/numbering_system.rb +58 -0
  76. data/lib/twitter_cldr/shared/territories.rb +43 -1
  77. data/lib/twitter_cldr/shared/unicode_regex.rb +81 -0
  78. data/lib/twitter_cldr/shared.rb +13 -9
  79. data/lib/twitter_cldr/tokenizers/calendars/date_time_tokenizer.rb +77 -0
  80. data/lib/twitter_cldr/tokenizers/calendars/date_tokenizer.rb +14 -29
  81. data/lib/twitter_cldr/tokenizers/calendars/time_tokenizer.rb +13 -28
  82. data/lib/twitter_cldr/tokenizers/calendars/timespan_tokenizer.rb +11 -87
  83. data/lib/twitter_cldr/tokenizers/numbers/number_tokenizer.rb +16 -71
  84. data/lib/twitter_cldr/tokenizers/numbers/rbnf_tokenizer.rb +53 -0
  85. data/lib/twitter_cldr/tokenizers/pattern_tokenizer.rb +42 -0
  86. data/lib/twitter_cldr/tokenizers/segmentation/segmentation_tokenizer.rb +39 -0
  87. data/lib/twitter_cldr/tokenizers/tokenizer.rb +116 -0
  88. data/lib/twitter_cldr/tokenizers/unicode_regex/unicode_regex_tokenizer.rb +52 -0
  89. data/lib/twitter_cldr/tokenizers.rb +8 -4
  90. data/lib/twitter_cldr/utils/code_points.rb +1 -1
  91. data/lib/twitter_cldr/utils/range_set.rb +242 -0
  92. data/lib/twitter_cldr/utils/yaml.rb +17 -12
  93. data/lib/twitter_cldr/utils.rb +1 -1
  94. data/lib/twitter_cldr/version.rb +1 -1
  95. data/lib/twitter_cldr.rb +2 -1
  96. data/resources/custom/locales/sv/units.yml +8 -0
  97. data/resources/locales/af/calendars.yml +278 -224
  98. data/resources/locales/af/currencies.yml +954 -916
  99. data/resources/locales/af/languages.yml +583 -580
  100. data/resources/locales/af/layout.yml +5 -5
  101. data/resources/locales/af/lists.yml +23 -7
  102. data/resources/locales/af/numbers.yml +59 -54
  103. data/resources/locales/af/plurals.yml +2 -2
  104. data/resources/locales/af/rbnf.yml +261 -0
  105. data/resources/locales/af/territories.yml +264 -263
  106. data/resources/locales/ar/calendars.yml +287 -259
  107. data/resources/locales/ar/currencies.yml +1730 -1692
  108. data/resources/locales/ar/languages.yml +583 -580
  109. data/resources/locales/ar/layout.yml +5 -5
  110. data/resources/locales/ar/lists.yml +23 -7
  111. data/resources/locales/ar/numbers.yml +66 -61
  112. data/resources/locales/ar/plurals.yml +5 -8
  113. data/resources/locales/ar/rbnf.yml +519 -0
  114. data/resources/locales/ar/territories.yml +264 -263
  115. data/resources/locales/be/calendars.yml +238 -237
  116. data/resources/locales/be/currencies.yml +954 -917
  117. data/resources/locales/be/languages.yml +583 -580
  118. data/resources/locales/be/layout.yml +5 -5
  119. data/resources/locales/be/lists.yml +23 -7
  120. data/resources/locales/be/numbers.yml +62 -57
  121. data/resources/locales/be/plurals.yml +7 -4
  122. data/resources/locales/be/rbnf.yml +1288 -0
  123. data/resources/locales/be/territories.yml +264 -263
  124. data/resources/locales/bg/calendars.yml +278 -218
  125. data/resources/locales/bg/currencies.yml +955 -917
  126. data/resources/locales/bg/languages.yml +583 -580
  127. data/resources/locales/bg/layout.yml +5 -5
  128. data/resources/locales/bg/lists.yml +23 -7
  129. data/resources/locales/bg/numbers.yml +62 -57
  130. data/resources/locales/bg/plurals.yml +2 -2
  131. data/resources/locales/bg/rbnf.yml +280 -0
  132. data/resources/locales/bg/territories.yml +264 -263
  133. data/resources/locales/bn/calendars.yml +287 -225
  134. data/resources/locales/bn/currencies.yml +953 -916
  135. data/resources/locales/bn/languages.yml +583 -580
  136. data/resources/locales/bn/layout.yml +5 -5
  137. data/resources/locales/bn/lists.yml +23 -7
  138. data/resources/locales/bn/numbers.yml +62 -57
  139. data/resources/locales/bn/plurals.yml +2 -2
  140. data/resources/locales/bn/rbnf.yml +4 -0
  141. data/resources/locales/bn/territories.yml +264 -263
  142. data/resources/locales/ca/calendars.yml +278 -278
  143. data/resources/locales/ca/currencies.yml +953 -916
  144. data/resources/locales/ca/languages.yml +583 -580
  145. data/resources/locales/ca/layout.yml +5 -5
  146. data/resources/locales/ca/lists.yml +23 -7
  147. data/resources/locales/ca/numbers.yml +62 -57
  148. data/resources/locales/ca/plurals.yml +3 -2
  149. data/resources/locales/ca/rbnf.yml +756 -0
  150. data/resources/locales/ca/territories.yml +264 -263
  151. data/resources/locales/cs/calendars.yml +269 -262
  152. data/resources/locales/cs/currencies.yml +1483 -1172
  153. data/resources/locales/cs/languages.yml +583 -580
  154. data/resources/locales/cs/layout.yml +5 -5
  155. data/resources/locales/cs/lists.yml +23 -7
  156. data/resources/locales/cs/numbers.yml +64 -58
  157. data/resources/locales/cs/plurals.yml +6 -2
  158. data/resources/locales/cs/rbnf.yml +367 -0
  159. data/resources/locales/cs/territories.yml +264 -263
  160. data/resources/locales/cy/calendars.yml +275 -274
  161. data/resources/locales/cy/currencies.yml +1585 -1548
  162. data/resources/locales/cy/languages.yml +583 -580
  163. data/resources/locales/cy/layout.yml +5 -5
  164. data/resources/locales/cy/lists.yml +23 -7
  165. data/resources/locales/cy/numbers.yml +66 -61
  166. data/resources/locales/cy/plurals.yml +4 -3
  167. data/resources/locales/cy/rbnf.yml +298 -0
  168. data/resources/locales/cy/territories.yml +264 -263
  169. data/resources/locales/da/calendars.yml +281 -280
  170. data/resources/locales/da/currencies.yml +954 -916
  171. data/resources/locales/da/languages.yml +583 -580
  172. data/resources/locales/da/layout.yml +5 -5
  173. data/resources/locales/da/lists.yml +23 -7
  174. data/resources/locales/da/numbers.yml +62 -57
  175. data/resources/locales/da/plurals.yml +3 -2
  176. data/resources/locales/da/rbnf.yml +194 -0
  177. data/resources/locales/da/territories.yml +264 -263
  178. data/resources/locales/de/calendars.yml +294 -293
  179. data/resources/locales/de/currencies.yml +954 -916
  180. data/resources/locales/de/languages.yml +583 -580
  181. data/resources/locales/de/layout.yml +5 -5
  182. data/resources/locales/de/lists.yml +23 -7
  183. data/resources/locales/de/numbers.yml +62 -57
  184. data/resources/locales/de/plurals.yml +3 -2
  185. data/resources/locales/de/rbnf.yml +346 -0
  186. data/resources/locales/de/territories.yml +264 -263
  187. data/resources/locales/el/calendars.yml +279 -282
  188. data/resources/locales/el/currencies.yml +954 -916
  189. data/resources/locales/el/languages.yml +583 -580
  190. data/resources/locales/el/layout.yml +5 -5
  191. data/resources/locales/el/lists.yml +23 -7
  192. data/resources/locales/el/numbers.yml +62 -57
  193. data/resources/locales/el/plurals.yml +2 -2
  194. data/resources/locales/el/rbnf.yml +880 -0
  195. data/resources/locales/el/territories.yml +264 -263
  196. data/resources/locales/en/calendars.yml +192 -191
  197. data/resources/locales/en/currencies.yml +953 -915
  198. data/resources/locales/en/languages.yml +583 -580
  199. data/resources/locales/en/layout.yml +5 -5
  200. data/resources/locales/en/lists.yml +23 -7
  201. data/resources/locales/en/numbers.yml +62 -57
  202. data/resources/locales/en/plurals.yml +3 -2
  203. data/resources/locales/en/rbnf.yml +542 -0
  204. data/resources/locales/en/territories.yml +264 -263
  205. data/resources/locales/en-GB/calendars.yml +195 -194
  206. data/resources/locales/en-GB/currencies.yml +953 -915
  207. data/resources/locales/en-GB/languages.yml +583 -580
  208. data/resources/locales/en-GB/layout.yml +5 -5
  209. data/resources/locales/en-GB/lists.yml +23 -7
  210. data/resources/locales/en-GB/numbers.yml +62 -57
  211. data/resources/locales/en-GB/plurals.yml +2 -1
  212. data/resources/locales/en-GB/rbnf.yml +4 -0
  213. data/resources/locales/en-GB/territories.yml +264 -263
  214. data/resources/locales/es/calendars.yml +288 -238
  215. data/resources/locales/es/currencies.yml +953 -922
  216. data/resources/locales/es/languages.yml +583 -580
  217. data/resources/locales/es/layout.yml +5 -5
  218. data/resources/locales/es/lists.yml +23 -7
  219. data/resources/locales/es/numbers.yml +62 -57
  220. data/resources/locales/es/plurals.yml +2 -2
  221. data/resources/locales/es/rbnf.yml +913 -0
  222. data/resources/locales/es/territories.yml +264 -263
  223. data/resources/locales/eu/calendars.yml +277 -218
  224. data/resources/locales/eu/currencies.yml +953 -916
  225. data/resources/locales/eu/languages.yml +583 -580
  226. data/resources/locales/eu/layout.yml +5 -5
  227. data/resources/locales/eu/lists.yml +23 -7
  228. data/resources/locales/eu/numbers.yml +56 -51
  229. data/resources/locales/eu/plurals.yml +2 -2
  230. data/resources/locales/eu/rbnf.yml +4 -0
  231. data/resources/locales/eu/territories.yml +264 -263
  232. data/resources/locales/fa/calendars.yml +294 -293
  233. data/resources/locales/fa/currencies.yml +955 -916
  234. data/resources/locales/fa/languages.yml +583 -580
  235. data/resources/locales/fa/layout.yml +5 -5
  236. data/resources/locales/fa/lists.yml +23 -7
  237. data/resources/locales/fa/numbers.yml +62 -57
  238. data/resources/locales/fa/plurals.yml +2 -2
  239. data/resources/locales/fa/rbnf.yml +157 -0
  240. data/resources/locales/fa/territories.yml +264 -263
  241. data/resources/locales/fi/calendars.yml +284 -283
  242. data/resources/locales/fi/currencies.yml +953 -915
  243. data/resources/locales/fi/languages.yml +583 -580
  244. data/resources/locales/fi/layout.yml +5 -5
  245. data/resources/locales/fi/lists.yml +23 -7
  246. data/resources/locales/fi/numbers.yml +62 -57
  247. data/resources/locales/fi/plurals.yml +3 -2
  248. data/resources/locales/fi/rbnf.yml +206 -0
  249. data/resources/locales/fi/territories.yml +264 -263
  250. data/resources/locales/fil/calendars.yml +281 -230
  251. data/resources/locales/fil/currencies.yml +953 -916
  252. data/resources/locales/fil/languages.yml +583 -580
  253. data/resources/locales/fil/layout.yml +5 -5
  254. data/resources/locales/fil/lists.yml +23 -7
  255. data/resources/locales/fil/numbers.yml +62 -57
  256. data/resources/locales/fil/plurals.yml +3 -2
  257. data/resources/locales/fil/rbnf.yml +158 -0
  258. data/resources/locales/fil/territories.yml +264 -263
  259. data/resources/locales/fr/calendars.yml +297 -296
  260. data/resources/locales/fr/currencies.yml +968 -949
  261. data/resources/locales/fr/languages.yml +583 -580
  262. data/resources/locales/fr/layout.yml +5 -5
  263. data/resources/locales/fr/lists.yml +23 -7
  264. data/resources/locales/fr/numbers.yml +62 -57
  265. data/resources/locales/fr/plurals.yml +2 -2
  266. data/resources/locales/fr/rbnf.yml +621 -0
  267. data/resources/locales/fr/territories.yml +264 -263
  268. data/resources/locales/ga/calendars.yml +192 -191
  269. data/resources/locales/ga/currencies.yml +954 -916
  270. data/resources/locales/ga/languages.yml +583 -580
  271. data/resources/locales/ga/layout.yml +5 -5
  272. data/resources/locales/ga/lists.yml +23 -7
  273. data/resources/locales/ga/numbers.yml +62 -57
  274. data/resources/locales/ga/plurals.yml +4 -3
  275. data/resources/locales/ga/rbnf.yml +615 -0
  276. data/resources/locales/ga/territories.yml +264 -263
  277. data/resources/locales/gl/calendars.yml +283 -217
  278. data/resources/locales/gl/currencies.yml +953 -916
  279. data/resources/locales/gl/languages.yml +583 -580
  280. data/resources/locales/gl/layout.yml +5 -5
  281. data/resources/locales/gl/lists.yml +23 -7
  282. data/resources/locales/gl/numbers.yml +62 -57
  283. data/resources/locales/gl/plurals.yml +3 -2
  284. data/resources/locales/gl/rbnf.yml +4 -0
  285. data/resources/locales/gl/territories.yml +264 -263
  286. data/resources/locales/he/calendars.yml +248 -220
  287. data/resources/locales/he/currencies.yml +992 -932
  288. data/resources/locales/he/languages.yml +583 -580
  289. data/resources/locales/he/layout.yml +5 -5
  290. data/resources/locales/he/lists.yml +23 -7
  291. data/resources/locales/he/numbers.yml +64 -59
  292. data/resources/locales/he/plurals.yml +6 -3
  293. data/resources/locales/he/rbnf.yml +1029 -0
  294. data/resources/locales/he/territories.yml +264 -263
  295. data/resources/locales/hi/calendars.yml +284 -216
  296. data/resources/locales/hi/currencies.yml +953 -915
  297. data/resources/locales/hi/languages.yml +583 -580
  298. data/resources/locales/hi/layout.yml +5 -5
  299. data/resources/locales/hi/lists.yml +23 -7
  300. data/resources/locales/hi/numbers.yml +60 -55
  301. data/resources/locales/hi/plurals.yml +2 -2
  302. data/resources/locales/hi/rbnf.yml +430 -0
  303. data/resources/locales/hi/territories.yml +264 -263
  304. data/resources/locales/hr/calendars.yml +308 -307
  305. data/resources/locales/hr/currencies.yml +1248 -1504
  306. data/resources/locales/hr/languages.yml +583 -580
  307. data/resources/locales/hr/layout.yml +5 -5
  308. data/resources/locales/hr/lists.yml +23 -7
  309. data/resources/locales/hr/numbers.yml +63 -59
  310. data/resources/locales/hr/plurals.yml +12 -4
  311. data/resources/locales/hr/rbnf.yml +599 -0
  312. data/resources/locales/hr/territories.yml +264 -263
  313. data/resources/locales/hu/calendars.yml +285 -284
  314. data/resources/locales/hu/currencies.yml +954 -916
  315. data/resources/locales/hu/languages.yml +583 -580
  316. data/resources/locales/hu/layout.yml +5 -5
  317. data/resources/locales/hu/lists.yml +23 -7
  318. data/resources/locales/hu/numbers.yml +62 -57
  319. data/resources/locales/hu/plurals.yml +2 -2
  320. data/resources/locales/hu/rbnf.yml +363 -0
  321. data/resources/locales/hu/territories.yml +264 -263
  322. data/resources/locales/id/calendars.yml +276 -275
  323. data/resources/locales/id/currencies.yml +954 -916
  324. data/resources/locales/id/languages.yml +583 -580
  325. data/resources/locales/id/layout.yml +5 -5
  326. data/resources/locales/id/lists.yml +23 -7
  327. data/resources/locales/id/numbers.yml +61 -56
  328. data/resources/locales/id/plurals.yml +2 -2
  329. data/resources/locales/id/rbnf.yml +121 -0
  330. data/resources/locales/id/territories.yml +264 -263
  331. data/resources/locales/is/calendars.yml +281 -242
  332. data/resources/locales/is/currencies.yml +954 -916
  333. data/resources/locales/is/languages.yml +583 -580
  334. data/resources/locales/is/layout.yml +5 -5
  335. data/resources/locales/is/lists.yml +23 -7
  336. data/resources/locales/is/numbers.yml +62 -57
  337. data/resources/locales/is/plurals.yml +5 -2
  338. data/resources/locales/is/rbnf.yml +326 -0
  339. data/resources/locales/is/territories.yml +264 -263
  340. data/resources/locales/it/calendars.yml +275 -260
  341. data/resources/locales/it/currencies.yml +953 -920
  342. data/resources/locales/it/languages.yml +583 -580
  343. data/resources/locales/it/layout.yml +5 -5
  344. data/resources/locales/it/lists.yml +23 -7
  345. data/resources/locales/it/numbers.yml +59 -54
  346. data/resources/locales/it/plurals.yml +3 -2
  347. data/resources/locales/it/rbnf.yml +1189 -0
  348. data/resources/locales/it/territories.yml +264 -263
  349. data/resources/locales/ja/calendars.yml +269 -207
  350. data/resources/locales/ja/currencies.yml +953 -915
  351. data/resources/locales/ja/languages.yml +583 -580
  352. data/resources/locales/ja/layout.yml +5 -5
  353. data/resources/locales/ja/lists.yml +23 -7
  354. data/resources/locales/ja/numbers.yml +62 -57
  355. data/resources/locales/ja/plurals.yml +2 -2
  356. data/resources/locales/ja/rbnf.yml +209 -0
  357. data/resources/locales/ja/territories.yml +264 -263
  358. data/resources/locales/ko/calendars.yml +246 -213
  359. data/resources/locales/ko/currencies.yml +953 -915
  360. data/resources/locales/ko/languages.yml +583 -580
  361. data/resources/locales/ko/layout.yml +5 -5
  362. data/resources/locales/ko/lists.yml +23 -7
  363. data/resources/locales/ko/numbers.yml +60 -55
  364. data/resources/locales/ko/plurals.yml +2 -2
  365. data/resources/locales/ko/rbnf.yml +722 -0
  366. data/resources/locales/ko/territories.yml +264 -263
  367. data/resources/locales/lv/calendars.yml +286 -285
  368. data/resources/locales/lv/currencies.yml +1122 -1084
  369. data/resources/locales/lv/languages.yml +583 -580
  370. data/resources/locales/lv/layout.yml +5 -5
  371. data/resources/locales/lv/lists.yml +23 -7
  372. data/resources/locales/lv/numbers.yml +63 -58
  373. data/resources/locales/lv/plurals.yml +11 -3
  374. data/resources/locales/lv/rbnf.yml +238 -0
  375. data/resources/locales/lv/territories.yml +264 -263
  376. data/resources/locales/ms/calendars.yml +280 -279
  377. data/resources/locales/ms/currencies.yml +954 -916
  378. data/resources/locales/ms/languages.yml +583 -580
  379. data/resources/locales/ms/layout.yml +5 -5
  380. data/resources/locales/ms/lists.yml +23 -7
  381. data/resources/locales/ms/numbers.yml +62 -57
  382. data/resources/locales/ms/plurals.yml +2 -2
  383. data/resources/locales/ms/rbnf.yml +130 -0
  384. data/resources/locales/ms/territories.yml +264 -263
  385. data/resources/locales/nb/calendars.yml +284 -283
  386. data/resources/locales/nb/currencies.yml +958 -916
  387. data/resources/locales/nb/languages.yml +583 -580
  388. data/resources/locales/nb/layout.yml +5 -5
  389. data/resources/locales/nb/lists.yml +23 -7
  390. data/resources/locales/nb/numbers.yml +62 -57
  391. data/resources/locales/nb/plurals.yml +2 -2
  392. data/resources/locales/nb/rbnf.yml +191 -0
  393. data/resources/locales/nb/territories.yml +264 -263
  394. data/resources/locales/nl/calendars.yml +285 -284
  395. data/resources/locales/nl/currencies.yml +953 -917
  396. data/resources/locales/nl/languages.yml +583 -580
  397. data/resources/locales/nl/layout.yml +5 -5
  398. data/resources/locales/nl/lists.yml +23 -7
  399. data/resources/locales/nl/numbers.yml +62 -57
  400. data/resources/locales/nl/plurals.yml +3 -2
  401. data/resources/locales/nl/rbnf.yml +320 -0
  402. data/resources/locales/nl/territories.yml +264 -263
  403. data/resources/locales/pl/calendars.yml +288 -287
  404. data/resources/locales/pl/currencies.yml +1326 -1284
  405. data/resources/locales/pl/languages.yml +583 -580
  406. data/resources/locales/pl/layout.yml +5 -5
  407. data/resources/locales/pl/lists.yml +23 -7
  408. data/resources/locales/pl/numbers.yml +64 -59
  409. data/resources/locales/pl/plurals.yml +11 -4
  410. data/resources/locales/pl/rbnf.yml +410 -0
  411. data/resources/locales/pl/territories.yml +264 -263
  412. data/resources/locales/pt/calendars.yml +290 -289
  413. data/resources/locales/pt/currencies.yml +954 -916
  414. data/resources/locales/pt/languages.yml +583 -580
  415. data/resources/locales/pt/layout.yml +5 -5
  416. data/resources/locales/pt/lists.yml +23 -7
  417. data/resources/locales/pt/numbers.yml +62 -57
  418. data/resources/locales/pt/plurals.yml +4 -2
  419. data/resources/locales/pt/rbnf.yml +586 -0
  420. data/resources/locales/pt/territories.yml +264 -263
  421. data/resources/locales/ro/calendars.yml +284 -283
  422. data/resources/locales/ro/currencies.yml +1170 -1132
  423. data/resources/locales/ro/languages.yml +583 -580
  424. data/resources/locales/ro/layout.yml +5 -5
  425. data/resources/locales/ro/lists.yml +23 -7
  426. data/resources/locales/ro/numbers.yml +63 -58
  427. data/resources/locales/ro/plurals.yml +5 -2
  428. data/resources/locales/ro/rbnf.yml +250 -0
  429. data/resources/locales/ro/territories.yml +264 -263
  430. data/resources/locales/ru/calendars.yml +282 -281
  431. data/resources/locales/ru/currencies.yml +1118 -1247
  432. data/resources/locales/ru/languages.yml +583 -580
  433. data/resources/locales/ru/layout.yml +5 -5
  434. data/resources/locales/ru/lists.yml +23 -7
  435. data/resources/locales/ru/numbers.yml +63 -59
  436. data/resources/locales/ru/plurals.yml +8 -4
  437. data/resources/locales/ru/rbnf.yml +385 -0
  438. data/resources/locales/ru/territories.yml +264 -263
  439. data/resources/locales/sk/calendars.yml +254 -251
  440. data/resources/locales/sk/currencies.yml +1174 -1008
  441. data/resources/locales/sk/languages.yml +583 -580
  442. data/resources/locales/sk/layout.yml +5 -5
  443. data/resources/locales/sk/lists.yml +23 -7
  444. data/resources/locales/sk/numbers.yml +64 -58
  445. data/resources/locales/sk/plurals.yml +6 -2
  446. data/resources/locales/sk/rbnf.yml +304 -0
  447. data/resources/locales/sk/territories.yml +264 -263
  448. data/resources/locales/sq/calendars.yml +283 -206
  449. data/resources/locales/sq/currencies.yml +954 -916
  450. data/resources/locales/sq/languages.yml +583 -580
  451. data/resources/locales/sq/layout.yml +5 -5
  452. data/resources/locales/sq/lists.yml +23 -7
  453. data/resources/locales/sq/numbers.yml +62 -57
  454. data/resources/locales/sq/plurals.yml +2 -2
  455. data/resources/locales/sq/rbnf.yml +181 -0
  456. data/resources/locales/sq/territories.yml +264 -263
  457. data/resources/locales/sr/calendars.yml +290 -289
  458. data/resources/locales/sr/currencies.yml +1251 -1508
  459. data/resources/locales/sr/languages.yml +583 -580
  460. data/resources/locales/sr/layout.yml +5 -5
  461. data/resources/locales/sr/lists.yml +23 -7
  462. data/resources/locales/sr/numbers.yml +62 -58
  463. data/resources/locales/sr/plurals.yml +12 -4
  464. data/resources/locales/sr/rbnf.yml +429 -0
  465. data/resources/locales/sr/territories.yml +264 -263
  466. data/resources/locales/sv/calendars.yml +290 -289
  467. data/resources/locales/sv/currencies.yml +960 -930
  468. data/resources/locales/sv/languages.yml +583 -580
  469. data/resources/locales/sv/layout.yml +5 -5
  470. data/resources/locales/sv/lists.yml +23 -7
  471. data/resources/locales/sv/numbers.yml +63 -58
  472. data/resources/locales/sv/plurals.yml +3 -2
  473. data/resources/locales/sv/rbnf.yml +692 -0
  474. data/resources/locales/sv/territories.yml +264 -263
  475. data/resources/locales/ta/calendars.yml +281 -266
  476. data/resources/locales/ta/currencies.yml +953 -915
  477. data/resources/locales/ta/languages.yml +583 -580
  478. data/resources/locales/ta/layout.yml +5 -5
  479. data/resources/locales/ta/lists.yml +23 -7
  480. data/resources/locales/ta/numbers.yml +62 -57
  481. data/resources/locales/ta/plurals.yml +2 -2
  482. data/resources/locales/ta/rbnf.yml +241 -0
  483. data/resources/locales/ta/territories.yml +264 -263
  484. data/resources/locales/th/calendars.yml +278 -289
  485. data/resources/locales/th/currencies.yml +953 -915
  486. data/resources/locales/th/languages.yml +583 -580
  487. data/resources/locales/th/layout.yml +5 -5
  488. data/resources/locales/th/lists.yml +23 -7
  489. data/resources/locales/th/numbers.yml +62 -57
  490. data/resources/locales/th/plurals.yml +2 -2
  491. data/resources/locales/th/rbnf.yml +119 -0
  492. data/resources/locales/th/territories.yml +264 -263
  493. data/resources/locales/tr/calendars.yml +287 -286
  494. data/resources/locales/tr/currencies.yml +953 -916
  495. data/resources/locales/tr/languages.yml +583 -580
  496. data/resources/locales/tr/layout.yml +5 -5
  497. data/resources/locales/tr/lists.yml +23 -7
  498. data/resources/locales/tr/numbers.yml +61 -56
  499. data/resources/locales/tr/plurals.yml +2 -2
  500. data/resources/locales/tr/rbnf.yml +277 -0
  501. data/resources/locales/tr/territories.yml +264 -263
  502. data/resources/locales/uk/calendars.yml +286 -252
  503. data/resources/locales/uk/currencies.yml +1311 -1070
  504. data/resources/locales/uk/languages.yml +583 -580
  505. data/resources/locales/uk/layout.yml +5 -5
  506. data/resources/locales/uk/lists.yml +23 -7
  507. data/resources/locales/uk/numbers.yml +64 -59
  508. data/resources/locales/uk/plurals.yml +10 -4
  509. data/resources/locales/uk/rbnf.yml +430 -0
  510. data/resources/locales/uk/territories.yml +264 -263
  511. data/resources/locales/ur/calendars.yml +267 -228
  512. data/resources/locales/ur/currencies.yml +954 -916
  513. data/resources/locales/ur/languages.yml +583 -580
  514. data/resources/locales/ur/layout.yml +5 -5
  515. data/resources/locales/ur/lists.yml +23 -7
  516. data/resources/locales/ur/numbers.yml +62 -57
  517. data/resources/locales/ur/plurals.yml +3 -2
  518. data/resources/locales/ur/rbnf.yml +4 -0
  519. data/resources/locales/ur/territories.yml +264 -263
  520. data/resources/locales/vi/calendars.yml +256 -236
  521. data/resources/locales/vi/currencies.yml +953 -915
  522. data/resources/locales/vi/languages.yml +583 -580
  523. data/resources/locales/vi/layout.yml +5 -5
  524. data/resources/locales/vi/lists.yml +23 -7
  525. data/resources/locales/vi/numbers.yml +62 -57
  526. data/resources/locales/vi/plurals.yml +2 -2
  527. data/resources/locales/vi/rbnf.yml +164 -0
  528. data/resources/locales/vi/territories.yml +264 -263
  529. data/resources/locales/zh/calendars.yml +266 -265
  530. data/resources/locales/zh/currencies.yml +953 -915
  531. data/resources/locales/zh/languages.yml +583 -580
  532. data/resources/locales/zh/layout.yml +5 -5
  533. data/resources/locales/zh/lists.yml +23 -7
  534. data/resources/locales/zh/numbers.yml +62 -57
  535. data/resources/locales/zh/plurals.yml +2 -2
  536. data/resources/locales/zh/rbnf.yml +689 -0
  537. data/resources/locales/zh/territories.yml +264 -263
  538. data/resources/locales/zh-Hant/calendars.yml +266 -265
  539. data/resources/locales/zh-Hant/currencies.yml +955 -915
  540. data/resources/locales/zh-Hant/languages.yml +583 -580
  541. data/resources/locales/zh-Hant/layout.yml +5 -5
  542. data/resources/locales/zh-Hant/lists.yml +23 -7
  543. data/resources/locales/zh-Hant/numbers.yml +62 -57
  544. data/resources/locales/zh-Hant/plurals.yml +2 -2
  545. data/resources/locales/zh-Hant/rbnf.yml +647 -0
  546. data/resources/locales/zh-Hant/territories.yml +264 -263
  547. data/resources/shared/currency_digits_and_rounding.yml +67 -64
  548. data/resources/shared/numbering_systems.yml +176 -0
  549. data/resources/shared/rbnf_root.yml +1573 -0
  550. data/resources/shared/segments/segments_root.yml +728 -0
  551. data/resources/shared/segments/tailorings/en.yml +8 -0
  552. data/resources/uli/segments/de.yml +128 -0
  553. data/resources/uli/segments/en.yml +154 -0
  554. data/resources/uli/segments/es.yml +112 -0
  555. data/resources/uli/segments/fr.yml +47 -0
  556. data/resources/uli/segments/it.yml +37 -0
  557. data/resources/uli/segments/pt.yml +173 -0
  558. data/resources/uli/segments/ru.yml +10 -0
  559. data/resources/unicode_data/casefolding.yml +4765 -0
  560. data/resources/unicode_data/indices/bidi_class.yml +4572 -0
  561. data/resources/unicode_data/indices/bidi_mirrored.yml +3087 -0
  562. data/resources/unicode_data/indices/category.yml +10918 -0
  563. data/resources/unicode_data/indices/keys.yml +101 -0
  564. data/resources/unicode_data/properties/line_break.yml +9269 -0
  565. data/resources/unicode_data/properties/sentence_break.yml +8067 -0
  566. data/resources/unicode_data/properties/word_break.yml +3001 -0
  567. data/spec/collation/collation_spec.rb +2 -1
  568. data/spec/collation/collator_spec.rb +4 -3
  569. data/spec/collation/tailoring_spec.rb +2 -2
  570. data/spec/collation/tailoring_tests/he.txt +5 -2
  571. data/spec/{tokenizers/calendars → data_readers}/additional_date_format_selector_spec.rb +13 -13
  572. data/spec/data_readers/date_time_data_reader_spec.rb +26 -0
  573. data/spec/data_readers/number_data_reader_spec.rb +18 -0
  574. data/spec/data_readers/timespan_data_reader.rb +22 -0
  575. data/spec/formatters/calendars/datetime_formatter_spec.rb +18 -22
  576. data/spec/formatters/list_formatter_spec.rb +16 -87
  577. data/spec/formatters/numbers/abbreviated/abbreviated_number_formatter_spec.rb +15 -59
  578. data/spec/formatters/numbers/abbreviated/long_decimal_formatter_spec.rb +32 -17
  579. data/spec/formatters/numbers/abbreviated/short_decimal_formatter_spec.rb +33 -17
  580. data/spec/formatters/numbers/currency_formatter_spec.rb +18 -13
  581. data/spec/formatters/numbers/decimal_formatter_spec.rb +16 -18
  582. data/spec/formatters/numbers/number_formatter_spec.rb +40 -31
  583. data/spec/formatters/numbers/percent_formatter_spec.rb +14 -6
  584. data/spec/formatters/numbers/rbnf/allowed_failures.yml +74 -0
  585. data/spec/formatters/numbers/rbnf/locales/af/rbnf_test.yml +706 -0
  586. data/spec/formatters/numbers/rbnf/locales/ar/rbnf_test.yml +706 -0
  587. data/spec/formatters/numbers/rbnf/locales/be/rbnf_test.yml +1174 -0
  588. data/spec/formatters/numbers/rbnf/locales/bg/rbnf_test.yml +706 -0
  589. data/spec/formatters/numbers/rbnf/locales/bn/rbnf_test.yml +1291 -0
  590. data/spec/formatters/numbers/rbnf/locales/ca/rbnf_test.yml +1174 -0
  591. data/spec/formatters/numbers/rbnf/locales/cs/rbnf_test.yml +823 -0
  592. data/spec/formatters/numbers/rbnf/locales/cy/rbnf_test.yml +940 -0
  593. data/spec/formatters/numbers/rbnf/locales/da/rbnf_test.yml +940 -0
  594. data/spec/formatters/numbers/rbnf/locales/de/rbnf_test.yml +940 -0
  595. data/spec/formatters/numbers/rbnf/locales/el/rbnf_test.yml +1174 -0
  596. data/spec/formatters/numbers/rbnf/locales/en/rbnf_test.yml +1291 -0
  597. data/spec/formatters/numbers/rbnf/locales/en-GB/rbnf_test.yml +1291 -0
  598. data/spec/formatters/numbers/rbnf/locales/es/rbnf_test.yml +1642 -0
  599. data/spec/formatters/numbers/rbnf/locales/eu/rbnf_test.yml +1291 -0
  600. data/spec/formatters/numbers/rbnf/locales/fa/rbnf_test.yml +589 -0
  601. data/spec/formatters/numbers/rbnf/locales/fi/rbnf_test.yml +706 -0
  602. data/spec/formatters/numbers/rbnf/locales/fil/rbnf_test.yml +706 -0
  603. data/spec/formatters/numbers/rbnf/locales/fr/rbnf_test.yml +1408 -0
  604. data/spec/formatters/numbers/rbnf/locales/ga/rbnf_test.yml +940 -0
  605. data/spec/formatters/numbers/rbnf/locales/gl/rbnf_test.yml +1291 -0
  606. data/spec/formatters/numbers/rbnf/locales/he/rbnf_test.yml +1057 -0
  607. data/spec/formatters/numbers/rbnf/locales/hi/rbnf_test.yml +823 -0
  608. data/spec/formatters/numbers/rbnf/locales/hr/rbnf_test.yml +1174 -0
  609. data/spec/formatters/numbers/rbnf/locales/hu/rbnf_test.yml +940 -0
  610. data/spec/formatters/numbers/rbnf/locales/id/rbnf_test.yml +706 -0
  611. data/spec/formatters/numbers/rbnf/locales/is/rbnf_test.yml +823 -0
  612. data/spec/formatters/numbers/rbnf/locales/it/rbnf_test.yml +1174 -0
  613. data/spec/formatters/numbers/rbnf/locales/ja/rbnf_test.yml +823 -0
  614. data/spec/formatters/numbers/rbnf/locales/ko/rbnf_test.yml +1408 -0
  615. data/spec/formatters/numbers/rbnf/locales/lv/rbnf_test.yml +706 -0
  616. data/spec/formatters/numbers/rbnf/locales/ms/rbnf_test.yml +706 -0
  617. data/spec/formatters/numbers/rbnf/locales/nb/rbnf_test.yml +940 -0
  618. data/spec/formatters/numbers/rbnf/locales/nl/rbnf_test.yml +706 -0
  619. data/spec/formatters/numbers/rbnf/locales/pl/rbnf_test.yml +823 -0
  620. data/spec/formatters/numbers/rbnf/locales/pt/rbnf_test.yml +1174 -0
  621. data/spec/formatters/numbers/rbnf/locales/ro/rbnf_test.yml +823 -0
  622. data/spec/formatters/numbers/rbnf/locales/ru/rbnf_test.yml +823 -0
  623. data/spec/formatters/numbers/rbnf/locales/sk/rbnf_test.yml +823 -0
  624. data/spec/formatters/numbers/rbnf/locales/sq/rbnf_test.yml +706 -0
  625. data/spec/formatters/numbers/rbnf/locales/sr/rbnf_test.yml +940 -0
  626. data/spec/formatters/numbers/rbnf/locales/sv/rbnf_test.yml +1876 -0
  627. data/spec/formatters/numbers/rbnf/locales/ta/rbnf_test.yml +706 -0
  628. data/spec/formatters/numbers/rbnf/locales/th/rbnf_test.yml +706 -0
  629. data/spec/formatters/numbers/rbnf/locales/tr/rbnf_test.yml +706 -0
  630. data/spec/formatters/numbers/rbnf/locales/uk/rbnf_test.yml +823 -0
  631. data/spec/formatters/numbers/rbnf/locales/ur/rbnf_test.yml +1291 -0
  632. data/spec/formatters/numbers/rbnf/locales/vi/rbnf_test.yml +706 -0
  633. data/spec/formatters/numbers/rbnf/locales/zh/rbnf_test.yml +940 -0
  634. data/spec/formatters/numbers/rbnf/locales/zh-Hant/rbnf_test.yml +940 -0
  635. data/spec/formatters/numbers/rbnf/rbnf_spec.rb +98 -0
  636. data/spec/formatters/plurals/plural_formatter_spec.rb +4 -4
  637. data/spec/formatters/plurals/rules_spec.rb +5 -5
  638. data/spec/localized/localized_date_spec.rb +1 -1
  639. data/spec/localized/localized_datetime_spec.rb +8 -13
  640. data/spec/localized/localized_number_spec.rb +17 -32
  641. data/spec/localized/localized_object_spec.rb +0 -5
  642. data/spec/localized/localized_string_spec.rb +40 -2
  643. data/spec/localized/localized_time_spec.rb +3 -6
  644. data/spec/localized/localized_timespan_spec.rb +144 -0
  645. data/spec/normalization_spec.rb +12 -12
  646. data/spec/parsers/number_parser_spec.rb +5 -5
  647. data/spec/parsers/parser_spec.rb +60 -0
  648. data/spec/parsers/segmentation_parser_spec.rb +96 -0
  649. data/spec/parsers/symbol_table_spec.rb +32 -0
  650. data/spec/parsers/unicode_regex/character_class_spec.rb +117 -0
  651. data/spec/parsers/unicode_regex/character_range_spec.rb +21 -0
  652. data/spec/parsers/unicode_regex/character_set_spec.rb +36 -0
  653. data/spec/parsers/unicode_regex/literal_spec.rb +34 -0
  654. data/spec/parsers/unicode_regex/unicode_string_spec.rb +22 -0
  655. data/spec/parsers/unicode_regex_parser_spec.rb +86 -0
  656. data/spec/readme_spec.rb +8 -269
  657. data/spec/shared/break_iterator_spec.rb +72 -0
  658. data/spec/shared/calendar_spec.rb +5 -4
  659. data/spec/shared/casefolder_spec.rb +30 -0
  660. data/spec/shared/casefolding.txt +251 -0
  661. data/spec/shared/casefolding_expected.txt +251 -0
  662. data/spec/shared/code_point_spec.rb +44 -14
  663. data/spec/shared/numbering_system_spec.rb +41 -0
  664. data/spec/shared/territories_spec.rb +14 -6
  665. data/spec/shared/unicode_regex_spec.rb +203 -0
  666. data/spec/spec_helper.rb +17 -0
  667. data/spec/tokenizers/calendars/date_tokenizer_spec.rb +26 -30
  668. data/spec/tokenizers/calendars/datetime_tokenizer_spec.rb +11 -90
  669. data/spec/tokenizers/calendars/time_tokenizer_spec.rb +5 -5
  670. data/spec/tokenizers/calendars/timespan_tokenizer_spec.rb +17 -7
  671. data/spec/tokenizers/numbers/number_tokenizer_spec.rb +28 -27
  672. data/spec/tokenizers/segmentation/segmentation_tokenizer_spec.rb +40 -0
  673. data/spec/tokenizers/unicode_regex/unicode_regex_tokenizer_spec.rb +190 -0
  674. data/spec/utils/range_set_spec.rb +171 -0
  675. data/spec/utils/yaml/yaml_spec.rb +62 -51
  676. data/twitter_cldr.gemspec +1 -1
  677. metadata +199 -30
  678. data/lib/twitter_cldr/formatters/base.rb +0 -47
  679. data/lib/twitter_cldr/formatters/calendars/date_formatter.rb +0 -19
  680. data/lib/twitter_cldr/formatters/calendars/time_formatter.rb +0 -19
  681. data/lib/twitter_cldr/normalization/base.rb +0 -37
  682. data/lib/twitter_cldr/normalization/hangul.rb +0 -79
  683. data/lib/twitter_cldr/normalization/nfc.rb +0 -24
  684. data/lib/twitter_cldr/normalization/nfd.rb +0 -26
  685. data/lib/twitter_cldr/normalization/nfkc.rb +0 -114
  686. data/lib/twitter_cldr/normalization/nfkd.rb +0 -120
  687. data/lib/twitter_cldr/normalization/quick_check.rb +0 -41
  688. data/lib/twitter_cldr/tokenizers/base.rb +0 -169
  689. data/lib/twitter_cldr/tokenizers/calendars/datetime_tokenizer.rb +0 -131
  690. data/lib/twitter_cldr/utils/territories.rb +0 -56
  691. data/spec/formatters/base_spec.rb +0 -18
  692. data/spec/formatters/calendars/timespan_formatter_spec.rb +0 -112
  693. data/spec/normalization/NormalizationTestShort.txt +0 -602
  694. data/spec/normalization/base_spec.rb +0 -16
  695. data/spec/normalization/hangul_spec.rb +0 -42
  696. data/spec/normalization/normalization_spec.rb +0 -113
  697. data/spec/tokenizers/base_spec.rb +0 -259
  698. data/spec/utils/territories_spec.rb +0 -16
@@ -6,7 +6,6 @@
6
6
  require 'spec_helper'
7
7
 
8
8
  require 'open-uri'
9
- require 'zip'
10
9
 
11
10
  include TwitterCldr::Collation
12
11
 
@@ -72,6 +71,8 @@ END
72
71
  def prepare_full_test
73
72
  return if File.file?(FULL_COLLATION_TEST_PATH)
74
73
 
74
+ require 'zip'
75
+
75
76
  print ' Downloading CollationAuxillary.zip ... '
76
77
  zip_file = Tempfile.new('CollationAuxillary.zip')
77
78
  zip_file.write(open(FULL_COLLATION_TEST_URL).read)
@@ -84,8 +84,9 @@ describe Collator do
84
84
  let(:collation_elements) { [[39, 5, 5], [41, 5, 5], [43, 5, 5]] }
85
85
 
86
86
  before :each do
87
- mock(TwitterCldr::Normalization::NFD).normalize_code_points(code_points) { code_points }
88
- stub(TwitterCldr::Normalization::Base).combining_class_for { 0 }
87
+ any_instance_of(TwitterCldr::Shared::CodePoint) do |instance|
88
+ stub(instance).combining_class_for { 0 }
89
+ end
89
90
  end
90
91
 
91
92
  it 'returns collation elements for a string' do
@@ -214,7 +215,7 @@ describe Collator do
214
215
  mock(TrieLoader).load_default_trie { TrieBuilder.load_default_trie }
215
216
  mock(TrieLoader).load_tailored_trie.with_any_args { |*args| TrieBuilder.load_tailored_trie(*args) }
216
217
 
217
- stub(TwitterCldr::Normalization::NFD).normalize_code_points { |code_points| code_points }
218
+ stub(TwitterCldr::Normalization).normalize_code_points { |code_points| code_points }
218
219
  end
219
220
 
220
221
  let(:locale) { :some_locale }
@@ -22,7 +22,7 @@ describe 'Unicode collation tailoring' do
22
22
  print "#{locale}\t-\t"
23
23
 
24
24
  lines = File.open(File.join(File.dirname(__FILE__), 'tailoring_tests', "#{locale}.txt")) do |file|
25
- file.lines.map(&:strip)
25
+ file.each_line.map(&:strip)
26
26
  end
27
27
 
28
28
  active_tests = lines.count(&method(:tailoring_test?))
@@ -49,7 +49,7 @@ describe 'Unicode collation tailoring' do
49
49
  else
50
50
  failures_info = "#{failures.size} failures: #{failures.inspect}"
51
51
  puts failures_info
52
- # failures.should(be_empty, "#{locale} - #{failures_info}") # currently breaks build for Hebrew (he). Probably should look into this.
52
+ failures.should(be_empty, "#{locale} - #{failures_info}")
53
53
  end
54
54
  end
55
55
  end
@@ -1,4 +1,7 @@
1
- # Pending: failures identical to ICU.
1
+ # Pending:
2
+ # - Failure on line 53 is caused by script reordering (http://site.icu-project.org/design/collation/script-reordering)
3
+ # that is applied to Hebrew as well as to a few other locales, but is not supported by TwitterCLDR yet.
4
+ # - Other failures are identical to ICU.
2
5
 
3
6
 
4
7
  x‎
@@ -48,7 +51,7 @@ X.
48
51
  x.x
49
52
 
50
53
 
51
- x־x
54
+ // x־x
52
55
 
53
56
 
54
57
  x׳x
@@ -5,7 +5,7 @@
5
5
 
6
6
  require 'spec_helper'
7
7
 
8
- include TwitterCldr::Tokenizers
8
+ include TwitterCldr::DataReaders
9
9
 
10
10
  describe AdditionalDateFormatSelector do
11
11
  let(:selector) do
@@ -90,16 +90,16 @@ describe AdditionalDateFormatSelector do
90
90
 
91
91
  describe "#find_closest" do
92
92
  it "returns an exact match if it exists" do
93
- selector.find_closest("h").should == "h"
94
- selector.find_closest("MMMd").should == "MMMd"
95
- selector.find_closest("Hms").should == "Hms"
96
- selector.find_closest("yQQQQ").should == "yQQQQ"
93
+ selector.find_closest("h").should == selector.pattern_hash[:h]
94
+ selector.find_closest("MMMd").should == selector.pattern_hash[:MMMd]
95
+ selector.find_closest("Hms").should == selector.pattern_hash[:Hms]
96
+ selector.find_closest("yQQQQ").should == selector.pattern_hash[:yQQQQ]
97
97
  end
98
98
 
99
99
  it "returns the next closest match (lowest score) if an exact match can't be found" do
100
- selector.find_closest("MMMMd").should == "MMMd"
101
- selector.find_closest("mHs").should == "Hms"
102
- selector.find_closest("Med").should == "MEd"
100
+ selector.find_closest("MMMMd").should == selector.pattern_hash[:MMMd]
101
+ selector.find_closest("mHs").should == selector.pattern_hash[:Hms]
102
+ selector.find_closest("Med").should == selector.pattern_hash[:MEd]
103
103
  end
104
104
 
105
105
  it "returns nil if an empty pattern is given" do
@@ -121,11 +121,11 @@ describe AdditionalDateFormatSelector do
121
121
  it "returns a list of all available patterns" do
122
122
  patterns = selector.patterns
123
123
  patterns.should be_a(Array)
124
- patterns.should include(:MMMd)
125
- patterns.should include(:yQQQ)
126
- patterns.should include(:yQQQQ)
127
- patterns.should include(:EHms)
128
- patterns.should include(:d)
124
+ patterns.should include("MMMd")
125
+ patterns.should include("yQQQ")
126
+ patterns.should include("yQQQQ")
127
+ patterns.should include("EHms")
128
+ patterns.should include("d")
129
129
  end
130
130
  end
131
131
 
@@ -0,0 +1,26 @@
1
+ # encoding: UTF-8
2
+
3
+ # Copyright 2012 Twitter, Inc
4
+ # http://www.apache.org/licenses/LICENSE-2.0
5
+
6
+ require 'spec_helper'
7
+
8
+ include TwitterCldr::DataReaders
9
+
10
+ describe DateTimeDataReader do
11
+ let(:data_reader) { DateTimeDataReader.new(:es) }
12
+
13
+ describe "#initialize" do
14
+ it "chooses gregorian as the calendar type if none is specified" do
15
+ DateTimeDataReader.new(:es).calendar_type.should == :gregorian
16
+ DateTimeDataReader.new(:es, :calendar_type => :julian).calendar_type.should == :julian
17
+ end
18
+ end
19
+
20
+ describe "#pattern" do
21
+ it "as of CLDR 23, should choose the medium date time path if no other type is specified" do
22
+ mock.proxy(data_reader).path_for(:medium, anything)
23
+ data_reader.pattern
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,18 @@
1
+ # encoding: UTF-8
2
+
3
+ # Copyright 2012 Twitter, Inc
4
+ # http://www.apache.org/licenses/LICENSE-2.0
5
+
6
+ require 'spec_helper'
7
+
8
+ include TwitterCldr::DataReaders
9
+
10
+ describe NumberDataReader do
11
+ let(:data_reader) { NumberDataReader.new(:en) }
12
+
13
+ describe "#get_key_for" do
14
+ it "builds a power-of-ten key based on the number of digits in the input" do
15
+ (3..15).each { |i| data_reader.send(:get_key_for, "1337#{"0" * (i - 3)}").should == 10 ** i }
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,22 @@
1
+ it "should read correct tokens from custom locale" do
2
+ tokenizer = TimespanTokenizer.new(:locale => :sv)
3
+ one_day_ago = tokenizer.tokens(:unit => :day, :direction => :ago, :number => 1, :type => :default)
4
+ one_day_ago[0].should == { :value => "för ", :type => :plaintext }
5
+ one_day_ago[1].should == { :value => "{0}", :type => :placeholder }
6
+ one_day_ago[2].should == { :value => " dag sedan", :type => :plaintext }
7
+
8
+ two_days_ago = tokenizer.tokens(:unit => :day, :direction => :ago, :number => 2, :type => :default)
9
+ two_days_ago[0].should == { :value => "för ", :type => :plaintext }
10
+ two_days_ago[1].should == { :value => "{0}", :type => :placeholder }
11
+ two_days_ago[2].should == { :value => " dagar sedan", :type => :plaintext }
12
+
13
+ one_day_until = tokenizer.tokens(:unit => :day, :direction => :until, :number => 1, :type => :default)
14
+ one_day_until[0].should == { :value => "om ", :type => :plaintext }
15
+ one_day_until[1].should == { :value => "{0}", :type => :placeholder }
16
+ one_day_until[2].should == { :value => " dag", :type => :plaintext }
17
+
18
+ two_days_until = tokenizer.tokens(:unit => :day, :direction => :until, :number => 2, :type => :default)
19
+ two_days_until[0].should == { :value => "om ", :type => :plaintext }
20
+ two_days_until[1].should == { :value => "{0}", :type => :placeholder }
21
+ two_days_until[2].should == { :value => " dagar", :type => :plaintext }
22
+ end
@@ -9,7 +9,8 @@ include TwitterCldr::Formatters
9
9
 
10
10
  describe DateTimeFormatter do
11
11
  before(:each) do
12
- @formatter = DateTimeFormatter.new(:locale => :de)
12
+ data_reader = DateTimeDataReader.new(:de)
13
+ @formatter = DateTimeFormatter.new(data_reader)
13
14
  end
14
15
 
15
16
  describe "#day" do
@@ -394,42 +395,37 @@ describe DateTimeFormatter do
394
395
 
395
396
  describe "#era" do
396
397
  before(:each) do
397
- @formatter = DateTimeFormatter.new(:locale => :en)
398
+ data_reader = DateTimeDataReader.new(:en)
399
+ @formatter = DateTimeFormatter.new(data_reader)
398
400
  end
399
401
 
400
402
  it "test: pattern G" do
401
- @formatter.send(:era, Date.new(2012, 1, 1), 'G', 1).should == "AD"
402
- @formatter.send(:era, Date.new(-1, 1, 1), 'G', 1).should == "BC"
403
+ @formatter.send(:era, Date.new(2012, 1, 1), 'G', 1).should == "CE"
404
+ @formatter.send(:era, Date.new(-1, 1, 1), 'G', 1).should == "BCE"
403
405
  end
404
406
 
405
407
  it "test: pattern GG" do
406
- @formatter.send(:era, Date.new(2012, 1, 1), 'GG', 2).should == "AD"
407
- @formatter.send(:era, Date.new(-1, 1, 1), 'GG', 2).should == "BC"
408
+ @formatter.send(:era, Date.new(2012, 1, 1), 'GG', 2).should == "CE"
409
+ @formatter.send(:era, Date.new(-1, 1, 1), 'GG', 2).should == "BCE"
408
410
  end
409
411
 
410
412
  it "test: pattern GGG" do
411
- @formatter.send(:era, Date.new(2012, 1, 1), 'GGG', 3).should == "AD"
412
- @formatter.send(:era, Date.new(-1, 1, 1), 'GGG', 3).should == "BC"
413
+ @formatter.send(:era, Date.new(2012, 1, 1), 'GGG', 3).should == "CE"
414
+ @formatter.send(:era, Date.new(-1, 1, 1), 'GGG', 3).should == "BCE"
413
415
  end
414
416
 
415
417
  it "test: pattern GGGG" do
416
- @formatter.send(:era, Date.new(2012, 1, 1), 'GGGG', 4).should == "Anno Domini"
417
- @formatter.send(:era, Date.new(-1, 1, 1), 'GGGG', 4).should == "Before Christ"
418
+ @formatter.send(:era, Date.new(2012, 1, 1), 'GGGG', 4).should == "Common Era"
419
+ @formatter.send(:era, Date.new(-1, 1, 1), 'GGGG', 4).should == "Before Common Era"
418
420
  end
419
421
 
420
422
  it "should fall back if the calendar doesn't contain the appropriate era data" do
421
- stub(@formatter.tokenizer).calendar do
422
- {
423
- :eras => {
424
- :abbr => {
425
- 0 => "abbr0",
426
- 1 => "abbr1"
427
- },
428
- :name => {
429
- 0 => "name0"
430
- }
431
- }
432
- }
423
+ stub(@formatter.data_reader.calendar).eras(:abbr) do
424
+ { 0 => "abbr0", 1 => "abbr1" }
425
+ end
426
+
427
+ stub(@formatter.data_reader.calendar).eras(:name) do
428
+ { 0 => "name0" }
433
429
  end
434
430
 
435
431
  date = Date.new(2012, 1, 1)
@@ -10,109 +10,38 @@ include TwitterCldr::Formatters
10
10
  describe ListFormatter do
11
11
  describe '#initialize' do
12
12
  it 'fetches locale from options hash' do
13
- ListFormatter.new(:locale => :pt).locale.should == :pt
13
+ ListFormatter.new(:pt).locale.should == :pt
14
14
  end
15
15
 
16
16
  it "uses default locale if it's not passed in options hash" do
17
- ListFormatter.new.locale.should == TwitterCldr::DEFAULT_LOCALE
17
+ ListFormatter.new.locale.should == TwitterCldr.locale
18
18
  end
19
19
  end
20
20
 
21
- context "with an initialized list formatter" do
22
- before(:each) do
23
- @formatter = ListFormatter.new
24
- end
25
-
26
- describe "#compose" do
27
- it "should reorder rtl lists" do
28
- list = ["larry", "curly"]
29
- @formatter.locale = :ar
30
- @formatter.send(:compose, "{0} \331\210 {1}", list).should == "curly \331\210 larry"
31
- end
32
-
33
- it "should format a variable number of elements correctly" do
34
- list = ["larry", "curly", "moe"]
35
- @formatter.send(:compose, "{0} - {1} - {2}", list).should == "larry - curly - moe"
36
- @formatter.send(:compose, "{0} - {1}", list).should == "larry - curly"
37
- @formatter.send(:compose, "{0}", list).should == "larry"
38
- @formatter.send(:compose, "", list).should == ""
39
- end
40
-
41
- it "should return the first element if the list only contains a single element" do
42
- @formatter.send(:compose, "{0} - {1}", ["larry"]).should == "larry"
43
- end
44
-
45
- it "should return an empty string if the list is empty" do
46
- @formatter.send(:compose, "{0} - {1}", []).should == ""
47
- end
48
- end
49
-
50
- context "with a standard resource" do
51
- before(:each) do
52
- stub(@formatter).resource do
53
- {
54
- 2 => "{0} $ {1}",
55
- :middle => "{0}; {1}",
56
- :start => "{0}< {1}",
57
- :end => "{0}> {1}"
58
- }
59
- end
60
- end
61
-
62
- describe "#compose_list" do
63
- it "should compose a list with two elements using the :end format" do
64
- @formatter.send(:compose_list, ["larry", "curly"]).should == "larry> curly"
65
- end
66
-
67
- it "should compose a list with three elements using the :start and :end formats" do
68
- @formatter.send(:compose_list, ["larry", "curly", "moe"]).should == "larry< curly> moe"
69
- end
70
-
71
- it "should compose a list with four elements using all the formats (:start, :middle, and :end)" do
72
- @formatter.send(:compose_list, ["larry", "curly", "moe", "jerry"]).should == "larry< curly; moe> jerry"
73
- end
74
-
75
- it "should compose a list of five elements just for the hell of it" do
76
- @formatter.send(:compose_list, ["larry", "curly", "moe", "jerry", "helga"]).should == "larry< curly; moe; jerry> helga"
77
- end
78
- end
79
-
80
- describe "#format" do
81
- it "should format correctly using the integer index if it exists" do
82
- @formatter.format(["larry", "curly"]).should == "larry $ curly"
83
- end
84
-
85
- it "should format correctly if no corresponding integer index exists" do
86
- @formatter.format(["larry", "curly", "moe"]).should == "larry< curly> moe"
87
- end
88
- end
89
- end
21
+ describe "#format" do
22
+ let(:list) { ["larry", "curly", "moe"] }
90
23
 
91
- context "with a resource that doesn't contain a start or end" do
24
+ context "with an English list formatter" do
92
25
  before(:each) do
93
- stub(@formatter).resource do
94
- { :middle => "{0}; {1}" }
95
- end
26
+ @formatter = ListFormatter.new(:en)
96
27
  end
97
28
 
98
- describe "#compose_list" do
99
- it "should correctly compose a list with four elements, falling back to :middle for the beginning and end" do
100
- @formatter.send(:compose_list, ["larry", "curly", "moe", "jerry"]).should == "larry; curly; moe; jerry"
101
- end
29
+ it "formats English lists correctly using various types" do
30
+ @formatter.format(list).should == "larry, curly, and moe"
31
+ @formatter.format(list, :unit).should == "larry, curly, moe"
32
+ @formatter.format(list, :"unit-narrow").should == "larry curly moe"
102
33
  end
103
34
  end
104
35
 
105
- context "with an empty resource" do
36
+ context "with a Spanish list formatter" do
106
37
  before(:each) do
107
- stub(@formatter).resource do
108
- {}
109
- end
38
+ @formatter = ListFormatter.new(:es)
110
39
  end
111
40
 
112
- describe "#compose_list" do
113
- it "should return a blank string since no formats are available" do
114
- @formatter.send(:compose_list, ["larry", "curly", "moe"]).should == ""
115
- end
41
+ it "formats Spanish lists correctly using various types" do
42
+ @formatter.format(list).should == "larry, curly y moe"
43
+ @formatter.format(list, :unit).should == "larry, curly y moe"
44
+ @formatter.format(list, :"unit-narrow").should == "larry curly moe"
116
45
  end
117
46
  end
118
47
  end
@@ -8,74 +8,30 @@ require 'spec_helper'
8
8
  include TwitterCldr::Formatters
9
9
 
10
10
  describe AbbreviatedNumberFormatter do
11
- before(:each) do
12
- @formatter = AbbreviatedNumberFormatter.new(:locale => :en)
13
- end
11
+ let(:formatter) { AbbreviatedNumberFormatter.new(:locale => :en) }
14
12
 
15
13
  describe "#transform_number" do
16
14
  it "chops off the number to the necessary number of sig figs" do
17
- @formatter.send(:transform_number, 10 ** 3).should == 1
18
- @formatter.send(:transform_number, 10 ** 4).should == 10
19
- @formatter.send(:transform_number, 10 ** 5).should == 100
20
- @formatter.send(:transform_number, 10 ** 6).should == 1
21
- @formatter.send(:transform_number, 10 ** 7).should == 10
22
- @formatter.send(:transform_number, 10 ** 8).should == 100
23
- @formatter.send(:transform_number, 10 ** 9).should == 1
24
- @formatter.send(:transform_number, 10 ** 10).should == 10
25
- @formatter.send(:transform_number, 10 ** 11).should == 100
26
- @formatter.send(:transform_number, 10 ** 12).should == 1
27
- @formatter.send(:transform_number, 10 ** 13).should == 10
28
- @formatter.send(:transform_number, 10 ** 14).should == 100
15
+ formatter.send(:transform_number, 10 ** 3).should == 1
16
+ formatter.send(:transform_number, 10 ** 4).should == 10
17
+ formatter.send(:transform_number, 10 ** 5).should == 100
18
+ formatter.send(:transform_number, 10 ** 6).should == 1
19
+ formatter.send(:transform_number, 10 ** 7).should == 10
20
+ formatter.send(:transform_number, 10 ** 8).should == 100
21
+ formatter.send(:transform_number, 10 ** 9).should == 1
22
+ formatter.send(:transform_number, 10 ** 10).should == 10
23
+ formatter.send(:transform_number, 10 ** 11).should == 100
24
+ formatter.send(:transform_number, 10 ** 12).should == 1
25
+ formatter.send(:transform_number, 10 ** 13).should == 10
26
+ formatter.send(:transform_number, 10 ** 14).should == 100
29
27
  end
30
28
 
31
29
  it "returns the original number if greater than 10^15" do
32
- @formatter.send(:transform_number, 10 ** 15).should == 10 ** 15
30
+ formatter.send(:transform_number, 10 ** 15).should == 10 ** 15
33
31
  end
34
32
 
35
33
  it "returns the original number if less than 10^3" do
36
- @formatter.send(:transform_number, 999).should == 999
37
- end
38
- end
39
-
40
- describe "#get_key" do
41
- it "builds a power-of-ten key based on the number of digits in the input" do
42
- (3..15).each { |i| @formatter.send(:get_key, "1337#{"0" * (i - 3)}").should == 10 ** i }
43
- end
44
- end
45
-
46
- describe "#get_tokens" do
47
- before(:each) do
48
- stub(@formatter).get_type { :awesome_type }
49
- end
50
-
51
- it "gets tokens for a valid number (between 10^3 and 10^15)" do
52
- mock(@formatter.tokenizer).tokens({
53
- :sign => :positive,
54
- :type => :awesome_type,
55
- :format => 10 ** 4
56
- }) { "I'm just right!" }
57
-
58
- @formatter.get_tokens(12345).should == "I'm just right!"
59
- end
60
-
61
- it "returns tokens for decimals if the number is too large" do
62
- mock(@formatter.tokenizer).tokens({
63
- :sign => :positive,
64
- :type => :decimal,
65
- :format => nil
66
- }) { "I'm too big!" }
67
-
68
- @formatter.get_tokens(1234567891011122).should == "I'm too big!"
69
- end
70
-
71
- it "returns tokens for decimals if the number is too small" do
72
- mock(@formatter.tokenizer).tokens({
73
- :sign => :positive,
74
- :type => :decimal,
75
- :format => nil
76
- }) { "I'm too small!" }
77
-
78
- @formatter.get_tokens(123).should == "I'm too small!"
34
+ formatter.send(:transform_number, 999).should == 999
79
35
  end
80
36
  end
81
37
  end
@@ -8,34 +8,49 @@ require 'spec_helper'
8
8
  include TwitterCldr::Formatters
9
9
 
10
10
  describe LongDecimalFormatter do
11
- before(:each) do
12
- @formatter = LongDecimalFormatter.new(:locale => :en)
11
+ let(:data_reader) do
12
+ TwitterCldr::DataReaders::NumberDataReader.new(:en, :type => :long_decimal)
13
13
  end
14
14
 
15
+ let(:formatter) { data_reader.formatter }
16
+ let(:tokenizer) { data_reader.tokenizer }
17
+
15
18
  it "formats valid numbers correctly (from 10^3 - 10^15)" do
16
- @formatter.format(10 ** 3).should match_normalized("1 thousand")
17
- @formatter.format(10 ** 4).should match_normalized("10 thousand")
18
- @formatter.format(10 ** 5).should match_normalized("100 thousand")
19
- @formatter.format(10 ** 6).should match_normalized("1 million")
20
- @formatter.format(10 ** 7).should match_normalized("10 million")
21
- @formatter.format(10 ** 8).should match_normalized("100 million")
22
- @formatter.format(10 ** 9).should match_normalized("1 billion")
23
- @formatter.format(10 ** 10).should match_normalized("10 billion")
24
- @formatter.format(10 ** 11).should match_normalized("100 billion")
25
- @formatter.format(10 ** 12).should match_normalized("1 trillion")
26
- @formatter.format(10 ** 13).should match_normalized("10 trillion")
27
- @formatter.format(10 ** 14).should match_normalized("100 trillion")
19
+ expected = {
20
+ 10 ** 3 => "1 thousand",
21
+ 10 ** 4 => "10 thousand",
22
+ 10 ** 5 => "100 thousand",
23
+ 10 ** 6 => "1 million",
24
+ 10 ** 7 => "10 million",
25
+ 10 ** 8 => "100 million",
26
+ 10 ** 9 => "1 billion",
27
+ 10 ** 10 => "10 billion",
28
+ 10 ** 11 => "100 billion",
29
+ 10 ** 12 => "1 trillion",
30
+ 10 ** 13 => "10 trillion",
31
+ 10 ** 14 => "100 trillion"
32
+ }
33
+
34
+ expected.each do |num, text|
35
+ pattern = data_reader.pattern(num)
36
+ formatter.format(tokenizer.tokenize(pattern), num).should == text
37
+ end
38
+ end
39
+
40
+ def format_number(number, options = {})
41
+ pattern = data_reader.pattern(number)
42
+ formatter.format(tokenizer.tokenize(pattern), number, options)
28
43
  end
29
44
 
30
45
  it "formats the number as if it were a straight decimal if it exceeds 10^15" do
31
- @formatter.format(10**15).should == "1,000,000,000,000,000"
46
+ format_number(10**15).should == "1,000,000,000,000,000"
32
47
  end
33
48
 
34
49
  it "formats the number as if it were a straight decimal if it's less than 1000" do
35
- @formatter.format(500).should == "500"
50
+ format_number(500).should == "500"
36
51
  end
37
52
 
38
53
  it "respects the :precision option" do
39
- @formatter.format(12345, :precision => 3).should match_normalized("12.345 thousand")
54
+ format_number(12345, :precision => 3).should match_normalized("12.345 thousand")
40
55
  end
41
56
  end
@@ -8,34 +8,50 @@ require 'spec_helper'
8
8
  include TwitterCldr::Formatters
9
9
 
10
10
  describe ShortDecimalFormatter do
11
- before(:each) do
12
- @formatter = ShortDecimalFormatter.new(:locale => :en)
11
+ let(:data_reader) do
12
+ TwitterCldr::DataReaders::NumberDataReader.new(:en, :type => :short_decimal)
13
13
  end
14
14
 
15
+ let(:formatter) { data_reader.formatter }
16
+ let(:tokenizer) { data_reader.tokenizer }
17
+
15
18
  it "formats valid numbers correctly (from 10^3 - 10^15)" do
16
- @formatter.format(10 ** 3).should match_normalized("1K")
17
- @formatter.format(10 ** 4).should match_normalized("10K")
18
- @formatter.format(10 ** 5).should match_normalized("100K")
19
- @formatter.format(10 ** 6).should match_normalized("1M")
20
- @formatter.format(10 ** 7).should match_normalized("10M")
21
- @formatter.format(10 ** 8).should match_normalized("100M")
22
- @formatter.format(10 ** 9).should match_normalized("1B")
23
- @formatter.format(10 ** 10).should match_normalized("10B")
24
- @formatter.format(10 ** 11).should match_normalized("100B")
25
- @formatter.format(10 ** 12).should match_normalized("1T")
26
- @formatter.format(10 ** 13).should match_normalized("10T")
27
- @formatter.format(10 ** 14).should match_normalized("100T")
19
+ expected = {
20
+ 10 ** 3 => "1K",
21
+ 10 ** 4 => "10K",
22
+ 10 ** 5 => "100K",
23
+ 10 ** 6 => "1M",
24
+ 10 ** 7 => "10M",
25
+ 10 ** 8 => "100M",
26
+ 10 ** 9 => "1B",
27
+ 10 ** 10 => "10B",
28
+ 10 ** 11 => "100B",
29
+ 10 ** 12 => "1T",
30
+ 10 ** 13 => "10T",
31
+ 10 ** 14 => "100T"
32
+ }
33
+
34
+ expected.each do |num, text|
35
+ pattern = data_reader.pattern(num)
36
+ formatter.format(tokenizer.tokenize(pattern), num).should == text
37
+ end
28
38
  end
29
39
 
30
40
  it "formats the number as if it were a straight decimal if it exceeds 10^15" do
31
- @formatter.format(10**15).should == "1,000,000,000,000,000"
41
+ number = 10**15
42
+ pattern = data_reader.pattern(number)
43
+ formatter.format(tokenizer.tokenize(pattern), number).should == "1,000,000,000,000,000"
32
44
  end
33
45
 
34
46
  it "formats the number as if it were a straight decimal if it's less than 1000" do
35
- @formatter.format(500).should == "500"
47
+ number = 500
48
+ pattern = data_reader.pattern(number)
49
+ formatter.format(tokenizer.tokenize(pattern), number).should == "500"
36
50
  end
37
51
 
38
52
  it "respects the :precision option" do
39
- @formatter.format(12345, :precision => 3).should match_normalized("12.345K")
53
+ number = 12345
54
+ pattern = data_reader.pattern(number)
55
+ formatter.format(tokenizer.tokenize(pattern), number, :precision => 3).should match_normalized("12.345K")
40
56
  end
41
57
  end