store_as_int 0.0.9 → 0.0.10

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: d88071316b9669a60fa319caf69e86a9be98ca5c56113db47cc16fa00be7e129
4
- data.tar.gz: 4190168f99238e32270d686caf7659d0b4819bbffdc581e9785432664ec59e6b
3
+ metadata.gz: 237e8f13fbdf567a8e6a3a87adaf4633185ef1df45ee94deec35109ad3cc2a93
4
+ data.tar.gz: 85df459643cd74d291996079526a7f2716dd476ffe16fb2fac3569f3f73e34e3
5
5
  SHA512:
6
- metadata.gz: ea4a01cd525a5b5ae35fc4117ef69b9cc1d1ded59e05af601a2bbbc64f1bb299c83d02236210773bc0e056c23ecbd42f845e1eca356fc86a55a6167173686926
7
- data.tar.gz: 15907321889d745a49b419859598f94fc21f91444167084cb2f25494715177e24ca479f63b91cf158bbacb01b53b0178e1561903bd957baf18e71ec914cd71fa
6
+ metadata.gz: be707c1a0705d8ad41d391c7d25014c5bd661b48fafe9762ef51697bd8412625c90d58fc2e436b30f042d4a11e4a2ae96b4cd870563dc1001e9a097cad269b7b
7
+ data.tar.gz: 2061b6c4e2c1eed125753fe8c672d43d31a37d69dca3eb6b27b0e617a828b7ad6e806f76f907fc92d649d25009bf1780b97cd0c7a0057d6ea008b0dee603ece0
@@ -1,13 +1,14 @@
1
1
  module StoreAsInt
2
- class Base
2
+ class Base < Numeric
3
3
  require 'bigdecimal'
4
4
  require 'bigdecimal/util'
5
5
 
6
6
  # == Constants ============================================================
7
- BASE = 1
8
- DECIMALS = nil
9
- SYM = 1
10
- STR_FORMAT = nil
7
+ ACCURACY ||= 5
8
+ DECIMALS ||= 2
9
+ SYM ||= nil
10
+ STR_FORMAT ||= nil
11
+ OPERATORS ||= [:+, :-, :*, :/, :%, :**].map {|sym| [sym]*2}.to_h
11
12
 
12
13
  # == Attributes ============================================================
13
14
  attr_accessor :num
@@ -17,15 +18,27 @@ module StoreAsInt
17
18
 
18
19
  # == Class Methods ========================================================
19
20
  def self.===(other)
20
- self === other || Integer === other
21
+ !!(
22
+ Numeric === other ||
23
+ (
24
+ other.is_a?(Class) ?
25
+ other :
26
+ other.class
27
+ ) <= self
28
+ ) || !!(
29
+ other.instance_of?(String) &&
30
+ (
31
+ other.gsub(/(,|\s)/, '') =~ /^(\-|\+)?#{Regexp.quote("\\#{sym}" || '[^0-9]')}?([0-9]+)(\.[0-9]+)?$/
32
+ )
33
+ )
21
34
  end
22
35
 
23
- def self.<=>(other)
24
- self <=> other || Integer <=> other
36
+ def self.accuracy
37
+ self::ACCURACY || 0
25
38
  end
26
39
 
27
40
  def self.base
28
- self::BASE || 1
41
+ 10 ** accuracy.to_i
29
42
  end
30
43
 
31
44
  def self.decimals
@@ -33,96 +46,142 @@ module StoreAsInt
33
46
  end
34
47
 
35
48
  def self.sym
36
- self::SYM || ''
49
+ self::SYM
37
50
  end
38
51
 
39
52
  def self.str_format
40
53
  self::STR_FORMAT
41
54
  end
42
55
 
56
+ def self.operators
57
+ self::OPERATORS
58
+ end
59
+
60
+ # == Boolean Methods ======================================================
61
+ def is_a?(klass)
62
+ kind_of?(klass)
63
+ end
64
+
65
+ def is_an?(klass)
66
+ kind_of?(klass)
67
+ end
68
+
69
+ def kind_of?(klass)
70
+ value.kind_of?(klass) || self.class == klass || super(klass)
71
+ end
72
+
73
+ def instance_of?(klass)
74
+ self.class == klass
75
+ end
76
+
77
+ def present?
78
+ begin
79
+ self.num.present?
80
+ rescue NoMethodError
81
+ !self.num.nil? && !(self.num.to_s == "")
82
+ end
83
+ end
84
+
85
+ # == Comparison Methods ===================================================
86
+ def <=>(compare)
87
+ value <=> convert(compare).value
88
+ end
89
+
90
+ def ==(compare)
91
+ value == convert(compare).value
92
+ end
93
+
94
+ def ===(compare)
95
+ self.== compare
96
+ end
97
+
43
98
  # == Instance Methods =====================================================
44
99
  def initialize(new_val = nil)
45
- return self.num = 0 unless new_val
100
+ return self.num = nil unless new_val
46
101
 
47
102
  if new_val.is_a?(self.class)
48
103
  self.num = new_val.value
49
104
  elsif new_val.is_a?(Integer)
50
105
  self.num = new_val
51
106
  else
107
+ if new_val.is_a?(String)
108
+ begin
109
+ new_val =
110
+ new_val.
111
+ gsub(/(,|\s)/, '').
112
+ match(/(\-|\+)?#{Regexp.quote("\\#{sym}" || '[^0-9]')}?([0-9]+)(\.[0-9]+)?$/)[1..-1].join("")
113
+ rescue NoMethodError
114
+ return self.num = 0
115
+ end
116
+ end
117
+
52
118
  self.num = (new_val.to_d * self.class.base).to_i
53
119
  end
54
120
  end
55
121
 
56
- def base
57
- self.class.base
122
+ def accuracy
123
+ @accuracy ||= self.class.accuracy || 0
58
124
  end
59
125
 
60
- def decimals
61
- @decimals ||= self.class.decimals
126
+ def as_json(*args)
127
+ self.num.as_json(*args)
62
128
  end
63
129
 
64
- def base_float
65
- base.to_f
130
+ def base
131
+ @base ||= 10 ** accuracy
66
132
  end
67
133
 
68
- def sym
69
- @sym ||= self.class.sym
134
+ def base_float
135
+ base.to_f
70
136
  end
71
137
 
72
- def sym=(new_sym)
73
- @sym = new_sym
138
+ def coerce(other_val)
139
+ [convert(other_val), self]
74
140
  end
75
141
 
76
142
  def convert(other_val)
77
143
  self.class.new(other_val)
78
144
  end
79
145
 
80
- def <=>(compare)
81
- value <=> convert(compare).value
82
- end
83
-
84
- def == (compare)
85
- value == convert(compare).value
86
- end
87
-
88
- def kind_of?(klass)
89
- self.num.kind_of?(klass)
90
- end
91
-
92
- def to_i
93
- self.num.to_i
146
+ def decimals
147
+ @decimals ||= self.class.decimals
94
148
  end
95
149
 
96
- def to_f
97
- to_i/base_float
150
+ def inspect
151
+ to_s(true)
98
152
  end
99
153
 
100
- def to_d
101
- to_i.to_d/base
154
+ def method_missing(name, *args, &blk)
155
+ if self.class.operators[name.to_sym]
156
+ self.class.new(value.__send__(name, self.class.new(*args).value))
157
+ else
158
+ ret = value.send(name, *args, &blk)
159
+ ret.is_a?(Numeric) ? self.class.new(ret) : ret
160
+ end
102
161
  end
103
162
 
104
- def cents
105
- self
163
+ def negative_sign
164
+ value < 0 ? '-' : ''
106
165
  end
107
166
 
108
- def value
109
- self.num || 0
167
+ def sym
168
+ @sym ||= self.class.sym || ''
110
169
  end
111
170
 
112
- def as_json(*args)
113
- self.num.as_json(*args)
171
+ def sym=(new_sym)
172
+ @sym = new_sym
114
173
  end
115
174
 
116
- def inspect
117
- to_s(true)
175
+ def to_d
176
+ to_i.to_d/base
118
177
  end
119
178
 
120
- def negative_sign
121
- value < 0 ? '-' : ''
179
+ def to_f
180
+ to_i/base_float
122
181
  end
123
182
 
124
- def coerce(other)
125
- [other, value]
183
+ def to_i
184
+ self.num.to_i
126
185
  end
127
186
 
128
187
  def to_s(w_sym = false)
@@ -135,25 +194,28 @@ module StoreAsInt
135
194
  end
136
195
  end
137
196
 
138
- def present?
139
- begin
140
- value.present?
141
- rescue NoMethodError
142
- !value.nil? && !(value.to_s == "")
143
- end
144
- end
145
-
146
- def method_missing(name, *args, &blk)
147
- ret = value.send(name, *args, &blk)
148
- ret.is_a?(Numeric) ? self.class.new(ret) : ret
197
+ def value
198
+ self.num || 0
149
199
  end
150
200
 
151
201
  private
152
202
  def str_format
153
203
  @str_format ||= self.class.str_format || ->(passed, w_sym) do
154
- return nil unless w_sym || passed.present?
155
- str = "#{passed.negative_sign}#{w_sym ? passed.sym : ''}#{passed.decimals ? sprintf("%0.0#{passed.decimals.to_i}f", passed.to_d.abs) : passed.to_i.to_s}".reverse.split('.')
156
- str[-1] = str[-1].gsub(/(\d{3})(?=\d)/, w_sym ? '\\1,' : '\\1')
204
+ return '' unless w_sym || passed.present?
205
+ str = "#{
206
+ passed.negative_sign
207
+ }#{
208
+ w_sym ? passed.sym : ''
209
+ }#{
210
+ passed.decimals ?
211
+ sprintf("%0.0#{passed.decimals.to_i}f", passed.to_d.abs) :
212
+ passed.to_i.to_s
213
+ }".reverse.split('.')
214
+
215
+ str[-1] =
216
+ str[-1].
217
+ gsub(/(\d{3})(?=\d)/, w_sym ? '\\1,' : '\\1')
218
+
157
219
  str.join('.').reverse
158
220
  end
159
221
  end
@@ -2,10 +2,45 @@ module StoreAsInt
2
2
  unless defined?(StoreAsInt::Base)
3
3
  require_relative './base'
4
4
  end
5
-
5
+
6
6
  class ExchangeRate < StoreAsInt::Base
7
- BASE = 10000000000
7
+ require 'bigdecimal'
8
+ require 'bigdecimal/util'
9
+
10
+ # == Constants ============================================================
11
+ ACCURACY = 10
8
12
  DECIMALS = 4
9
13
  SYM = '%'
14
+
15
+ # == Attributes ============================================================
16
+
17
+ # == Extensions ===========================================================
18
+
19
+ # == Class Methods ========================================================
20
+ def self.extend_numerics
21
+ Numeric.include StoreAsInt::ActsAsExchangeRateInt
22
+ end
23
+ # == Boolean Methods ======================================================
24
+
25
+ # == Comparison Methods ===================================================
26
+
27
+ # == Instance Methods =====================================================
28
+ def exchange_rate_str
29
+ to_s(true)
30
+ end
31
+
32
+ def to_exchange_rate
33
+ self
34
+ end
35
+ end
36
+
37
+ module ActsAsExchangeRateInt
38
+ def exchange_rate_str
39
+ to_cents.to_s(true)
40
+ end
41
+
42
+ def to_exchange_rate
43
+ StoreAsInt::ExchangeRate.new self
44
+ end
10
45
  end
11
46
  end
@@ -4,8 +4,43 @@ module StoreAsInt
4
4
  end
5
5
 
6
6
  class Money < StoreAsInt::Base
7
- BASE = 100
7
+ require 'bigdecimal'
8
+ require 'bigdecimal/util'
9
+
10
+ # == Constants ============================================================
11
+ ACCURACY = 2
8
12
  DECIMALS = 2
9
13
  SYM = '$'
14
+
15
+ # == Attributes ============================================================
16
+
17
+ # == Extensions ===========================================================
18
+
19
+ # == Class Methods ========================================================
20
+ def self.extend_numerics
21
+ Numeric.include StoreAsInt::ActsAsMoneyInt
22
+ end
23
+ # == Boolean Methods ======================================================
24
+
25
+ # == Comparison Methods ===================================================
26
+
27
+ # == Instance Methods =====================================================
28
+ def dollar_str
29
+ to_s(true)
30
+ end
31
+
32
+ def to_cents
33
+ self
34
+ end
35
+ end
36
+
37
+ module ActsAsMoneyInt
38
+ def dollar_str
39
+ to_cents.to_s(true)
40
+ end
41
+
42
+ def to_cents
43
+ StoreAsInt::Money.new self
44
+ end
10
45
  end
11
46
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: store_as_int
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.9
4
+ version: 0.0.10
5
5
  platform: ruby
6
6
  authors:
7
7
  - Sampson Crowley