satoshis 0.1.0 → 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.
Files changed (3) hide show
  1. checksums.yaml +4 -4
  2. data/lib/satoshis.rb +51 -37
  3. metadata +2 -44
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 7d2bfafdffd72c9977045b7a1d89ebc13e65f5c5a06c8b4c1ba55c6a26e3d221
4
- data.tar.gz: d952b6954c4b2fbad3dbf1488d492966d8caaaa1bd11142a571e197fc8fcc1d5
3
+ metadata.gz: 20a41eb38b1f428e876fe02cc28348e98cf11a9aed14c7612ca532a6bbe7bb14
4
+ data.tar.gz: 1fb070622ba09170b8d976e66091e297ae49d279f03734f520747ad9744a49c9
5
5
  SHA512:
6
- metadata.gz: 7020d62dd9777924401e023374b4b0d1abf6ff660f5660afe9b7f737d9e24a00caeb6053958b0f369a8cd339badd5374b99e0d149ef955bac675a738b3139082
7
- data.tar.gz: ab5bcfb64e121b2b69b51d8386298ab1eba38de1c5f0ff16bb7095a76afc0992dc4430f030c816e2270ac1e3df0d6ad41b6cb4287d93f332e6c26063681e07eb
6
+ metadata.gz: 7f0a4d1fc66fc0dbc83e211dc34031305328468e59c73916f64a1c74dea5ed1acd03a322a5e9211bebd4c3a7b67ed218870d664b495e7da5ae3506a6fb584a06
7
+ data.tar.gz: 1076d53d10a2f238f310ed807a3751440649c6ddfce73ef1a684ec92da04bcb9d55ba567c02efac6c46aba7ffb2a2cf000b45afc6ee8c7a0fbc036139b75b4a4
data/lib/satoshis.rb CHANGED
@@ -2,71 +2,85 @@
2
2
 
3
3
  require "bigdecimal"
4
4
  require "bigdecimal/util"
5
+ require "forwardable"
5
6
 
6
7
  class Satoshis
7
- VERSION = "0.1.0"
8
+ extend Forwardable
9
+
10
+ VERSION = "0.2.0"
8
11
 
9
12
  PRECISION = 8
10
13
  ONE = 100_000_000
11
14
 
12
15
  attr_reader :value
13
16
 
14
- def initialize(value)
15
- @value = value
16
- end
17
-
18
- class << self
19
- def from_integer(value)
20
- raise(ArgumentError, "value must be an Integer") unless value.is_a? Integer
21
-
22
- new(value)
23
- end
24
-
25
- def from_big_decimal(bitcoins)
26
- raise(ArgumentError, "bitcoins must be a BigDecimal") unless bitcoins.is_a? BigDecimal
17
+ def_delegators :value, :to_i
27
18
 
28
- new((bitcoins * ONE).to_i)
29
- end
19
+ def initialize(value)
20
+ raise(ArgumentError, "Value can't be nil.") if value.nil?
30
21
 
31
- def from_string(bitcoins)
32
- raise(ArgumentError, "bitcoins must be a String") unless bitcoins.is_a? String
22
+ @value = Satoshis.ensure_integer(value)
23
+ end
33
24
 
34
- Satoshis.from_big_decimal(bitcoins.to_d)
25
+ def self.ensure_integer(value)
26
+ if value.is_a?(Integer)
27
+ value
28
+ elsif value.is_a?(BigDecimal)
29
+ (value * ONE).to_i
30
+ elsif value.is_a?(String)
31
+ (value.to_d * ONE).to_i
32
+ else
33
+ raise(ArgumentError, "Value must be Integer, BigDecimal or String.")
35
34
  end
36
35
  end
37
36
 
38
- def string
39
- result = value.abs.to_s
40
-
41
- result = \
42
- if result.length > PRECISION
43
- result.insert(-(PRECISION + 1), ".")
44
- else
45
- "0.#{result.rjust(PRECISION, "0")}"
46
- end
47
-
48
- result = "-#{result}" if negative?
37
+ def +(addend)
38
+ sum = value + addend.value
39
+ Satoshis.new(sum)
40
+ end
49
41
 
50
- result
42
+ def -(subtrahend)
43
+ difference = value - subtrahend.value
44
+ Satoshis.new(difference)
51
45
  end
52
46
 
53
- def string_formatted
54
- result = string.gsub(/0+$/, "")
47
+ def formatted(short: true)
48
+ result = string
55
49
 
56
- result = "#{result}0" if result.end_with?(".")
50
+ if short
51
+ result = result.gsub(/0+$/, "")
52
+ result = "#{result}0" if result.end_with?(".")
53
+ end
57
54
 
58
55
  result
59
56
  end
60
57
 
61
- alias to_s string_formatted
58
+ alias to_s formatted
62
59
 
63
60
  def to_d
64
- string.to_d
61
+ formatted.to_d
65
62
  end
66
63
 
67
- private
64
+ def positive?
65
+ value > 0
66
+ end
68
67
 
69
68
  def negative?
70
69
  value < 0
71
70
  end
71
+
72
+ private
73
+
74
+ def string
75
+ result = value.abs.to_s
76
+
77
+ result = \
78
+ if result.length > PRECISION
79
+ result.insert(-(PRECISION + 1), ".")
80
+ else
81
+ "0.#{result.rjust(PRECISION, "0")}"
82
+ end
83
+
84
+ negative? ? "-#{result}" : result
85
+ end
72
86
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: satoshis
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Bruno Soares
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2018-04-21 00:00:00.000000000 Z
11
+ date: 2018-04-22 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -24,20 +24,6 @@ dependencies:
24
24
  - - "~>"
25
25
  - !ruby/object:Gem::Version
26
26
  version: '1.16'
27
- - !ruby/object:Gem::Dependency
28
- name: codeclimate-test-reporter
29
- requirement: !ruby/object:Gem::Requirement
30
- requirements:
31
- - - "~>"
32
- - !ruby/object:Gem::Version
33
- version: '1.0'
34
- type: :development
35
- prerelease: false
36
- version_requirements: !ruby/object:Gem::Requirement
37
- requirements:
38
- - - "~>"
39
- - !ruby/object:Gem::Version
40
- version: '1.0'
41
27
  - !ruby/object:Gem::Dependency
42
28
  name: pry-byebug
43
29
  requirement: !ruby/object:Gem::Requirement
@@ -122,34 +108,6 @@ dependencies:
122
108
  - - "~>"
123
109
  - !ruby/object:Gem::Version
124
110
  version: '1.24'
125
- - !ruby/object:Gem::Dependency
126
- name: simplecov
127
- requirement: !ruby/object:Gem::Requirement
128
- requirements:
129
- - - "~>"
130
- - !ruby/object:Gem::Version
131
- version: '0.16'
132
- type: :development
133
- prerelease: false
134
- version_requirements: !ruby/object:Gem::Requirement
135
- requirements:
136
- - - "~>"
137
- - !ruby/object:Gem::Version
138
- version: '0.16'
139
- - !ruby/object:Gem::Dependency
140
- name: simplecov-console
141
- requirement: !ruby/object:Gem::Requirement
142
- requirements:
143
- - - "~>"
144
- - !ruby/object:Gem::Version
145
- version: '0.4'
146
- type: :development
147
- prerelease: false
148
- version_requirements: !ruby/object:Gem::Requirement
149
- requirements:
150
- - - "~>"
151
- - !ruby/object:Gem::Version
152
- version: '0.4'
153
111
  description: A Ruby gem to manipulate Bitcoin money without loss of precision.
154
112
  email:
155
113
  - bruno@bsoares.com