twitter_cldr 1.2.0 → 1.3.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (154) hide show
  1. data/README.md +34 -18
  2. data/lib/twitter_cldr.rb +15 -21
  3. data/lib/twitter_cldr/core_ext.rb +2 -1
  4. data/lib/twitter_cldr/core_ext/array.rb +22 -0
  5. data/lib/twitter_cldr/core_ext/numbers/localized_number.rb +0 -1
  6. data/lib/twitter_cldr/core_ext/string.rb +10 -2
  7. data/lib/twitter_cldr/formatters/calendars/datetime_formatter.rb +4 -1
  8. data/lib/twitter_cldr/formatters/numbers/currency_formatter.rb +7 -2
  9. data/lib/twitter_cldr/formatters/numbers/decimal_formatter.rb +5 -1
  10. data/lib/twitter_cldr/formatters/numbers/number_formatter.rb +1 -1
  11. data/lib/twitter_cldr/formatters/numbers/percent_formatter.rb +5 -3
  12. data/lib/twitter_cldr/formatters/plurals/rules.rb +9 -5
  13. data/lib/twitter_cldr/normalizers/nfkd.rb +3 -1
  14. data/lib/twitter_cldr/shared.rb +2 -0
  15. data/lib/twitter_cldr/shared/calendar.rb +64 -0
  16. data/lib/twitter_cldr/shared/currencies.rb +6 -2
  17. data/lib/twitter_cldr/shared/languages.rb +10 -6
  18. data/lib/twitter_cldr/shared/numbers.rb +26 -0
  19. data/lib/twitter_cldr/shared/resources.rb +26 -9
  20. data/lib/twitter_cldr/shared/unicode_data.rb +26 -6
  21. data/lib/twitter_cldr/tokenizers/calendars/datetime_tokenizer.rb +5 -3
  22. data/lib/twitter_cldr/tokenizers/numbers/number_tokenizer.rb +1 -1
  23. data/lib/twitter_cldr/version.rb +1 -1
  24. data/resources/{ar → locales/ar}/calendars.yml +30 -33
  25. data/resources/{ar → locales/ar}/languages.yml +120 -118
  26. data/resources/{ar → locales/ar}/numbers.yml +8 -9
  27. data/resources/{ar → locales/ar}/plurals.yml +0 -0
  28. data/resources/{da → locales/da}/calendars.yml +24 -9
  29. data/resources/{da → locales/da}/languages.yml +14 -8
  30. data/resources/{da → locales/da}/numbers.yml +1 -2
  31. data/resources/{da → locales/da}/plurals.yml +0 -0
  32. data/resources/{de → locales/de}/calendars.yml +42 -8
  33. data/resources/{de → locales/de}/languages.yml +47 -42
  34. data/resources/{de → locales/de}/numbers.yml +1 -2
  35. data/resources/{de → locales/de}/plurals.yml +0 -0
  36. data/resources/{en → locales/en}/calendars.yml +16 -7
  37. data/resources/{en → locales/en}/languages.yml +53 -5
  38. data/resources/{en → locales/en}/numbers.yml +1 -2
  39. data/resources/{en → locales/en}/plurals.yml +0 -0
  40. data/resources/{es → locales/es}/calendars.yml +29 -15
  41. data/resources/{es → locales/es}/languages.yml +7 -5
  42. data/resources/{es → locales/es}/numbers.yml +3 -3
  43. data/resources/{es → locales/es}/plurals.yml +0 -0
  44. data/resources/{fa → locales/fa}/calendars.yml +87 -18
  45. data/resources/{fa → locales/fa}/languages.yml +13 -9
  46. data/resources/locales/fa/numbers.yml +29 -0
  47. data/resources/{fa → locales/fa}/plurals.yml +0 -0
  48. data/resources/{fi → locales/fi}/calendars.yml +64 -14
  49. data/resources/{fi → locales/fi}/languages.yml +47 -36
  50. data/resources/{fi → locales/fi}/numbers.yml +1 -2
  51. data/resources/{fi → locales/fi}/plurals.yml +0 -0
  52. data/resources/{fil → locales/fil}/calendars.yml +32 -23
  53. data/resources/{fil → locales/fil}/languages.yml +75 -22
  54. data/resources/{fil → locales/fil}/numbers.yml +1 -2
  55. data/resources/{fil → locales/fil}/plurals.yml +0 -0
  56. data/resources/{fr → locales/fr}/calendars.yml +54 -12
  57. data/resources/{fr → locales/fr}/languages.yml +5 -2
  58. data/resources/{fr → locales/fr}/numbers.yml +1 -2
  59. data/resources/{fr → locales/fr}/plurals.yml +0 -0
  60. data/resources/{he → locales/he}/calendars.yml +74 -38
  61. data/resources/{he → locales/he}/languages.yml +41 -26
  62. data/resources/{he → locales/he}/numbers.yml +1 -2
  63. data/resources/{he → locales/he}/plurals.yml +0 -0
  64. data/resources/{hi → locales/hi}/calendars.yml +36 -42
  65. data/resources/{hi → locales/hi}/languages.yml +8 -3
  66. data/resources/{hi → locales/hi}/numbers.yml +1 -2
  67. data/resources/{hi → locales/hi}/plurals.yml +0 -0
  68. data/resources/{hu → locales/hu}/calendars.yml +95 -19
  69. data/resources/{hu → locales/hu}/languages.yml +15 -4
  70. data/resources/{hu → locales/hu}/numbers.yml +1 -2
  71. data/resources/{hu → locales/hu}/plurals.yml +0 -0
  72. data/resources/{id → locales/id}/calendars.yml +56 -39
  73. data/resources/{id → locales/id}/languages.yml +148 -141
  74. data/resources/{id → locales/id}/numbers.yml +1 -2
  75. data/resources/{id → locales/id}/plurals.yml +0 -0
  76. data/resources/{it → locales/it}/calendars.yml +51 -15
  77. data/resources/{it → locales/it}/languages.yml +5 -5
  78. data/resources/{it → locales/it}/numbers.yml +2 -2
  79. data/resources/{it → locales/it}/plurals.yml +0 -0
  80. data/resources/{ja → locales/ja}/calendars.yml +26 -36
  81. data/resources/{ja → locales/ja}/languages.yml +29 -16
  82. data/resources/{ja → locales/ja}/numbers.yml +2 -3
  83. data/resources/{ja → locales/ja}/plurals.yml +0 -0
  84. data/resources/{ko → locales/ko}/calendars.yml +18 -9
  85. data/resources/{ko → locales/ko}/languages.yml +13 -10
  86. data/resources/{ko → locales/ko}/numbers.yml +1 -2
  87. data/resources/{ko → locales/ko}/plurals.yml +0 -0
  88. data/resources/{ms → locales/ms}/calendars.yml +91 -53
  89. data/resources/locales/ms/languages.yml +157 -0
  90. data/resources/{ms → locales/ms}/numbers.yml +1 -2
  91. data/resources/{ms → locales/ms}/plurals.yml +0 -0
  92. data/resources/{nl → locales/nl}/calendars.yml +38 -9
  93. data/resources/{nl → locales/nl}/languages.yml +28 -21
  94. data/resources/{nl → locales/nl}/numbers.yml +1 -2
  95. data/resources/{nl → locales/nl}/plurals.yml +0 -0
  96. data/resources/{no → locales/no}/calendars.yml +11 -6
  97. data/resources/{no → locales/no}/languages.yml +0 -0
  98. data/resources/{no → locales/no}/numbers.yml +1 -2
  99. data/resources/{no → locales/no}/plurals.yml +0 -0
  100. data/resources/{pl → locales/pl}/calendars.yml +80 -15
  101. data/resources/{pl → locales/pl}/languages.yml +6 -6
  102. data/resources/{pl → locales/pl}/numbers.yml +3 -2
  103. data/resources/{pl → locales/pl}/plurals.yml +0 -0
  104. data/resources/{pt → locales/pt}/calendars.yml +34 -8
  105. data/resources/{pt → locales/pt}/languages.yml +12 -4
  106. data/resources/{pt → locales/pt}/numbers.yml +1 -2
  107. data/resources/{pt → locales/pt}/plurals.yml +0 -0
  108. data/resources/{ru → locales/ru}/calendars.yml +69 -30
  109. data/resources/{ru → locales/ru}/languages.yml +18 -16
  110. data/resources/{ru → locales/ru}/numbers.yml +2 -3
  111. data/resources/{ru → locales/ru}/plurals.yml +0 -0
  112. data/resources/{sv → locales/sv}/calendars.yml +95 -15
  113. data/resources/{sv → locales/sv}/languages.yml +30 -8
  114. data/resources/{sv → locales/sv}/numbers.yml +1 -2
  115. data/resources/{sv → locales/sv}/plurals.yml +0 -0
  116. data/resources/{th → locales/th}/calendars.yml +89 -64
  117. data/resources/{th → locales/th}/languages.yml +5 -3
  118. data/resources/{th → locales/th}/numbers.yml +1 -2
  119. data/resources/{th → locales/th}/plurals.yml +0 -0
  120. data/resources/{tr → locales/tr}/calendars.yml +93 -19
  121. data/resources/{tr → locales/tr}/languages.yml +30 -28
  122. data/resources/{tr → locales/tr}/numbers.yml +2 -3
  123. data/resources/{tr → locales/tr}/plurals.yml +0 -0
  124. data/resources/{ur → locales/ur}/calendars.yml +33 -37
  125. data/resources/locales/ur/languages.yml +163 -0
  126. data/resources/{ur → locales/ur}/numbers.yml +1 -2
  127. data/resources/{ur → locales/ur}/plurals.yml +0 -0
  128. data/resources/{zh-Hant → locales/zh-Hant}/calendars.yml +76 -44
  129. data/resources/{zh-Hant → locales/zh-Hant}/languages.yml +122 -22
  130. data/resources/{zh-Hant → locales/zh-Hant}/numbers.yml +3 -4
  131. data/resources/{zh → locales/zh}/calendars.yml +81 -24
  132. data/resources/{zh → locales/zh}/languages.yml +13 -14
  133. data/resources/{zh → locales/zh}/numbers.yml +1 -2
  134. data/resources/{zh → locales/zh}/plurals.yml +0 -0
  135. data/spec/core_ext/array_spec.rb +16 -0
  136. data/spec/core_ext/calendars/date_spec.rb +6 -1
  137. data/spec/core_ext/calendars/datetime_spec.rb +6 -1
  138. data/spec/core_ext/calendars/time_spec.rb +6 -1
  139. data/spec/core_ext/numbers/localized_number_spec.rb +38 -8
  140. data/spec/core_ext/string_spec.rb +14 -1
  141. data/spec/formatters/numbers/number_formatter_spec.rb +3 -3
  142. data/spec/formatters/plurals/rules_spec.rb +3 -3
  143. data/spec/readme_spec.rb +190 -0
  144. data/spec/shared/calendar_spec.rb +133 -0
  145. data/spec/shared/numbers_spec.rb +35 -0
  146. data/spec/shared/resources_spec.rb +33 -15
  147. data/spec/tokenizers/calendars/date_tokenizer_spec.rb +37 -26
  148. data/spec/tokenizers/calendars/datetime_tokenizer_spec.rb +36 -29
  149. data/spec/tokenizers/calendars/time_tokenizer_spec.rb +22 -18
  150. data/spec/twitter_cldr_spec.rb +21 -7
  151. metadata +166 -114
  152. data/resources/fa/numbers.yml +0 -30
  153. data/resources/ms/languages.yml +0 -54
  154. data/resources/ur/languages.yml +0 -81
@@ -110,12 +110,25 @@ describe LocalizedString do
110
110
  end
111
111
 
112
112
  describe "#normalize" do
113
- it "returns a normalized instance of LocalizedString" do
113
+ it "returns a normalized instance of LocalizedString, defaults to NFD" do
114
+ mock.proxy(TwitterCldr::Normalizers::NFD).normalize("español")
114
115
  "español".bytes.to_a.should == [101, 115, 112, 97, 195, 177, 111, 108]
115
116
  result = "español".localize.normalize
116
117
  result.should be_a(LocalizedString)
117
118
  result.to_s.bytes.to_a.should == [101, 115, 112, 97, 110, 204, 131, 111, 108]
118
119
  end
120
+
121
+ it "returns a normalized instance of LocalizedString using the specified algorithm" do
122
+ mock.proxy(TwitterCldr::Normalizers::NFKD).normalize("español")
123
+ "español".bytes.to_a.should == [101, 115, 112, 97, 195, 177, 111, 108]
124
+ result = "español".localize.normalize(:using => :NFKD)
125
+ result.should be_a(LocalizedString)
126
+ result.to_s.bytes.to_a.should == [101, 115, 112, 97, 110, 204, 131, 111, 108]
127
+ end
128
+
129
+ it "raises an ArgumentError if passed an unsupported normalization form" do
130
+ lambda { "español".localize.normalize(:using => :blarg) }.should raise_error(ArgumentError)
131
+ end
119
132
  end
120
133
 
121
134
  describe "#code_points" do
@@ -11,11 +11,11 @@ describe NumberFormatter do
11
11
  before(:each) do
12
12
  @tokenizer = TwitterCldr::Tokenizers::NumberTokenizer.new(:locale => :sv, :type => :decimal)
13
13
 
14
- any_instance_of(NumberFormatter) do |formatter|
14
+ any_instance_of(DecimalFormatter) do |formatter|
15
15
  mock(formatter).tokenizer { @tokenizer }
16
16
  end
17
17
 
18
- @formatter = NumberFormatter.new(:locale => :sv)
18
+ @formatter = DecimalFormatter.new(:locale => :sv)
19
19
  @formatter.instance_variable_set("@tokenizer", @tokenizer)
20
20
  end
21
21
 
@@ -78,7 +78,7 @@ describe NumberFormatter do
78
78
  @formatter.format(1337).should == "1 337"
79
79
  end
80
80
 
81
- it "formats an decimal larger than 999.9" do
81
+ it "formats a decimal larger than 999.9" do
82
82
  @formatter.format(1337.37).should == "1 337,37"
83
83
  end
84
84
  end
@@ -59,10 +59,10 @@ describe Rules do
59
59
  Rules.all_for(:ru).should =~ [:one, :few, :many, :other]
60
60
  end
61
61
 
62
- it "returns an empty array on error" do
62
+ it "returns nil on error" do
63
63
  stub(Rules).get_resource { lambda { raise "Jelly beans" } }
64
- Rules.all_for(:en).should == []
65
- Rules.all_for(:ru).should == []
64
+ Rules.all_for(:en).should be_nil
65
+ Rules.all_for(:ru).should be_nil
66
66
  end
67
67
  end
68
68
 
@@ -0,0 +1,190 @@
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
+ def spaces(str)
9
+ str.gsub("\xC2\xA0", " ")
10
+ end
11
+
12
+ describe "README" do
13
+ it "verifies supported_locales" do
14
+ sup = TwitterCldr.supported_locales
15
+ sup.should be_a(Array)
16
+ sup.first.should be_a(Symbol)
17
+ end
18
+
19
+ it "verifies supported_locale?" do
20
+ TwitterCldr.supported_locale?(:es).should be_true
21
+ TwitterCldr.supported_locale?(:xx).should be_false
22
+ end
23
+
24
+ it "verifies number formatting" do
25
+ nbsp = "\xC2\xA0"
26
+ 1337.localize(:es).to_s.should == "1.337"
27
+ spaces(1337.localize(:es).to_currency.to_s).should == "1.337,00 $"
28
+ spaces(1337.localize(:es).to_currency.to_s(:currency => "EUR").to_s).should == "1.337,00 €"
29
+ spaces(1337.localize(:es).to_currency.to_s(:currency => "Peru").to_s).should == "1.337,00 S/."
30
+ 1337.localize(:es).to_percent.to_s.should == "1.337%"
31
+ 1337.localize(:es).to_percent.to_s(:precision => 2).should == "1.337,00%"
32
+ 1337.localize(:es).to_decimal.to_s(:precision => 3).should == "1.337,000"
33
+
34
+ num = TwitterCldr::LocalizedNumber.new(1337, :es)
35
+ spaces(num.to_currency.to_s).should == "1.337,00 $"
36
+ end
37
+
38
+ it "verifies extra currency data" do
39
+ countries = TwitterCldr::Shared::Currencies.countries
40
+ countries.should be_a(Array)
41
+ countries.should include("Lithuania")
42
+ countries.should include("Philippines")
43
+
44
+ currency_codes = TwitterCldr::Shared::Currencies.currency_codes
45
+ currency_codes.should be_a(Array)
46
+ currency_codes.should include("LTL")
47
+ currency_codes.should include("PHP")
48
+
49
+ TwitterCldr::Shared::Currencies.for_country("Canada").should == { :currency => "Dollar", :symbol => "$", :code => "CAD" }
50
+ TwitterCldr::Shared::Currencies.for_code("CAD").should == { :currency => "Dollar", :symbol => "$", :country => "Canada"}
51
+ end
52
+
53
+ it "verifies dates" do
54
+ date_time = DateTime.new(2011, 12, 12, 21, 44, 57, -8.0 / 24.0)
55
+ date = date_time.localize.to_date.base_obj
56
+ time = Time.at(date_time.localize.to_time.base_obj.utc - (8 * 60 * 60))
57
+
58
+ date_time.localize(:es).to_full_s.should == "lunes, 12 de diciembre de 2011 21:44:57 UTC -0800"
59
+ date_time.localize(:es).to_long_s.should == "12 de diciembre de 2011 21:44:57 -08:00"
60
+ date_time.localize(:es).to_medium_s.should == "12/12/2011 21:44:57"
61
+ date_time.localize(:es).to_short_s.should == "12/12/11 21:44"
62
+
63
+ date.localize(:es).to_full_s.should == "lunes, 12 de diciembre de 2011"
64
+ date.localize(:es).to_long_s.should == "12 de diciembre de 2011"
65
+ date.localize(:es).to_medium_s.should == "12/12/2011"
66
+ date.localize(:es).to_short_s.should == "12/12/11"
67
+
68
+ time.localize(:es).to_full_s.should match(/21:44:57 UTC [-+]\d{4}/)
69
+ time.localize(:es).to_long_s.should == "21:44:57 UTC"
70
+ time.localize(:es).to_medium_s.should == "21:44:57"
71
+ time.localize(:es).to_short_s.should == "21:44"
72
+
73
+ dt = TwitterCldr::LocalizedDateTime.new(date_time, :es)
74
+ dt.to_short_s.should == "12/12/11 21:44"
75
+ end
76
+
77
+ it "verifies plural rules" do
78
+ 1.localize(:ru).plural_rule.should == :one
79
+ 2.localize(:ru).plural_rule.should == :few
80
+ 5.localize(:ru).plural_rule.should == :many
81
+
82
+ TwitterCldr::Formatters::Plurals::Rules.all.should == [:one, :other]
83
+ TwitterCldr::Formatters::Plurals::Rules.all_for(:es).should == [:one, :other]
84
+ TwitterCldr::Formatters::Plurals::Rules.all_for(:ru).should == [:one, :few, :many, :other]
85
+
86
+ # get the rule for a number in a specific locale
87
+ TwitterCldr::Formatters::Plurals::Rules.rule_for(1, :ru).should == :one
88
+ TwitterCldr::Formatters::Plurals::Rules.rule_for(2, :ru).should == :few
89
+ end
90
+
91
+ describe "plural interpolation" do
92
+ it "verifies first technique" do
93
+ replacements = { :horse_count => 3,
94
+ :horses => { :one => "is 1 horse",
95
+ :other => "are %{horse_count} horses" } }
96
+
97
+ ("there %{horse_count:horses} in the barn".localize % replacements).should == "there are 3 horses in the barn"
98
+ end
99
+
100
+ it "verifies second technique" do
101
+ str = 'there %<{ "horse_count": { "one": "is one horse", "other": "are %{horse_count} horses" } }> in the barn'
102
+ (str.localize % { :horse_count => 3 }).should == "there are 3 horses in the barn"
103
+ end
104
+
105
+ it "verifies regular Ruby interpolation works" do
106
+ ("five euros plus %.3f in tax" % (13.25 * 0.087)).should == "five euros plus 1.153 in tax"
107
+
108
+ if RUBY_VERSION >= '1.9.0'
109
+ ("there are %{count} horses in the barn" % { :count => "5" }).should == "there are 5 horses in the barn"
110
+ end
111
+ end
112
+
113
+ it "verifies named interpolation parameters" do
114
+ #"five euros plus %<percent>.3f in %{noun}".localize % { :percent => 13.25 * 0.087, :noun => "tax" }.should == "five euros plus 1.15 in tax"
115
+ end
116
+ end
117
+
118
+ it "verifies world languages" do
119
+ :es.localize(:es).as_language_code.should == "español"
120
+ :ru.localize(:es).as_language_code.should == "ruso"
121
+ ls = TwitterCldr::LocalizedSymbol.new(:ru, :es)
122
+ ls.as_language_code.should == "ruso"
123
+ end
124
+
125
+ it "verifies language data" do
126
+ # get all languages for the default locale
127
+ all = TwitterCldr::Shared::Languages.all
128
+ all.should include(:"zh-Hant")
129
+ all[:'zh-Hant'].should == "Traditional Chinese"
130
+ all.should include(:vi)
131
+ all[:vi].should == "Vietnamese"
132
+
133
+ # get all languages for a specific locale
134
+ all_es = TwitterCldr::Shared::Languages.all_for(:es)
135
+ all_es.should include(:"zh-Hant")
136
+ all_es[:'zh-Hant'].should == "chino tradicional"
137
+ all_es.should include(:vi)
138
+ all_es[:vi].should == "vietnamita"
139
+
140
+ # get a language by its code for the default locale
141
+ TwitterCldr::Shared::Languages.from_code(:'zh-Hant').should == "Traditional Chinese"
142
+
143
+ # get a language from its code for a specific locale
144
+ TwitterCldr::Shared::Languages.from_code_for_locale(:'zh-Hant', :es).should == "chino tradicional"
145
+
146
+ # translate a language from one locale to another
147
+ TwitterCldr::Shared::Languages.translate_language("chino tradicional", :es, :en).should == "Traditional Chinese"
148
+ TwitterCldr::Shared::Languages.translate_language("Traditional Chinese", :en, :es).should == "chino tradicional"
149
+ end
150
+
151
+ it "verifies code point conversions" do
152
+ code_point = TwitterCldr::Shared::UnicodeData.for_code_point("1F3E9")
153
+ code_point.name.should == "LOVE HOTEL"
154
+ code_point.bidi_mirrored.should == "N"
155
+ code_point.category.should == "So"
156
+ code_point.combining_class.should == "0"
157
+
158
+ # Convert characters to code points:
159
+ TwitterCldr::Utils::CodePoints.from_string("¿").should == ["00BF"]
160
+
161
+ # Convert code points to characters:
162
+ TwitterCldr::Utils::CodePoints.to_string(["00BF"]).should == "¿"
163
+ end
164
+
165
+ it "verifies normalization" do
166
+ TwitterCldr::Normalizers::NFD.normalize("français").should == TwitterCldr::Utils::CodePoints.to_string(["0066", "0072", "0061", "006E", "0063", "0327", "0061", "0069", "0073"])
167
+ TwitterCldr::Utils::CodePoints.from_string("español").should == ["0065", "0073", "0070", "0061", "00F1", "006F", "006C"]
168
+ TwitterCldr::Utils::CodePoints.from_string(TwitterCldr::Normalizers::NFD.normalize("español")).should == ["0065", "0073", "0070", "0061", "006E", "0303", "006F", "006C"]
169
+
170
+ "español".localize.code_points.should == ["0065", "0073", "0070", "0061", "00F1", "006F", "006C"]
171
+ "español".localize.normalize.code_points.should == ["0065", "0073", "0070", "0061", "006E", "0303", "006F", "006C"]
172
+ "español".localize.normalize(:using => :NFKD).code_points.should == ["0065", "0073", "0070", "0061", "006E", "0303", "006F", "006C"]
173
+ end
174
+
175
+ it "verifies Twitter-specific locale conversion" do
176
+ TwitterCldr.convert_locale(:'zh-cn').should == :zh
177
+ TwitterCldr.convert_locale(:zh).should == :zh
178
+ TwitterCldr.convert_locale(:'zh-tw').should == :'zh-Hant'
179
+ TwitterCldr.convert_locale(:'zh-Hant').should == :'zh-Hant'
180
+
181
+ TwitterCldr.convert_locale(:msa).should == :ms
182
+ TwitterCldr.convert_locale(:ms).should == :ms
183
+ end
184
+
185
+ it "verifies locale defaults" do
186
+ TwitterCldr.get_locale.should == :en
187
+ FastGettext.locale = "ru"
188
+ TwitterCldr.get_locale.should == :ru
189
+ end
190
+ end
@@ -0,0 +1,133 @@
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::Shared
9
+
10
+ describe Calendar do
11
+
12
+ let(:calendar) { Calendar.new(:de) }
13
+
14
+ describe '#initialize' do
15
+ it 'returns calendar for default locale and type' do
16
+ stub(TwitterCldr).get_locale { :fr }
17
+ cal = Calendar.new
18
+
19
+ cal.locale.should == :fr
20
+ cal.calendar_type.should == TwitterCldr::DEFAULT_CALENDAR_TYPE
21
+ end
22
+
23
+ it 'returns calendar for a specific locale' do
24
+ Calendar.new(:jp).locale.should == :jp
25
+ end
26
+
27
+ it 'uses TwitterCldr.convert_locale' do
28
+ Calendar.new(:'zh-cn').locale.should == :zh
29
+ end
30
+
31
+ it 'returns calendar of a specific type' do
32
+ Calendar.new(:th, :buddhist).calendar_type.should == :buddhist
33
+ end
34
+
35
+ end
36
+
37
+ describe '#months' do
38
+ context 'when data is available' do
39
+ it 'returns months list in a wide names form by default' do
40
+ calendar.months.should == %w[Januar Februar März April Mai Juni Juli August September Oktober November Dezember]
41
+ end
42
+
43
+ it 'supports wide names form' do
44
+ calendar.months(:wide).should == %w[Januar Februar März April Mai Juni Juli August September Oktober November Dezember]
45
+ end
46
+
47
+ it 'supports narrow names form' do
48
+ calendar.months(:narrow).should == %w[J F M A M J J A S O N D]
49
+ end
50
+
51
+ it 'supports abbreviated names form' do
52
+ calendar.months(:abbreviated).should == %w[Jan Feb Mär Apr Mai Jun Jul Aug Sep Okt Nov Dez]
53
+ end
54
+
55
+ it 'returns nil if invalid names form is passed' do
56
+ calendar.months(:wat).should == nil
57
+ end
58
+ end
59
+
60
+ context 'when some data is missing' do
61
+ it 'returns nil if some names format is missing' do
62
+ stub(TwitterCldr).get_locale_resource { { :de => { :calendars => { :gregorian => { :months => { :'stand-alone' => {} } } } } } }
63
+ calendar.months(:wide).should == nil
64
+ end
65
+
66
+ it 'returns nil if calendars data is missing' do
67
+ stub(TwitterCldr).get_locale_resource { { :de => {} } }
68
+ calendar.months(:wide).should == nil
69
+ end
70
+ end
71
+ end
72
+
73
+ describe '#weekdays' do
74
+ context 'when data is available' do
75
+ it 'returns weekdays list in a wide names form by default' do
76
+ calendar.weekdays.should == {
77
+ :sun => 'Sonntag',
78
+ :mon => 'Montag',
79
+ :tue => 'Dienstag',
80
+ :wed => 'Mittwoch',
81
+ :thu => 'Donnerstag',
82
+ :fri => 'Freitag',
83
+ :sat => 'Samstag'
84
+ }
85
+ end
86
+
87
+ it 'supports wide names form' do
88
+ calendar.weekdays(:wide).should == {
89
+ :sun => 'Sonntag',
90
+ :mon => 'Montag',
91
+ :tue => 'Dienstag',
92
+ :wed => 'Mittwoch',
93
+ :thu => 'Donnerstag',
94
+ :fri => 'Freitag',
95
+ :sat => 'Samstag'
96
+ }
97
+ end
98
+
99
+ it 'supports narrow names form' do
100
+ calendar.weekdays(:narrow).should == { :sun => 'S', :mon => 'M', :tue => 'D', :wed => 'M', :thu => 'D', :fri => 'F', :sat => 'S' }
101
+ end
102
+
103
+ it 'supports abbreviated names form' do
104
+ calendar.weekdays(:abbreviated).should == {
105
+ :sun => 'So',
106
+ :mon => 'Mo',
107
+ :tue => 'Di',
108
+ :wed => 'Mi',
109
+ :thu => 'Do',
110
+ :fri => 'Fr',
111
+ :sat => 'Sa'
112
+ }
113
+ end
114
+
115
+ it 'returns nil if invalid names form is passed' do
116
+ calendar.weekdays(:wat).should == nil
117
+ end
118
+ end
119
+
120
+ context 'when some data is missing' do
121
+ it 'returns nil if some names format is missing' do
122
+ stub(TwitterCldr).get_locale_resource { { :de => { :calendars => { :gregorian => { :days => { :'stand-alone' => {} } } } } } }
123
+ calendar.weekdays(:wide).should == nil
124
+ end
125
+
126
+ it 'returns nil if calendars data is missing' do
127
+ stub(TwitterCldr).get_locale_resource { { :de => {} } }
128
+ calendar.weekdays(:wide).should == nil
129
+ end
130
+ end
131
+ end
132
+
133
+ end
@@ -0,0 +1,35 @@
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::Shared
9
+
10
+ describe Numbers do
11
+ describe "#symbols" do
12
+ let(:symbols) { { :nan => 'NaN', :minus_sign => '-' } }
13
+
14
+ it 'returns numerical symbols for default locale' do
15
+ stub(TwitterCldr).get_locale { :jp }
16
+ stub(TwitterCldr).get_locale_resource(:jp, :numbers) { { :jp => { :numbers => { :symbols => symbols } } } }
17
+ Numbers.symbols.should == symbols
18
+ end
19
+
20
+ it 'returns numerical symbols for default locale' do
21
+ stub(TwitterCldr).get_locale_resource(:np, :numbers) { { :np => { :numbers => { :symbols => symbols } } } }
22
+ Numbers.symbols(:np).should == symbols
23
+ end
24
+
25
+ it 'converts locale' do
26
+ stub(TwitterCldr).get_locale_resource(:'zh-Hant', :numbers) { { :'zh-Hant' => { :numbers => { :symbols => symbols } } } }
27
+ Numbers.symbols('zh-tw').should == symbols
28
+ end
29
+
30
+ it 'returns nil if the resource is missing' do
31
+ stub(TwitterCldr).get_locale_resource(:nop, :numbers) { nil }
32
+ Numbers.symbols(:nop).should be_nil
33
+ end
34
+ end
35
+ end
@@ -8,26 +8,44 @@ require 'spec_helper'
8
8
  include TwitterCldr::Shared
9
9
 
10
10
  describe Resources do
11
- before(:each) do
12
- @resource = Resources.new
13
- end
11
+ let(:resources) { Resources.new }
12
+
13
+ describe '#get_resource' do
14
+ it 'loads the correct YAML file' do
15
+ stub(File).read(File.join(TwitterCldr::RESOURCES_DIR, 'shared/currencies.yml')) { "---\n- 1\n- 2\n" }
16
+ resources.get_resource(:shared, :currencies).should == [1, 2]
17
+ end
14
18
 
15
- describe "#resource_for" do
16
- it "loads the requested resource from disk only once" do
17
- # note that it should convert the string "de" into a symbol
18
- mock(@resource).data_for(:de, "racehorse").once { "german racehorse resource" }
19
+ it 'loads the resource only once' do
20
+ mock(resources).load_resource('shared/currencies.yml').once { 'foo-bar-baz' }
19
21
 
20
- # do it twice - the second one shouldn't call data_for
21
- @resource.resource_for("de", "racehorse").should == "german racehorse resource"
22
- @resource.resource_for("de", "racehorse").should == "german racehorse resource"
22
+ result = resources.get_resource(:shared, :currencies)
23
+ # second time load_resource is not called but we get the same object as before
24
+ resources.get_resource(:shared, :currencies).object_id.should == result.object_id
25
+ end
26
+
27
+ it 'accepts a variable length resource path both in symbols and strings' do
28
+ stub(resources).load_resource('foo/bar/baz.yml') { 'foo-bar-baz' }
29
+ resources.get_resource('foo', :bar, 'baz').should == 'foo-bar-baz'
30
+ end
31
+
32
+ it 'raises an exception if resource file is missing' do
33
+ lambda { resources.get_resource(:foo, :bar) }.should raise_error(ArgumentError, "Resource 'foo/bar.yml' not found.")
23
34
  end
24
35
  end
25
36
 
26
- describe "#data_for" do
27
- it "loads the correct file for the given locale and resource" do
28
- mock(YAML).load("data") { { "key" => "value" } }
29
- mock(File).read(File.join(File.dirname(File.dirname(File.dirname(File.expand_path(__FILE__)))), "resources", "de", "racehorse.yml")) { "data" }
30
- @resource.resource_for("de", "racehorse").should == { :key => "value" }
37
+ describe '#get_locale_resource' do
38
+ it 'load the correct locale resource file' do
39
+ stub(resources).get_resource(:locales, :de, :numbers) { 'foo' }
40
+ resources.get_locale_resource(:de, :numbers).should == 'foo'
41
+ end
42
+
43
+ it 'converts locales' do
44
+ mock(TwitterCldr).convert_locale('zh-tw') { :'zh-Hant' }
45
+ mock(resources).get_resource(:locales, :'zh-Hant', :numbers) { 'foo' }
46
+
47
+ resources.get_locale_resource('zh-tw', :numbers).should == 'foo'
31
48
  end
32
49
  end
50
+
33
51
  end