twitter_cldr 1.7.0 → 1.8.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (76) hide show
  1. data/History.txt +6 -0
  2. data/README.md +61 -5
  3. data/Rakefile +64 -60
  4. data/js/lib/twitter_cldr_js.rb +0 -2
  5. data/lib/twitter_cldr/core_ext.rb +12 -12
  6. data/lib/twitter_cldr/formatters/calendars/timespan_formatter.rb +13 -11
  7. data/lib/twitter_cldr/localized/localized_array.rb +33 -0
  8. data/lib/twitter_cldr/localized/localized_date.rb +23 -0
  9. data/lib/twitter_cldr/localized/localized_datetime.rb +63 -0
  10. data/lib/twitter_cldr/localized/localized_number.rb +50 -0
  11. data/lib/twitter_cldr/localized/localized_object.rb +38 -0
  12. data/lib/twitter_cldr/localized/localized_string.rb +41 -0
  13. data/lib/twitter_cldr/localized/localized_symbol.rb +20 -0
  14. data/lib/twitter_cldr/localized/localized_time.rb +23 -0
  15. data/lib/twitter_cldr/localized/localized_timespan.rb +26 -0
  16. data/lib/twitter_cldr/localized.rb +18 -0
  17. data/lib/twitter_cldr/normalization.rb +23 -0
  18. data/lib/twitter_cldr/resources/{tries_dumper.rb → collation_tries_dumper.rb} +1 -1
  19. data/lib/twitter_cldr/resources/composition_exclusions_importer.rb +1 -1
  20. data/lib/twitter_cldr/resources/language_codes_importer.rb +232 -0
  21. data/lib/twitter_cldr/resources/locales_resources_importer.rb +1 -1
  22. data/lib/twitter_cldr/resources/phone_codes_importer.rb +1 -1
  23. data/lib/twitter_cldr/resources/postal_codes_importer.rb +1 -1
  24. data/lib/twitter_cldr/resources/tailoring_importer.rb +12 -3
  25. data/lib/twitter_cldr/resources/unicode_data_importer.rb +3 -1
  26. data/lib/twitter_cldr/resources.rb +2 -1
  27. data/lib/twitter_cldr/shared/calendar.rb +2 -6
  28. data/lib/twitter_cldr/shared/language_codes.rb +75 -0
  29. data/lib/twitter_cldr/shared/languages.rb +4 -11
  30. data/lib/twitter_cldr/shared.rb +8 -7
  31. data/lib/twitter_cldr/tokenizers/base.rb +2 -8
  32. data/lib/twitter_cldr/utils.rb +8 -0
  33. data/lib/twitter_cldr/version.rb +1 -1
  34. data/lib/twitter_cldr.rb +5 -4
  35. data/resources/custom/locales/cs/units.yml +3 -3
  36. data/resources/custom/locales/pl/units.yml +4 -4
  37. data/resources/custom/locales/pt/units.yml +2 -2
  38. data/resources/shared/language_codes_table.dump +0 -0
  39. data/spec/core_ext_spec.rb +19 -0
  40. data/spec/{core_ext/array_spec.rb → localized/localized_array_spec.rb} +1 -1
  41. data/spec/{core_ext/calendars/date_spec.rb → localized/localized_date_spec.rb} +24 -44
  42. data/spec/localized/localized_datetime_spec.rb +81 -0
  43. data/spec/{core_ext/numbers → localized}/localized_number_spec.rb +34 -1
  44. data/spec/localized/localized_object_spec.rb +89 -0
  45. data/spec/{core_ext/string_spec.rb → localized/localized_string_spec.rb} +16 -33
  46. data/spec/{core_ext/symbol_spec.rb → localized/localized_symbol_spec.rb} +3 -1
  47. data/spec/localized/localized_time_spec.rb +70 -0
  48. data/spec/normalization_spec.rb +42 -0
  49. data/spec/readme_spec.rb +51 -5
  50. data/spec/shared/language_codes_spec.rb +161 -0
  51. data/spec/shared/phone_codes_spec.rb +2 -2
  52. data/spec/shared/postal_codes_spec.rb +2 -2
  53. data/spec/spec_helper.rb +2 -0
  54. data/spec/tokenizers/base_spec.rb +15 -6
  55. data/spec/utils_spec.rb +18 -2
  56. data/twitter_cldr.gemspec +2 -1
  57. metadata +28 -44
  58. data/lib/twitter_cldr/core_ext/array.rb +0 -35
  59. data/lib/twitter_cldr/core_ext/calendars/date.rb +0 -25
  60. data/lib/twitter_cldr/core_ext/calendars/datetime.rb +0 -65
  61. data/lib/twitter_cldr/core_ext/calendars/time.rb +0 -25
  62. data/lib/twitter_cldr/core_ext/calendars/timespan.rb +0 -24
  63. data/lib/twitter_cldr/core_ext/localized_object.rb +0 -25
  64. data/lib/twitter_cldr/core_ext/numbers/bignum.rb +0 -8
  65. data/lib/twitter_cldr/core_ext/numbers/fixnum.rb +0 -8
  66. data/lib/twitter_cldr/core_ext/numbers/float.rb +0 -8
  67. data/lib/twitter_cldr/core_ext/numbers/localized_number.rb +0 -54
  68. data/lib/twitter_cldr/core_ext/string.rb +0 -51
  69. data/lib/twitter_cldr/core_ext/symbol.rb +0 -22
  70. data/spec/core_ext/calendars/datetime_spec.rb +0 -90
  71. data/spec/core_ext/calendars/time_spec.rb +0 -90
  72. data/spec/core_ext/calendars_spec.rb +0 -34
  73. data/spec/core_ext/numbers/bignum_spec.rb +0 -25
  74. data/spec/core_ext/numbers/fixnum_spec.rb +0 -25
  75. data/spec/core_ext/numbers/float_spec.rb +0 -25
  76. data/spec/core_ext/numbers_spec.rb +0 -39
@@ -0,0 +1,81 @@
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::Localized
9
+
10
+ describe LocalizedDateTime do
11
+
12
+ let(:date_time) { DateTime.new(1987, 9, 20, 22, 5) }
13
+
14
+ describe '#initilize' do
15
+ it 'sets calendar type' do
16
+ date_time.localize(:th, :calendar_type => :buddhist).calendar_type.should == :buddhist
17
+ end
18
+
19
+ it 'uses default calendar type' do
20
+ date_time.localize(:en).calendar_type.should == TwitterCldr::DEFAULT_CALENDAR_TYPE
21
+ end
22
+ end
23
+
24
+ describe "stringify" do
25
+ it "should stringify with a default calendar" do
26
+ #date_time.localize(:th, :calendar_type => :buddhist).to_full_s # It doesn't support era
27
+ date_time.localize(:th).to_long_s
28
+ date_time.localize(:th).to_medium_s
29
+ date_time.localize(:th).to_short_s
30
+ end
31
+
32
+ it "should stringify with buddhist calendar" do
33
+ # Ensure that buddhist calendar data is present in th locale.
34
+ TwitterCldr.get_locale_resource(:th, :calendars)[:th][:calendars][:buddhist].should_not(
35
+ be_nil, 'buddhist calendar is missing for :th locale (check resources/locales/th/calendars.yml)'
36
+ )
37
+
38
+ #date_time.localize(:th, :calendar_type => :buddhist).to_full_s # It doesn't support era
39
+ date_time.localize(:th, :calendar_type => :buddhist).to_long_s
40
+ date_time.localize(:th, :calendar_type => :buddhist).to_medium_s
41
+ date_time.localize(:th, :calendar_type => :buddhist).to_short_s
42
+ end
43
+ end
44
+
45
+ describe "#to_date" do
46
+ it "should convert to a date" do
47
+ date_time.localize.to_date.base_obj.strftime("%Y-%m-%d").should == "1987-09-20"
48
+ end
49
+
50
+ it 'forwards calendar type' do
51
+ date_time.localize(:th, :calendar_type => :buddhist).to_date.calendar_type == :buddhist
52
+ end
53
+ end
54
+
55
+ describe "#to_time" do
56
+ it "should convert to a time" do
57
+ date_time.localize.to_time.base_obj.getgm.strftime("%H:%M:%S").should == "22:05:00"
58
+ end
59
+
60
+ it 'forwards calendar type' do
61
+ date_time.localize(:th, :calendar_type => :buddhist).to_time.calendar_type == :buddhist
62
+ end
63
+ end
64
+
65
+ describe "#to_timespan" do
66
+ it "should return a localized timespan with a direction of :none" do
67
+ date_time.localize.to_timespan.formatter.instance_variable_get(:'@direction').should == :none
68
+ end
69
+ end
70
+
71
+ describe 'formatters' do
72
+ it "don't raise errors for any locale" do
73
+ TwitterCldr.supported_locales.each do |locale|
74
+ TwitterCldr::Tokenizers::DateTimeTokenizer::VALID_TYPES.each do |type|
75
+ lambda { DateTime.now.localize(locale).send(:"to_#{type}_s") }.should_not raise_error
76
+ end
77
+ end
78
+ end
79
+ end
80
+
81
+ end
@@ -8,6 +8,7 @@ require 'spec_helper'
8
8
  include TwitterCldr
9
9
 
10
10
  describe LocalizedNumber do
11
+
11
12
  describe '#initialize' do
12
13
  let(:decimal) { LocalizedNumber.new(10, :en) }
13
14
  let(:currency) { LocalizedNumber.new(10, :en, :type => :currency) }
@@ -58,7 +59,7 @@ describe LocalizedNumber do
58
59
 
59
60
  it 'creates a new object with the same base object and locale' do
60
61
  percent = LocalizedNumber.new(42, :fr, :type => :percent)
61
- mock.proxy(TwitterCldr::LocalizedNumber).new(42, :fr, :type => type)
62
+ mock.proxy(TwitterCldr::Localized::LocalizedNumber).new(42, :fr, :type => type)
62
63
  percent.send(method)
63
64
  end
64
65
  end
@@ -123,4 +124,36 @@ describe LocalizedNumber do
123
124
  5.localize.plural_rule.should == :other
124
125
  end
125
126
  end
127
+
128
+ describe 'formatters for every locale' do
129
+ it "makes sure currency formatters for every locale don't raise errors" do
130
+ TwitterCldr.supported_locales.each do |locale|
131
+ lambda { 1337.localize(locale).to_currency.to_s }.should_not raise_error
132
+ lambda { 1337.localize(locale).to_currency.to_s(:precision => 3) }.should_not raise_error
133
+ lambda { 1337.localize(locale).to_currency.to_s(:precision => 3, :currency => "EUR") }.should_not raise_error
134
+ end
135
+ end
136
+
137
+ it "makes sure decimal formatters for every locale don't raise errors" do
138
+ TwitterCldr.supported_locales.each do |locale|
139
+ lambda { 1337.localize(locale).to_decimal.to_s }.should_not raise_error
140
+ lambda { 1337.localize(locale).to_decimal.to_s(:precision => 3) }.should_not raise_error
141
+ end
142
+ end
143
+
144
+ it "makes sure percentage formatters for every locale don't raise errors" do
145
+ TwitterCldr.supported_locales.each do |locale|
146
+ lambda { 1337.localize(locale).to_percent.to_s }.should_not raise_error
147
+ lambda { 1337.localize(locale).to_percent.to_s(:precision => 3) }.should_not raise_error
148
+ end
149
+ end
150
+
151
+ it "makes sure basic number formatters for every locale don't raise errors" do
152
+ TwitterCldr.supported_locales.each do |locale|
153
+ lambda { 1337.localize(locale).to_s }.should_not raise_error
154
+ lambda { 1337.localize(locale).to_s(:precision => 3) }.should_not raise_error
155
+ end
156
+ end
157
+ end
158
+
126
159
  end
@@ -0,0 +1,89 @@
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::Localized
9
+
10
+ describe LocalizedObject do
11
+
12
+ class LocalizedFormatter
13
+ def initialize(options); end
14
+ end
15
+
16
+ class LocalizedClass < LocalizedObject
17
+ def formatter_const
18
+ LocalizedFormatter
19
+ end
20
+ end
21
+
22
+ describe '#initialize' do
23
+ let(:base_object) { 'base-object' }
24
+ let(:locale) { :fr }
25
+ let(:localized_object) { LocalizedClass.new(base_object, locale) }
26
+ let(:options) { { :foobar => 'value' } }
27
+
28
+ it 'sets base object' do
29
+ localized_object.base_obj.should == base_object
30
+ end
31
+
32
+ it 'sets locale' do
33
+ localized_object.locale.should == locale
34
+ end
35
+
36
+ it 'converts locale' do
37
+ LocalizedClass.new(base_object, :msa).locale.should == :ms
38
+ end
39
+
40
+ it 'falls back to default locale if unsupported locale is passed' do
41
+ LocalizedClass.new(base_object, :foobar).locale.should == TwitterCldr::DEFAULT_LOCALE
42
+ end
43
+
44
+ it 'passes options (including locale) to formatter' do
45
+ mock(LocalizedFormatter).new(options.merge(:locale => locale))
46
+ LocalizedClass.new(base_object, locale, options)
47
+ end
48
+
49
+ it "doesn't change original options hash" do
50
+ lambda { LocalizedClass.new(base_object, locale, options) }.should_not change { options }
51
+ end
52
+ end
53
+
54
+ describe '.localize' do
55
+ it 'defines #localize method on a class' do
56
+ some_class = Class.new
57
+
58
+ some_class.new.should_not respond_to(:localize)
59
+ LocalizedClass.localize(some_class)
60
+ some_class.new.should respond_to(:localize)
61
+ end
62
+ end
63
+
64
+ describe '#localize' do
65
+ let(:locale) { :ru }
66
+ let(:options) { { :option => 'value' } }
67
+
68
+ let(:localizable_object) do
69
+ some_class = Class.new
70
+ LocalizedClass.localize(some_class)
71
+ some_class.new
72
+ end
73
+
74
+ it 'returns localized object' do
75
+ localizable_object.localize.should be_a(LocalizedClass)
76
+ end
77
+
78
+ it 'accepts locale and options and pass them to the localized class constructor' do
79
+ mock(LocalizedClass).new(localizable_object, locale, options)
80
+ localizable_object.localize(locale, options)
81
+ end
82
+
83
+ it 'uses default locale and empty options hash by default' do
84
+ mock(LocalizedClass).new(localizable_object, TwitterCldr.get_locale, {})
85
+ localizable_object.localize
86
+ end
87
+ end
88
+
89
+ end
@@ -5,26 +5,7 @@
5
5
 
6
6
  require 'spec_helper'
7
7
 
8
- include TwitterCldr
9
-
10
- describe String do
11
-
12
- describe '#localize' do
13
- it 'returns localized string object' do
14
- 'foo'.localize.should be_a(LocalizedString)
15
- end
16
-
17
- it "uses default locale if it's not explicitly specified" do
18
- mock(TwitterCldr).get_locale { :ja }
19
- 'foo'.localize.locale.should == :ja
20
- end
21
-
22
- it 'uses provided locale if there is one' do
23
- 'foo'.localize(:ru).locale.should == :ru
24
- end
25
- end
26
-
27
- end
8
+ include TwitterCldr::Localized
28
9
 
29
10
  describe LocalizedString do
30
11
  describe '#%' do
@@ -110,24 +91,26 @@ describe LocalizedString do
110
91
  end
111
92
 
112
93
  describe "#normalize" do
113
- it "returns a normalized instance of LocalizedString, defaults to NFD" do
114
- mock.proxy(TwitterCldr::Normalization::NFD).normalize("español")
115
- "español".bytes.to_a.should == [101, 115, 112, 97, 195, 177, 111, 108]
116
- result = "español".localize.normalize
117
- result.should be_a(LocalizedString)
118
- result.to_s.bytes.to_a.should == [101, 115, 112, 97, 110, 204, 131, 111, 108]
94
+ let(:string) { 'string' }
95
+ let(:normalized_string) { 'normalized' }
96
+ let(:localized_string) { string.localize }
97
+
98
+ it 'returns a LocalizedString' do
99
+ localized_string.normalize.should be_an_instance_of(LocalizedString)
100
+ end
101
+
102
+ it 'it uses NFD by default' do
103
+ mock(TwitterCldr::Normalization::NFD).normalize(string) { normalized_string }
104
+ localized_string.normalize.base_obj.should == normalized_string
119
105
  end
120
106
 
121
- it "returns a normalized instance of LocalizedString using the specified algorithm" do
122
- mock.proxy(TwitterCldr::Normalization::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]
107
+ it "uses specified algorithm if there is any" do
108
+ mock(TwitterCldr::Normalization::NFKD).normalize(string) { normalized_string }
109
+ localized_string.normalize(:using => :NFKD).base_obj.should == normalized_string
127
110
  end
128
111
 
129
112
  it "raises an ArgumentError if passed an unsupported normalization form" do
130
- lambda { "español".localize.normalize(:using => :blarg) }.should raise_error(ArgumentError)
113
+ lambda { localized_string.normalize(:using => :blarg) }.should raise_error(ArgumentError)
131
114
  end
132
115
  end
133
116
 
@@ -5,9 +5,10 @@
5
5
 
6
6
  require 'spec_helper'
7
7
 
8
- include TwitterCldr
8
+ include TwitterCldr::Localized
9
9
 
10
10
  describe LocalizedSymbol do
11
+
11
12
  describe "#as_language_code" do
12
13
  it "returns the correct localized language from the symbol" do
13
14
  :es.localize.as_language_code.should == "Spanish"
@@ -26,4 +27,5 @@ describe LocalizedSymbol do
26
27
  :'zh'.localize.as_language_code.should == "Chinese"
27
28
  end
28
29
  end
30
+
29
31
  end
@@ -0,0 +1,70 @@
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::Localized
9
+
10
+ describe LocalizedTime do
11
+ let(:time) { Time.now }
12
+
13
+ describe "stringify" do
14
+ it "should stringify with a default calendar" do
15
+ #time.localize(:th, :calendar_type => :buddhist).to_full_s # It doesn't support era
16
+ time.localize(:th).to_long_s
17
+ time.localize(:th).to_medium_s
18
+ time.localize(:th).to_short_s
19
+ end
20
+
21
+ it "should stringify with buddhist calendar" do
22
+ # Ensure that buddhist calendar data is present in th locale.
23
+ TwitterCldr.get_locale_resource(:th, :calendars)[:th][:calendars][:buddhist].should_not(
24
+ be_nil, 'buddhist calendar is missing for :th locale (check resources/locales/th/calendars.yml)'
25
+ )
26
+
27
+ #time.localize(:th, :calendar_type => :buddhist).to_full_s # It doesn't support era
28
+ time.localize(:th, :calendar_type => :buddhist).to_long_s
29
+ time.localize(:th, :calendar_type => :buddhist).to_medium_s
30
+ time.localize(:th, :calendar_type => :buddhist).to_short_s
31
+ end
32
+ end
33
+
34
+ describe "#ago" do
35
+ it "should ago-ify a time with a number of different units" do
36
+ base_time = time + 172800
37
+ loc_time = time.localize(:de)
38
+ loc_time.ago(:base_time => base_time).to_s(:unit => :hour).should match_normalized("Vor 48 Stunden")
39
+ loc_time.ago(:base_time => base_time).to_s(:unit => :day).should match_normalized("Vor 2 Tagen")
40
+ end
41
+ end
42
+
43
+ describe "#to_datetime" do
44
+ it "should combine a date and a time object into a datetime" do
45
+ date = Date.new(1987, 9, 20)
46
+ time = Time.local(2000, 5, 12, 22, 5)
47
+ datetime = time.localize.to_datetime(date)
48
+ datetime.should be_a(LocalizedDateTime)
49
+ datetime.base_obj.strftime("%Y-%m-%d %H:%M:%S").should == "1987-09-20 22:05:00"
50
+ end
51
+
52
+ it "should work with an instance of LocalizedDate too" do
53
+ date = Date.new(1987, 9, 20).localize
54
+ time = Time.local(2000, 5, 12, 22, 5)
55
+ datetime = time.localize.to_datetime(date)
56
+ datetime.should be_a(LocalizedDateTime)
57
+ datetime.base_obj.strftime("%Y-%m-%d %H:%M:%S").should == "1987-09-20 22:05:00"
58
+ end
59
+ end
60
+
61
+ describe 'formatters' do
62
+ it "don't raise errors for any locale" do
63
+ TwitterCldr.supported_locales.each do |locale|
64
+ TwitterCldr::Tokenizers::DateTimeTokenizer::VALID_TYPES.each do |type|
65
+ lambda { Time.now.localize(locale).send(:"to_#{type}_s") }.should_not raise_error
66
+ end
67
+ end
68
+ end
69
+ end
70
+ end
@@ -0,0 +1,42 @@
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
9
+
10
+ describe TwitterCldr::Normalization do
11
+
12
+ describe "#normalize" do
13
+ let(:string) { 'string' }
14
+ let(:normalized_string) { 'normalized' }
15
+
16
+ it 'it uses NFD by default' do
17
+ mock(TwitterCldr::Normalization::NFD).normalize(string) { normalized_string }
18
+ Normalization.normalize(string).should == normalized_string
19
+ end
20
+
21
+ it "uses specified algorithm if there is any" do
22
+ mock(TwitterCldr::Normalization::NFKD).normalize(string) { normalized_string }
23
+ Normalization.normalize(string, :using => :NFKD).should == normalized_string
24
+ end
25
+
26
+ it "raises an ArgumentError if passed an unsupported normalizer name" do
27
+ lambda { Normalization.normalize(string, :using => :blarg) }.should raise_error(ArgumentError)
28
+ end
29
+
30
+ it 'accepts normalizer name in a lower case' do
31
+ mock(TwitterCldr::Normalization::NFKD).normalize(string) { normalized_string }
32
+ Normalization.normalize(string, :using => :nfkd).should == normalized_string
33
+ end
34
+
35
+ it 'accepts a string' do
36
+ mock(TwitterCldr::Normalization::NFKD).normalize(string) { normalized_string }
37
+ Normalization.normalize(string, :using => 'NFKD').should == normalized_string
38
+ end
39
+
40
+ end
41
+
42
+ end
data/spec/readme_spec.rb CHANGED
@@ -31,7 +31,7 @@ describe "README" do
31
31
  1337.localize(:es).to_percent.to_s(:precision => 2).should == "1.337,00%"
32
32
  1337.localize(:es).to_decimal.to_s(:precision => 3).should == "1.337,000"
33
33
 
34
- num = TwitterCldr::LocalizedNumber.new(1337, :es)
34
+ num = TwitterCldr::Localized::LocalizedNumber.new(1337, :es)
35
35
  spaces(num.to_currency.to_s).should == "1.337,00 $"
36
36
  end
37
37
 
@@ -70,7 +70,7 @@ describe "README" do
70
70
  time.localize(:es).to_medium_s.should == "21:44:57"
71
71
  time.localize(:es).to_short_s.should == "21:44"
72
72
 
73
- dt = TwitterCldr::LocalizedDateTime.new(date_time, :es)
73
+ dt = TwitterCldr::Localized::LocalizedDateTime.new(date_time, :es)
74
74
  dt.to_short_s.should == "12/12/11 21:44"
75
75
  end
76
76
 
@@ -90,11 +90,11 @@ describe "README" do
90
90
  # 86400 = 1 day in seconds, 259200 = 3 days in seconds
91
91
  (Time.now + 86400).localize(:de).ago(:base_time => (Time.now + 259200)).to_s(:unit => :hour).should match_normalized("Vor 48 Stunden")
92
92
 
93
- ts = TwitterCldr::LocalizedTimespan.new(86400, :locale => :de)
93
+ ts = TwitterCldr::Localized::LocalizedTimespan.new(86400, :locale => :de)
94
94
  ts.to_s.should match_normalized("In 1 Tag")
95
95
  ts.to_s(:unit => :hour).should match_normalized("In 24 Stunden")
96
96
 
97
- ts = TwitterCldr::LocalizedTimespan.new(-86400, :locale => :de)
97
+ ts = TwitterCldr::Localized::LocalizedTimespan.new(-86400, :locale => :de)
98
98
  ts.to_s.should match_normalized("Vor 1 Tag")
99
99
  ts.to_s(:unit => :hour).should match_normalized("Vor 24 Stunden")
100
100
  end
@@ -140,10 +140,56 @@ describe "README" do
140
140
  end
141
141
  end
142
142
 
143
+ it "verifies language code conversion" do
144
+ TwitterCldr::Shared::LanguageCodes.convert(:es, :from => :bcp_47, :to => :iso_639_2).should == :spa
145
+
146
+ expected = [:bcp_47, :iso_639_1, :iso_639_2, :iso_639_3]
147
+ actual = TwitterCldr::Shared::LanguageCodes.standards_for(:es, :bcp_47)
148
+ expected.size.should == actual.size
149
+ actual.each { |standard| expected.should include(standard) }
150
+
151
+ expected = [:bcp_47, :iso_639_1, :iso_639_2, :iso_639_3]
152
+ actual = TwitterCldr::Shared::LanguageCodes.standards_for_language(:Spanish)
153
+ expected.size.should == actual.size
154
+ actual.each { |standard| expected.should include(standard) }
155
+
156
+ TwitterCldr::Shared::LanguageCodes.languages.should include(:Spanish)
157
+
158
+ TwitterCldr::Shared::LanguageCodes.valid_standard?(:iso_639_1).should be_true
159
+ TwitterCldr::Shared::LanguageCodes.valid_standard?(:blarg).should be_false
160
+
161
+ TwitterCldr::Shared::LanguageCodes.valid_code?(:es, :bcp_47).should be_true
162
+ TwitterCldr::Shared::LanguageCodes.valid_code?(:es, :iso_639_2).should be_false
163
+
164
+ TwitterCldr::Shared::LanguageCodes.from_language(:Spanish, :iso_639_2).should == :spa
165
+
166
+ TwitterCldr::Shared::LanguageCodes.to_language(:spa, :iso_639_2).should == "Spanish"
167
+ end
168
+
169
+ it "verifies postal code validations" do
170
+ TwitterCldr::Shared::PostalCodes.valid?(:us, "94103").should be_true
171
+ TwitterCldr::Shared::PostalCodes.valid?(:us, "9410").should be_false
172
+ TwitterCldr::Shared::PostalCodes.valid?(:gb, "BS98 1TL").should be_true
173
+ TwitterCldr::Shared::PostalCodes.valid?(:se, "280 12").should be_true
174
+ TwitterCldr::Shared::PostalCodes.valid?(:ca, "V3H 1Z7").should be_true
175
+
176
+ TwitterCldr::Shared::PostalCodes.territories.should include(:gb)
177
+
178
+ TwitterCldr::Shared::PostalCodes.regex_for_territory(:us).should == /\d{5}([ \-]\d{4})?/
179
+ end
180
+
181
+ it "verifies phone codes" do
182
+ TwitterCldr::Shared::PhoneCodes.code_for_territory(:us).should == "1"
183
+ TwitterCldr::Shared::PhoneCodes.code_for_territory(:pe).should == "51"
184
+ TwitterCldr::Shared::PhoneCodes.code_for_territory(:eg).should == "20"
185
+ TwitterCldr::Shared::PhoneCodes.code_for_territory(:dk).should == "45"
186
+ TwitterCldr::Shared::PhoneCodes.territories.should include(:pe)
187
+ end
188
+
143
189
  it "verifies world languages" do
144
190
  :es.localize(:es).as_language_code.should == "español"
145
191
  :ru.localize(:es).as_language_code.should == "ruso"
146
- ls = TwitterCldr::LocalizedSymbol.new(:ru, :es)
192
+ ls = TwitterCldr::Localized::LocalizedSymbol.new(:ru, :es)
147
193
  ls.as_language_code.should == "ruso"
148
194
  end
149
195