ruby-si-units 0.0.6 → 0.0.7

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: 6ba7d0ae38d0154cb299425afbccd647328cf656
4
- data.tar.gz: 6c8a39d238e7cd97ad45657b4589d545994225b7
3
+ metadata.gz: efa72132c423b8eeebd9edfb7be550c997713b49
4
+ data.tar.gz: 7efa33641c700b3a2af0bc5d2665e30617e19274
5
5
  SHA512:
6
- metadata.gz: 07ee599f83021b50b69f12fd4c25c311282e15a3436a123b28658c847a054dfce24e04757be0fa951e3a80fa2afef45a25c9e0ebf027c33dd782b1ea2d723bd7
7
- data.tar.gz: ca977de578fd5653e276de3e03800b567c10f9c59a2469e3e9e6a87b5a7c484bfd73ef35bc07ce118a50c7bc24a77f4d196acd7bbe37be039ed773562370595e
6
+ metadata.gz: af000424f61537a2c24d6bb758ba2f7de023b4e59aa40ff16e95b4b642c377f9de52c94db2271a669e2235ad2e86eb3b929a44724313bfcef9d945f04d7d7ea6
7
+ data.tar.gz: e655905b2637defa6103898bbcc7c6773bc6ef09fd400274c03001559105c43e91674c1eb813cf6ca844f1c2ad6424ace13e82ea7013bd4a16983ade4cdabbaf
data/.rspec CHANGED
@@ -1,2 +1,2 @@
1
1
  --color
2
- --format progress
2
+ --format documentation
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- ruby-si-units (0.0.6)
4
+ ruby-si-units (0.0.7)
5
5
 
6
6
  GEM
7
7
  remote: https://rubygems.org/
data/README.md CHANGED
@@ -28,14 +28,14 @@ Or install it yourself:
28
28
  ### Convert absolute value to a unit with prefix SI notation
29
29
 
30
30
  ```ruby
31
- unit = SIUnits::Unit.new(10000000)
31
+ unit = SIUnits::Unit.new 10000000
32
32
  # => #<SIUnits::Unit:0x0000000283b8a8 @unit_value=10000000, @unit_kind="mega">
33
33
  unit.best_scale
34
34
  # => "10.0M"
35
35
  ```
36
36
 
37
37
  ```ruby
38
- unit = SIUnits::Unit.new(0.000000001)
38
+ unit = SIUnits::Unit.new 0.000000001
39
39
  # => #<SIUnits::Unit:0x0000000272bb20 @unit_value=1.0e-09, @unit_kind="nano">
40
40
  unit.best_scale
41
41
  # => "1.0n"
@@ -50,6 +50,26 @@ unit.best_scale
50
50
  # => #<SIUnits::Unit:0x000000017406e8 @unit_value=1.0e-09, @unit_kind="nano">
51
51
  ```
52
52
 
53
+ ### Compare units
54
+
55
+
56
+ ```ruby
57
+ a = SIUnits::Unit.new 10000000
58
+ # => #<SIUnits::Unit:0x0000000283b8a8 @unit_value=10000000, @unit_kind="mega">
59
+
60
+ b = SIUnits::Unit.new 0.000000001
61
+ # => #<SIUnits::Unit:0x0000000272bb20 @unit_value=1.0e-09, @unit_kind="nano">
62
+
63
+ a > b
64
+ => true
65
+ a < b
66
+ => false
67
+ a <=> b
68
+ => 1
69
+ a == b
70
+ => false
71
+ ```
72
+
53
73
  ## Contributing
54
74
 
55
75
  1. Fork it
@@ -3,7 +3,7 @@ class String
3
3
  # @return (see RubyUnits::Unit#initialize)
4
4
  def to_unit
5
5
  unit_reduced, prefix = *split_value(self)
6
- SIUnits::Unit.new(unit_reduced.to_f).convert_to(prefix)
6
+ SIUnits::Unit.new(unit_reduced).convert_to(prefix)
7
7
  end
8
8
 
9
9
  def split_value(value)
data/lib/si_units/unit.rb CHANGED
@@ -7,7 +7,8 @@
7
7
  module SIUnits
8
8
  class Unit
9
9
  include Comparable
10
- attr_reader :unit_value
10
+
11
+ attr_reader :unit_value, :unit_kind
11
12
 
12
13
  # Definition of SI Prefix Units, with name, aliases and scale
13
14
  UNITS_DEFINITION = {
@@ -43,52 +44,77 @@ module SIUnits
43
44
  'yocto' => [%w{y Yocto yocto}, 1e-24],
44
45
  'zero' => [%w{zero}, 0.0]
45
46
  }
47
+ UNIT_REGEX = /(\d+\.?\d*)(\w+)/
48
+
49
+ # Create a new Unit object.
50
+ # @return [Unit]
51
+ # @raise [ArgumentError] if absolute value of a temperature is less than absolute zero
52
+ # @raise [ArgumentError] if no unit is specified
53
+ # @raise [ArgumentError] if an invalid unit is specified
54
+ def initialize(*options)
55
+
56
+ raise ArgumentError, "Unit can't be initialized without args" if options[0].nil?
57
+
58
+ case options[0]
59
+ when Numeric
60
+ # Conversion use a scale
61
+ @unit_value = options.first
62
+ @unit_kind = parse_unit
63
+
64
+ when String
65
+ value, prefix = *split_value(options[0])
66
+ @unit_kind = who_is_my_prefix?(prefix)
67
+ # Value is absolute, needs convert to scale of prefix
68
+ @unit_value = value.to_f * unit_scale
46
69
 
47
- # Create a unit object
48
- # Can be initialized with a number
49
- # initialize a unit and parse, recognizing the scale of number
50
- # @param [Fixnum|Float]
51
- # @return Unit
52
- def initialize(unit)
53
- @unit_value = unit
54
- @unit_kind = parse_unit
70
+ else
71
+ raise ArgumentError, "Invalid Unit Format"
72
+ end
55
73
  end
56
74
 
57
75
  # Public call to get a unit best representation
58
76
  # @return String
59
77
  def best_scale
60
- @best_scale ||= best_value_with_scale
78
+ @best_scale ||= best_value_with_scale
61
79
  end
62
80
 
63
- #
81
+ # Comparable units
82
+ # => Compare with scale of kinds
64
83
  def <=>(comparison)
65
- UNITS_DEFINITION.find_index(@unit_kind) <=> UNITS_DEFINITION.find_index(comparison.unit_kind)
84
+ UNITS_DEFINITION[unit_kind].last <=> UNITS_DEFINITION[comparison.unit_kind].last
85
+ end
86
+
87
+ def ==(comparison)
88
+ unit_kind == comparison.unit_kind
66
89
  end
67
90
 
68
- # convert to a specified unit string or to the same units as another Unit
69
- def convert_to(prefix)
70
- return self if prefix.nil?
71
- scalar = prefix_is_defined?(prefix)
72
- absolute_unit_value = convert_base_prefix_to_value self.unit_value, scalar
91
+ # convert to a specified unit string or to the same unit as another Unit
92
+ def convert_to(other)
93
+ return self if other.nil?
73
94
 
74
- SIUnits::Unit.new(absolute_unit_value)
95
+ case other
96
+ when Unit
97
+ return self if other == self
98
+ target = other
99
+ when String
100
+ target = SIUnits::Unit.new(other.to_f)
101
+ else
102
+ raise ArgumentError, "Unknown target units"
103
+ end
75
104
  end
76
105
 
77
- private
106
+ alias :>> :convert_to
78
107
 
79
- # Logic to convert the absolute value to a best form of representation
80
- # Only aliase if scalar is zero!
81
- # => Don't raise a ZeroDivisionError, the zero is defined
82
- def best_value_with_scale
83
- aliase, scalar = UNITS_DEFINITION[@unit_kind]
84
- return aliase.first if scalar == 0
85
- [(@unit_value / scalar), aliase.first].join
108
+ def to_s
109
+ [best_scale, unit_kind].join(' ')
86
110
  end
87
111
 
88
- # Logic to convert a value with scale
89
- # @return Float
90
- def convert_base_prefix_to_value(value, scalar)
91
- value * scalar
112
+ private
113
+
114
+ # Logic to convert the current unit value to a best form of representation
115
+ # == Just remove the "e base" from value
116
+ def best_value_with_scale
117
+ (unit_value / unit_scale).round(4)
92
118
  end
93
119
 
94
120
  # The parser
@@ -121,14 +147,19 @@ module SIUnits
121
147
  end
122
148
  end
123
149
 
124
- # Search on DEFINITIONS if the kind is a element
125
- # @return Fixnum with scale of prefix
126
- # @raise ArgumentError
127
- def prefix_is_defined?(kind)
150
+ def who_is_my_prefix?(prefix)
128
151
  UNITS_DEFINITION.each { |key, value|
129
- return value.last if value[0].include?(kind)
152
+ return key if value[0].include?(prefix)
130
153
  }
131
154
  raise ArgumentError, "Unknown prefix"
132
155
  end
156
+
157
+ def unit_scale
158
+ @unit_scale ||= UNITS_DEFINITION[unit_kind].last
159
+ end
160
+
161
+ def split_value(value)
162
+ value.scan(UNIT_REGEX).flatten
163
+ end
133
164
  end
134
165
  end
@@ -1,4 +1,4 @@
1
1
  module SIUnits
2
2
  # Project Version
3
- VERSION = "0.0.6"
3
+ VERSION = "0.0.7"
4
4
  end
@@ -2,202 +2,49 @@
2
2
  require 'spec_helper'
3
3
  require "unit"
4
4
 
5
- describe "it's a pico " do
6
- it "max limit" do
7
- unit = SIUnits::Unit.new((1e-15) + 0.0000000000001)
8
- expect(unit.best_scale).to match(/[p]/)
9
- end
10
-
11
- it "min limit" do
12
- unit = SIUnits::Unit.new(1e-12)
13
- expect(unit.best_scale).to match(/[p]/)
14
- end
5
+ describe SIUnits::Unit do
15
6
 
16
- it "not a pico" do
17
- unit = SIUnits::Unit.new((1e-12) + 0.0000000000001)
18
- expect(unit.best_scale).to_not match(/[p]/)
19
- end
20
- end
21
-
22
- describe "it's a nano " do
23
- it "max limit" do
24
- unit = SIUnits::Unit.new((1e-12) + 0.00000000001)
25
- expect(unit.best_scale).to match(/[n]/)
26
- end
7
+ context "it's a pico " do
27
8
 
28
- it "min limit" do
29
- unit = SIUnits::Unit.new(1e-9)
30
- expect(unit.best_scale).to match(/[n]/)
31
9
  end
32
10
 
33
- it "not a nano" do
34
- unit = SIUnits::Unit.new((1e-9) + 0.00000000001)
35
- expect(unit.best_scale).to_not match(/[n]/)
36
- end
37
- end
38
-
39
- describe "it's a micro " do
40
- it "max limit" do
41
- unit = SIUnits::Unit.new((1e-9) + 0.00000000001)
42
- expect(unit.best_scale).to match(/[u]/)
43
- end
44
-
45
- it "min limit" do
46
- unit = SIUnits::Unit.new(1e-6)
47
- expect(unit.best_scale).to match(/[u]/)
48
- end
11
+ context "it's a nano " do
49
12
 
50
- it "not a micro" do
51
- unit = SIUnits::Unit.new((1e-6) + 0.000001)
52
- expect(unit.best_scale).to_not match(/[u]/)
53
13
  end
54
- end
55
14
 
56
- describe "it's a milli " do
57
- it "max limit" do
58
- unit = SIUnits::Unit.new((1e-6) + 0.000001)
59
- expect(unit.best_scale).to match(/[m]/)
60
- end
15
+ context "it's a micro " do
61
16
 
62
- it "min limit" do
63
- unit = SIUnits::Unit.new(1e-3)
64
- expect(unit.best_scale).to match(/[m]/)
65
17
  end
66
18
 
67
- it "not a milli" do
68
- unit = SIUnits::Unit.new((1e-3) + 0.001)
69
- expect(unit.best_scale).to_not match(/[m]/)
70
- end
71
- end
19
+ context "it's a milli " do
72
20
 
73
- describe "it's a centi " do
74
- it "max limit" do
75
- unit = SIUnits::Unit.new((1e-3) + 0.001)
76
- expect(unit.best_scale).to match(/[c]/)
77
21
  end
78
22
 
79
- it "min limit" do
80
- unit = SIUnits::Unit.new(1e-2)
81
- expect(unit.best_scale).to match(/[c]/)
82
- end
23
+ context "it's a const " do
83
24
 
84
- it "not a centi" do
85
- unit = SIUnits::Unit.new((1e-2) + 0.001)
86
- expect(unit.best_scale).to_not match(/[c]/)
87
25
  end
88
- end
89
26
 
90
- describe "it's a deci " do
91
- it "max limit" do
92
- unit = SIUnits::Unit.new((1e-2) + 0.01)
93
- expect(unit.best_scale).to match(/[d]/)
27
+ context "it's a kilo " do
94
28
  end
95
29
 
96
- it "min limit" do
97
- unit = SIUnits::Unit.new(1e-1)
98
- expect(unit.best_scale).to match(/[d]/)
99
- end
30
+ context "it's a mega " do
100
31
 
101
- it "not a deci" do
102
- unit = SIUnits::Unit.new((1e-1) + 0.01)
103
- expect(unit.best_scale).to_not match(/[d]/)
104
32
  end
105
- end
106
-
107
- describe "it's a const " do
108
33
 
109
- it "zero" do
110
- unit = SIUnits::Unit.new(0)
111
- expect(unit.best_scale).to match(/zero/)
112
- end
34
+ context "it's a giga " do
113
35
 
114
- it "not a zero" do
115
- unit = SIUnits::Unit.new(0.1)
116
- expect(unit.best_scale).to_not match(/zero/)
117
36
  end
118
- end
119
37
 
120
- describe "it's a deca " do
121
- it "max limit" do
122
- unit = SIUnits::Unit.new((1e2) - 1.0)
123
- expect(unit.best_scale).to match(/(da)/)
38
+ context "Its comparable" do
39
+ it "Compare with"
124
40
  end
125
41
 
126
- it "min limit" do
127
- unit = SIUnits::Unit.new(1e1 + 1.0)
128
- expect(unit.best_scale).to match(/(da)/)
42
+ context "Convert to" do
43
+ it "Convert to"
129
44
  end
130
45
 
131
- it "not a deca" do
132
- unit = SIUnits::Unit.new((1e1) - 1.0)
133
- expect(unit.best_scale).to_not match(/da/)
46
+ context "Convert string to unit" do
47
+ it "string to unit"
134
48
  end
135
- end
136
49
 
137
- describe "it's a hecto " do
138
- it "max limit" do
139
- unit = SIUnits::Unit.new((1e3) - 1.0)
140
- expect(unit.best_scale).to match(/[h]/)
141
- end
142
-
143
- it "min limit" do
144
- unit = SIUnits::Unit.new(1e2 + 1.0)
145
- expect(unit.best_scale).to match(/[h]/)
146
- end
147
-
148
- it "not a deca" do
149
- unit = SIUnits::Unit.new((1e2) - 1.0)
150
- expect(unit.best_scale).to_not match(/[h]/)
151
- end
152
- end
153
-
154
- describe "it's a kilo " do
155
- it "max limit" do
156
- unit = SIUnits::Unit.new((1e6) - 1.0)
157
- expect(unit.best_scale).to match(/[k]/)
158
- end
159
-
160
- it "min limit" do
161
- unit = SIUnits::Unit.new(1e3 + 1.0)
162
- expect(unit.best_scale).to match(/[k]/)
163
- end
164
-
165
- it "not a deca" do
166
- unit = SIUnits::Unit.new((1e3) - 1.0)
167
- expect(unit.best_scale).to_not match(/[k]/)
168
- end
169
- end
170
-
171
- describe "it's a mega " do
172
- it "max limit" do
173
- unit = SIUnits::Unit.new((1e9) - 1.0)
174
- expect(unit.best_scale).to match(/[M]/)
175
- end
176
-
177
- it "min limit" do
178
- unit = SIUnits::Unit.new(1e6 + 1.0)
179
- expect(unit.best_scale).to match(/[M]/)
180
- end
181
-
182
- it "not a deca" do
183
- unit = SIUnits::Unit.new((1e6) - 1.0)
184
- expect(unit.best_scale).to_not match(/[M]/)
185
- end
186
- end
187
-
188
- describe "it's a giga " do
189
- it "max limit" do
190
- unit = SIUnits::Unit.new((1e12) - 1.0)
191
- expect(unit.best_scale).to match(/[G]/)
192
- end
193
-
194
- it "min limit" do
195
- unit = SIUnits::Unit.new(1e9 + 1.0)
196
- expect(unit.best_scale).to match(/[G]/)
197
- end
198
-
199
- it "not a deca" do
200
- unit = SIUnits::Unit.new((1e9) - 1.0)
201
- expect(unit.best_scale).to_not match(/[G]/)
202
- end
203
50
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ruby-si-units
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.6
4
+ version: 0.0.7
5
5
  platform: ruby
6
6
  authors:
7
7
  - Kenner Kliemann
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2013-09-09 00:00:00.000000000 Z
11
+ date: 2013-09-26 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -100,7 +100,6 @@ files:
100
100
  - lib/unit.rb
101
101
  - ruby-si-unit.gemspec
102
102
  - spec/spec_helper.rb
103
- - spec/units/string_spec.rb
104
103
  - spec/units/unit_spec.rb
105
104
  homepage: https://github.com/gnomex/ruby-si-units
106
105
  licenses:
@@ -122,11 +121,10 @@ required_rubygems_version: !ruby/object:Gem::Requirement
122
121
  version: '0'
123
122
  requirements: []
124
123
  rubyforge_project:
125
- rubygems_version: 2.0.7
124
+ rubygems_version: 2.1.1
126
125
  signing_key:
127
126
  specification_version: 4
128
127
  summary: A SI prefix unit handling library for ruby
129
128
  test_files:
130
129
  - spec/spec_helper.rb
131
- - spec/units/string_spec.rb
132
130
  - spec/units/unit_spec.rb
@@ -1,3 +0,0 @@
1
- # coding: utf-8
2
- require 'spec_helper'
3
- require "unit"