unitwise 0.3.1 → 0.3.2

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: a382c394857814457fe921d7556aa91211d9a752
4
- data.tar.gz: 24ecd6c8f3fcd11a281cc0fb860462f2b9766b4c
3
+ metadata.gz: ebcd2779e6a54ca23cc3cd644f3720bd9de8846d
4
+ data.tar.gz: 4bc1072fe92630814f05e9402e5cc5ac8983ce94
5
5
  SHA512:
6
- metadata.gz: a23988ac0f39b46d1f325bb4766e13c3ce025eaee602f5946426e4258b07b9b32f4752298ce78160f049c6be05b7699cfbefaf63a451763559de5fecf2336cbc
7
- data.tar.gz: 75f123f3fd5195239f728efc037ce2038dece84b647df8234fca6391b4a9280f0e6d6fad614502737daf62976795253c099fa03a4a5c459837f8b92feaedfaa1
6
+ metadata.gz: 5de61cb9d586961307d03e8c3db35ba3d851d6cc8dcdfd8944c2c6d4b6e9e6833abe82c0fe498d1924bd3a23927c980a7c0fa252ba5e931d848afd10fa278672
7
+ data.tar.gz: 9b01d1fc8f63294e72bd20060f411c8a54d5ffffe7cb872b504728aa0ea8e4c189f2df696a50bb392b291c1582629c852e7dcbeab2634429b61f3883f4f95f46
data/.ruby-version CHANGED
@@ -1 +1 @@
1
- 2.0.0-p195
1
+ 2.1.0
data/.travis.yml CHANGED
@@ -1,4 +1,20 @@
1
1
  language: ruby
2
+ cache: bundler
3
+ bundler_args: --without yard pry
2
4
  rvm:
3
5
  - 1.9.3
4
- - 2.0.0
6
+ - 2.0.0
7
+ - 2.1.0
8
+ - ruby-head
9
+ - rbx
10
+ - rbx-2
11
+ matrix:
12
+ include:
13
+ - rvm: jruby-19mode
14
+ env: JRUBY_OPTS="$JRUBY_OPTS --debug"
15
+ - rvm: jruby-head
16
+ env: JRUBY_OPTS="$JRUBY_OPTS --debug"
17
+ allow_failure:
18
+ - rvm: ruby-head
19
+ - rvm: jruby-head
20
+ fast_finish: true
data/README.md CHANGED
@@ -29,7 +29,7 @@ or require the core extensions for some syntactic sugar.
29
29
  ```ruby
30
30
  require 'unitwise/ext'
31
31
 
32
- 1.convert(liter)
32
+ 1.convert('liter')
33
33
  # => <Unitwise::Measurement 1 liter>
34
34
 
35
35
  4.teaspoon
@@ -180,6 +180,22 @@ You can also get the official list from the UCUM website in XML format at
180
180
  or a YAML version within this repo
181
181
  [github.com/joshwlewis/unitwise/tree/master/data](//github.com/joshwlewis/unitwise/tree/master/data).
182
182
 
183
+ ### Supported Ruby Versions
184
+
185
+ This library aims to support and is tested against the following Ruby
186
+ implementations:
187
+
188
+ * Ruby 1.9.3
189
+ * Ruby 2.0.0
190
+ * Ruby 2.1.0
191
+ * [JRuby](http://jruby.org/)
192
+ * [Rubinius](http://rubini.us/)
193
+
194
+ If something doesn't work on one of these versions, it's a bug.
195
+
196
+ This library may inadvertently work (or seem to work) on other Ruby versions or
197
+ implementations, however support will only be provided for the implementations
198
+ listed above.
183
199
 
184
200
  ## Installation
185
201
 
data/lib/unitwise/atom.rb CHANGED
@@ -116,7 +116,7 @@ module Unitwise
116
116
  # depths. This method returns all of this atoms base level terms.
117
117
  # @return [Array] An array containing base Unitwise::Term
118
118
  def root_terms
119
- base? ? [Term.new(atom: self)] : scale.root_terms
119
+ base? ? [Term.new(atom_code: primary_code)] : scale.root_terms
120
120
  end
121
121
 
122
122
  end
data/lib/unitwise/base.rb CHANGED
@@ -7,12 +7,8 @@ module Unitwise
7
7
  @all ||= data.map{|d| self.new d }
8
8
  end
9
9
 
10
- def self.find(string)
11
- [:primary_code, :secondary_code, :names, :slugs, :symbol].reduce(nil) do |m, method|
12
- if found = find_by(method, string)
13
- return found
14
- end
15
- end
10
+ def self.find(term)
11
+ all.find { |i| i.search_strings.any? { |string| string == term } }
16
12
  end
17
13
 
18
14
  def self.find_by(method, string)
@@ -46,5 +42,9 @@ module Unitwise
46
42
  [primary_code, secondary_code, names, slugs, symbol].flatten.compact
47
43
  end
48
44
 
45
+ def to_s
46
+ primary_code
47
+ end
48
+
49
49
  end
50
50
  end
@@ -7,12 +7,28 @@ require 'unitwise/expression/composer'
7
7
  require 'unitwise/expression/decomposer'
8
8
 
9
9
  module Unitwise
10
+ # The Expression module encompases all functions around encoding and decoding
11
+ # strings into Measurement::Units and vice-versa.
10
12
  module Expression
11
13
  class << self
14
+ # Build a string representation of a collection of terms
15
+ # @param terms [Array]
16
+ # @return [String]
17
+ # @example
18
+ # Unitwise::Expression.compose(terms) # => "m2/s2"
19
+ # @api public
12
20
  def compose(terms)
13
21
  Composer.new(terms).expression
14
22
  end
15
23
 
24
+ # Convert a string representation of a unit, and turn it into a
25
+ # an array of terms
26
+ # @param expression [String] The string you wish to convert
27
+ # @return [Array]
28
+ # @example
29
+ # Unitwise::Expression.decompose("m2/s2")
30
+ # # => [<Unitwise::Term m2>, <Unitwise::Term s-2>]
31
+ # @api public
16
32
  def decompose(expression)
17
33
  expression = expression.to_s
18
34
  @decompose ||= {}
@@ -8,7 +8,7 @@ module Unitwise
8
8
 
9
9
  def set
10
10
  @set ||= terms.reduce(SignedMultiset.new) do |s, t|
11
- s.increment({f: t.factor, p: t.prefix_code, a: t.atom_code}, t.exponent); s
11
+ s.increment({f: t.factor, p: t.prefix, a: t.atom}, t.exponent); s
12
12
  end
13
13
  end
14
14
 
@@ -1,13 +1,31 @@
1
1
  module Unitwise
2
+ # A Measurement is a combination of a numeric value and a unit. You can think
3
+ # of this as a type of vector where the direction is the unit designation and
4
+ # the value is the magnitued. This is the primary class that outside code
5
+ # will interact with. Comes with conversion, comparison, and math methods.
2
6
  class Measurement < Scale
3
7
 
4
- def initialize(value, unit)
5
- super(value, unit)
8
+ # Create a new Measurement
9
+ # @param value [Numeric] The scalar value for the measurement
10
+ # @param unit [String, Measurement::Unit] Either a string expression, or a
11
+ # Measurement::Unit
12
+ # @example
13
+ # Unitwise::Measurement.new(20, 'm/s') # => #<Unitwise::Measurement 20 m/s>
14
+ # @api public
15
+ def initialize(*args)
16
+ super(*args)
6
17
  if terms.nil?
7
18
  raise ExpressionError, "Could not evaluate `#{unit}`."
8
19
  end
9
20
  end
10
21
 
22
+ # Convert this measurement to a compatible unit.
23
+ # @param other_unit [String, Measurement::Unit] Either a string expression
24
+ # or a Measurement::Unit
25
+ # @example
26
+ # measurement1.convert('foot')
27
+ # measurement2.convert('kilogram')
28
+ # @api public
11
29
  def convert(other_unit)
12
30
  other_unit = Unit.new(other_unit)
13
31
  if similar_to?(other_unit)
@@ -17,22 +35,49 @@ module Unitwise
17
35
  end
18
36
  end
19
37
 
38
+ # Multiply this measurement by a number or another measurement
39
+ # @param other [Numeric, Unitwise::Measurement]
40
+ # @example
41
+ # measurent * 5
42
+ # measurement * some_other_measurement
43
+ # @api public
20
44
  def *(other)
21
45
  operate(:*, other) || raise(TypeError, "Can't multiply #{inspect} by #{other}.")
22
46
  end
23
47
 
48
+ # Divide this measurement by a number or another measurement
49
+ # @param (see #*)
50
+ # @example
51
+ # measurement / 2
52
+ # measurement / some_other_measurement
53
+ # @api public
24
54
  def /(other)
25
55
  operate(:/, other) || raise(TypeError, "Can't divide #{inspect} by #{other}")
26
56
  end
27
57
 
58
+ # Add another measurement to this unit. Units must be compatible.
59
+ # @param other [Unitwise::Measurement]
60
+ # @example
61
+ # measurement + some_other_measurement
62
+ # @api public
28
63
  def +(other)
29
64
  combine(:+, other) || raise(TypeError, "Can't add #{other} to #{inspect}.")
30
65
  end
31
66
 
67
+ # Subtract another measurement from this unit. Units must be compatible.
68
+ # @param (see #+)
69
+ # @example
70
+ # measurement - some_other_measurement
71
+ # @api public
32
72
  def -(other)
33
73
  combine(:-, other) || raise(TypeError, "Can't subtract #{other} from #{inspect}.")
34
74
  end
35
75
 
76
+ # Raise a measurement to a numeric power.
77
+ # @param number [Numeric]
78
+ # @example
79
+ # measurement ** 2
80
+ # @api public
36
81
  def **(number)
37
82
  if number.is_a?(Numeric)
38
83
  new( value ** number, unit ** number )
@@ -41,6 +86,12 @@ module Unitwise
41
86
  end
42
87
  end
43
88
 
89
+ # Coerce a numeric to a a measurement for mathematical operations
90
+ # @param other [Numeric]
91
+ # @example
92
+ # 2.5 * measurement
93
+ # 4 / measurement
94
+ # @api public
44
95
  def coerce(other)
45
96
  case other
46
97
  when Numeric
@@ -50,6 +101,35 @@ module Unitwise
50
101
  end
51
102
  end
52
103
 
104
+ # Convert a measurement to an Integer.
105
+ # @example
106
+ # measurement.to_i # => 4
107
+ # @api public
108
+ def to_i
109
+ Integer(value)
110
+ end
111
+ alias :to_int :to_i
112
+
113
+ # Convert a measurement to a Float.
114
+ # @example
115
+ # measurement.to_f # => 4.25
116
+ # @api public
117
+ def to_f
118
+ Float(value)
119
+ end
120
+
121
+ # Convert a measurement to a Rational.
122
+ # @example
123
+ # measurement.to_r # => (17/4)
124
+ # @api public
125
+ def to_r
126
+ Rational(value)
127
+ end
128
+
129
+ # Will attempt to convert to a unit by the method name.
130
+ # @example
131
+ # measurement.foot # => <Unitwise::Measurement 4 foot>
132
+ # @api semipublic
53
133
  def method_missing(meth, *args, &block)
54
134
  if Unitwise::Expression.decompose(meth)
55
135
  self.convert(meth)
@@ -60,10 +140,14 @@ module Unitwise
60
140
 
61
141
  private
62
142
 
143
+ # Helper method to create a new instance from this instance
144
+ # @api private
63
145
  def new(*args)
64
146
  self.class.new(*args)
65
147
  end
66
148
 
149
+ # Determine value of the unit after conversion to another unit
150
+ # @api private
67
151
  def converted_value(other_unit)
68
152
  if unit.special?
69
153
  if other_unit.special?
@@ -80,14 +164,16 @@ module Unitwise
80
164
  end
81
165
  end
82
166
 
83
- # add or subtract other unit
167
+ # Add or subtract other unit
168
+ # @api private
84
169
  def combine(operator, other)
85
170
  if similar_to?(other)
86
171
  new(value.send(operator, other.convert(unit).value), unit)
87
172
  end
88
173
  end
89
174
 
90
- # multiply or divide other unit
175
+ # Multiply or divide other unit
176
+ # @api private
91
177
  def operate(operator, other)
92
178
  if other.is_a?(Numeric)
93
179
  new(value.send(operator, other), unit)
@@ -1,65 +1,91 @@
1
1
  module Unitwise
2
+ # A Unitwise::Scale represents a value and a unit, sort of like a vector, it
3
+ # has two components. In this case, it's a value and unit rather than a
4
+ # magnitude and direction. This class should be considered mostly privateish.
2
5
  class Scale
3
- attr_reader :value
6
+ liner :value, :unit
4
7
 
5
8
  include Unitwise::Composable
6
9
 
7
- def initialize(value, unit)
8
- @value = value
9
- if unit.is_a?(Unit)
10
- @unit = unit.dup
11
- else
12
- @unit = Unit.new(unit.to_s)
13
- end
10
+ # The unit associated with this scale.
11
+ # @return [Unitwise::Unit]
12
+ # @api public
13
+ def unit
14
+ @unit.is_a?(Unit) ? @unit : Unit.new(@unit)
14
15
  end
15
16
 
17
+ # Duplicate this instance
18
+ # @return [Unitwise::Unit]
19
+ # @api public
16
20
  def dup
17
21
  self.class.new(value, unit)
18
22
  end
19
23
 
24
+ # List the atoms associated with this scale's unit.
25
+ # @return [Array]
26
+ # @api public
20
27
  def atoms
21
28
  unit.atoms
22
29
  end
23
30
 
31
+ # List the atoms associated with this scale's unit.
32
+ # @return [Array]
33
+ # @api public
24
34
  def terms
25
35
  unit.terms
26
36
  end
27
37
 
38
+ # Is this scale's unit special?
39
+ # @return [true, false]
40
+ # @api public
28
41
  def special?
29
42
  unit.special?
30
43
  end
31
44
 
45
+ # Return a converted value for this scale, based on it's function for
46
+ # scales with special units.
47
+ # @param x [Numeric] Value to convert to or from
48
+ # @param forward [true, false] whether to convert to this unit or from it.
49
+ # @return [Numeric]
50
+ # @api public
32
51
  def functional(x=value, forward=true)
33
52
  unit.functional(x, forward)
34
53
  end
35
54
 
55
+ # Return a scalar value for non-special units, this will be some ratio of a
56
+ # child base unit.
57
+ # @return [Numeric]
58
+ # @api public
36
59
  def scalar
37
60
  value * unit.scalar
38
61
  end
39
62
 
40
- def unit
41
- @unit ||= Unit.new(@unit_code)
42
- end
43
-
63
+ # The base units this scale's unit is derived from
64
+ # @return [Array] An array of Unitwise::Term
65
+ # @api public
44
66
  def root_terms
45
67
  unit.root_terms
46
68
  end
47
69
 
70
+ # How far away is this instances unit from the deepest leve atom.
71
+ # @return [Integer]
72
+ # @api public
48
73
  def depth
49
74
  unit.depth + 1
50
75
  end
51
76
 
77
+ # Is this the deepest level scale in the scale chain?
78
+ # @return [true, false]
79
+ # @api public
52
80
  def terminal?
53
81
  depth <= 3
54
82
  end
55
83
 
84
+ # Convert to a simple string representing the scale.
85
+ # @api public
56
86
  def to_s
57
87
  "#{value} #{unit}"
58
88
  end
59
89
 
60
- def inspect
61
- "<#{self.class} #{to_s}>"
62
- end
63
-
64
90
  end
65
91
  end
@@ -8,6 +8,10 @@ require 'unitwise/standard/scale'
8
8
  require 'unitwise/standard/function'
9
9
 
10
10
  module Unitwise
11
+ # The Standard module is responsible for fetching the UCUM specification unit
12
+ # standards and translating them into yaml files. This code is only used for
13
+ # by the rake task `rake unitwise:update_standard` and as such is not
14
+ # normally loaded.
11
15
  module Standard
12
16
  HOST = "unitsofmeasure.org"
13
17
  PATH = "/ucum-essence.xml"
data/lib/unitwise/term.rb CHANGED
@@ -1,24 +1,15 @@
1
1
  require 'signed_multiset'
2
2
  module Unitwise
3
- class Term
4
- liner :atom_code, :prefix_code, :atom, :prefix, :factor, :exponent, :annotation
3
+ class Term < Liner.new(:atom, :prefix, :factor, :exponent, :annotation)
5
4
 
6
5
  include Unitwise::Composable
7
6
 
8
- def prefix_code
9
- @prefix_code ||= (@prefix.primary_code if @prefix)
7
+ def atom=(value)
8
+ value.is_a?(Atom) ? super(value) : super(Atom.find(value.to_s))
10
9
  end
11
10
 
12
- def prefix
13
- @prefix ||= (Prefix.find(@prefix_code) if @prefix_code)
14
- end
15
-
16
- def atom_code
17
- @atom_code ||= (@atom.primary_code if @atom)
18
- end
19
-
20
- def atom
21
- @atom ||= (Atom.find(@atom_code) if @atom_code)
11
+ def prefix=(value)
12
+ value.is_a?(Prefix) ? super(value) : super(Prefix.find(value.to_s))
22
13
  end
23
14
 
24
15
  def special?
@@ -59,12 +50,6 @@ module Unitwise
59
50
  end
60
51
  end
61
52
 
62
- def to_hash
63
- [:prefix, :atom, :exponent, :factor, :annotation].inject({}) do |h, a|
64
- h[a] = send a; h
65
- end
66
- end
67
-
68
53
  def *(other)
69
54
  if other.respond_to?(:terms)
70
55
  Unit.new(other.terms << self)
@@ -90,12 +75,8 @@ module Unitwise
90
75
  end
91
76
 
92
77
  def to_s
93
- [(factor if factor != 1), prefix_code,
94
- atom_code, (exponent if exponent != 1)].compact.join('')
95
- end
96
-
97
- def inspect
98
- "<#{self.class} #{to_s}>"
78
+ [(factor if factor != 1), prefix.to_s,
79
+ atom.to_s, (exponent if exponent != 1)].compact.join('')
99
80
  end
100
81
 
101
82
  end
data/lib/unitwise/unit.rb CHANGED
@@ -1,5 +1,7 @@
1
1
  module Unitwise
2
2
  class Unit
3
+ liner :expression, :terms
4
+
3
5
  include Unitwise::Composable
4
6
 
5
7
  def initialize(input)
@@ -85,10 +87,5 @@ module Unitwise
85
87
  def to_s
86
88
  expression
87
89
  end
88
-
89
- def inspect
90
- "<#{self.class} #{to_s}>"
91
- end
92
-
93
90
  end
94
91
  end
@@ -1,3 +1,3 @@
1
1
  module Unitwise
2
- VERSION = "0.3.1"
2
+ VERSION = "0.3.2"
3
3
  end
@@ -0,0 +1,101 @@
1
+ # Shared examples for Unitwise::Scale and Unitwise::Measurement
2
+ module ScaleTests
3
+ def self.included(base)
4
+ base.class_eval do
5
+ subject { described_class.new(4, "J") }
6
+
7
+ let(:mph) { Unitwise::Measurement.new(60, '[mi_i]/h') }
8
+ let(:kmh) { Unitwise::Measurement.new(100, 'km/h') }
9
+ let(:mile) { Unitwise::Measurement.new(3, '[mi_i]') }
10
+ let(:hpm) { Unitwise::Measurement.new(6, 'h/[mi_i]') }
11
+ let(:cui) { Unitwise::Measurement.new(12, "[in_i]3") }
12
+ let(:cel) { Unitwise::Measurement.new(22, 'Cel') }
13
+ let(:k) { Unitwise::Measurement.new(373.15, 'K') }
14
+ let(:f) { Unitwise::Measurement.new(98.6, '[degF]')}
15
+ let(:r) { Unitwise::Measurement.new(491.67, '[degR]') }
16
+
17
+ describe "#new" do
18
+ it "must set attributes" do
19
+ subject.value.must_equal(4)
20
+ subject.unit.to_s.must_equal('J')
21
+ end
22
+ end
23
+
24
+ describe "#unit" do
25
+ it "must be a unit" do
26
+ subject.must_respond_to(:unit)
27
+ subject.unit.must_be_instance_of(Unitwise::Unit)
28
+ end
29
+ end
30
+
31
+ describe "#root_terms" do
32
+ it "must be a collection of terms" do
33
+ subject.must_respond_to(:root_terms)
34
+ subject.root_terms.must_be_kind_of Enumerable
35
+ subject.root_terms.sample.must_be_instance_of(Unitwise::Term)
36
+ end
37
+ end
38
+
39
+ describe "#dup" do
40
+ it "must return a new instance" do
41
+ subject.must_respond_to(:dup)
42
+ subject.dup.must_be_instance_of(described_class)
43
+ subject.dup.value.must_equal subject.value
44
+ subject.dup.unit.to_s.must_equal subject.unit.to_s
45
+ subject.dup.object_id.wont_equal subject.dup.object_id
46
+ end
47
+ end
48
+
49
+ describe "#terms" do
50
+ it "must return an array of terms" do
51
+ subject.terms.must_be_kind_of(Enumerable)
52
+ subject.terms.sample.must_be_kind_of(Unitwise::Term)
53
+ end
54
+ end
55
+
56
+ describe "#atoms" do
57
+ it "must return an array of atoms" do
58
+ subject.atoms.must_be_kind_of(Enumerable)
59
+ subject.atoms.sample.must_be_kind_of(Unitwise::Atom)
60
+ end
61
+ end
62
+
63
+ describe "#scalar" do
64
+ it "must return value relative to terminal atoms" do
65
+ subject.scalar.must_equal 4000
66
+ mph.scalar.must_equal 26.8224
67
+ end
68
+ end
69
+
70
+ describe "#functional" do
71
+ it "must return a converted value" do
72
+ cel.functional(0,true).must_equal -273.15
73
+ end
74
+ it "must return a de-converted value" do
75
+ cel.functional(0,false).must_equal 273.15
76
+ end
77
+ end
78
+
79
+ describe "#special?" do
80
+ it "must return true when unit is special, false otherwise" do
81
+ subject.special?.must_equal false
82
+ cel.special?.must_equal true
83
+ end
84
+ end
85
+
86
+ describe "#depth" do
87
+ it "must return a number indicating how far down the rabbit hole goes" do
88
+ subject.depth.must_equal 11
89
+ k.depth.must_equal 3
90
+ end
91
+ end
92
+
93
+ describe "#terminal?" do
94
+ it "must return true for the last of kind in the chain" do
95
+ subject.terminal?.must_equal false
96
+ k.terminal?.must_equal true
97
+ end
98
+ end
99
+ end
100
+ end
101
+ end
@@ -1,59 +1,16 @@
1
1
  require 'test_helper'
2
+ require 'support/scale_tests'
2
3
 
3
4
  describe Unitwise::Measurement do
4
- subject { Unitwise::Measurement.new(1, 'm/s') }
5
+ let(:described_class) { Unitwise::Measurement }
6
+ include ScaleTests
7
+
5
8
  describe "#new" do
6
- it "must set attributes" do
7
- subject.value.must_equal(1)
8
- subject.unit.to_s.must_equal('m/s')
9
- end
10
9
  it "should raise an error for unknown units" do
11
10
  ->{ Unitwise::Measurement.new(1,"funkitron") }.must_raise(Unitwise::ExpressionError)
12
11
  end
13
12
  end
14
13
 
15
- describe "#unit" do
16
- it "must be a unit" do
17
- subject.must_respond_to(:unit)
18
- subject.unit.must_be_instance_of(Unitwise::Unit)
19
- end
20
- end
21
-
22
- describe "#root_terms" do
23
- it "must be a collection of terms" do
24
- subject.must_respond_to(:root_terms)
25
- subject.root_terms.must_be_kind_of Enumerable
26
- subject.root_terms.sample.must_be_instance_of(Unitwise::Term)
27
- end
28
- end
29
-
30
- describe "#dup" do
31
- it "must return a new instance" do
32
- subject.must_respond_to(:dup)
33
- subject.dup.must_be_instance_of(Unitwise::Measurement)
34
- subject.dup.value.must_equal subject.value
35
- subject.dup.unit.to_s.must_equal subject.unit.to_s
36
- subject.dup.object_id.wont_equal subject.dup.object_id
37
- end
38
- end
39
-
40
- let(:mph) { Unitwise::Measurement.new(60, '[mi_i]/h') }
41
- let(:kmh) { Unitwise::Measurement.new(100, 'km/h') }
42
- let(:mile) { Unitwise::Measurement.new(3, '[mi_i]') }
43
- let(:hpm) { Unitwise::Measurement.new(6, 'h/[mi_i]') }
44
- let(:cui) { Unitwise::Measurement.new(12, "[in_i]3") }
45
- let(:cel) { Unitwise::Measurement.new(22, 'Cel') }
46
- let(:k) { Unitwise::Measurement.new(373.15, 'K') }
47
- let(:f) { Unitwise::Measurement.new(98.6, '[degF]')}
48
- let(:r) { Unitwise::Measurement.new(491.67, '[degR]') }
49
-
50
- describe "#scalar" do
51
- it "must return value relative to terminal atoms" do
52
- subject.scalar.must_equal 1
53
- mph.scalar.must_equal 26.8224
54
- end
55
- end
56
-
57
14
  describe "#convert" do
58
15
  it "must convert to a similar unit code" do
59
16
  mph.convert('km/h').value.must_equal 96.56063999999999
@@ -188,4 +145,22 @@ describe Unitwise::Measurement do
188
145
 
189
146
  end
190
147
 
148
+ describe "#to_f" do
149
+ it "must convert to a float" do
150
+ f.to_f.must_be_kind_of(Float)
151
+ end
152
+ end
153
+
154
+ describe "#to_i" do
155
+ it "must convert to an integer" do
156
+ k.to_i.must_be_kind_of(Integer)
157
+ end
158
+ end
159
+
160
+ describe "#to_r" do
161
+ it "must convert to a rational" do
162
+ cel.to_r.must_be_kind_of(Rational)
163
+ end
164
+ end
165
+
191
166
  end
@@ -0,0 +1,7 @@
1
+ require 'test_helper'
2
+ require 'support/scale_tests'
3
+
4
+ describe Unitwise::Scale do
5
+ let(:described_class) { Unitwise::Scale }
6
+ include ScaleTests
7
+ end
@@ -2,7 +2,7 @@ require 'test_helper'
2
2
 
3
3
  describe Unitwise::Term do
4
4
  describe "instance" do
5
- subject { Unitwise::Term.new(atom_code: 'J', prefix_code: 'k')}
5
+ subject { Unitwise::Term.new(atom: 'J', prefix: 'k')}
6
6
  describe "#atom" do
7
7
  it "should be an atom" do
8
8
  subject.atom.must_be_instance_of Unitwise::Atom
metadata CHANGED
@@ -1,125 +1,125 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: unitwise
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.1
4
+ version: 0.3.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Josh Lewis
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-02-14 00:00:00.000000000 Z
11
+ date: 2014-03-01 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: liner
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
- - - ~>
17
+ - - "~>"
18
18
  - !ruby/object:Gem::Version
19
19
  version: 0.2.1
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
- - - ~>
24
+ - - "~>"
25
25
  - !ruby/object:Gem::Version
26
26
  version: 0.2.1
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: signed_multiset
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
- - - ~>
31
+ - - "~>"
32
32
  - !ruby/object:Gem::Version
33
33
  version: 0.2.0
34
34
  type: :runtime
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
- - - ~>
38
+ - - "~>"
39
39
  - !ruby/object:Gem::Version
40
40
  version: 0.2.0
41
41
  - !ruby/object:Gem::Dependency
42
42
  name: parslet
43
43
  requirement: !ruby/object:Gem::Requirement
44
44
  requirements:
45
- - - ~>
45
+ - - "~>"
46
46
  - !ruby/object:Gem::Version
47
47
  version: 1.5.0
48
48
  type: :runtime
49
49
  prerelease: false
50
50
  version_requirements: !ruby/object:Gem::Requirement
51
51
  requirements:
52
- - - ~>
52
+ - - "~>"
53
53
  - !ruby/object:Gem::Version
54
54
  version: 1.5.0
55
55
  - !ruby/object:Gem::Dependency
56
56
  name: minitest
57
57
  requirement: !ruby/object:Gem::Requirement
58
58
  requirements:
59
- - - '>='
59
+ - - ">="
60
60
  - !ruby/object:Gem::Version
61
61
  version: '0'
62
62
  type: :development
63
63
  prerelease: false
64
64
  version_requirements: !ruby/object:Gem::Requirement
65
65
  requirements:
66
- - - '>='
66
+ - - ">="
67
67
  - !ruby/object:Gem::Version
68
68
  version: '0'
69
69
  - !ruby/object:Gem::Dependency
70
70
  name: rake
71
71
  requirement: !ruby/object:Gem::Requirement
72
72
  requirements:
73
- - - '>='
73
+ - - ">="
74
74
  - !ruby/object:Gem::Version
75
75
  version: '0'
76
76
  type: :development
77
77
  prerelease: false
78
78
  version_requirements: !ruby/object:Gem::Requirement
79
79
  requirements:
80
- - - '>='
80
+ - - ">="
81
81
  - !ruby/object:Gem::Version
82
82
  version: '0'
83
83
  - !ruby/object:Gem::Dependency
84
84
  name: nori
85
85
  requirement: !ruby/object:Gem::Requirement
86
86
  requirements:
87
- - - '>='
87
+ - - ">="
88
88
  - !ruby/object:Gem::Version
89
89
  version: '0'
90
90
  type: :development
91
91
  prerelease: false
92
92
  version_requirements: !ruby/object:Gem::Requirement
93
93
  requirements:
94
- - - '>='
94
+ - - ">="
95
95
  - !ruby/object:Gem::Version
96
96
  version: '0'
97
97
  - !ruby/object:Gem::Dependency
98
98
  name: nokogiri
99
99
  requirement: !ruby/object:Gem::Requirement
100
100
  requirements:
101
- - - '>='
101
+ - - ">="
102
102
  - !ruby/object:Gem::Version
103
103
  version: '0'
104
104
  type: :development
105
105
  prerelease: false
106
106
  version_requirements: !ruby/object:Gem::Requirement
107
107
  requirements:
108
- - - '>='
108
+ - - ">="
109
109
  - !ruby/object:Gem::Version
110
110
  version: '0'
111
111
  - !ruby/object:Gem::Dependency
112
112
  name: coveralls
113
113
  requirement: !ruby/object:Gem::Requirement
114
114
  requirements:
115
- - - '>='
115
+ - - ">="
116
116
  - !ruby/object:Gem::Version
117
117
  version: '0'
118
118
  type: :development
119
119
  prerelease: false
120
120
  version_requirements: !ruby/object:Gem::Requirement
121
121
  requirements:
122
- - - '>='
122
+ - - ">="
123
123
  - !ruby/object:Gem::Version
124
124
  version: '0'
125
125
  description: Ruby implementation of the Unified Code for Units of Measure (UCUM)
@@ -129,9 +129,9 @@ executables: []
129
129
  extensions: []
130
130
  extra_rdoc_files: []
131
131
  files:
132
- - .gitignore
133
- - .ruby-version
134
- - .travis.yml
132
+ - ".gitignore"
133
+ - ".ruby-version"
134
+ - ".travis.yml"
135
135
  - Gemfile
136
136
  - LICENSE.txt
137
137
  - README.md
@@ -168,6 +168,7 @@ files:
168
168
  - lib/unitwise/unit.rb
169
169
  - lib/unitwise/version.rb
170
170
  - simple_bench.rb
171
+ - test/support/scale_tests.rb
171
172
  - test/test_helper.rb
172
173
  - test/unitwise/atom_test.rb
173
174
  - test/unitwise/base_test.rb
@@ -178,6 +179,7 @@ files:
178
179
  - test/unitwise/functional_test.rb
179
180
  - test/unitwise/measurement_test.rb
180
181
  - test/unitwise/prefix_test.rb
182
+ - test/unitwise/scale_test.rb
181
183
  - test/unitwise/term_test.rb
182
184
  - test/unitwise/unit_test.rb
183
185
  - test/unitwise_test.rb
@@ -192,22 +194,23 @@ require_paths:
192
194
  - lib
193
195
  required_ruby_version: !ruby/object:Gem::Requirement
194
196
  requirements:
195
- - - '>='
197
+ - - ">="
196
198
  - !ruby/object:Gem::Version
197
199
  version: '0'
198
200
  required_rubygems_version: !ruby/object:Gem::Requirement
199
201
  requirements:
200
- - - '>='
202
+ - - ">="
201
203
  - !ruby/object:Gem::Version
202
204
  version: '0'
203
205
  requirements: []
204
206
  rubyforge_project:
205
- rubygems_version: 2.0.2
207
+ rubygems_version: 2.2.0
206
208
  signing_key:
207
209
  specification_version: 4
208
210
  summary: Unitwise is a library for performing mathematical operations and conversions
209
211
  on all units defined by the Unified Code for Units of Measure(UCUM).
210
212
  test_files:
213
+ - test/support/scale_tests.rb
211
214
  - test/test_helper.rb
212
215
  - test/unitwise/atom_test.rb
213
216
  - test/unitwise/base_test.rb
@@ -218,7 +221,7 @@ test_files:
218
221
  - test/unitwise/functional_test.rb
219
222
  - test/unitwise/measurement_test.rb
220
223
  - test/unitwise/prefix_test.rb
224
+ - test/unitwise/scale_test.rb
221
225
  - test/unitwise/term_test.rb
222
226
  - test/unitwise/unit_test.rb
223
227
  - test/unitwise_test.rb
224
- has_rdoc: