maguire 0.1.3 → 0.2.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.
@@ -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