d12n 0.0.3 → 0.0.4

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: abcfcf50cfc7704732eb93a84fca8dacb37e6347
4
- data.tar.gz: 7ef57e5988fd6d9185032db1dcaf1cfb48a602ce
3
+ metadata.gz: 9fab51c4115aeaa16486a5319ea6cdb9f63eef5f
4
+ data.tar.gz: b98690bb15e012314d65b65594e9ca1f8e8e006c
5
5
  SHA512:
6
- metadata.gz: c8241902f3b72b64ed42ee7969b3eedf1165b988636f8508e467cd085f4dfa1cd179709c5021a2b410ef3ff0f204039c512f5bfe7345e613ac181381f3825bf6
7
- data.tar.gz: 0a64084146dd829f4f1ae50140ff74d1bcb5edde9dc649964cd4eb4c1efa2b4c45903930ffa8ac90535616c474680b2186b76159d263498e80d3c67a89799aa8
6
+ metadata.gz: 359787933d7c1c15f9a6c41e905a1a28808d3bc8ae29364f7cba35080c7f0614ea351ea5c04470cc4f49faedd0f45a50e0f02ceb9f542e88d6703fb525baa9eb
7
+ data.tar.gz: ee41ec45117aeb4e02d698aa08f0b901b4c025e1c53051f3bacc62c8c7fc2399d061557e97b2780f6358b1eab35d20e5200bc00940b74708fefaf2cde1ad323a
data/README.md CHANGED
@@ -17,7 +17,7 @@ class Dummy
17
17
  include D12n::ModelSupport
18
18
 
19
19
  attr_accessor :amount
20
- d12n_attribute :amount
20
+ d12n_attribute :amount, factor: 100
21
21
  end
22
22
  ```
23
23
 
@@ -49,3 +49,23 @@ d12n_attribute :amount, prefix: 'localized'
49
49
  ```
50
50
 
51
51
  Would give you `localized_amount` instead of `local_amount`.
52
+
53
+ ### Internal integer representation with a factor
54
+
55
+ If your internal representation is for example in cents, but the local format should be EUR with decimal point
56
+ you can use this option:
57
+
58
+ ```ruby
59
+ d12n_attribute :amount, factor: 100
60
+ ```
61
+
62
+ ```ruby
63
+ d = Dummy.new
64
+
65
+ d.amount = 1_234
66
+ d.local_amount # "12,34"
67
+
68
+ d.local_amount = '3,456.78'
69
+ d.amount.class # Integer
70
+ d.amount # 345_678
71
+ ```
data/lib/d12n.rb CHANGED
@@ -1,4 +1,5 @@
1
1
  require 'active_support'
2
+ require 'active_support/core_ext/hash'
2
3
  require 'bigdecimal'
3
4
 
4
5
  module D12n
@@ -3,28 +3,34 @@ module D12n
3
3
  module ClassMethods
4
4
  def d12n_attribute(*args)
5
5
  options = args.extract_options!
6
- prefix = options[:prefix] || 'local'
6
+ options.reverse_merge! prefix: 'local'
7
7
  args.each do |name|
8
- define_reader name, prefix
9
- define_writer name, prefix
8
+ define_reader name, options
9
+ define_writer name, options
10
10
  end
11
11
  end
12
12
 
13
13
  private
14
14
 
15
- def define_reader(name, prefix)
16
- define_method "#{prefix}_#{name}" do
17
- local = instance_variable_get "@#{prefix}_#{name}"
15
+ def define_reader(name, options)
16
+ define_method "#{options[:prefix]}_#{name}" do
17
+ local = instance_variable_get "@#{options[:prefix]}_#{name}"
18
18
  return local if local
19
- ActiveSupport::NumberHelper::NumberToDelimitedConverter.convert(send(name), {})
19
+ number = send(name)
20
+ # If a factor is defined, internal presentation is an integer multiple of the local value
21
+ number /= options[:factor].to_f if options[:factor]
22
+ D12n.strategy.bigdecimal_to_formatted(number)
20
23
  end
21
24
  end
22
25
 
23
- def define_writer(name, prefix)
24
- define_method "#{prefix}_#{name}=" do |val|
26
+ def define_writer(name, options)
27
+ define_method "#{options[:prefix]}_#{name}=" do |val|
25
28
  begin
26
- instance_variable_set "@#{prefix}_#{name}", val
27
- send "#{name}=", D12n.strategy.number_to_bigdecimal(val)
29
+ instance_variable_set "@#{options[:prefix]}_#{name}", val
30
+ number = D12n.strategy.formatted_to_bigdecimal(val)
31
+ # If a factor is defined, internal presentation is an integer multiple of the local value
32
+ number = (number * options[:factor].to_f).to_i if options[:factor]
33
+ send "#{name}=", number
28
34
  val
29
35
  rescue ArgumentError
30
36
  val
@@ -6,9 +6,13 @@ module D12n
6
6
  extend self
7
7
 
8
8
  # must raise ArgumentError when format is invalid
9
- def number_to_bigdecimal(formatted)
9
+ def formatted_to_bigdecimal(formatted)
10
10
  BigDecimal.new formatted.tr('.', '').tr(',', '.')
11
11
  end
12
+
13
+ def bigdecimal_to_formatted(internal)
14
+ ActiveSupport::NumberHelper::NumberToDelimitedConverter.convert(internal, {})
15
+ end
12
16
  end
13
17
  end
14
18
  end
@@ -6,9 +6,13 @@ module D12n
6
6
  extend self
7
7
 
8
8
  # must raise ArgumentError when format is invalid
9
- def number_to_bigdecimal(formatted)
9
+ def formatted_to_bigdecimal(formatted)
10
10
  BigDecimal.new formatted.tr(',', '')
11
11
  end
12
+
13
+ def bigdecimal_to_formatted(internal)
14
+ ActiveSupport::NumberHelper::NumberToDelimitedConverter.convert(internal, {})
15
+ end
12
16
  end
13
17
  end
14
18
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: d12n
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.3
4
+ version: 0.0.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - mkon