ruby-cldr 0.0.1 → 0.0.2

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 (97) hide show
  1. data/Gemfile +7 -0
  2. data/Gemfile.lock +23 -0
  3. data/README.textile +9 -6
  4. data/VERSION +1 -1
  5. data/lib/cldr.rb +1 -1
  6. data/lib/cldr/data.rb +9 -29
  7. data/lib/cldr/download.rb +2 -2
  8. data/lib/cldr/export.rb +8 -2
  9. data/lib/cldr/export/code.rb +34 -0
  10. data/lib/cldr/export/code/numbers.rb +29 -0
  11. data/lib/cldr/export/data.rb +36 -0
  12. data/lib/cldr/export/data/base.rb +61 -0
  13. data/lib/cldr/export/data/calendars.rb +14 -0
  14. data/lib/cldr/export/data/calendars/gregorian.rb +142 -0
  15. data/lib/cldr/export/data/currencies.rb +28 -0
  16. data/lib/cldr/export/data/delimiters.rb +29 -0
  17. data/lib/cldr/export/data/languages.rb +19 -0
  18. data/lib/cldr/export/data/numbers.rb +67 -0
  19. data/lib/cldr/export/data/plurals.rb +41 -0
  20. data/lib/cldr/{data → export/data}/plurals/cldr_grammar.treetop +0 -0
  21. data/lib/cldr/export/data/plurals/grammar.rb +538 -0
  22. data/lib/cldr/export/data/plurals/rules.rb +119 -0
  23. data/lib/cldr/export/data/territories.rb +19 -0
  24. data/lib/cldr/export/data/timezones.rb +27 -0
  25. data/lib/cldr/export/data/units.rb +29 -0
  26. data/lib/cldr/export/ruby.rb +1 -1
  27. data/lib/cldr/export/yaml.rb +1 -1
  28. data/lib/cldr/format.rb +1 -97
  29. data/lib/cldr/format/currency.rb +1 -1
  30. data/lib/cldr/format/date.rb +1 -1
  31. data/lib/cldr/format/datetime.rb +14 -18
  32. data/lib/cldr/format/datetime/base.rb +1 -1
  33. data/lib/cldr/format/decimal.rb +1 -1
  34. data/lib/cldr/format/decimal/base.rb +1 -1
  35. data/lib/cldr/format/decimal/fraction.rb +1 -1
  36. data/lib/cldr/format/decimal/integer.rb +1 -1
  37. data/lib/cldr/format/decimal/number.rb +1 -1
  38. data/lib/cldr/format/percent.rb +1 -1
  39. data/lib/cldr/format/time.rb +1 -1
  40. data/lib/cldr/thor.rb +3 -3
  41. data/test/all.rb +1 -1
  42. data/test/export/code/numbers_test.rb +11 -0
  43. data/test/{data → export/data}/all.rb +1 -1
  44. data/test/{data → export/data}/calendars_test.rb +18 -18
  45. data/test/{data → export/data}/currencies_test.rb +6 -6
  46. data/test/{data → export/data}/delimiters_test.rb +6 -6
  47. data/test/{data → export/data}/languages_test.rb +6 -6
  48. data/test/{data → export/data}/numbers_test.rb +8 -8
  49. data/test/export/data/plurals_test.rb +141 -0
  50. data/test/{data → export/data}/territories_test.rb +6 -6
  51. data/test/{data → export/data}/timezones_test.rb +6 -6
  52. data/test/{data → export/data}/units_test.rb +6 -6
  53. data/test/export_test.rb +8 -8
  54. data/test/{formats → format}/all.rb +1 -1
  55. data/test/format/currency_test.rb +0 -0
  56. data/test/format/date_test.rb +265 -0
  57. data/test/format/datetime_test.rb +18 -0
  58. data/test/{formats → format}/decimal/fraction_test.rb +4 -4
  59. data/test/{formats → format}/decimal/integer_test.rb +17 -17
  60. data/test/{formats → format}/decimal/number_test.rb +19 -19
  61. data/test/{formats → format}/decimal_test.rb +5 -5
  62. data/test/format/percent_test.rb +0 -0
  63. data/test/format/time_test.rb +195 -0
  64. data/test/test_autotest.rb +36 -0
  65. data/test/test_helper.rb +16 -1
  66. metadata +124 -114
  67. data/lib/cldr/data/base.rb +0 -66
  68. data/lib/cldr/data/calendars.rb +0 -12
  69. data/lib/cldr/data/calendars/gregorian.rb +0 -124
  70. data/lib/cldr/data/currencies.rb +0 -26
  71. data/lib/cldr/data/delimiters.rb +0 -21
  72. data/lib/cldr/data/languages.rb +0 -17
  73. data/lib/cldr/data/numbers.rb +0 -60
  74. data/lib/cldr/data/plurals.rb +0 -39
  75. data/lib/cldr/data/plurals/grammar.rb +0 -536
  76. data/lib/cldr/data/plurals/rules.rb +0 -113
  77. data/lib/cldr/data/territories.rb +0 -17
  78. data/lib/cldr/data/timezones.rb +0 -25
  79. data/lib/cldr/data/units.rb +0 -25
  80. data/test/data/plurals_test.rb +0 -132
  81. data/test/formats/datetime/all.rb +0 -3
  82. data/test/formats/datetime/date_test.rb +0 -31
  83. data/test/formats/datetime/datetime_test.rb +0 -18
  84. data/test/formats/datetime/day_test.rb +0 -41
  85. data/test/formats/datetime/hour_test.rb +0 -79
  86. data/test/formats/datetime/minute_test.rb +0 -25
  87. data/test/formats/datetime/month_test.rb +0 -76
  88. data/test/formats/datetime/period_test.rb +0 -20
  89. data/test/formats/datetime/quarter_test.rb +0 -118
  90. data/test/formats/datetime/second_test.rb +0 -80
  91. data/test/formats/datetime/time_test.rb +0 -33
  92. data/test/formats/datetime/timezone_test.rb +0 -23
  93. data/test/formats/datetime/year_test.rb +0 -57
  94. data/test/formats/format_test.rb +0 -66
  95. data/test/formats/rails_compat/all.rb +0 -3
  96. data/test/formats/rails_compat/format_integer_test.rb +0 -56
  97. data/test/formats/rails_compat/format_number_test.rb +0 -134
data/Gemfile ADDED
@@ -0,0 +1,7 @@
1
+ source :gemcutter
2
+
3
+ gem 'thor'
4
+ gem 'i18n'
5
+ gem 'ya2yaml'
6
+ gem 'nokogiri'
7
+ gem 'jeweler', :group => :development
data/Gemfile.lock ADDED
@@ -0,0 +1,23 @@
1
+ GEM
2
+ remote: http://rubygems.org/
3
+ specs:
4
+ git (1.2.5)
5
+ i18n (0.6.0)
6
+ jeweler (1.6.4)
7
+ bundler (~> 1.0)
8
+ git (>= 1.2.5)
9
+ rake
10
+ nokogiri (1.5.0)
11
+ rake (0.9.2.2)
12
+ thor (0.14.6)
13
+ ya2yaml (0.30)
14
+
15
+ PLATFORMS
16
+ ruby
17
+
18
+ DEPENDENCIES
19
+ i18n
20
+ jeweler
21
+ nokogiri
22
+ thor
23
+ ya2yaml
data/README.textile CHANGED
@@ -17,8 +17,11 @@ h2. Requirements
17
17
  h2. Installation
18
18
 
19
19
  <pre>
20
- gem install cldr (not there, yet. install locally)
21
- thor install http://github.com/svenfuchs/cldr/raw/master/cldr.thor --as=cldr
20
+ gem install bundler
21
+ bundle install
22
+
23
+
24
+ thor cldr:download
22
25
  </pre>
23
26
 
24
27
  h2. Export
@@ -57,12 +60,12 @@ E.g.:
57
60
  format.apply(1234.567)
58
61
  # => "1 234,57"
59
62
 
60
- calendar = Cldr::Data::Calendars.new(:de)[:calendars][:gregorian]
61
- format = Cldr::Format::Date.new('EEEE, d. MMMM y', calendar)
63
+ calendar = Cldr::Export::Data::Calendars.new(:de)[:calendars][:gregorian]
64
+ format = Cldr::Export::Format::Date.new('EEEE, d. MMMM y', calendar)
62
65
  format.apply(Date.new(2010, 1, 11))
63
66
  # => "Montag, 11. Januar 2010"
64
67
 
65
- calendar = Cldr::Data::Calendars.new(:de)[:calendars][:gregorian]
68
+ calendar = Cldr::Export::Data::Calendars.new(:de)[:calendars][:gregorian]
66
69
  format = Cldr::Format::Time.new('HH:mm:ss z', calendar)
67
70
  format.apply(Time.utc(2010, 1, 1, 13, 12, 11))
68
71
  # => "13:12:11 UTC"
@@ -100,5 +103,5 @@ h2. Resources
100
103
  For additional information on CLDR plural rules see:
101
104
 
102
105
  * "http://unicode.org/draft/reports/tr35/tr35.html#Language_Plural_Rules":http://unicode.org/draft/reports/tr35/tr35.html#Language_Plural_Rules
103
- * "http://www.unicode.org/cldr/data/charts/supplemental/language_plural_rules.html":http://www.unicode.org/cldr/data/charts/supplemental/language_plural_rules.html
106
+ * "http://www.unicode.org/cldr/export/data/charts/supplemental/language_plural_rules.html":http://www.unicode.org/cldr/export/data/charts/supplemental/language_plural_rules.html
104
107
 
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.0.1
1
+ 0.0.2
data/lib/cldr.rb CHANGED
@@ -1,6 +1,6 @@
1
1
  require 'core_ext/hash/symbolize_keys'
2
2
 
3
- class Cldr
3
+ module Cldr
4
4
  autoload :Data, 'cldr/data'
5
5
  autoload :Export, 'cldr/export'
6
6
  autoload :Format, 'cldr/format'
data/lib/cldr/data.rb CHANGED
@@ -1,34 +1,14 @@
1
1
  require 'core_ext/string/camelize'
2
2
 
3
- class Cldr
3
+ module Cldr
4
4
  module Data
5
- autoload :Base, 'cldr/data/base'
6
- autoload :Calendars, 'cldr/data/calendars'
7
- autoload :Currencies, 'cldr/data/currencies'
8
- autoload :Delimiters, 'cldr/data/delimiters'
9
- autoload :Languages, 'cldr/data/languages'
10
- autoload :Numbers, 'cldr/data/numbers'
11
- autoload :Plurals, 'cldr/data/plurals'
12
- autoload :Territories, 'cldr/data/territories'
13
- autoload :Timezones, 'cldr/data/timezones'
14
- autoload :Units, 'cldr/data/units'
15
-
16
- class << self
17
- def dir
18
- @dir ||= File.expand_path('./vendor/cldr/common')
19
- end
20
-
21
- def dir=(dir)
22
- @dir = dir
23
- end
24
-
25
- def locales
26
- Dir["#{dir}/main/*.xml"].map { |path| path =~ /([\w_-]+)\.xml/ && $1 }
27
- end
28
-
29
- def components
30
- self.constants.sort - [:Base, :Export]
31
- end
32
- end
5
+ # autoload :De, 'data/de'
6
+ #
7
+ # class << self
8
+ # def [](locale)
9
+ # @data ||= {}
10
+ # @data[locale] ||= const_get(locale.to_s.camelize)
11
+ # end
12
+ # end
33
13
  end
34
14
  end
data/lib/cldr/download.rb CHANGED
@@ -3,10 +3,10 @@ require 'net/http'
3
3
  require 'uri'
4
4
  require 'tempfile'
5
5
 
6
- class Cldr
6
+ module Cldr
7
7
  class << self
8
8
  def download(source = nil, target = nil)
9
- source ||= 'http://unicode.org/Public/cldr/1.7.2/core.zip'
9
+ source ||= 'http://unicode.org/Public/cldr/21/core.zip'
10
10
  target ||= File.expand_path('./vendor/cldr')
11
11
 
12
12
  source = URI.parse(source)
data/lib/cldr/export.rb CHANGED
@@ -4,8 +4,10 @@ require 'core_ext/string/camelize'
4
4
  require 'core_ext/string/underscore'
5
5
  require 'core_ext/hash/deep_stringify_keys'
6
6
 
7
- class Cldr
7
+ module Cldr
8
8
  module Export
9
+ autoload :Code, 'cldr/export/code'
10
+ autoload :Data, 'cldr/export/data'
9
11
  autoload :Ruby, 'cldr/export/ruby'
10
12
  autoload :Yaml, 'cldr/export/yaml'
11
13
 
@@ -41,7 +43,11 @@ class Cldr
41
43
  else
42
44
  data = locales(locale, options).inject({}) do |result, locale|
43
45
  data = Data.const_get(component.to_s.camelize).new(locale)
44
- data ? data.deep_merge(result) : result
46
+ if data
47
+ data.is_a?(Hash) ? data.deep_merge(result) : data
48
+ else
49
+ result
50
+ end
45
51
  end
46
52
  # data = resolve_links if options[:merge] TODO!!
47
53
  data
@@ -0,0 +1,34 @@
1
+ module Cldr
2
+ module Export
3
+ module Code
4
+ # autoload :Base, 'cldr/export/code/base'
5
+ # autoload :Calendars, 'cldr/export/code/calendars'
6
+ # autoload :Currencies, 'cldr/export/code/currencies'
7
+ # autoload :Delimiters, 'cldr/export/code/delimiters'
8
+ # autoload :Languages, 'cldr/export/code/languages'
9
+ autoload :Numbers, 'cldr/export/code/numbers'
10
+ # autoload :Plurals, 'cldr/export/code/plurals'
11
+ # autoload :Territories, 'cldr/export/code/territories'
12
+ # autoload :Timezones, 'cldr/export/code/timezones'
13
+ # autoload :Units, 'cldr/export/code/units'
14
+ #
15
+ # class << self
16
+ # def dir
17
+ # @dir ||= File.expand_path('./vendor/cldr/common')
18
+ # end
19
+ #
20
+ # def dir=(dir)
21
+ # @dir = dir
22
+ # end
23
+ #
24
+ # def locales
25
+ # Dir["#{dir}/main/*.xml"].map { |path| path =~ /([\w_-]+)\.xml/ && $1 }
26
+ # end
27
+ #
28
+ # def components
29
+ # self.constants.sort - [:Base, :Export]
30
+ # end
31
+ # end
32
+ end
33
+ end
34
+ end
@@ -0,0 +1,29 @@
1
+ # module Cldr
2
+ # module Export
3
+ # module Code
4
+ # end
5
+ # end
6
+ # end
7
+ #
8
+ # export code like this:
9
+ #
10
+ # module Cldr::Data::De
11
+ # module Numbers
12
+ # def self.symbols
13
+ # end
14
+ #
15
+ # module Format
16
+ # def self.currency
17
+ # end
18
+ #
19
+ # def self.decimal
20
+ # end
21
+ #
22
+ # def self.percent
23
+ # end
24
+ #
25
+ # def self.scientific
26
+ # end
27
+ # end
28
+ # end
29
+ # end
@@ -0,0 +1,36 @@
1
+ require 'core_ext/string/camelize'
2
+
3
+ module Cldr
4
+ module Export
5
+ module Data
6
+ autoload :Base, 'cldr/export/data/base'
7
+ autoload :Calendars, 'cldr/export/data/calendars'
8
+ autoload :Currencies, 'cldr/export/data/currencies'
9
+ autoload :Delimiters, 'cldr/export/data/delimiters'
10
+ autoload :Languages, 'cldr/export/data/languages'
11
+ autoload :Numbers, 'cldr/export/data/numbers'
12
+ autoload :Plurals, 'cldr/export/data/plurals'
13
+ autoload :Territories, 'cldr/export/data/territories'
14
+ autoload :Timezones, 'cldr/export/data/timezones'
15
+ autoload :Units, 'cldr/export/data/units'
16
+
17
+ class << self
18
+ def dir
19
+ @dir ||= File.expand_path('./vendor/cldr/common')
20
+ end
21
+
22
+ def dir=(dir)
23
+ @dir = dir
24
+ end
25
+
26
+ def locales
27
+ Dir["#{dir}/main/*.xml"].map { |path| path =~ /([\w_-]+)\.xml/ && $1 }
28
+ end
29
+
30
+ def components
31
+ self.constants.sort - [:Base, :Export]
32
+ end
33
+ end
34
+ end
35
+ end
36
+ end
@@ -0,0 +1,61 @@
1
+ require 'core_ext/string/underscore'
2
+ require 'core_ext/hash/deep_merge'
3
+ require 'nokogiri'
4
+
5
+ module Cldr
6
+ module Export
7
+ module Data
8
+ class Base < Hash
9
+ attr_reader :locale
10
+
11
+ def initialize(locale)
12
+ @locale = locale
13
+ end
14
+
15
+ def update(hash)
16
+ hash.each { |key, value| self[key] = value }
17
+ end
18
+
19
+ def []=(key, value)
20
+ store(key, value) unless value.nil? || value.respond_to?(:empty?) && value.empty?
21
+ end
22
+
23
+ protected
24
+
25
+ def plural?(node)
26
+ !!node.attribute('count')
27
+ end
28
+
29
+ def draft?(node)
30
+ draft = node.attribute('draft')
31
+ draft && draft.value == 'unconfirmed'
32
+ end
33
+
34
+ def name(node)
35
+ node.name.underscore
36
+ end
37
+
38
+ def count(node)
39
+ node.attribute('count').value
40
+ end
41
+
42
+ def select(*sources)
43
+ doc.xpath(xpath(sources))
44
+ end
45
+
46
+ def xpath(sources)
47
+ path = sources.map { |source| source.respond_to?(:path) ? source.path : source }.join('/')
48
+ path =~ /^\/?\/ldml/ ? path : "//ldml/#{path}"
49
+ end
50
+
51
+ def doc
52
+ @doc ||= Nokogiri::XML(File.read(path))
53
+ end
54
+
55
+ def path
56
+ @path ||= "#{Cldr::Export::Data.dir}/main/#{locale.to_s.gsub('-', '_')}.xml"
57
+ end
58
+ end
59
+ end
60
+ end
61
+ end
@@ -0,0 +1,14 @@
1
+ module Cldr
2
+ module Export
3
+ module Data
4
+ class Calendars < Base
5
+ autoload :Gregorian, 'cldr/export/data/calendars/gregorian'
6
+
7
+ def initialize(locale)
8
+ super
9
+ update(:calendars => { :gregorian => Gregorian.new(locale) })
10
+ end
11
+ end
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,142 @@
1
+ module Cldr
2
+ module Export
3
+ module Data
4
+ class Calendars
5
+ class Gregorian < Base
6
+ def initialize(locale)
7
+ super
8
+ update(
9
+ :months => contexts('month'),
10
+ :days => contexts('day'),
11
+ :eras => eras,
12
+ :quarters => contexts('quarter'),
13
+ :periods => contexts('dayPeriod'),
14
+ :fields => fields,
15
+ :formats => {
16
+ :date => formats('date'),
17
+ :time => formats('time'),
18
+ :datetime => formats('dateTime')
19
+ }
20
+ )
21
+ end
22
+
23
+ def calendar
24
+ @calendar ||= select('dates/calendars/calendar[@type="gregorian"]').first
25
+ end
26
+
27
+ def contexts(kind)
28
+ select(calendar, "#{kind}s/#{kind}Context").inject({}) do |result, node|
29
+ context = node.attribute('type').value.to_sym
30
+ result[context] = widths(node, kind, context)
31
+ result
32
+ end
33
+ end
34
+
35
+ def widths(node, kind, context)
36
+ select(node, "#{kind}Width").inject({}) do |result, node|
37
+ width = node.attribute('type').value.to_sym
38
+ result[width] = elements(node, kind, context, width)
39
+ result
40
+ end
41
+ end
42
+
43
+ def elements(node, kind, context, width)
44
+ aliased = select(node, 'alias').first
45
+ if aliased
46
+ xpath_to_key(aliased.attribute('path').value, kind, context, width)
47
+ else
48
+ select(node, kind).inject({}) do |result, node|
49
+ key = node.attribute('type').value
50
+ key = key =~ /^\d*$/ ? key.to_i : key.to_sym
51
+ result[key] = node.content
52
+ result
53
+ end
54
+ end
55
+ end
56
+
57
+ def xpath_to_key(xpath, kind, context, width)
58
+ kind = (xpath =~ %r(/([^\/]*)Width) && $1) || kind
59
+ context = (xpath =~ %r(Context\[@type='([^\/]*)'\]) && $1) || context
60
+ width = (xpath =~ %r(Width\[@type='([^\/]*)'\]) && $1) || width
61
+ :"calendars.gregorian.#{kind}s.#{context}.#{width}"
62
+ end
63
+
64
+ def xpath_width
65
+ end
66
+
67
+ def periods
68
+ am = select(calendar, "am").first
69
+ pm = select(calendar, "pm").first
70
+
71
+ result = {}
72
+ result[:am] = am.content if am
73
+ result[:pm] = pm.content if pm
74
+ result
75
+ end
76
+
77
+ def eras
78
+ base_path = calendar.path.gsub('/ldml/', '') + '/eras'
79
+ keys = select("#{base_path}/*").map { |node| node.name }
80
+
81
+ keys.inject({}) do |result, name|
82
+ path = "#{base_path}/#{name}/*"
83
+ key = name.gsub('era', '').gsub(/s$/, '').downcase.to_sym
84
+ result[key] = select(path).inject({}) do |ret, node|
85
+ type = node.attribute('type').value.to_i rescue 0
86
+ ret[type] = node.content
87
+ ret
88
+ end
89
+ result
90
+ end
91
+ end
92
+
93
+ def extract(path, lambdas)
94
+ nodes = select(path)
95
+ nodes.inject({}) do |ret, node|
96
+ key = lambdas[:key].call(node)
97
+ ret[key] = lambdas[:value].call(node)
98
+ ret
99
+ end
100
+ end
101
+
102
+ def formats(type)
103
+ formats = select(calendar, "#{type}Formats/#{type}FormatLength").inject({}) do |result, node|
104
+ key = node.attribute('type').value.to_sym rescue :format
105
+ result[key] = pattern(node, type)
106
+ result
107
+ end
108
+ if default = default_format(type)
109
+ formats = default.merge(formats)
110
+ end
111
+ formats
112
+ end
113
+
114
+ def default_format(type)
115
+ if node = select(calendar, "#{type}Formats/default").first
116
+ key = node.attribute('choice').value.to_sym
117
+ { :default => :"calendars.gregorian.formats.#{type.downcase}.#{key}" }
118
+ end
119
+ end
120
+
121
+ def pattern(node, type)
122
+ select(node, "#{type}Format/pattern").inject({}) do |result, node|
123
+ pattern = node.content
124
+ pattern = pattern.gsub('{0}', '{{time}}').gsub('{1}', '{{date}}') if type == 'dateTime'
125
+ result[:pattern] = pattern
126
+ result
127
+ end
128
+ end
129
+
130
+ def fields
131
+ select(calendar, "fields/field").inject({}) do |result, node|
132
+ key = node.attribute('type').value.to_sym
133
+ name = node.xpath('displayName').first
134
+ result[key] = name.content if name
135
+ result
136
+ end
137
+ end
138
+ end
139
+ end
140
+ end
141
+ end
142
+ end