twitter_cldr 3.0.1 → 3.0.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Gemfile +4 -2
- data/History.txt +4 -0
- data/README.md +17 -6
- data/lib/twitter_cldr/resources/postal_codes_importer.rb +12 -1
- data/lib/twitter_cldr/resources/regexp_ast_generator.rb +41 -0
- data/lib/twitter_cldr/resources.rb +1 -0
- data/lib/twitter_cldr/shared/postal_code_generator.rb +50 -0
- data/lib/twitter_cldr/shared/postal_codes.rb +48 -9
- data/lib/twitter_cldr/shared.rb +15 -14
- data/lib/twitter_cldr/utils/regexp_ast.rb +115 -0
- data/lib/twitter_cldr/utils/regexp_sampler.rb +149 -0
- data/lib/twitter_cldr/utils.rb +5 -3
- data/lib/twitter_cldr/version.rb +1 -1
- data/resources/shared/postal_codes.yml +1442 -159
- data/spec/bidi/bidi_spec.rb +1 -1
- data/spec/collation/collation_spec.rb +1 -1
- data/spec/collation/collator_spec.rb +31 -31
- data/spec/collation/implicit_collation_elements_spec.rb +6 -6
- data/spec/collation/sort_key_builder_spec.rb +28 -26
- data/spec/collation/tailoring_spec.rb +1 -1
- data/spec/collation/trie_builder_spec.rb +16 -16
- data/spec/collation/trie_dumps_spec.rb +2 -2
- data/spec/collation/trie_loader_spec.rb +8 -8
- data/spec/collation/trie_spec.rb +61 -61
- data/spec/collation/trie_with_fallback_spec.rb +5 -5
- data/spec/core_ext_spec.rb +1 -1
- data/spec/data_readers/additional_date_format_selector_spec.rb +38 -38
- data/spec/data_readers/date_time_data_reader_spec.rb +2 -2
- data/spec/data_readers/number_data_reader_spec.rb +1 -1
- data/spec/formatters/calendars/datetime_formatter_spec.rb +218 -218
- data/spec/formatters/list_formatter_spec.rb +8 -8
- data/spec/formatters/numbers/abbreviated/abbreviated_number_formatter_spec.rb +14 -14
- data/spec/formatters/numbers/abbreviated/long_decimal_formatter_spec.rb +4 -4
- data/spec/formatters/numbers/abbreviated/short_decimal_formatter_spec.rb +4 -4
- data/spec/formatters/numbers/currency_formatter_spec.rb +11 -11
- data/spec/formatters/numbers/decimal_formatter_spec.rb +3 -3
- data/spec/formatters/numbers/helpers/fraction_spec.rb +3 -3
- data/spec/formatters/numbers/helpers/integer_spec.rb +16 -16
- data/spec/formatters/numbers/number_formatter_spec.rb +21 -21
- data/spec/formatters/numbers/percent_formatter_spec.rb +3 -3
- data/spec/formatters/numbers/rbnf/rbnf_spec.rb +2 -2
- data/spec/formatters/plurals/plural_formatter_spec.rb +41 -41
- data/spec/formatters/plurals/rules_spec.rb +13 -13
- data/spec/localized/localized_array_spec.rb +12 -12
- data/spec/localized/localized_date_spec.rb +33 -33
- data/spec/localized/localized_datetime_spec.rb +11 -11
- data/spec/localized/localized_hash_spec.rb +4 -4
- data/spec/localized/localized_number_spec.rb +36 -36
- data/spec/localized/localized_object_spec.rb +8 -8
- data/spec/localized/localized_string_spec.rb +53 -53
- data/spec/localized/localized_symbol_spec.rb +9 -9
- data/spec/localized/localized_time_spec.rb +10 -10
- data/spec/localized/localized_timespan_spec.rb +8 -8
- data/spec/normalization_spec.rb +6 -6
- data/spec/parsers/number_parser_spec.rb +36 -36
- data/spec/parsers/parser_spec.rb +5 -5
- data/spec/parsers/segmentation_parser_spec.rb +19 -19
- data/spec/parsers/symbol_table_spec.rb +4 -4
- data/spec/parsers/unicode_regex/character_class_spec.rb +19 -19
- data/spec/parsers/unicode_regex/character_range_spec.rb +1 -1
- data/spec/parsers/unicode_regex/character_set_spec.rb +8 -8
- data/spec/parsers/unicode_regex/literal_spec.rb +5 -5
- data/spec/parsers/unicode_regex/unicode_string_spec.rb +2 -2
- data/spec/parsers/unicode_regex_parser_spec.rb +28 -28
- data/spec/resources/loader_spec.rb +32 -32
- data/spec/shared/break_iterator_spec.rb +13 -13
- data/spec/shared/calendar_spec.rb +59 -59
- data/spec/shared/casefolder_spec.rb +5 -5
- data/spec/shared/code_point_spec.rb +46 -46
- data/spec/shared/currencies_spec.rb +7 -7
- data/spec/shared/language_codes_spec.rb +34 -34
- data/spec/shared/languages_spec.rb +30 -30
- data/spec/shared/numbering_system_spec.rb +7 -7
- data/spec/shared/numbers_spec.rb +4 -4
- data/spec/shared/phone_codes_spec.rb +7 -7
- data/spec/shared/postal_code_generator_spec.rb +76 -0
- data/spec/shared/postal_codes_spec.rb +35 -29
- data/spec/shared/territories_spec.rb +40 -40
- data/spec/shared/unicode_regex_spec.rb +71 -71
- data/spec/spec_helper.rb +2 -2
- data/spec/tokenizers/calendars/date_tokenizer_spec.rb +1 -1
- data/spec/tokenizers/calendars/timespan_tokenizer_spec.rb +6 -6
- data/spec/tokenizers/composite_token_spec.rb +3 -3
- data/spec/tokenizers/token_spec.rb +3 -3
- data/spec/twitter_cldr_spec.rb +72 -72
- data/spec/utils/code_points_spec.rb +10 -10
- data/spec/utils/interpolation_spec.rb +32 -32
- data/spec/utils/range_set_spec.rb +36 -36
- data/spec/utils/regexp_ast_spec.rb +44 -0
- data/spec/utils/regexp_sampler_spec.rb +182 -0
- data/spec/utils/yaml/yaml_spec.rb +23 -23
- data/spec/utils_spec.rb +19 -19
- metadata +263 -258
@@ -23,64 +23,64 @@ describe UnicodeRegexParser do
|
|
23
23
|
describe "#parse" do
|
24
24
|
it "identifies ranges" do
|
25
25
|
elements = parse(tokenize("[a-z]"))
|
26
|
-
elements.first.
|
26
|
+
expect(elements.first).to be_a(UnicodeRegexParser::CharacterClass)
|
27
27
|
root = elements.first.send(:root)
|
28
|
-
root.
|
29
|
-
root.initial.codepoints.
|
30
|
-
root.final.codepoints.
|
28
|
+
expect(root).to be_a(UnicodeRegexParser::CharacterRange)
|
29
|
+
expect(root.initial.codepoints).to eq("a".unpack("U*"))
|
30
|
+
expect(root.final.codepoints).to eq("z".unpack("U*"))
|
31
31
|
end
|
32
32
|
|
33
33
|
it "replaces variables" do
|
34
34
|
symbol_table = SymbolTable.new("$VAR" => tokenize("\\p{L}"))
|
35
35
|
elements = parse(tokenize("($VAR)?"), :symbol_table => symbol_table)
|
36
|
-
elements[1].
|
37
|
-
elements[1].property_value.
|
36
|
+
expect(elements[1]).to be_a(UnicodeRegexParser::CharacterSet)
|
37
|
+
expect(elements[1].property_value).to eq("L")
|
38
38
|
end
|
39
39
|
|
40
40
|
it "handles character and negated character sets" do
|
41
41
|
elements = parse(tokenize("\\p{L}[:^P:]\\P{L}[:P:]"))
|
42
42
|
|
43
43
|
element = elements[0]
|
44
|
-
element.
|
45
|
-
element.property_value.
|
44
|
+
expect(element).to be_a(UnicodeRegexParser::CharacterSet)
|
45
|
+
expect(element.property_value).to eq("L")
|
46
46
|
|
47
47
|
element = elements[1]
|
48
|
-
element.
|
49
|
-
element.send(:root).child.property_value.
|
50
|
-
element.send(:root).operator.
|
48
|
+
expect(element).to be_a(UnicodeRegexParser::CharacterClass)
|
49
|
+
expect(element.send(:root).child.property_value).to eq("P")
|
50
|
+
expect(element.send(:root).operator).to eq(:negate)
|
51
51
|
|
52
52
|
element = elements[2]
|
53
|
-
element.
|
54
|
-
element.send(:root).child.property_value.
|
53
|
+
expect(element).to be_a(UnicodeRegexParser::CharacterClass)
|
54
|
+
expect(element.send(:root).child.property_value).to eq("L")
|
55
55
|
|
56
56
|
element = elements[3]
|
57
|
-
element.
|
58
|
-
element.property_value.
|
57
|
+
expect(element).to be_a(UnicodeRegexParser::CharacterSet)
|
58
|
+
expect(element.property_value).to eq("P")
|
59
59
|
end
|
60
60
|
|
61
61
|
it "handles unicode characters" do
|
62
62
|
elements = parse(tokenize("\\u0123"))
|
63
|
-
elements[0].
|
64
|
-
elements[0].codepoints.
|
63
|
+
expect(elements[0]).to be_a(UnicodeRegexParser::UnicodeString)
|
64
|
+
expect(elements[0].codepoints).to eq([291])
|
65
65
|
end
|
66
66
|
|
67
67
|
it "handles multichar and escaped unicode strings" do
|
68
68
|
elements = parse(tokenize("\\g{abc}"))
|
69
|
-
elements[0].
|
70
|
-
elements[0].text.
|
71
|
-
elements[1].
|
72
|
-
elements[1].codepoints.
|
69
|
+
expect(elements[0]).to be_a(UnicodeRegexParser::Literal)
|
70
|
+
expect(elements[0].text).to eq("\\g")
|
71
|
+
expect(elements[1]).to be_a(UnicodeRegexParser::UnicodeString)
|
72
|
+
expect(elements[1].codepoints).to eq([97, 98, 99])
|
73
73
|
end
|
74
74
|
|
75
75
|
it "handles special chars" do
|
76
76
|
elements = parse(tokenize("^(?:)$"))
|
77
|
-
elements.each { |elem| elem.
|
78
|
-
elements[0].text.
|
79
|
-
elements[1].text.
|
80
|
-
elements[2].text.
|
81
|
-
elements[3].text.
|
82
|
-
elements[4].text.
|
83
|
-
elements[5].text.
|
77
|
+
elements.each { |elem| expect(elem).to be_a(UnicodeRegexParser::Literal) }
|
78
|
+
expect(elements[0].text).to eq("^")
|
79
|
+
expect(elements[1].text).to eq("(")
|
80
|
+
expect(elements[2].text).to eq("?")
|
81
|
+
expect(elements[3].text).to eq(":")
|
82
|
+
expect(elements[4].text).to eq(")")
|
83
|
+
expect(elements[5].text).to eq("$")
|
84
84
|
end
|
85
85
|
end
|
86
86
|
end
|
@@ -16,37 +16,37 @@ describe Loader do
|
|
16
16
|
|
17
17
|
it 'loads the correct YAML file' do
|
18
18
|
stub_resource_file(resource_path, "---\n- 1\n- 2\n")
|
19
|
-
loader.get_resource(:random, :resource).
|
19
|
+
expect(loader.get_resource(:random, :resource)).to eq([1, 2])
|
20
20
|
end
|
21
21
|
|
22
22
|
it 'symbolizes hash keys' do
|
23
23
|
stub_resource_file(resource_path, "---\n:a:\n :b: 3\n")
|
24
|
-
loader.get_resource(:random, :resource).
|
24
|
+
expect(loader.get_resource(:random, :resource)).to eq({ :a => { :b => 3 } })
|
25
25
|
end
|
26
26
|
|
27
27
|
it 'loads the resource only once' do
|
28
28
|
mock(loader).load_resource(resource_path).once { resource_content }
|
29
29
|
|
30
30
|
result = loader.get_resource(:random, :resource)
|
31
|
-
result.
|
31
|
+
expect(result).to eq(resource_content)
|
32
32
|
# second time load_resource is not called but we get the same object as before
|
33
|
-
loader.get_resource(:random, :resource).object_id.
|
33
|
+
expect(loader.get_resource(:random, :resource).object_id).to eq(result.object_id)
|
34
34
|
end
|
35
35
|
|
36
36
|
it 'accepts a variable length resource path both in symbols and strings' do
|
37
37
|
stub(loader).load_resource('foo/bar/baz.yml') { 'foo-bar-baz' }
|
38
|
-
loader.get_resource('foo', :bar, 'baz').
|
38
|
+
expect(loader.get_resource('foo', :bar, 'baz')).to eq('foo-bar-baz')
|
39
39
|
end
|
40
40
|
|
41
41
|
it 'raises an exception if resource file is missing' do
|
42
42
|
mock(File).file?(File.join(TwitterCldr::RESOURCES_DIR, 'foo/bar.yml')) { false }
|
43
|
-
|
43
|
+
expect { loader.get_resource(:foo, :bar) }.to raise_error(ArgumentError, "Resource 'foo/bar.yml' not found.")
|
44
44
|
end
|
45
45
|
|
46
46
|
context 'custom resources' do
|
47
47
|
it "doesn't merge the custom resource if it doesn't exist" do
|
48
48
|
mock(loader).read_resource_file('foo/bar.yml') { ":foo: bar" }
|
49
|
-
loader.get_resource(:foo, :bar).
|
49
|
+
expect(loader.get_resource(:foo, :bar)).to eq({ :foo => "bar" })
|
50
50
|
end
|
51
51
|
|
52
52
|
context 'with a custom resource' do
|
@@ -61,12 +61,12 @@ describe Loader do
|
|
61
61
|
mock.proxy(loader).load_resource("foo/bar.yml")
|
62
62
|
mock.proxy(loader).load_resource("custom/foo/bar.yml", false)
|
63
63
|
|
64
|
-
loader.get_resource(:foo, :bar).
|
64
|
+
expect(loader.get_resource(:foo, :bar)).to eq({ :foo => "bar", :bar => "baz" })
|
65
65
|
end
|
66
66
|
|
67
67
|
it 'does not merge the custom resource if custom resources are disabled' do
|
68
68
|
TwitterCldr.disable_custom_locale_resources = true
|
69
|
-
loader.get_resource(:foo, :bar).
|
69
|
+
expect(loader.get_resource(:foo, :bar)).to eq({ :foo => "bar" })
|
70
70
|
TwitterCldr.disable_custom_locale_resources = false
|
71
71
|
end
|
72
72
|
end
|
@@ -76,7 +76,7 @@ describe Loader do
|
|
76
76
|
describe '#get_locale_resource' do
|
77
77
|
it 'loads the correct locale resource file' do
|
78
78
|
stub(loader).get_resource(:locales, :de, :numbers) { 'foo' }
|
79
|
-
loader.get_locale_resource(:de, :numbers).
|
79
|
+
expect(loader.get_locale_resource(:de, :numbers)).to eq('foo')
|
80
80
|
end
|
81
81
|
|
82
82
|
it 'loads the resource only once' do
|
@@ -84,56 +84,56 @@ describe Loader do
|
|
84
84
|
|
85
85
|
result = loader.get_locale_resource(:de, :numbers)
|
86
86
|
# second time get_resource is not called but we get the same object as before
|
87
|
-
loader.get_locale_resource(:de, :numbers).object_id.
|
87
|
+
expect(loader.get_locale_resource(:de, :numbers).object_id).to eq(result.object_id)
|
88
88
|
end
|
89
89
|
|
90
90
|
it 'converts locales' do
|
91
91
|
mock(TwitterCldr).convert_locale('zh-tw') { :'zh-Hant' }
|
92
92
|
mock(loader).get_resource(:locales, :'zh-Hant', :numbers) { 'foo' }
|
93
93
|
|
94
|
-
loader.get_locale_resource('zh-tw', :numbers).
|
94
|
+
expect(loader.get_locale_resource('zh-tw', :numbers)).to eq('foo')
|
95
95
|
end
|
96
96
|
end
|
97
97
|
|
98
98
|
describe '#resource_loaded' do
|
99
99
|
it 'should return true if the resource is cached, false otherwise' do
|
100
100
|
loader.preload_resources_for_locale(:de, :numbers)
|
101
|
-
loader.resource_loaded?(:locales, :de, :numbers).
|
102
|
-
loader.resource_loaded?(:locales, :de, :calendars).
|
101
|
+
expect(loader.resource_loaded?(:locales, :de, :numbers)).to be_true
|
102
|
+
expect(loader.resource_loaded?(:locales, :de, :calendars)).to be_false
|
103
103
|
end
|
104
104
|
end
|
105
105
|
|
106
106
|
describe '#locale_resource_loaded' do
|
107
107
|
it 'should return true if the locale resource is cached, false otherwise' do
|
108
108
|
loader.preload_resources_for_locale(:de, :numbers)
|
109
|
-
loader.locale_resource_loaded?(:de, :numbers).
|
110
|
-
loader.locale_resource_loaded?(:de, :calendars).
|
109
|
+
expect(loader.locale_resource_loaded?(:de, :numbers)).to be_true
|
110
|
+
expect(loader.locale_resource_loaded?(:de, :calendars)).to be_false
|
111
111
|
end
|
112
112
|
end
|
113
113
|
|
114
114
|
describe '#resource_types' do
|
115
115
|
it 'returns the list of available resource types' do
|
116
116
|
types = loader.resource_types
|
117
|
-
types.
|
118
|
-
types.
|
119
|
-
types.
|
120
|
-
types.
|
117
|
+
expect(types).to be_a(Array)
|
118
|
+
expect(types).to include(:calendars)
|
119
|
+
expect(types).to include(:numbers)
|
120
|
+
expect(types).to include(:units)
|
121
121
|
end
|
122
122
|
end
|
123
123
|
|
124
124
|
describe '#preload_resources_for_locale' do
|
125
125
|
it 'loads potentially multiple resources into the cache' do
|
126
126
|
loader.preload_resources_for_locale(:ar, :calendars, :units)
|
127
|
-
loader.locale_resource_loaded?(:ar, :calendars).
|
128
|
-
loader.locale_resource_loaded?(:ar, :units).
|
129
|
-
loader.locale_resource_loaded?(:en, :units).
|
127
|
+
expect(loader.locale_resource_loaded?(:ar, :calendars)).to be_true
|
128
|
+
expect(loader.locale_resource_loaded?(:ar, :units)).to be_true
|
129
|
+
expect(loader.locale_resource_loaded?(:en, :units)).to be_false
|
130
130
|
end
|
131
131
|
|
132
132
|
it 'loads all resources for the locale if the :all resource type is specified' do
|
133
133
|
loader.preload_resources_for_locale(:ar, :all)
|
134
134
|
loader.resource_types.each do |resource_type|
|
135
|
-
loader.locale_resource_loaded?(:ar, resource_type).
|
136
|
-
loader.locale_resource_loaded?(:en, resource_type).
|
135
|
+
expect(loader.locale_resource_loaded?(:ar, resource_type)).to be_true
|
136
|
+
expect(loader.locale_resource_loaded?(:en, resource_type)).to be_false
|
137
137
|
end
|
138
138
|
end
|
139
139
|
end
|
@@ -141,9 +141,9 @@ describe Loader do
|
|
141
141
|
describe '#preload_resource_for_locales' do
|
142
142
|
it 'loads a single resource for potentially multiple locales into the cache' do
|
143
143
|
loader.preload_resource_for_locales(:calendars, :sv, :bn)
|
144
|
-
loader.locale_resource_loaded?(:sv, :calendars).
|
145
|
-
loader.locale_resource_loaded?(:bn, :calendars).
|
146
|
-
loader.locale_resource_loaded?(:sv, :units).
|
144
|
+
expect(loader.locale_resource_loaded?(:sv, :calendars)).to be_true
|
145
|
+
expect(loader.locale_resource_loaded?(:bn, :calendars)).to be_true
|
146
|
+
expect(loader.locale_resource_loaded?(:sv, :units)).to be_false
|
147
147
|
end
|
148
148
|
end
|
149
149
|
|
@@ -151,9 +151,9 @@ describe Loader do
|
|
151
151
|
it 'loads potentially multiple resources for all locales' do
|
152
152
|
loader.preload_resources_for_all_locales(:plurals, :lists)
|
153
153
|
TwitterCldr.supported_locales.each do |locale|
|
154
|
-
loader.locale_resource_loaded?(locale, :plurals).
|
155
|
-
loader.locale_resource_loaded?(locale, :lists).
|
156
|
-
loader.locale_resource_loaded?(locale, :calendars).
|
154
|
+
expect(loader.locale_resource_loaded?(locale, :plurals)).to be_true
|
155
|
+
expect(loader.locale_resource_loaded?(locale, :lists)).to be_true
|
156
|
+
expect(loader.locale_resource_loaded?(locale, :calendars)).to be_false
|
157
157
|
end
|
158
158
|
end
|
159
159
|
end
|
@@ -163,7 +163,7 @@ describe Loader do
|
|
163
163
|
loader.preload_all_resources
|
164
164
|
TwitterCldr.supported_locales.each do |locale|
|
165
165
|
loader.resource_types.each do |resource_type|
|
166
|
-
loader.locale_resource_loaded?(locale, resource_type).
|
166
|
+
expect(loader.locale_resource_loaded?(locale, resource_type)).to be_true
|
167
167
|
end
|
168
168
|
end
|
169
169
|
end
|
@@ -12,47 +12,47 @@ describe BreakIterator do
|
|
12
12
|
let(:iterator) { BreakIterator.new(:en, :use_uli_exceptions => true) }
|
13
13
|
|
14
14
|
it "should return an enumerator if called without a block" do
|
15
|
-
iterator.each_sentence("foo bar").
|
15
|
+
expect(iterator.each_sentence("foo bar")).to be_a(Enumerator)
|
16
16
|
end
|
17
17
|
|
18
18
|
it "splits a simple string into sentences" do
|
19
19
|
str = "The. Quick. Brown. Fox."
|
20
|
-
iterator.each_sentence(str).to_a.
|
20
|
+
expect(iterator.each_sentence(str).to_a).to eq([
|
21
21
|
"The.", " Quick.", " Brown.", " Fox."
|
22
|
-
]
|
22
|
+
])
|
23
23
|
end
|
24
24
|
|
25
25
|
it "does not split on commas, for example" do
|
26
26
|
str = "The. Quick, brown. Fox."
|
27
|
-
iterator.each_sentence(str).to_a.
|
27
|
+
expect(iterator.each_sentence(str).to_a).to eq([
|
28
28
|
"The.", " Quick, brown.", " Fox."
|
29
|
-
]
|
29
|
+
])
|
30
30
|
end
|
31
31
|
|
32
32
|
it "does not split periods in the midst of other letters, eg. in a URL" do
|
33
33
|
str = "Visit us. Go to http://translate.twitter.com."
|
34
|
-
iterator.each_sentence(str).to_a.
|
34
|
+
expect(iterator.each_sentence(str).to_a).to eq([
|
35
35
|
"Visit us.",
|
36
36
|
" Go to http://translate.twitter.com."
|
37
|
-
]
|
37
|
+
])
|
38
38
|
end
|
39
39
|
|
40
40
|
it "splits on sentences that end with other kinds of punctuation" do
|
41
41
|
str = "Help us translate! Speak another language? You really, really rock."
|
42
|
-
iterator.each_sentence(str).to_a.
|
42
|
+
expect(iterator.each_sentence(str).to_a).to eq([
|
43
43
|
"Help us translate!",
|
44
44
|
" Speak another language?",
|
45
45
|
" You really, really rock."
|
46
|
-
]
|
46
|
+
])
|
47
47
|
end
|
48
48
|
|
49
49
|
context "with ULI exceptions" do
|
50
50
|
it "does not split on certain abbreviations like Mr. and Mrs." do
|
51
51
|
str = "I really like Mrs. Patterson. She's nice."
|
52
|
-
iterator.each_sentence(str).to_a.
|
52
|
+
expect(iterator.each_sentence(str).to_a).to eq([
|
53
53
|
"I really like Mrs. Patterson.",
|
54
54
|
" She's nice."
|
55
|
-
]
|
55
|
+
])
|
56
56
|
end
|
57
57
|
end
|
58
58
|
|
@@ -61,11 +61,11 @@ describe BreakIterator do
|
|
61
61
|
|
62
62
|
it "splits on certain abbreviations like Mr. and Mrs. (use ULI rules to avoid this behavior)" do
|
63
63
|
str = "I really like Mrs. Patterson. She's nice."
|
64
|
-
iterator.each_sentence(str).to_a.
|
64
|
+
expect(iterator.each_sentence(str).to_a).to eq([
|
65
65
|
"I really like Mrs.",
|
66
66
|
" Patterson.",
|
67
67
|
" She's nice."
|
68
|
-
]
|
68
|
+
])
|
69
69
|
end
|
70
70
|
end
|
71
71
|
end
|
@@ -22,20 +22,20 @@ describe Calendar do
|
|
22
22
|
stub(TwitterCldr).locale { :fr }
|
23
23
|
cal = Calendar.new
|
24
24
|
|
25
|
-
cal.locale.
|
26
|
-
cal.calendar_type.
|
25
|
+
expect(cal.locale).to eq(:fr)
|
26
|
+
expect(cal.calendar_type).to eq(TwitterCldr::DEFAULT_CALENDAR_TYPE)
|
27
27
|
end
|
28
28
|
|
29
29
|
it 'returns calendar for a specific locale' do
|
30
|
-
Calendar.new(:jp).locale.
|
30
|
+
expect(Calendar.new(:jp).locale).to eq(:jp)
|
31
31
|
end
|
32
32
|
|
33
33
|
it 'uses TwitterCldr.convert_locale' do
|
34
|
-
Calendar.new(:'zh-cn').locale.
|
34
|
+
expect(Calendar.new(:'zh-cn').locale).to eq(:zh)
|
35
35
|
end
|
36
36
|
|
37
37
|
it 'returns calendar of a specific type' do
|
38
|
-
Calendar.new(:th, :buddhist).calendar_type.
|
38
|
+
expect(Calendar.new(:th, :buddhist).calendar_type).to eq(:buddhist)
|
39
39
|
end
|
40
40
|
|
41
41
|
end
|
@@ -43,35 +43,35 @@ describe Calendar do
|
|
43
43
|
describe '#months' do
|
44
44
|
context 'when data is available' do
|
45
45
|
it 'returns months list in a wide names form by default' do
|
46
|
-
calendar.months.
|
46
|
+
expect(calendar.months).to eq(%w[Januar Februar März April Mai Juni Juli August September Oktober November Dezember])
|
47
47
|
end
|
48
48
|
|
49
49
|
it 'supports wide names form' do
|
50
|
-
calendar.months(:wide).
|
50
|
+
expect(calendar.months(:wide)).to eq(%w[Januar Februar März April Mai Juni Juli August September Oktober November Dezember])
|
51
51
|
end
|
52
52
|
|
53
53
|
it 'supports narrow names form' do
|
54
|
-
calendar.months(:narrow).
|
54
|
+
expect(calendar.months(:narrow)).to eq(%w[J F M A M J J A S O N D])
|
55
55
|
end
|
56
56
|
|
57
57
|
it 'supports abbreviated names form' do
|
58
|
-
calendar.months(:abbreviated).
|
58
|
+
expect(calendar.months(:abbreviated)).to eq(%w[Jan Feb Mär Apr Mai Jun Jul Aug Sep Okt Nov Dez])
|
59
59
|
end
|
60
60
|
|
61
61
|
it 'returns nil if invalid names form is passed' do
|
62
|
-
calendar.months(:wat).
|
62
|
+
expect(calendar.months(:wat)).to eq(nil)
|
63
63
|
end
|
64
64
|
end
|
65
65
|
|
66
66
|
context 'when some data is missing' do
|
67
67
|
it 'returns nil if some names format is missing' do
|
68
68
|
stub(TwitterCldr).get_locale_resource { { :de => { :calendars => { :gregorian => { :months => { :'stand-alone' => {} } } } } } }
|
69
|
-
calendar.months(:wide).
|
69
|
+
expect(calendar.months(:wide)).to eq(nil)
|
70
70
|
end
|
71
71
|
|
72
72
|
it 'returns nil if calendars data is missing' do
|
73
73
|
stub(TwitterCldr).get_locale_resource { { :de => {} } }
|
74
|
-
calendar.months(:wide).
|
74
|
+
expect(calendar.months(:wide)).to eq(nil)
|
75
75
|
end
|
76
76
|
end
|
77
77
|
end
|
@@ -79,7 +79,7 @@ describe Calendar do
|
|
79
79
|
describe '#weekdays' do
|
80
80
|
context 'when data is available' do
|
81
81
|
it 'returns weekdays list in a wide names form by default' do
|
82
|
-
calendar.weekdays.
|
82
|
+
expect(calendar.weekdays).to eq({
|
83
83
|
:sun => 'Sonntag',
|
84
84
|
:mon => 'Montag',
|
85
85
|
:tue => 'Dienstag',
|
@@ -87,11 +87,11 @@ describe Calendar do
|
|
87
87
|
:thu => 'Donnerstag',
|
88
88
|
:fri => 'Freitag',
|
89
89
|
:sat => 'Samstag'
|
90
|
-
}
|
90
|
+
})
|
91
91
|
end
|
92
92
|
|
93
93
|
it 'supports wide names form' do
|
94
|
-
calendar.weekdays(:wide).
|
94
|
+
expect(calendar.weekdays(:wide)).to eq({
|
95
95
|
:sun => 'Sonntag',
|
96
96
|
:mon => 'Montag',
|
97
97
|
:tue => 'Dienstag',
|
@@ -99,15 +99,15 @@ describe Calendar do
|
|
99
99
|
:thu => 'Donnerstag',
|
100
100
|
:fri => 'Freitag',
|
101
101
|
:sat => 'Samstag'
|
102
|
-
}
|
102
|
+
})
|
103
103
|
end
|
104
104
|
|
105
105
|
it 'supports narrow names form' do
|
106
|
-
calendar.weekdays(:narrow).
|
106
|
+
expect(calendar.weekdays(:narrow)).to eq({ :sun => 'S', :mon => 'M', :tue => 'D', :wed => 'M', :thu => 'D', :fri => 'F', :sat => 'S' })
|
107
107
|
end
|
108
108
|
|
109
109
|
it 'supports abbreviated names form' do
|
110
|
-
calendar.weekdays(:abbreviated).
|
110
|
+
expect(calendar.weekdays(:abbreviated)).to eq({
|
111
111
|
:sun => 'So',
|
112
112
|
:mon => 'Mo',
|
113
113
|
:tue => 'Di',
|
@@ -115,23 +115,23 @@ describe Calendar do
|
|
115
115
|
:thu => 'Do',
|
116
116
|
:fri => 'Fr',
|
117
117
|
:sat => 'Sa'
|
118
|
-
}
|
118
|
+
})
|
119
119
|
end
|
120
120
|
|
121
121
|
it 'returns nil if invalid names form is passed' do
|
122
|
-
calendar.weekdays(:wat).
|
122
|
+
expect(calendar.weekdays(:wat)).to eq(nil)
|
123
123
|
end
|
124
124
|
end
|
125
125
|
|
126
126
|
context 'when some data is missing' do
|
127
127
|
it 'returns nil if some names format is missing' do
|
128
128
|
stub(TwitterCldr).get_locale_resource { { :de => { :calendars => { :gregorian => { :days => { :'stand-alone' => {} } } } } } }
|
129
|
-
calendar.weekdays(:wide).
|
129
|
+
expect(calendar.weekdays(:wide)).to eq(nil)
|
130
130
|
end
|
131
131
|
|
132
132
|
it 'returns nil if calendars data is missing' do
|
133
133
|
stub(TwitterCldr).get_locale_resource { { :de => {} } }
|
134
|
-
calendar.weekdays(:wide).
|
134
|
+
expect(calendar.weekdays(:wide)).to eq(nil)
|
135
135
|
end
|
136
136
|
end
|
137
137
|
end
|
@@ -139,117 +139,117 @@ describe Calendar do
|
|
139
139
|
describe '#fields' do
|
140
140
|
it 'returns the list of fields for the locale (eg. weekday, month, etc)' do
|
141
141
|
fields = calendar.fields
|
142
|
-
fields[:hour].
|
143
|
-
fields[:dayperiod].
|
144
|
-
fields[:weekday].
|
142
|
+
expect(fields[:hour]).to match_normalized("Stunde")
|
143
|
+
expect(fields[:dayperiod]).to match_normalized("Tageshälfte")
|
144
|
+
expect(fields[:weekday]).to match_normalized("Wochentag")
|
145
145
|
|
146
146
|
fields = Calendar.new(:ja).fields
|
147
|
-
fields[:hour].
|
148
|
-
fields[:dayperiod].
|
149
|
-
fields[:weekday].
|
147
|
+
expect(fields[:hour]).to match_normalized("時")
|
148
|
+
expect(fields[:dayperiod]).to match_normalized("午前/午後")
|
149
|
+
expect(fields[:weekday]).to match_normalized("曜日")
|
150
150
|
end
|
151
151
|
end
|
152
152
|
|
153
153
|
describe '#quarters' do
|
154
154
|
it 'returns default quarters' do
|
155
|
-
calendar.quarters.
|
155
|
+
expect(calendar.quarters).to eq({
|
156
156
|
1 => "1. Quartal",
|
157
157
|
2 => "2. Quartal",
|
158
158
|
3 => "3. Quartal",
|
159
159
|
4 => "4. Quartal"
|
160
|
-
}
|
160
|
+
})
|
161
161
|
end
|
162
162
|
|
163
163
|
it 'returns quarters with other name forms' do
|
164
|
-
calendar.quarters(:abbreviated).
|
164
|
+
expect(calendar.quarters(:abbreviated)).to eq({
|
165
165
|
1 => "Q1", 2 => "Q2",
|
166
166
|
3 => "Q3", 4 => "Q4"
|
167
|
-
}
|
167
|
+
})
|
168
168
|
|
169
|
-
calendar.quarters(:narrow).
|
169
|
+
expect(calendar.quarters(:narrow)).to eq({
|
170
170
|
1 => 1, 2 => 2,
|
171
171
|
3 => 3, 4 => 4
|
172
|
-
}
|
172
|
+
})
|
173
173
|
end
|
174
174
|
end
|
175
175
|
|
176
176
|
describe '#periods' do
|
177
177
|
it 'returns default periods' do
|
178
178
|
periods = calendar.periods
|
179
|
-
periods[:am].
|
180
|
-
periods[:pm].
|
179
|
+
expect(periods[:am]).to eq("vorm.")
|
180
|
+
expect(periods[:pm]).to eq("nachm.")
|
181
181
|
end
|
182
182
|
|
183
183
|
it 'returns quarters with other name forms' do
|
184
184
|
periods = calendar.periods(:abbreviated)
|
185
|
-
periods[:am].
|
186
|
-
periods[:pm].
|
185
|
+
expect(periods[:am]).to eq("vorm.")
|
186
|
+
expect(periods[:pm]).to eq("nachm.")
|
187
187
|
end
|
188
188
|
end
|
189
189
|
|
190
190
|
describe '#eras' do
|
191
191
|
it 'returns default eras' do
|
192
|
-
calendar.eras.
|
192
|
+
expect(calendar.eras).to eq({
|
193
193
|
0 => "vor der gewöhnlichen Zeitrechnung",
|
194
194
|
1 => "der gewöhnlichen Zeitrechnung"
|
195
|
-
}
|
195
|
+
})
|
196
196
|
end
|
197
197
|
|
198
198
|
it 'returns eras with other name forms' do
|
199
|
-
calendar.eras(:abbr).
|
199
|
+
expect(calendar.eras(:abbr)).to eq({
|
200
200
|
0 => "v. u. Z.",
|
201
201
|
1 => "u. Z."
|
202
|
-
}
|
202
|
+
})
|
203
203
|
end
|
204
204
|
end
|
205
205
|
|
206
206
|
describe '#date_order' do
|
207
207
|
it 'should return the correct date order for a few different locales' do
|
208
|
-
Calendar.new(:en).date_order.
|
209
|
-
Calendar.new(:ja).date_order.
|
210
|
-
Calendar.new(:ar).date_order.
|
208
|
+
expect(Calendar.new(:en).date_order).to eq([:month, :day, :year])
|
209
|
+
expect(Calendar.new(:ja).date_order).to eq([:year, :month, :day])
|
210
|
+
expect(Calendar.new(:ar).date_order).to eq([:day, :month, :year])
|
211
211
|
end
|
212
212
|
end
|
213
213
|
|
214
214
|
describe '#time_order' do
|
215
215
|
it 'should return the correct time order for a few different locales' do
|
216
|
-
Calendar.new(:en).time_order.
|
217
|
-
Calendar.new(:ja).time_order.
|
218
|
-
Calendar.new(:ar).time_order.
|
216
|
+
expect(Calendar.new(:en).time_order).to eq([:hour, :minute, :second, :period])
|
217
|
+
expect(Calendar.new(:ja).time_order).to eq([:hour, :minute, :second])
|
218
|
+
expect(Calendar.new(:ar).time_order).to eq([:hour, :minute, :second, :period])
|
219
219
|
end
|
220
220
|
end
|
221
221
|
|
222
222
|
describe '#datetime_order' do
|
223
223
|
it 'should return the correct date and time order for a few different locales' do
|
224
|
-
Calendar.new(:en).datetime_order.
|
225
|
-
Calendar.new(:ja).datetime_order.
|
226
|
-
Calendar.new(:ar).datetime_order.
|
224
|
+
expect(Calendar.new(:en).datetime_order).to eq([:month, :day, :year, :hour, :minute, :second, :period])
|
225
|
+
expect(Calendar.new(:ja).datetime_order).to eq([:year, :month, :day, :hour, :minute, :second])
|
226
|
+
expect(Calendar.new(:ar).datetime_order).to eq([:day, :month, :year, :hour, :minute, :second, :period])
|
227
227
|
end
|
228
228
|
end
|
229
229
|
|
230
230
|
describe '#methods_for_tokens' do
|
231
231
|
it 'converts pattern tokens into their corresponding method names' do
|
232
232
|
tokens = [TwitterCldr::Tokenizers::Token.new(:value => "YYYY", :type => :pattern)]
|
233
|
-
calendar.send(:methods_for_tokens, tokens).
|
233
|
+
expect(calendar.send(:methods_for_tokens, tokens)).to eq([:year_of_week_of_year])
|
234
234
|
end
|
235
235
|
|
236
236
|
it 'ignores plaintext tokens' do
|
237
237
|
tokens = [TwitterCldr::Tokenizers::Token.new(:value => "blarg", :type => :plaintext)]
|
238
|
-
calendar.send(:methods_for_tokens, tokens).
|
238
|
+
expect(calendar.send(:methods_for_tokens, tokens)).to eq([])
|
239
239
|
end
|
240
240
|
end
|
241
241
|
|
242
242
|
describe '#resolve_methods' do
|
243
243
|
it 'converts certain method names to their basic equivalents' do
|
244
|
-
calendar.send(:resolve_methods, [:year_of_week_of_year]).
|
245
|
-
calendar.send(:resolve_methods, [:weekday_local]).
|
246
|
-
calendar.send(:resolve_methods, [:day_of_month, :second_fraction]).
|
244
|
+
expect(calendar.send(:resolve_methods, [:year_of_week_of_year])).to eq([:year])
|
245
|
+
expect(calendar.send(:resolve_methods, [:weekday_local])).to eq([:weekday])
|
246
|
+
expect(calendar.send(:resolve_methods, [:day_of_month, :second_fraction])).to eq([:day, :second])
|
247
247
|
end
|
248
248
|
|
249
249
|
it 'does not convert basic method names' do
|
250
|
-
calendar.send(:resolve_methods, [:year]).
|
251
|
-
calendar.send(:resolve_methods, [:day, :month]).
|
252
|
-
calendar.send(:resolve_methods, [:minute, :hour, :second]).
|
250
|
+
expect(calendar.send(:resolve_methods, [:year])).to eq([:year])
|
251
|
+
expect(calendar.send(:resolve_methods, [:day, :month])).to eq([:day, :month])
|
252
|
+
expect(calendar.send(:resolve_methods, [:minute, :hour, :second])).to eq([:minute, :hour, :second])
|
253
253
|
end
|
254
254
|
end
|
255
255
|
|