si 0.1.1 → 0.1.2

Sign up to get free protection for your applications and to get access to all the features.
data/README.md CHANGED
@@ -20,6 +20,8 @@ Or install it yourself as:
20
20
 
21
21
  ### `si`
22
22
 
23
+ Express a numeric value with SI prefix.
24
+
23
25
  ```ruby
24
26
  0.9.si # '900m'
25
27
  9.si # '9'
@@ -50,19 +52,32 @@ Or install it yourself as:
50
52
  9876543210000.si(:length => 5) # '9.8765T'
51
53
 
52
54
  # For convenience, a single Fixnum is recognized as :length value
53
- 9876543210000.si(5) # '9.8765T'
55
+ 9876543210000.si(5) # '9.8765T'
54
56
  ```
55
57
 
56
58
  ### `si_byte`
57
59
 
58
- `si_byte` is simply a shorcut for
60
+ `si_byte` is simply a shorcut for `number.si(:length => length, :base => 1024, :min_exp => 0) + 'B'`.
59
61
 
60
62
  ```ruby
61
- number.si(:length => length, :base => 1024, :min_exp => 0) + 'B'
63
+ 13255342817.si_byte(3) # '12.3GB'
62
64
  ```
63
65
 
66
+ ## SI module methods: convert / revert
67
+
64
68
  ```ruby
65
- 13255342817.si_byte(3) # '12.3GB'
69
+ SI.convert(9876543210000, :length => 5) # '9.8765T'
70
+ SI.revert('100k', :base => 1024) # 102400.0
71
+ ```
72
+
73
+ ## Avoiding monkey-patching
74
+
75
+ Require 'si/minimal' instead to avoid monkey-patching numeric classes.
76
+
77
+ ```ruby
78
+ require 'si/minimal'
79
+
80
+ SI.convert(987654321, 3) # 988M
66
81
  ```
67
82
 
68
83
  ## Contributing
data/lib/si.rb CHANGED
@@ -1,55 +1,5 @@
1
1
  # encoding: utf-8
2
2
 
3
- require "si/version"
4
-
5
- module SI
6
- PREFIXES = Hash[ -8.upto(8).zip(%[yzafpnμm kMGTPEZY].chars.map(&:strip)) ]
7
- DEFAULT = {
8
- :length => 3,
9
- :base => 1000,
10
- :min_exp => -8,
11
- :max_exp => 8,
12
- }
13
-
14
- def si options = {}
15
- options = { :length => options } if options.is_a?(Fixnum) && options >= 3
16
- options = DEFAULT.merge(options)
17
- length,
18
- min_exp,
19
- max_exp = options.values_at(:length, :min_exp, :max_exp)
20
- base = options[:base].to_f
21
- minus = self < 0 ? '-' : ''
22
- selfp = self.abs
23
-
24
- PREFIXES.keys.sort.reverse.select { |exp| (min_exp..max_exp).include? exp }.each do |exp|
25
- denom = base ** exp
26
- if selfp >= denom || exp == min_exp
27
- val = selfp / denom
28
- val = val.round [length - val.to_i.to_s.length, 0].max
29
- val = val.to_i if exp == 0 && self.is_a?(Fixnum)
30
- val = val.to_s.ljust(length + 1, '0') if val.is_a?(Float)
31
-
32
- return "#{minus}#{val}#{PREFIXES[exp]}"
33
- end
34
- end
35
-
36
- nil
37
- end
38
-
39
- def si_byte length = 3
40
- self.si(:length => length, :base => 1024, :min_exp => 0) + 'B'
41
- end
42
- end
43
-
44
- class Float
45
- include SI
46
- end
47
-
48
- class Fixnum
49
- include SI
50
- end
51
-
52
- class Bignum
53
- include SI
54
- end
3
+ require 'si/minimal'
4
+ require 'si/patch'
55
5
 
@@ -0,0 +1,13 @@
1
+ # encoding: utf-8
2
+
3
+ module SI
4
+ PREFIXES = Hash[ -8.upto(8).zip(%[yzafpnμm kMGTPEZY].chars.map(&:strip)) ]
5
+
6
+ DEFAULT = {
7
+ :length => 3,
8
+ :base => 1000,
9
+ :min_exp => -8,
10
+ :max_exp => 8,
11
+ }
12
+ end
13
+
data/lib/si/minimal.rb ADDED
@@ -0,0 +1,4 @@
1
+ require 'si/version'
2
+ require 'si/constants'
3
+ require 'si/module'
4
+
data/lib/si/module.rb ADDED
@@ -0,0 +1,49 @@
1
+ module SI
2
+ class << self
3
+ def convert num, options = {}
4
+ options = { :length => options } if options.is_a?(Fixnum) && options >= 3
5
+ options = DEFAULT.merge(options)
6
+ length,
7
+ min_exp,
8
+ max_exp = options.values_at(:length, :min_exp, :max_exp)
9
+ base = options[:base].to_f
10
+ minus = num < 0 ? '-' : ''
11
+ nump = num.abs
12
+
13
+ PREFIXES.keys.sort.reverse.select { |exp| (min_exp..max_exp).include? exp }.each do |exp|
14
+ denom = base ** exp
15
+ if nump >= denom || exp == min_exp
16
+ val = nump / denom
17
+ val = val.round [length - val.to_i.to_s.length, 0].max
18
+ val = val.to_i if exp == 0 && num.is_a?(Fixnum)
19
+ val = val.to_s.ljust(length + 1, '0') if val.is_a?(Float)
20
+
21
+ return "#{minus}#{val}#{PREFIXES[exp]}"
22
+ end
23
+ end
24
+
25
+ nil
26
+ end
27
+
28
+ def revert str, options = {}
29
+ options = DEFAULT.select { |k, v| k == :base }.merge(options)
30
+ base = options[:base]
31
+ pair = PREFIXES.to_a.find { |k, v| v == str[-1] }
32
+
33
+ if pair
34
+ str[0...-1].to_f * (options[:base] ** pair.first)
35
+ else
36
+ str.to_f
37
+ end
38
+ end
39
+ end
40
+
41
+ def si options = {}
42
+ SI.convert(self, options)
43
+ end
44
+
45
+ def si_byte length = 3
46
+ SI.convert(self, :length => length, :base => 1024, :min_exp => 0) + 'B'
47
+ end
48
+ end
49
+
data/lib/si/patch.rb ADDED
@@ -0,0 +1,15 @@
1
+ class Float
2
+ include SI
3
+ end
4
+
5
+ class Fixnum
6
+ include SI
7
+ end
8
+
9
+ class Bignum
10
+ include SI
11
+ end
12
+
13
+ class Rational
14
+ include SI
15
+ end
data/lib/si/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module SI
2
- VERSION = "0.1.1"
2
+ VERSION = "0.1.2"
3
3
  end
data/test/test_si.rb CHANGED
@@ -180,5 +180,21 @@ class TestSI < Test::Unit::TestCase
180
180
  def test_shortcut
181
181
  assert_equal '123.5M', 123450000.si(4)
182
182
  end
183
+
184
+ def test_module_methods
185
+ assert_equal '9.8765T', SI.convert(9876543210000, :length => 5)
186
+ assert_equal 9876500000000, SI.revert('9.8765T')
187
+ assert_equal 9876500000, SI.revert('9.8765G')
188
+ assert_equal 9876500, SI.revert('9.8765M')
189
+ assert_equal 9.8765 * 1024 ** 2, SI.revert('9.8765M', :base => 1024)
190
+ assert_equal 0.0098765, SI.revert('9.8765m')
191
+ assert_equal 0.0098765, SI.revert('9.8765m')
192
+ assert_equal 9.8765, SI.revert('9.8765')
193
+ assert_equal 0.0, SI.revert('hello') # FIXME
194
+ end
195
+
196
+ def test_rational
197
+ assert_equal '12.345n', (12345 * (10 ** -12)).si(5)
198
+ end
183
199
  end
184
200
 
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: si
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.1
4
+ version: 0.1.2
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-09-11 00:00:00.000000000 Z
12
+ date: 2012-09-13 00:00:00.000000000 Z
13
13
  dependencies: []
14
14
  description: Formats a number with SI prefix
15
15
  email:
@@ -24,6 +24,10 @@ files:
24
24
  - README.md
25
25
  - Rakefile
26
26
  - lib/si.rb
27
+ - lib/si/constants.rb
28
+ - lib/si/minimal.rb
29
+ - lib/si/module.rb
30
+ - lib/si/patch.rb
27
31
  - lib/si/version.rb
28
32
  - si.gemspec
29
33
  - test/test_si.rb