maguire 0.1.3 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 68b624745bcd22e8111fc985132ffa0bc3074af3
4
+ data.tar.gz: cfad026deb4b6355ba405ec5d20879a51ceb9ce6
5
+ SHA512:
6
+ metadata.gz: 57778cf554336ddf7be48aeccf0d00cb263447a8d193f27c966d86afb08369a8bc43deb2bc474edfb8be846c36bab366e148fce06eda3b43b91aa5ef8b7ef971
7
+ data.tar.gz: 6a334c4e870965cb3f993b0de21288ed8888145d53b610c783685f50b635983edaf62668e1539927fec273633e9bff73adc8ed4e370b9956462327671bc0f0ae
@@ -0,0 +1,3 @@
1
+ {
2
+ "symbol": "₼"
3
+ }
@@ -1,3 +1,3 @@
1
1
  {
2
- "symbol": "m"
3
- }
2
+ "symbol": "T"
3
+ }
@@ -28,10 +28,9 @@ module Maguire
28
28
  end
29
29
 
30
30
  def format(money, options={})
31
- currency = Currency.coded(money[:currency].downcase)
32
31
  locale = Locale.lookup(options[:locale] || Maguire.default_locale)
33
32
 
34
- locale.format(money[:value], currency, options)
33
+ locale.format(money[:value], money[:currency], options)
35
34
  end
36
35
  end
37
36
 
@@ -20,6 +20,17 @@ module Maguire
20
20
  Currency.new(Maguire::Hash.merge([@data, locale_data]))
21
21
  end
22
22
 
23
+ def as_json
24
+ {
25
+ name: name,
26
+ code: code,
27
+ minor_units: minor_units,
28
+ precision: precision,
29
+ symbol: symbol,
30
+ symbol_html: symbol_html
31
+ }
32
+ end
33
+
23
34
  class << self
24
35
  def coded(code)
25
36
  self.new(Maguire.data_paths.load(code.downcase))
@@ -23,14 +23,22 @@ module Maguire
23
23
  "<##{self.class} locale=#{locale}>"
24
24
  end
25
25
 
26
- def format(value, currency, options={})
27
- major_value = value.abs / currency.precision
28
- minor_value = round(value.abs - major_value * currency.precision)
26
+ def localized_currency(currency_code)
27
+ currency_code.downcase!
28
+ currency = Currency.coded(currency_code)
29
+ overlay = @currency_overlays[currency_code.to_sym]
30
+ if overlay
31
+ currency.overlay(overlay)
32
+ else
33
+ currency
34
+ end
35
+ end
29
36
 
30
- overlay = @currency_overlays[currency.code.downcase.to_sym]
31
- currency = currency.overlay(overlay) if overlay
37
+ def format(value, currency_code, options={})
38
+ currency = localized_currency(currency_code)
32
39
 
33
- groups = split_value_into_groups(major_value)
40
+ major_value = value.abs / currency.precision
41
+ minor_value = round(value.abs - major_value * currency.precision)
34
42
 
35
43
  formatting = value >= 0 ?
36
44
  @positive_formatting : @negative_formatting
@@ -59,6 +67,8 @@ module Maguire
59
67
  end
60
68
  end
61
69
 
70
+ groups = split_value_into_groups(major_value, formatting[:digit_grouping_style])
71
+
62
72
  formatting[:layout] % {
63
73
  symbol: symbol,
64
74
  code: currency.code,
@@ -68,6 +78,14 @@ module Maguire
68
78
  }
69
79
  end
70
80
 
81
+ def as_json
82
+ {
83
+ positive: @positive_formatting,
84
+ negative: @negative_formatting,
85
+ zero: @zero_formatting
86
+ }
87
+ end
88
+
71
89
  private
72
90
 
73
91
  SOUTH_ASIAN_GROUPING_RE = /([0-9]{2}[^0-9]){3}[0-9]{3}[^0-9]/
@@ -75,21 +93,18 @@ module Maguire
75
93
  GROUPS_OF_THREE_RE = /([0-9]{3}[^0-9]){3}+/
76
94
 
77
95
  def parse_groups_in_south_asian_style(layout)
78
- @group_numbers_in_south_asian_style = true
79
96
  digit_grouping_symbol = layout.match(/1([^0-9]*)23/)[1]
80
97
  layout.gsub!(["1", "23", "45", "67", "890"].join(digit_grouping_symbol), "%{major_value}")
81
98
  digit_grouping_symbol
82
99
  end
83
100
 
84
101
  def parse_groups_of_four(layout)
85
- @group_numbers_in_fours = true
86
102
  digit_grouping_symbol = layout.match(/12([^0-9]*)3456/)[1]
87
103
  layout.gsub!(["12", "3456", "7890"].join(digit_grouping_symbol), "%{major_value}")
88
104
  digit_grouping_symbol
89
105
  end
90
106
 
91
107
  def parse_groups_of_three(layout)
92
- @group_numbers_in_threes = true
93
108
  digit_grouping_symbol = layout.match(/1([^0-9]*)234/)[1]
94
109
  layout.gsub!(["1", "234", "567", "890"].join(digit_grouping_symbol), "%{major_value}")
95
110
  digit_grouping_symbol
@@ -104,10 +119,13 @@ module Maguire
104
119
 
105
120
  digit_grouping_symbol =
106
121
  if layout =~ SOUTH_ASIAN_GROUPING_RE
122
+ digit_grouping_style = 'south_asian'
107
123
  parse_groups_in_south_asian_style(layout)
108
124
  elsif layout =~ GROUPS_OF_FOUR_RE
125
+ digit_grouping_style = 'quadruples'
109
126
  parse_groups_of_four(layout)
110
127
  elsif layout =~ GROUPS_OF_THREE_RE
128
+ digit_grouping_style = 'triples'
111
129
  parse_groups_of_three(layout)
112
130
  end
113
131
 
@@ -120,7 +138,8 @@ module Maguire
120
138
  {
121
139
  layout: layout,
122
140
  decimal_symbol: decimal_symbol,
123
- digit_grouping_symbol: digit_grouping_symbol
141
+ digit_grouping_symbol: digit_grouping_symbol,
142
+ digit_grouping_style: digit_grouping_style
124
143
  }
125
144
  end
126
145
 
@@ -136,7 +155,8 @@ module Maguire
136
155
  {
137
156
  layout: layout,
138
157
  decimal_symbol: decimal_symbol,
139
- digit_grouping_symbol: @positive_formatting[:digit_grouping_symbol]
158
+ digit_grouping_symbol: @positive_formatting[:digit_grouping_symbol],
159
+ digit_grouping_style: @positive_formatting[:digit_grouping_style]
140
160
  }
141
161
  end
142
162
 
@@ -159,14 +179,15 @@ module Maguire
159
179
  groups
160
180
  end
161
181
 
162
- def split_value_into_groups(value)
182
+ def split_value_into_groups(value, style)
163
183
  value = value.to_s
164
184
 
165
- if @group_numbers_in_threes
185
+ case(style)
186
+ when 'triples'
166
187
  split_value_into_groups_of(value, 3)
167
- elsif @group_numbers_in_fours
188
+ when 'quadruples'
168
189
  split_value_into_groups_of(value, 4)
169
- elsif @group_numbers_in_south_asian_style
190
+ when 'south_asian'
170
191
  (value, partial) = break_off(value, 3)
171
192
 
172
193
  split_value_into_groups_of(value, 2) << partial
@@ -1,3 +1,3 @@
1
1
  module Maguire
2
- VERSION = '0.1.3'
2
+ VERSION = '0.2.0'
3
3
  end
metadata CHANGED
@@ -1,52 +1,46 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: maguire
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.3
5
- prerelease:
4
+ version: 0.2.0
6
5
  platform: ruby
7
6
  authors:
8
7
  - Tim Evans
9
8
  autorequire:
10
9
  bindir: bin
11
10
  cert_chain: []
12
- date: 2014-04-13 00:00:00.000000000 Z
11
+ date: 2014-10-08 00:00:00.000000000 Z
13
12
  dependencies:
14
13
  - !ruby/object:Gem::Dependency
15
14
  name: nokogiri
16
15
  requirement: !ruby/object:Gem::Requirement
17
- none: false
18
16
  requirements:
19
- - - ! '>='
17
+ - - ">="
20
18
  - !ruby/object:Gem::Version
21
19
  version: '0'
22
20
  type: :development
23
21
  prerelease: false
24
22
  version_requirements: !ruby/object:Gem::Requirement
25
- none: false
26
23
  requirements:
27
- - - ! '>='
24
+ - - ">="
28
25
  - !ruby/object:Gem::Version
29
26
  version: '0'
30
27
  - !ruby/object:Gem::Dependency
31
28
  name: pry
32
29
  requirement: !ruby/object:Gem::Requirement
33
- none: false
34
30
  requirements:
35
- - - ! '>='
31
+ - - ">="
36
32
  - !ruby/object:Gem::Version
37
33
  version: '0'
38
34
  type: :development
39
35
  prerelease: false
40
36
  version_requirements: !ruby/object:Gem::Requirement
41
- none: false
42
37
  requirements:
43
- - - ! '>='
38
+ - - ">="
44
39
  - !ruby/object:Gem::Version
45
40
  version: '0'
46
41
  - !ruby/object:Gem::Dependency
47
42
  name: rake
48
43
  requirement: !ruby/object:Gem::Requirement
49
- none: false
50
44
  requirements:
51
45
  - - '='
52
46
  - !ruby/object:Gem::Version
@@ -54,7 +48,6 @@ dependencies:
54
48
  type: :development
55
49
  prerelease: false
56
50
  version_requirements: !ruby/object:Gem::Requirement
57
- none: false
58
51
  requirements:
59
52
  - - '='
60
53
  - !ruby/object:Gem::Version
@@ -62,17 +55,15 @@ dependencies:
62
55
  - !ruby/object:Gem::Dependency
63
56
  name: codeclimate-test-reporter
64
57
  requirement: !ruby/object:Gem::Requirement
65
- none: false
66
58
  requirements:
67
- - - ! '>='
59
+ - - ">="
68
60
  - !ruby/object:Gem::Version
69
61
  version: '0'
70
62
  type: :development
71
63
  prerelease: false
72
64
  version_requirements: !ruby/object:Gem::Requirement
73
- none: false
74
65
  requirements:
75
- - - ! '>='
66
+ - - ">="
76
67
  - !ruby/object:Gem::Version
77
68
  version: '0'
78
69
  description: Currency data acquired from the Swiss Association for Standardization
@@ -81,14 +72,8 @@ executables: []
81
72
  extensions: []
82
73
  extra_rdoc_files: []
83
74
  files:
84
- - lib/maguire/currency.rb
85
- - lib/maguire/data_set.rb
86
- - lib/maguire/hash.rb
87
- - lib/maguire/locale.rb
88
- - lib/maguire/locale.rb~
89
- - lib/maguire/version.rb
90
- - lib/maguire/version.rb~
91
- - lib/maguire.rb
75
+ - LICENSE
76
+ - README.md
92
77
  - iso_data/patch_layer/mga.json
93
78
  - iso_data/patch_layer/mro.json
94
79
  - iso_data/seed_layer/aed.json
@@ -279,6 +264,7 @@ files:
279
264
  - iso_data/symbol_layer/ars.json
280
265
  - iso_data/symbol_layer/aud.json
281
266
  - iso_data/symbol_layer/awg.json
267
+ - iso_data/symbol_layer/azn.json
282
268
  - iso_data/symbol_layer/bas.json
283
269
  - iso_data/symbol_layer/bbd.json
284
270
  - iso_data/symbol_layer/bdt.json
@@ -354,7 +340,6 @@ files:
354
340
  - iso_data/symbol_layer/ltl.json
355
341
  - iso_data/symbol_layer/lvl.json
356
342
  - iso_data/symbol_layer/lyd.json
357
- - iso_data/symbol_layer/lyd.json~
358
343
  - iso_data/symbol_layer/mad.json
359
344
  - iso_data/symbol_layer/mdl.json
360
345
  - iso_data/symbol_layer/mga.json
@@ -377,7 +362,6 @@ files:
377
362
  - iso_data/symbol_layer/nzd.json
378
363
  - iso_data/symbol_layer/omr.json
379
364
  - iso_data/symbol_layer/pab.json
380
- - iso_data/symbol_layer/pab.json~
381
365
  - iso_data/symbol_layer/pen.json
382
366
  - iso_data/symbol_layer/pgk.json
383
367
  - iso_data/symbol_layer/php.json
@@ -432,31 +416,34 @@ files:
432
416
  - iso_data/symbol_layer/zar.json
433
417
  - iso_data/symbol_layer/zmk.json
434
418
  - iso_data/symbol_layer/zmw.json
419
+ - lib/maguire.rb
420
+ - lib/maguire/currency.rb
421
+ - lib/maguire/data_set.rb
422
+ - lib/maguire/hash.rb
423
+ - lib/maguire/locale.rb
424
+ - lib/maguire/version.rb
435
425
  - locale/en_US.json
436
- - LICENSE
437
- - README.md
438
426
  homepage: http://github.com/paddle8/maguire
439
427
  licenses: []
428
+ metadata: {}
440
429
  post_install_message:
441
430
  rdoc_options: []
442
431
  require_paths:
443
432
  - lib
444
433
  required_ruby_version: !ruby/object:Gem::Requirement
445
- none: false
446
434
  requirements:
447
- - - ! '>='
435
+ - - ">="
448
436
  - !ruby/object:Gem::Version
449
437
  version: '0'
450
438
  required_rubygems_version: !ruby/object:Gem::Requirement
451
- none: false
452
439
  requirements:
453
- - - ! '>='
440
+ - - ">="
454
441
  - !ruby/object:Gem::Version
455
442
  version: 1.3.6
456
443
  requirements: []
457
444
  rubyforge_project:
458
- rubygems_version: 1.8.24
445
+ rubygems_version: 2.2.2
459
446
  signing_key:
460
- specification_version: 3
447
+ specification_version: 4
461
448
  summary: Locale-specific currency formatting for Ruby
462
449
  test_files: []
@@ -1,3 +0,0 @@
1
- {
2
- "symbol": "ل.د"
3
- m}
@@ -1,3 +0,0 @@
1
- {
2
- "symbol": "B/.",
3
- }
@@ -1,189 +0,0 @@
1
- require 'json'
2
-
3
- module Maguire
4
- class Locale
5
- class NotSupportedError < StandardError; end
6
-
7
- attr_reader :locale, :code, :symbol, :locale
8
-
9
- def initialize(locale, locale_data={})
10
- @locale = locale
11
-
12
- layouts = locale_data[:layouts]
13
- @positive_formatting = parse_layout(layouts[:positive])
14
- @negative_formatting = parse_layout(layouts[:negative])
15
- if layouts[:zero]
16
- @zero_formatting = parse_zero_layout([:zero])
17
- end
18
-
19
- @currency_overlays = locale_data
20
- end
21
-
22
- def inspect
23
- "<##{self.class} locale=#{locale}>"
24
- end
25
-
26
- def format(value, currency, options={})
27
- major_value = value.abs / currency.precision
28
- minor_value = round(value.abs - major_value * currency.precision)
29
-
30
- overlay = @currency_overlays[currency.code.downcase.to_sym]
31
- currency = currency.overlay(overlay) if overlay
32
-
33
- groups = split_value_into_groups(major_value)
34
-
35
- formatting = value >= 0 ?
36
- @positive_formatting : @negative_formatting
37
-
38
- symbol = currency.symbol
39
- if options[:html] && currency.symbol_html
40
- symbol = currency.symbol_html
41
- end
42
-
43
- strip_insignificant_zeros = options[:strip_insignificant_zeros]
44
- if options[:no_minor_units] || currency.minor_units == 0
45
- minor_value = 0
46
- strip_insignificant_zeros = true
47
- end
48
-
49
- if strip_insignificant_zeros && minor_value == 0
50
- minor_value = ""
51
- decimal_symbol = ""
52
- else
53
- minor_value = minor_value.to_s.rjust(currency.minor_units, "0")
54
- decimal_symbol = formatting[:decimal_symbol]
55
-
56
- if minor_value == 0 && @zero_formatting
57
- formatting = @zero_formatting
58
- end
59
- end
60
-
61
- formatting[:layout] % {
62
- symbol: symbol,
63
- code: currency.code,
64
- decimal: decimal_symbol,
65
- major_value: groups.join(formatting[:digit_grouping_symbol]),
66
- minor_value: minor_value
67
- }
68
- end
69
-
70
- private
71
-
72
- SOUTH_ASIAN_GROUPING_RE = /([0-9]{2}[^0-9]){3}[0-9]{3}[^0-9]/
73
- GROUPS_OF_FOUR_RE = /([0-9]{4}[^0-9])+/
74
- GROUPS_OF_THREE_RE = /([0-9]{3}[^0-9]){3}+/
75
-
76
- def parse_groups_in_south_asian_style(layout)
77
- @group_numbers_in_south_asian_style = true
78
- digit_grouping_symbol = layout.match(/1([^0-9]*)23/)[1]
79
- layout.gsub!(["1", "23", "45", "67", "890"].join(digit_grouping_symbol), "%{major_value}")
80
- digit_grouping_symbol
81
- end
82
-
83
- def parse_groups_of_four(layout)
84
- @group_numbers_in_fours = true
85
- digit_grouping_symbol = layout.match(/12([^0-9]*)3456/)[1]
86
- layout.gsub!(["12", "3456", "7890"].join(digit_grouping_symbol), "%{major_value}")
87
- digit_grouping_symbol
88
- end
89
-
90
- def parse_groups_of_three(layout)
91
- @group_numbers_in_threes = true
92
- digit_grouping_symbol = layout.match(/1([^0-9]*)234/)[1]
93
- layout.gsub!(["1", "234", "567", "890"].join(digit_grouping_symbol), "%{major_value}")
94
- digit_grouping_symbol
95
- end
96
-
97
- # Currency layouts are defined using a standard format of:
98
- # 1234567890.12 USD
99
- # 1,23,45,67,890.12 USD
100
- # 12,3456,7890.12 USD
101
- def parse_layout(layout)
102
- layout = layout.dup
103
-
104
- digit_grouping_symbol =
105
- if layout =~ SOUTH_ASIAN_GROUPING_RE
106
- parse_groups_in_south_asian_style(layout)
107
- elsif layout =~ GROUPS_OF_FOUR_RE
108
- parse_groups_of_four(layout)
109
- elsif layout =~ GROUPS_OF_THREE_RE
110
- parse_groups_of_three(layout)
111
- end
112
-
113
- layout.gsub!("USD", "%{code}")
114
- layout.gsub!("$", "%{symbol}")
115
- layout.gsub!("12", "%{minor_value}")
116
- decimal_symbol = layout.match(/major_value}(.*)%{minor_value/)[1]
117
- layout.gsub!(decimal_symbol, "%{decimal}")
118
-
119
- {
120
- layout: layout,
121
- decimal_symbol: decimal_symbol,
122
- digit_grouping_symbol: digit_grouping_symbol
123
- }
124
- end
125
-
126
- def parse_zero_layout(layout)
127
- layout = layout.dup
128
-
129
- layout.gsub!("USD", "%{code}")
130
- layout.gsub!("$", "%{symbol}")
131
- layout.gsub!("1", "%{major_value}")
132
- decimal_symbol = @positive_layout[:decimal_symbol]
133
- layout.gsub!(decimal_symbol, "%{decimal}")
134
-
135
- {
136
- layout: layout,
137
- decimal_symbol: decimal_symbol,
138
- digit_grouping_symbol: @positive_layout[:digit_grouping_symbol]
139
- }
140
- end
141
-
142
- def round(value)
143
- value.to_i
144
- end
145
-
146
- def break_off(value, number)
147
- len = value.length
148
- number = len if number > len
149
- [value.slice(0, len - number), value.slice(len - number, len)]
150
- end
151
-
152
- def split_value_into_groups_of(value, number)
153
- groups = []
154
- while value && value.length > 0
155
- (value, partial) = break_off(value, number)
156
- groups.unshift(partial)
157
- end
158
- groups
159
- end
160
-
161
- def split_value_into_groups(value)
162
- value = value.to_s
163
-
164
- if @group_numbers_in_threes
165
- split_value_into_groups_of(value, 3)
166
- elsif @group_numbers_in_fours
167
- split_value_into_groups_of(value, 4)
168
- elsif @group_numbers_in_south_asian_style
169
- (value, partial) = break_off(value, 3)
170
-
171
- split_value_into_groups_of(value, 2) << partial
172
- else
173
- []
174
- end
175
- end
176
-
177
- class << self
178
- def lookup(options)
179
- locale = "#{options[:lang].downcase}_#{options[:country].upcase}"
180
- data = Maguire.locale_paths.load(locale)
181
- if data.nil?
182
- raise Locale::NotSupportedError.new("The locale #{locale} isn't supported")
183
- else
184
- self.new(locale, data)
185
- end
186
- end
187
- end
188
- end
189
- end
@@ -1,3 +0,0 @@
1
- module Maguire
2
- VERSION = '0.1.2'
3
- end