ruby-si-units 0.0.3 → 0.0.4

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
  SHA1:
3
- metadata.gz: 1dd9d5852f10c0121151f8beff6f4901a5b9a1d3
4
- data.tar.gz: abbf844f0f8bc8aa84dcaec4da99233371793d46
3
+ metadata.gz: 5f466356845980e98060a4f9570ff9b06f8dad80
4
+ data.tar.gz: 8a30b37d30f7f7ec6194b5c51539538b82d4eff3
5
5
  SHA512:
6
- metadata.gz: 0313e3edf342fdb8ec05b7de112f000db5efdfcf93458ef7c2cd3761f8913512398efaf18f474401cddaec493449b1c037eb49c8ca062e54848d5f041adb4670
7
- data.tar.gz: 42cd297fbae6c77c2ce0de86c9f584344fd278c1b1033ec46298021724ada10dc24d24231cee39b99923e367a0aca44fe49330c1d06f42a74ec4e6a34662f81b
6
+ metadata.gz: b7d9d08987f2e2a58989a4c93049154d7755854a0d7ddd471e973da475dc0fc4b23045a7b28c9fadacfbcf4c8446c9bebddfb32b4640d5acc37a3edb5debd8dc
7
+ data.tar.gz: f3b4c8c2aecd4a40db6ef7f75a1df804df99ee1326eba977df997e8e6425d47c5b9d9a44a39e0126fd09d5ae5d7d1c30603c7f534b0d1978c3812ed4c91b6c2a
data/.travis.yml ADDED
@@ -0,0 +1,7 @@
1
+ language: ruby
2
+ script: bundle exec rspec spec
3
+ rvm:
4
+ - 2.0.0
5
+ - 1.9.3
6
+ notifications:
7
+ email: false
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- ruby-si-units (0.0.1)
4
+ ruby-si-units (0.0.4)
5
5
 
6
6
  GEM
7
7
  remote: https://rubygems.org/
@@ -14,6 +14,7 @@ GEM
14
14
  coderay (~> 1.0.5)
15
15
  method_source (~> 0.8)
16
16
  slop (~> 3.4)
17
+ rake (10.1.0)
17
18
  rspec (2.14.1)
18
19
  rspec-core (~> 2.14.0)
19
20
  rspec-expectations (~> 2.14.0)
@@ -29,6 +30,8 @@ PLATFORMS
29
30
 
30
31
  DEPENDENCIES
31
32
  awesome_print (~> 1.1.0)
33
+ bundler (~> 1.3.5)
32
34
  pry (~> 0.9.12.2)
35
+ rake (~> 10.1.0)
33
36
  rspec (~> 2.14.1)
34
37
  ruby-si-units!
data/README.md CHANGED
@@ -1,14 +1,62 @@
1
- SI Prefix Units
2
- ====================
1
+ # SI Prefix Units
3
2
  A SI prefix unit handling library for ruby
4
3
 
5
- How it work's ?
6
- ===
4
+ [![Build Status](https://travis-ci.org/gnomex/ruby-si-units.png?branch=master)](https://travis-ci.org/gnomex/ruby-si-units)
5
+
6
+ ## How it work's ?
7
7
  <p>
8
- Recognizes the scale and unit presets for a unit
8
+ Makes a parce of an absolute value and identifies the scale of the unit that belongs SI, returning the unit in better representation along with the unit symbol prefixed
9
9
  </p>
10
10
 
11
+ ## Installation
12
+
13
+ Add in your application's Gemfile:
14
+
15
+ `gem "ruby-si-units", "~> 0.0.3"`
16
+
17
+ And using blunder, execute:
18
+
19
+ `$ bundle install`
20
+
21
+ Or install it yourself:
22
+
23
+ `$ gem install ruby-si-units`
24
+
25
+
26
+ ## Usage
27
+
28
+ ### Convert absolute value to a unit with prefix SI notation
29
+
30
+ ```ruby
31
+ unit = SIUnits::Unit.new(10000000)
32
+ # => #<SIUnits::Unit:0x0000000283b8a8 @unit_value=10000000, @unit_kind="mega">
33
+ unit.best_scale
34
+ # => "10.0M"
35
+ ```
36
+
37
+ ```ruby
38
+ unit = SIUnits::Unit.new(0.000000001)
39
+ # => #<SIUnits::Unit:0x0000000272bb20 @unit_value=1.0e-09, @unit_kind="nano">
40
+ unit.best_scale
41
+ # => "1.0n"
42
+ ```
43
+ ### Convert string to unit
44
+
45
+ ```ruby
46
+ "10.0k".to_unit
47
+ # => #<SIUnits::Unit:0x0000000175da90 @unit_value=10000.0, @unit_kind="kilo">
48
+
49
+ "1n".to_unit
50
+ # => #<SIUnits::Unit:0x000000017406e8 @unit_value=1.0e-09, @unit_kind="nano">
51
+ ```
52
+
53
+ ## Contributing
54
+
55
+ 1. Fork it
56
+ 2. Create your feature branch (`git checkout -b my-new-feature`)
57
+ 3. Commit your changes (`git commit -am 'Add some feature'`)
58
+ 4. Push to the branch (`git push origin my-new-feature`)
59
+ 5. Create new Pull Request
11
60
 
12
- Another useful resources
13
- ===
14
- * (ruby-units)[https://github.com/olbrich/ruby-units]
61
+ ## Another useful resources
62
+ * [ruby-units](https://github.com/olbrich/ruby-units)
@@ -0,0 +1,13 @@
1
+ class String
2
+ # make a string into a unit
3
+ # @return (see RubyUnits::Unit#initialize)
4
+ def to_unit
5
+ unit_reduced, prefix = *split_value(self)
6
+ SIUnits::Unit.new(unit_reduced.to_f).convert_to(prefix)
7
+ end
8
+
9
+ def split_value(value)
10
+ value.scan(/(\d+\.?\d*)(\w+)/).flatten
11
+ end
12
+ end
13
+
data/lib/si_units/unit.rb CHANGED
@@ -24,7 +24,7 @@ module SIUnits
24
24
  'kilo' => [%w{k kilo}, 1e3],
25
25
  'hecto' => [%w{h Hecto hecto}, 1e2],
26
26
  'deca' => [%w{da Deca deca deka}, 1e1],
27
- '1' => [%w{const}, 1],
27
+ '1' => [%w{const}, 1],
28
28
  'deci' => [%w{d Deci deci}, 1e-1],
29
29
  'centi' => [%w{c Centi centi}, 1e-2],
30
30
  'milli' => [%w{m Milli milli}, 1e-3],
@@ -50,6 +50,15 @@ module SIUnits
50
50
  UNITS_DEFINITION.find_index(@unit_kind) <=> UNITS_DEFINITION.find_index(comparison.unit_kind)
51
51
  end
52
52
 
53
+ # convert to a specified unit string or to the same units as another Unit
54
+ def convert_to(prefix)
55
+ return self if prefix.nil?
56
+ scalar = prefix_is_defined?(prefix)
57
+ absolute_unit_value = convert_base_prefix_to_value self.unit_value, scalar
58
+
59
+ SIUnits::Unit.new(absolute_unit_value)
60
+ end
61
+
53
62
  private
54
63
 
55
64
  def best_value_with_scale
@@ -57,6 +66,10 @@ module SIUnits
57
66
  [(@unit_value / scalar), aliase.first].join
58
67
  end
59
68
 
69
+ def convert_base_prefix_to_value(value, scalar)
70
+ value * scalar
71
+ end
72
+
60
73
  def parse_unit
61
74
  case @unit_value
62
75
  when 1e-15..1e-12 then return "pico"
@@ -65,8 +78,7 @@ module SIUnits
65
78
  when 1e-6..1e-3 then return "milli"
66
79
  when 1e-3..1e-2 then return "centi"
67
80
  when 1e-2..1e-1 then return "deci"
68
- when 1e-1..0e1 then return "1"
69
- when 0e1..1e1 then return "1"
81
+ when 1e-1..1e1 then return "1"
70
82
  when 1e1..1e2 then return "deca"
71
83
  when 1e2..1e3 then return "hecto"
72
84
  when 1e3..1e6 then return "kilo"
@@ -76,5 +88,11 @@ module SIUnits
76
88
  end
77
89
  end
78
90
 
91
+ def prefix_is_defined?(kind)
92
+ UNITS_DEFINITION.each { |key, value|
93
+ return value.last if value[0].include?(kind)
94
+ }
95
+ raise ArgumentError, "Unknown prefix"
96
+ end
79
97
  end
80
98
  end
@@ -1,3 +1,3 @@
1
1
  module SIUnits
2
- VERSION = "0.0.3"
2
+ VERSION = "0.0.4"
3
3
  end
data/lib/unit.rb CHANGED
@@ -1,3 +1,3 @@
1
+ require 'si_units/string'
1
2
  require 'si_units/unit'
2
- require 'si_units/distance'
3
3
  require 'si_units/version'
data/ruby-si-unit.gemspec CHANGED
@@ -13,6 +13,8 @@ Gem::Specification.new do |spec|
13
13
  spec.homepage = "https://github.com/gnomex/ruby-si-units"
14
14
  spec.license = "MIT"
15
15
 
16
+ spec.add_development_dependency("bundler", "~> 1.3.5")
17
+ spec.add_development_dependency("rake", "~> 10.1.0")
16
18
  spec.add_development_dependency("awesome_print", "~> 1.1.0")
17
19
  spec.add_development_dependency("pry", "~> 0.9.12.2")
18
20
  spec.add_development_dependency("rspec", "~> 2.14.1")
data/spec/spec_helper.rb CHANGED
@@ -4,6 +4,9 @@
4
4
  # loaded once.
5
5
  #
6
6
  # See http://rubydoc.info/gems/rspec-core/RSpec/Core/Configuration
7
+
8
+ Dir["./spec/support/**/*.rb"].sort.each {|f| require f}
9
+
7
10
  RSpec.configure do |config|
8
11
  config.treat_symbols_as_metadata_keys_with_true_values = true
9
12
  config.run_all_when_everything_filtered = true
@@ -0,0 +1,17 @@
1
+ # coding: utf-8
2
+ require 'spec_helper'
3
+
4
+ shared_examples_for "is unit of" do |unit, expected_prefix|
5
+
6
+ it "is max limit on range" do
7
+ expect(:unit.to_s).to eql(expected_prefix)
8
+ end
9
+
10
+ it "is min limit on range" do
11
+ expect(:unit.to_s).to eql(expected_prefix)
12
+ end
13
+
14
+ it "out of unit range" do
15
+ expect(:unit.to_s).to_not eql(expected_prefix)
16
+ end
17
+ end
@@ -1,2 +1,211 @@
1
1
  # coding: utf-8
2
2
  require 'spec_helper'
3
+ require "unit"
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
15
+
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
27
+
28
+ it "min limit" do
29
+ unit = SIUnits::Unit.new(1e-9)
30
+ expect(unit.best_scale).to match(/[n]/)
31
+ end
32
+
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
49
+
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
+ end
54
+ end
55
+
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
61
+
62
+ it "min limit" do
63
+ unit = SIUnits::Unit.new(1e-3)
64
+ expect(unit.best_scale).to match(/[m]/)
65
+ end
66
+
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
72
+
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
+ end
78
+
79
+ it "min limit" do
80
+ unit = SIUnits::Unit.new(1e-2)
81
+ expect(unit.best_scale).to match(/[c]/)
82
+ end
83
+
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
+ end
88
+ end
89
+
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]/)
94
+ end
95
+
96
+ it "min limit" do
97
+ unit = SIUnits::Unit.new(1e-1)
98
+ expect(unit.best_scale).to match(/[d]/)
99
+ end
100
+
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
+ end
105
+ end
106
+
107
+ describe "it's a const " do
108
+ xit "max limit" do
109
+ unit = SIUnits::Unit.new((1e-1) + 0.1)
110
+ expect(unit.best_scale).to match(/const/)
111
+ end
112
+
113
+ xit "zero" do
114
+
115
+ end
116
+
117
+ xit "min limit" do
118
+ unit = SIUnits::Unit.new(1e1)
119
+ expect(unit.best_scale).to match(/cost/)
120
+ end
121
+
122
+ xit "not a const" do
123
+ unit = SIUnits::Unit.new((1e-2) + 0.00000000001)
124
+ expect(unit.best_scale).to_not match(/const/)
125
+ end
126
+ end
127
+
128
+ describe "it's a deca " do
129
+ it "max limit" do
130
+ unit = SIUnits::Unit.new((1e2) - 1.0)
131
+ expect(unit.best_scale).to match(/(da)/)
132
+ end
133
+
134
+ it "min limit" do
135
+ unit = SIUnits::Unit.new(1e1 + 1.0)
136
+ expect(unit.best_scale).to match(/(da)/)
137
+ end
138
+
139
+ it "not a deca" do
140
+ unit = SIUnits::Unit.new((1e1) - 1.0)
141
+ expect(unit.best_scale).to_not match(/da/)
142
+ end
143
+ end
144
+
145
+ describe "it's a hecto " do
146
+ it "max limit" do
147
+ unit = SIUnits::Unit.new((1e3) - 1.0)
148
+ expect(unit.best_scale).to match(/[h]/)
149
+ end
150
+
151
+ it "min limit" do
152
+ unit = SIUnits::Unit.new(1e2 + 1.0)
153
+ expect(unit.best_scale).to match(/[h]/)
154
+ end
155
+
156
+ it "not a deca" do
157
+ unit = SIUnits::Unit.new((1e2) - 1.0)
158
+ expect(unit.best_scale).to_not match(/[h]/)
159
+ end
160
+ end
161
+
162
+ describe "it's a kilo " do
163
+ it "max limit" do
164
+ unit = SIUnits::Unit.new((1e6) - 1.0)
165
+ expect(unit.best_scale).to match(/[k]/)
166
+ end
167
+
168
+ it "min limit" do
169
+ unit = SIUnits::Unit.new(1e3 + 1.0)
170
+ expect(unit.best_scale).to match(/[k]/)
171
+ end
172
+
173
+ it "not a deca" do
174
+ unit = SIUnits::Unit.new((1e3) - 1.0)
175
+ expect(unit.best_scale).to_not match(/[k]/)
176
+ end
177
+ end
178
+
179
+ describe "it's a mega " do
180
+ it "max limit" do
181
+ unit = SIUnits::Unit.new((1e9) - 1.0)
182
+ expect(unit.best_scale).to match(/[M]/)
183
+ end
184
+
185
+ it "min limit" do
186
+ unit = SIUnits::Unit.new(1e6 + 1.0)
187
+ expect(unit.best_scale).to match(/[M]/)
188
+ end
189
+
190
+ it "not a deca" do
191
+ unit = SIUnits::Unit.new((1e6) - 1.0)
192
+ expect(unit.best_scale).to_not match(/[M]/)
193
+ end
194
+ end
195
+
196
+ describe "it's a giga " do
197
+ it "max limit" do
198
+ unit = SIUnits::Unit.new((1e12) - 1.0)
199
+ expect(unit.best_scale).to match(/[G]/)
200
+ end
201
+
202
+ it "min limit" do
203
+ unit = SIUnits::Unit.new(1e9 + 1.0)
204
+ expect(unit.best_scale).to match(/[G]/)
205
+ end
206
+
207
+ it "not a deca" do
208
+ unit = SIUnits::Unit.new((1e9) - 1.0)
209
+ expect(unit.best_scale).to_not match(/[G]/)
210
+ end
211
+ end
metadata CHANGED
@@ -1,15 +1,43 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ruby-si-units
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
  - Kenner Kliemann
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2013-09-02 00:00:00.000000000 Z
11
+ date: 2013-09-05 00:00:00.000000000 Z
12
12
  dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: bundler
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ~>
18
+ - !ruby/object:Gem::Version
19
+ version: 1.3.5
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ~>
25
+ - !ruby/object:Gem::Version
26
+ version: 1.3.5
27
+ - !ruby/object:Gem::Dependency
28
+ name: rake
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ~>
32
+ - !ruby/object:Gem::Version
33
+ version: 10.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: 10.1.0
13
41
  - !ruby/object:Gem::Dependency
14
42
  name: awesome_print
15
43
  requirement: !ruby/object:Gem::Requirement
@@ -61,16 +89,18 @@ extra_rdoc_files: []
61
89
  files:
62
90
  - .gitignore
63
91
  - .rspec
92
+ - .travis.yml
64
93
  - Gemfile
65
94
  - Gemfile.lock
66
95
  - LICENSE
67
96
  - README.md
68
- - lib/si_units/distance.rb
97
+ - lib/si_units/string.rb
69
98
  - lib/si_units/unit.rb
70
99
  - lib/si_units/version.rb
71
100
  - lib/unit.rb
72
101
  - ruby-si-unit.gemspec
73
102
  - spec/spec_helper.rb
103
+ - spec/support/units_shared_example.rb
74
104
  - spec/units/unit_spec.rb
75
105
  homepage: https://github.com/gnomex/ruby-si-units
76
106
  licenses:
@@ -92,10 +122,11 @@ required_rubygems_version: !ruby/object:Gem::Requirement
92
122
  version: '0'
93
123
  requirements: []
94
124
  rubyforge_project:
95
- rubygems_version: 2.0.3
125
+ rubygems_version: 2.0.7
96
126
  signing_key:
97
127
  specification_version: 4
98
128
  summary: A SI prefix unit handling library for ruby
99
129
  test_files:
100
130
  - spec/spec_helper.rb
131
+ - spec/support/units_shared_example.rb
101
132
  - spec/units/unit_spec.rb
@@ -1,33 +0,0 @@
1
- module SIUnits
2
- class Distance
3
- include Comparable
4
-
5
- UNIT_REGEX = /(\d+)(\w+)/
6
-
7
- attr_reader :value, :unit, :distance
8
-
9
- def initialize(distance)
10
- @distance = distance
11
- @value, @unit = *split_value(distance)
12
- end
13
-
14
- def <=>(comparison)
15
- u1 = Unit.new(@unit)
16
- u2 = Unit.new(comparison.unit)
17
-
18
- if u1 > u2
19
- return 1
20
- elsif u1 < u2
21
- return -1
22
- elsif u1 == u2
23
- @value.to_i <=> comparison.value.to_i
24
- end
25
- end
26
-
27
- private
28
-
29
- def split_value(value)
30
- value.scan(UNIT_REGEX).flatten
31
- end
32
- end
33
- end