ruby-cldr 0.1.0 → 0.5.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 (47) hide show
  1. checksums.yaml +5 -5
  2. data/CHANGELOG.md +53 -0
  3. data/Gemfile +1 -1
  4. data/Gemfile.lock +56 -46
  5. data/README.textile +8 -0
  6. data/Rakefile +2 -2
  7. data/VERSION +1 -1
  8. data/lib/cldr/download.rb +1 -1
  9. data/lib/cldr/export.rb +74 -16
  10. data/lib/cldr/export/data.rb +34 -21
  11. data/lib/cldr/export/data/aliases.rb +47 -0
  12. data/lib/cldr/export/data/base.rb +4 -0
  13. data/lib/cldr/export/data/characters.rb +30 -0
  14. data/lib/cldr/export/data/country_codes.rb +29 -0
  15. data/lib/cldr/export/data/currencies.rb +13 -3
  16. data/lib/cldr/export/data/fields.rb +60 -0
  17. data/lib/cldr/export/data/languages.rb +1 -1
  18. data/lib/cldr/export/data/likely_subtags.rb +29 -0
  19. data/lib/cldr/export/data/numbers.rb +48 -6
  20. data/lib/cldr/export/data/parent_locales.rb +23 -0
  21. data/lib/cldr/export/data/plural_rules.rb +70 -0
  22. data/lib/cldr/export/data/plurals/rules.rb +12 -1
  23. data/lib/cldr/export/data/rbnf.rb +12 -4
  24. data/lib/cldr/export/data/region_currencies.rb +45 -0
  25. data/lib/cldr/export/data/segments_root.rb +61 -0
  26. data/lib/cldr/export/data/subdivisions.rb +35 -0
  27. data/lib/cldr/export/data/territories.rb +1 -1
  28. data/lib/cldr/export/data/territories_containment.rb +30 -0
  29. data/lib/cldr/export/data/timezones.rb +18 -2
  30. data/lib/cldr/export/data/transforms.rb +76 -0
  31. data/lib/cldr/export/data/variables.rb +42 -0
  32. data/lib/cldr/export/yaml.rb +5 -21
  33. data/lib/cldr/thor.rb +2 -2
  34. data/ruby-cldr.gemspec +157 -0
  35. data/test/export/data/calendars_test.rb +102 -52
  36. data/test/export/data/country_codes_test.rb +21 -0
  37. data/test/export/data/currencies_test.rb +40 -26
  38. data/test/export/data/languages_test.rb +69 -51
  39. data/test/export/data/numbers_test.rb +61 -62
  40. data/test/export/data/plurals_test.rb +10 -3
  41. data/test/export/data/subdivisions_test.rb +33 -0
  42. data/test/export/data/territories_containment_test.rb +10 -0
  43. data/test/export/data/territories_test.rb +12 -5
  44. data/test/export/data/timezones_test.rb +5 -8
  45. data/test/export_test.rb +57 -5
  46. data/test/format/time_test.rb +5 -5
  47. metadata +51 -33
@@ -30,13 +30,13 @@ module Cldr
30
30
  :type => ruleset_node.attribute("type").value,
31
31
  :rules => (ruleset_node / "rbnfrule").map do |rule_node|
32
32
  radix = if radix_attr = rule_node.attribute("radix")
33
- radix_attr.value
33
+ cast_value(radix_attr.value)
34
34
  else
35
35
  nil
36
36
  end
37
-
37
+
38
38
  attrs = {
39
- :value => rule_node.attribute("value").value,
39
+ :value => cast_value(rule_node.attribute("value").value),
40
40
  :rule => fix_rule(rule_node.text)
41
41
  }
42
42
 
@@ -50,6 +50,14 @@ module Cldr
50
50
  attrs
51
51
  end
52
52
 
53
+ def cast_value(val)
54
+ if val =~ /\A[\d]+\z/
55
+ val.to_i
56
+ else
57
+ val
58
+ end
59
+ end
60
+
53
61
  def fix_rule(rule)
54
62
  rule.gsub(/\A'/, '').gsub("←", '<').gsub("→", '>')
55
63
  end
@@ -61,4 +69,4 @@ module Cldr
61
69
  end
62
70
  end
63
71
  end
64
- end
72
+ end
@@ -0,0 +1,45 @@
1
+ module Cldr
2
+ module Export
3
+ module Data
4
+ class RegionCurrencies < Base
5
+
6
+ def initialize
7
+ super(nil)
8
+ update(:region_currencies => currencies)
9
+ end
10
+
11
+ private
12
+
13
+ def currencies
14
+ doc.xpath('//currencyData/region').inject({}) do |ret, region|
15
+ name = region.attribute('iso3166').value
16
+ ret[name] = currency(region)
17
+ ret
18
+ end
19
+ end
20
+
21
+ def currency(node)
22
+ (node / 'currency').map do |currency|
23
+ currency_code = currency.attribute('iso4217').value
24
+ result = { currency: currency_code }
25
+
26
+ if from_node = currency.attribute('from')
27
+ result[:from] = from_node.value
28
+ end
29
+
30
+ if to_node = currency.attribute('to')
31
+ result[:to] = to_node.value
32
+ end
33
+
34
+ result
35
+ end
36
+ end
37
+
38
+ def path
39
+ @path ||= "#{Cldr::Export::Data.dir}/supplemental/supplementalData.xml"
40
+ end
41
+
42
+ end
43
+ end
44
+ end
45
+ end
@@ -0,0 +1,61 @@
1
+ module Cldr
2
+ module Export
3
+ module Data
4
+ class SegmentsRoot < Base
5
+
6
+ def initialize
7
+ super(nil)
8
+ update(:segments => segmentations)
9
+ end
10
+
11
+ def segmentations
12
+ doc.xpath("ldml/segmentations/segmentation").inject({}) do |ret, seg|
13
+ type = seg.attribute("type").value
14
+ ret[type] = segmentation(seg)
15
+ ret
16
+ end
17
+ end
18
+
19
+ def segmentation(node)
20
+ {
21
+ :variables => variables(node),
22
+ :rules => rules(node)
23
+ }
24
+ end
25
+
26
+ def variables(node)
27
+ (node / "variables" / "variable").map do |variable|
28
+ {
29
+ :id => cast_value(variable.attribute("id").value),
30
+ :value => variable.text
31
+ }
32
+ end
33
+ end
34
+
35
+ def rules(node)
36
+ (node / "segmentRules" / "rule").map do |rule|
37
+ {
38
+ :id => cast_value(rule.attribute("id").value),
39
+ :value => rule.text
40
+ }
41
+ end
42
+ end
43
+
44
+ def path
45
+ @path ||= "#{Cldr::Export::Data.dir}/segments/root.xml"
46
+ end
47
+
48
+ def cast_value(value)
49
+ if value =~ /\A[\d]+\z/
50
+ value.to_i
51
+ elsif value =~ /\A[\d.]+\z/
52
+ value.to_f
53
+ else
54
+ value
55
+ end
56
+ end
57
+
58
+ end
59
+ end
60
+ end
61
+ end
@@ -0,0 +1,35 @@
1
+ module Cldr
2
+ module Export
3
+ module Data
4
+ class Subdivisions < Base
5
+
6
+ def initialize(locale)
7
+ super
8
+ update(:subdivisions => subdivisions)
9
+ end
10
+
11
+ private
12
+
13
+ def subdivisions
14
+ @subdivisions ||= select('localeDisplayNames/subdivisions/subdivision').inject({}) do |result, node|
15
+ result[node.attribute('type').value.to_sym] = node.content unless draft?(node) or alt?(node)
16
+ result
17
+ end
18
+ end
19
+
20
+ def doc
21
+ begin
22
+ super
23
+ rescue Errno::ENOENT
24
+ @doc = Nokogiri::XML('')
25
+ end
26
+ end
27
+
28
+ def path
29
+ @path ||= "#{Cldr::Export::Data.dir}/subdivisions/#{locale.to_s.gsub('-', '_')}.xml"
30
+ end
31
+
32
+ end
33
+ end
34
+ end
35
+ end
@@ -9,7 +9,7 @@ module Cldr
9
9
 
10
10
  def territories
11
11
  @territories ||= select('localeDisplayNames/territories/territory').inject({}) do |result, node|
12
- result[node.attribute('type').value.to_sym] = node.content unless draft?(node)
12
+ result[node.attribute('type').value.to_sym] = node.content unless draft?(node) or alt?(node)
13
13
  result
14
14
  end
15
15
  end
@@ -0,0 +1,30 @@
1
+ module Cldr
2
+ module Export
3
+ module Data
4
+ class TerritoriesContainment < Base
5
+ def initialize(*)
6
+ super(nil)
7
+ update(:territories => territories)
8
+ end
9
+
10
+ def territories
11
+ @territories ||= doc.xpath('supplementalData/territoryContainment/group').inject(
12
+ Hash.new { |h, k| h[k] = { :contains => [] } }
13
+ ) do |memo, territory|
14
+ territory_id = territory.attribute('type').value
15
+ children = territory.attribute('contains').value.split(' ')
16
+
17
+ memo[territory_id][:contains].concat(children)
18
+ memo[territory_id][:contains].sort!
19
+
20
+ memo
21
+ end
22
+ end
23
+
24
+ def path
25
+ @path ||= "#{Cldr::Export::Data.dir}/supplemental/supplementalData.xml"
26
+ end
27
+ end
28
+ end
29
+ end
30
+ end
@@ -6,7 +6,23 @@ module Cldr
6
6
  class Timezones < Base
7
7
  def initialize(locale)
8
8
  super
9
- update(:timezones => timezones, :metazones => metazones)
9
+
10
+ update(
11
+ :formats => formats,
12
+ :timezones => timezones,
13
+ :metazones => metazones
14
+ )
15
+ end
16
+
17
+ def formats
18
+ @formats ||= select('dates/timeZoneNames/*').inject({}) do |result, format|
19
+ if format.name.end_with?('Format')
20
+ underscored_name = format.name.gsub(/([a-z])([A-Z])/, '\1_\2').downcase
21
+ result[underscored_name] = format.text
22
+ end
23
+
24
+ result
25
+ end
10
26
  end
11
27
 
12
28
  def timezones
@@ -47,4 +63,4 @@ module Cldr
47
63
  end
48
64
  end
49
65
  end
50
- end
66
+ end
@@ -0,0 +1,76 @@
1
+ # encoding: UTF-8
2
+
3
+ module Cldr
4
+ module Export
5
+ module Data
6
+ class Transforms < Base
7
+
8
+ attr_reader :transform_file
9
+
10
+ def initialize(transform_file)
11
+ super(nil) # no locale
12
+ @transform_file = transform_file
13
+ update(:transforms => transforms)
14
+ end
15
+
16
+ private
17
+
18
+ def transforms
19
+ doc.xpath("supplementalData/transforms/transform").map do |transform_node|
20
+ {
21
+ :source => transform_node.attribute("source").value,
22
+ :target => transform_node.attribute("target").value,
23
+ :variant => get_variant(transform_node),
24
+ :direction => transform_node.attribute("direction").value,
25
+ :rules => rules(transform_node)
26
+ }
27
+ end
28
+ end
29
+
30
+ def get_variant(node)
31
+ if attrib = node.attribute("variant")
32
+ attrib.value
33
+ end
34
+ end
35
+
36
+ def rules(transform_node)
37
+ rules = fix_rule_wrapping(
38
+ doc.xpath("#{transform_node.path}/tRule").flat_map do |rule_node|
39
+ fix_rule(rule_node.content).split("\n").map(&:strip)
40
+ end
41
+ )
42
+
43
+ rules.reject do |rule|
44
+ rule.strip.empty? || rule.strip.start_with?('#')
45
+ end
46
+ end
47
+
48
+ def fix_rule_wrapping(rules)
49
+ wrap = false
50
+
51
+ rules.each_with_object([]) do |rule, ret|
52
+ if wrap
53
+ ret.last.sub!(/\\\z/, rule)
54
+ else
55
+ ret << rule
56
+ end
57
+
58
+ wrap = rule.end_with?('\\')
59
+ end
60
+ end
61
+
62
+ def fix_rule(rule)
63
+ rule.
64
+ gsub("←", '<').
65
+ gsub("→", '>').
66
+ gsub("↔", '<>')
67
+ end
68
+
69
+ def path
70
+ transform_file
71
+ end
72
+
73
+ end
74
+ end
75
+ end
76
+ end
@@ -0,0 +1,42 @@
1
+ module Cldr
2
+ module Export
3
+ module Data
4
+ class Variables < Base
5
+
6
+ # only these variables will be exported
7
+ VARIABLE_IDS = %w($grandfathered $language $territory $script $variant)
8
+
9
+ def initialize
10
+ super(nil)
11
+ update(:variables => variables)
12
+ end
13
+
14
+ private
15
+
16
+ def variables
17
+ doc.xpath('//validity/variable').inject({}) do |ret, variable|
18
+ name = variable.attribute('id').value
19
+ if VARIABLE_IDS.include?(name)
20
+ ret[fix_var_name(name)] = split_value_list(variable.text)
21
+ end
22
+ ret
23
+ end
24
+ end
25
+
26
+ def fix_var_name(var_name)
27
+ # remove leading dollar sign
28
+ var_name.sub(/\A\$/, '')
29
+ end
30
+
31
+ def split_value_list(value_list)
32
+ value_list.strip.split(/[\s]+/)
33
+ end
34
+
35
+ def path
36
+ @path ||= "#{Cldr::Export::Data.dir}/supplemental/supplementalMetadata.xml"
37
+ end
38
+
39
+ end
40
+ end
41
+ end
42
+ end
@@ -1,11 +1,8 @@
1
- require 'ya2yaml'
1
+ require 'yaml'
2
2
 
3
3
  module Cldr
4
4
  module Export
5
- class Yaml < Ya2YAML
6
- def initialize
7
- super(:syck_compatible => true)
8
- end
5
+ class Yaml
9
6
 
10
7
  def export(locale, component, options = {})
11
8
  data = Export.data(component, locale, options)
@@ -19,22 +16,9 @@ module Cldr
19
16
  end
20
17
  end
21
18
 
22
- def yaml(data)
23
- emit(data, 1)[1..-1]
24
- end
25
-
26
- def emit(object, level = 1)
27
- result = object.is_a?(Symbol) ? object.inspect : super
28
- result.gsub(/(\s{1})(no):/i) { %(#{$1}"#{$2}":) } # FIXME fucking spaghetti code
29
- end
30
-
31
- def is_one_plain_line?(str)
32
- # removed REX_BOOL, REX_INT
33
- str !~ /^([\-\?:,\[\]\{\}\#&\*!\|>'"%@`\s]|---|\.\.\.)/ &&
34
- str !~ /[:\#\s\[\]\{\},]/ &&
35
- str !~ /#{REX_ANY_LB}/ &&
36
- str !~ /^(#{REX_FLOAT}|#{REX_MERGE}|#{REX_NULL}|#{REX_TIMESTAMP}|#{REX_VALUE})$/x
37
- end
19
+ def yaml(data)
20
+ data.to_yaml
21
+ end
38
22
  end
39
23
  end
40
24
  end
@@ -5,7 +5,7 @@ module Cldr
5
5
  class Thor < ::Thor
6
6
  namespace 'cldr'
7
7
 
8
- desc "download [--source=http://unicode.org/Public/cldr/24/core.zip] [--target=./vendor]",
8
+ desc "download [--source=http://unicode.org/Public/cldr/26/core.zip] [--target=./vendor]",
9
9
  "Download and extract CLDR data from source to target dir"
10
10
  method_options %w(source -s) => :string,
11
11
  %w(target -t) => :string
@@ -27,7 +27,7 @@ module Cldr
27
27
  Cldr::Export.export(options.dup.symbolize_keys) { putc '.' }
28
28
  puts
29
29
  end
30
-
30
+
31
31
  # TODO flatten task, e.g. flatten all plural locale files into one big file
32
32
  end
33
33
  end
@@ -0,0 +1,157 @@
1
+ # Generated by jeweler
2
+ # DO NOT EDIT THIS FILE DIRECTLY
3
+ # Instead, edit Jeweler::Tasks in Rakefile, and run 'rake gemspec'
4
+ # -*- encoding: utf-8 -*-
5
+ # stub: ruby-cldr 0.2.0 ruby lib
6
+
7
+ Gem::Specification.new do |s|
8
+ s.name = "ruby-cldr".freeze
9
+ s.version = "0.5.0"
10
+
11
+ s.required_rubygems_version = Gem::Requirement.new(">= 0".freeze) if s.respond_to? :required_rubygems_version=
12
+ s.require_paths = ["lib".freeze]
13
+ s.authors = ["Sven Fuchs".freeze]
14
+ s.date = "2019-03-21"
15
+ s.description = "Ruby library for exporting and using data from CLDR, see http://cldr.unicode.org".freeze
16
+ s.email = "svenfuchs@artweb-design.de".freeze
17
+ s.extra_rdoc_files = [
18
+ "LICENSE",
19
+ "README.textile",
20
+ "TODO"
21
+ ]
22
+ s.files = [
23
+ "Gemfile",
24
+ "Gemfile.lock",
25
+ "LICENSE",
26
+ "README.textile",
27
+ "Rakefile",
28
+ "TODO",
29
+ "VERSION",
30
+ "cldr.thor",
31
+ "lib/cldr.rb",
32
+ "lib/cldr/data.rb",
33
+ "lib/cldr/download.rb",
34
+ "lib/cldr/export.rb",
35
+ "lib/cldr/export/code.rb",
36
+ "lib/cldr/export/code/numbers.rb",
37
+ "lib/cldr/export/data.rb",
38
+ "lib/cldr/export/data/aliases.rb",
39
+ "lib/cldr/export/data/base.rb",
40
+ "lib/cldr/export/data/calendars.rb",
41
+ "lib/cldr/export/data/calendars/gregorian.rb",
42
+ "lib/cldr/export/data/characters.rb",
43
+ "lib/cldr/export/data/currencies.rb",
44
+ "lib/cldr/export/data/currency_digits_and_rounding.rb",
45
+ "lib/cldr/export/data/delimiters.rb",
46
+ "lib/cldr/export/data/fields.rb",
47
+ "lib/cldr/export/data/languages.rb",
48
+ "lib/cldr/export/data/layout.rb",
49
+ "lib/cldr/export/data/likely_subtags.rb",
50
+ "lib/cldr/export/data/lists.rb",
51
+ "lib/cldr/export/data/metazones.rb",
52
+ "lib/cldr/export/data/numbering_systems.rb",
53
+ "lib/cldr/export/data/numbers.rb",
54
+ "lib/cldr/export/data/parent_locales.rb",
55
+ "lib/cldr/export/data/plural_rules.rb",
56
+ "lib/cldr/export/data/plurals.rb",
57
+ "lib/cldr/export/data/plurals/cldr_grammar.treetop",
58
+ "lib/cldr/export/data/plurals/grammar.rb",
59
+ "lib/cldr/export/data/plurals/rules.rb",
60
+ "lib/cldr/export/data/rbnf.rb",
61
+ "lib/cldr/export/data/rbnf_root.rb",
62
+ "lib/cldr/export/data/region_currencies.rb",
63
+ "lib/cldr/export/data/segments_root.rb",
64
+ "lib/cldr/export/data/territories.rb",
65
+ "lib/cldr/export/data/territories_containment.rb",
66
+ "lib/cldr/export/data/timezones.rb",
67
+ "lib/cldr/export/data/transforms.rb",
68
+ "lib/cldr/export/data/units.rb",
69
+ "lib/cldr/export/data/variables.rb",
70
+ "lib/cldr/export/data/windows_zones.rb",
71
+ "lib/cldr/export/ruby.rb",
72
+ "lib/cldr/export/yaml.rb",
73
+ "lib/cldr/format.rb",
74
+ "lib/cldr/format/currency.rb",
75
+ "lib/cldr/format/date.rb",
76
+ "lib/cldr/format/datetime.rb",
77
+ "lib/cldr/format/datetime/base.rb",
78
+ "lib/cldr/format/decimal.rb",
79
+ "lib/cldr/format/decimal/base.rb",
80
+ "lib/cldr/format/decimal/fraction.rb",
81
+ "lib/cldr/format/decimal/integer.rb",
82
+ "lib/cldr/format/decimal/number.rb",
83
+ "lib/cldr/format/percent.rb",
84
+ "lib/cldr/format/time.rb",
85
+ "lib/cldr/thor.rb",
86
+ "lib/core_ext/hash/deep_merge.rb",
87
+ "lib/core_ext/hash/deep_stringify_keys.rb",
88
+ "lib/core_ext/hash/symbolize_keys.rb",
89
+ "lib/core_ext/string/camelize.rb",
90
+ "lib/core_ext/string/underscore.rb",
91
+ "test/all.rb",
92
+ "test/export/code/numbers_test.rb",
93
+ "test/export/data/all.rb",
94
+ "test/export/data/calendars_test.rb",
95
+ "test/export/data/currencies_test.rb",
96
+ "test/export/data/delimiters_test.rb",
97
+ "test/export/data/languages_test.rb",
98
+ "test/export/data/metazones_test.rb",
99
+ "test/export/data/numbers_test.rb",
100
+ "test/export/data/plurals_test.rb",
101
+ "test/export/data/territories_containment_test.rb",
102
+ "test/export/data/territories_test.rb",
103
+ "test/export/data/timezones_test.rb",
104
+ "test/export/data/units_test.rb",
105
+ "test/export/data/windows_zones_test.rb",
106
+ "test/export_test.rb",
107
+ "test/format/all.rb",
108
+ "test/format/currency_test.rb",
109
+ "test/format/date_test.rb",
110
+ "test/format/datetime_test.rb",
111
+ "test/format/decimal/fraction_test.rb",
112
+ "test/format/decimal/integer_test.rb",
113
+ "test/format/decimal/number_test.rb",
114
+ "test/format/decimal_test.rb",
115
+ "test/format/percent_test.rb",
116
+ "test/format/time_test.rb",
117
+ "test/test_autotest.rb",
118
+ "test/test_helper.rb"
119
+ ]
120
+ s.homepage = "http://github.com/ruby-i18n/ruby-cldr".freeze
121
+ s.rubygems_version = "2.7.9".freeze
122
+ s.summary = "Ruby library for exporting and using data from CLDR".freeze
123
+
124
+ if s.respond_to? :specification_version then
125
+ s.specification_version = 4
126
+
127
+ if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
128
+ s.add_runtime_dependency(%q<thor>.freeze, [">= 0"])
129
+ s.add_runtime_dependency(%q<i18n>.freeze, [">= 0"])
130
+ s.add_runtime_dependency(%q<nokogiri>.freeze, [">= 0"])
131
+ s.add_development_dependency(%q<rubyzip>.freeze, [">= 0"])
132
+ s.add_development_dependency(%q<jeweler>.freeze, [">= 0"])
133
+ s.add_development_dependency(%q<pry>.freeze, [">= 0"])
134
+ s.add_development_dependency(%q<pry-nav>.freeze, [">= 0"])
135
+ s.add_development_dependency(%q<test-unit>.freeze, [">= 0"])
136
+ else
137
+ s.add_dependency(%q<thor>.freeze, [">= 0"])
138
+ s.add_dependency(%q<i18n>.freeze, [">= 0"])
139
+ s.add_dependency(%q<nokogiri>.freeze, [">= 0"])
140
+ s.add_dependency(%q<rubyzip>.freeze, [">= 0"])
141
+ s.add_dependency(%q<jeweler>.freeze, [">= 0"])
142
+ s.add_dependency(%q<pry>.freeze, [">= 0"])
143
+ s.add_dependency(%q<pry-nav>.freeze, [">= 0"])
144
+ s.add_dependency(%q<test-unit>.freeze, [">= 0"])
145
+ end
146
+ else
147
+ s.add_dependency(%q<thor>.freeze, [">= 0"])
148
+ s.add_dependency(%q<i18n>.freeze, [">= 0"])
149
+ s.add_dependency(%q<nokogiri>.freeze, [">= 0"])
150
+ s.add_dependency(%q<rubyzip>.freeze, [">= 0"])
151
+ s.add_dependency(%q<jeweler>.freeze, [">= 0"])
152
+ s.add_dependency(%q<pry>.freeze, [">= 0"])
153
+ s.add_dependency(%q<pry-nav>.freeze, [">= 0"])
154
+ s.add_dependency(%q<test-unit>.freeze, [">= 0"])
155
+ end
156
+ end
157
+