dimensional 1.0.1 → 1.1.1

Sign up to get free protection for your applications and to get access to all the features.
data/CHANGELOG CHANGED
@@ -1,5 +1,6 @@
1
1
  0.1.0
2
2
  0.1.1 Simpler conversion system-to-system and redefinition of preference semantics.
3
- 0.1.2 Cleanup tests to work with gem check -t
4
- 1.0.0 Production Release 1
5
- 1.0.1 Use Rationals for default values and avoid the dreaded integer division = 0 problem
3
+ 0.1.2 Cleanup tests to work with gem check -t.
4
+ 1.0.0 Production Release 1.
5
+ 1.0.1 Use Rationals for default values and avoid the dreaded integer division = 0 problem.
6
+ 1.1.1 Add Metric.load constructor, improve docs and enhance scanner.
data/README CHANGED
@@ -3,9 +3,22 @@
3
3
  # unit-oriented methods into Ruby standard classes -to perform operations, particularly across dimensions, you
4
4
  # will need to use basic conversion methods provided by this library combined with standard Ruby numerical oper-
5
5
  # ations. There is no method_missing magic or large mixin of spiffy unit-like methods here.
6
-
7
- # The long-term objective for this library is to achieve compliance with the UCUM standard, with additional
8
- # facilities for simple parsing and formatting of measures according to localized standards, and conversion
9
- # of measures between units. References:
6
+ #
7
+ # Here are some examples of what you can do with the Dimensional library:
8
+ #
9
+ # require 'dimensional'
10
+ # require 'test/demo'
11
+ # class Autonomy < Dimensional::Metric
12
+ # self.dimension = Dimensional::Dimension::L
13
+ # end
14
+ # range = Autonomy.parse("15 nautical miles")
15
+ # range.to_s # => "15M"
16
+ # range.base # => <Rational(27780, 1) <meter>>
17
+ # range.base.to_s # => "27780m"
18
+ # usrange = range.convert(Dimensional::Unit[:L, :US, :yd]) # => <30380.5774278215 <yard>>
19
+ #
20
+ # The demo library in the test directory contains a good starter set of units.
21
+ #
22
+ # The long-term objective for this library is to achieve compliance with the UCUM standard. References:
10
23
  # UCUM Website: http://unitsofmeasure.org/
11
24
  # UCUM Standard: http://aurora.regenstrief.org/~ucum/ucum.html
data/Rakefile CHANGED
@@ -39,8 +39,9 @@ Rake::RDocTask.new do |rdoc|
39
39
  version = File.exist?('VERSION') ? File.read('VERSION') : ""
40
40
 
41
41
  rdoc.rdoc_dir = 'rdoc'
42
- rdoc.title = "tttt #{version}"
43
- rdoc.rdoc_files.include('README*')
42
+ rdoc.title = "Dimensional #{version}"
43
+ rdoc.rdoc_files.include(%w(README LICENSE CHANGELOG TODO))
44
+ rdoc.rdoc_files.include('test/demo.rb')
44
45
  rdoc.rdoc_files.include('lib/**/*.rb')
45
46
  end
46
47
 
data/TODO ADDED
@@ -0,0 +1 @@
1
+ 1. Fix parsing units like "6m3" for six cubic meters.
@@ -8,7 +8,7 @@ module Dimensional
8
8
  # A Measure string is composed of a number followed by a unit separated by optional whitespace.
9
9
  # A unit (optional) is composed of a non-digit character followed by zero or more word characters and terminated by some stuff.
10
10
  # Scientific notation is not currently supported.
11
- NUMERIC_REGEXP = /((?=\d|\.\d)\d*(?:\.\d*)?)\s*(\D\w*?)?(?=\b|\d|\W|$)/
11
+ NUMERIC_REGEXP = /((?=\d|\.\d)\d*(?:\.\d*)?)\s*(\D.*?)?\s*(?=\d|$)/
12
12
 
13
13
  class << self
14
14
  attr_accessor :dimension, :base, :default
@@ -67,6 +67,11 @@ module Dimensional
67
67
  configuration[u][:preference] - oom_delta
68
68
  end
69
69
  end
70
+
71
+ # Create a new instance with the given value (assumed to be in the base unit) and convert it to the preferred unit.
72
+ def load(v)
73
+ new(v, base).preferred
74
+ end
70
75
  end
71
76
 
72
77
  attr_reader :unit
@@ -1,3 +1,3 @@
1
1
  module Dimensional
2
- VERSION = "1.0.1"
2
+ VERSION = "1.1.1"
3
3
  end
@@ -36,7 +36,7 @@ Configurator.start do
36
36
  base('meter', 'm', :detector => /\A(met(er|re)s?|m)\Z/) do
37
37
  derive('decimeter', 'dm', Rational(1, 10), :detector => /\A(decimet(er|re)s?|dm)\Z/, :preference => 0.5)
38
38
  derive('centimeter', 'cm', Rational(1, 100), :detector => /\A(centimet(er|re)s?|cm)\Z/)
39
- derive('decameter', 'km', 10, :detector => /\A(de(c|k)amet(er|re)s?|dam)\Z/)
39
+ derive('decameter', 'dam', 10, :detector => /\A(de(c|k)amet(er|re)s?|dam)\Z/)
40
40
  derive('kilometer', 'km', 1000, :detector => /\A(kilomet(er|re)s?|km)\Z/)
41
41
  derive('nautical mile', 'M', 1852, :detector => /\A(nautical miles?|NMs?|nmis?)\Z/)
42
42
  end
@@ -70,8 +70,8 @@ Configurator.start do
70
70
  reference('mile', 'nm', Dimensional::Unit[:L, :SI, 'meter'], 1852.216, :detector => /\A((nautical )?mile|nm|nmi)\Z/) do
71
71
  derive('league', nil, 3, :detector => /\A(leagues?)\Z/)
72
72
  derive('cable', nil, Rational(1,10), :detector => /\A(cables?|cbls?)\Z/) do
73
- derive('fathom', 'fm', Rational(1,10), :detector => /\A(fathoms?|fms?)\Z/) do
74
- derive('yard', 'yd', Rational(1,6), :detector => /\A(yards?|yds?)\Z/) do
73
+ derive('fathom', 'fm', Rational(1,100), :detector => /\A(fathoms?|fms?)\Z/) do
74
+ derive('yard', 'yd', Rational(1,2), :detector => /\A(yards?|yds?)\Z/) do
75
75
  derive('foot', 'ft', Rational(1,3), :detector => /\A(foot|feet|ft|')\Z/) do
76
76
  derive('inch', 'in', Rational(1,12), :detector => /\A(inch|inches|in|")\Z/)
77
77
  end
@@ -137,6 +137,7 @@ Configurator.start do
137
137
  derive('township', 'twp', 36, :detector => /\Atownships?\Z/)
138
138
  end
139
139
  end
140
+ combine('square foot', 'ft2', {Unit[:L, :US, :ft] => 2}, :detector => /ft2/)
140
141
  end
141
142
  end
142
143
 
@@ -250,7 +251,6 @@ Configurator.start do
250
251
  end
251
252
  system(:US) do
252
253
  # Using the definition for mechanical horsepower, http://en.wikipedia.org/wiki/Horsepower
253
- # reference('horsepower', 'hp', Dimensional::Unit[:P, :SI, 'watt'], 745.69987158227022, :detector => /\A(horsepower|hp)\Z/)
254
254
  combine('horsepower', 'hp', {Unit[:E, :US, :'ft-lbf'] => 1, Unit[:T, :SI, :m] => -1}, {:reference_factor => 33000})
255
255
  end
256
256
  end
@@ -303,13 +303,14 @@ end
303
303
 
304
304
  class Length < Dimensional::Metric
305
305
  self.dimension = Dimensional::Dimension::L
306
- self.default = Unit[:L, :SI, :m]
306
+ self.base = Unit[:L, :SI, :m]
307
+ self.default = base
307
308
  end
308
309
 
309
310
  class Autonomy < Dimensional::Metric
310
311
  self.dimension = Dimension::L
311
- self.default = Unit[:L, :BA, :nm]
312
312
  self.base = Unit[:L, :SI, :m]
313
+ self.default = Unit[:L, :BA, :nm]
313
314
  configure(Unit[:L, :SI, :km], {:preference => 2})
314
315
  configure(Unit[:L, :US, :mi], {:preference => 3.5})
315
316
  configure(Unit[:L, :Imp, :mi], {:preference => 3.5})
@@ -317,13 +318,13 @@ end
317
318
 
318
319
  class EngineDisplacement < Dimensional::Metric
319
320
  self.dimension = Dimensional::Dimension::V
320
- self.default = Unit[:V, :SI, :l]
321
- self.base = default
321
+ self.base = Unit[:V, :SI, :l]
322
+ self.default = base
322
323
  configure(Unit[:V, :US, :in3], {:preference => 2})
323
324
  end
324
325
 
325
326
  class MechanicalPower < Dimensional::Metric
326
327
  self.dimension = Dimensional::Dimension::P
327
- self.default = Unit[:P, :SI, :W]
328
- self.base = default
328
+ self.base = Unit[:P, :SI, :W]
329
+ self.default = base
329
330
  end
@@ -15,6 +15,7 @@ class MetricTest < Test::Unit::TestCase
15
15
  @meter = Unit.register('meter', System::SI, Dimension::L, {:abbreviation => 'm'})
16
16
  @kilometer = Unit.register('kilometer', System::SI, Dimension::L, {:reference_units => {@meter => 1}, :reference_factor => 1000, :abbreviation => 'km'})
17
17
  @centimeter = Unit.register('centimeter', System::SI, Dimension::L, {:reference_units => {@meter => 1}, :reference_factor => Rational(1,100), :abbreviation => 'cm'})
18
+ @international_nautical_mile = Unit.register('nautical mile', System::SI, Dimension::L, {:reference_units => {@meter => 1}, :reference_factor => Rational(1852,1), :abbreviation => 'M', :preference => -3})
18
19
  # Length Units - US
19
20
  @yard_us = Unit.register('yard', System::US, Dimension::L, {:reference_units => {@meter => 1}, :reference_factor => 0.9144, :abbreviation => 'yd'})
20
21
  @foot_us = Unit.register('foot', System::US, Dimension::L, {:reference_units => {@yard_us => 1}, :reference_factor => Rational(1,3), :abbreviation => 'ft'})
@@ -74,6 +75,18 @@ class MetricTest < Test::Unit::TestCase
74
75
  assert_equal @yard_us, m.unit
75
76
  end
76
77
 
78
+ def test_load_metric
79
+ range = Class.new(Metric)
80
+ range.instance_eval do
81
+ self.dimension = Dimension::L
82
+ self.base = Unit[:L, :SI, :m]
83
+ configure Unit[:L, :SI, :M], :preference => 0
84
+ end
85
+ assert r = range.load(200000)
86
+ assert_in_delta(108, r, 0.1)
87
+ assert_same @international_nautical_mile, r.unit
88
+ end
89
+
77
90
  def test_find_unit
78
91
  depth = Class.new(Metric)
79
92
  depth.dimension = Dimension::L
@@ -81,6 +94,18 @@ class MetricTest < Test::Unit::TestCase
81
94
  assert_same @foot_us, depth.find_unit('foot', :US)
82
95
  end
83
96
 
97
+ def test_scanner
98
+ assert_equal [%w(3 m)], "3m".scan(Metric::NUMERIC_REGEXP)
99
+ assert_equal [%w(3 m)], "3 m".scan(Metric::NUMERIC_REGEXP)
100
+ assert_equal [%w(.3 m)], ".3m".scan(Metric::NUMERIC_REGEXP)
101
+ assert_equal [%w(0.3 m)], "0.3m".scan(Metric::NUMERIC_REGEXP)
102
+ assert_equal [%w(01.32 m)], "01.32m".scan(Metric::NUMERIC_REGEXP)
103
+ assert_equal [%w(6 '), %w(4 ")], "6'4\"".scan(Metric::NUMERIC_REGEXP)
104
+ assert_equal [%w(6 feet), %w(4 inches)], "6 feet 4 inches".scan(Metric::NUMERIC_REGEXP)
105
+ assert_equal [["1.32", "nautical miles"]], "1.32 nautical miles".scan(Metric::NUMERIC_REGEXP)
106
+ # assert_equal [%w(.3 m3)], ".3m3".scan(Metric::NUMERIC_REGEXP)
107
+ end
108
+
84
109
  def test_parse
85
110
  depth = Class.new(Metric)
86
111
  depth.dimension = Dimension::L
@@ -97,6 +122,14 @@ class MetricTest < Test::Unit::TestCase
97
122
  assert_equal 15, m
98
123
  end
99
124
 
125
+ def test_parse_with_multiword_unit
126
+ range = Class.new(Metric)
127
+ range.dimension = Dimension::L
128
+ m = range.parse("15 nautical miles", :SI)
129
+ assert_same @international_nautical_mile, m.unit
130
+ assert_equal 15, m
131
+ end
132
+
100
133
  def test_parse_compound
101
134
  depth = Class.new(Metric)
102
135
  depth.dimension = Dimension::L
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: dimensional
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.1
4
+ version: 1.1.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Chris Hapgood
@@ -22,6 +22,7 @@ extensions: []
22
22
  extra_rdoc_files:
23
23
  - LICENSE
24
24
  - README
25
+ - TODO
25
26
  files:
26
27
  - CHANGELOG
27
28
  - LICENSE
@@ -42,6 +43,7 @@ files:
42
43
  - test/metric_test.rb
43
44
  - test/system_test.rb
44
45
  - test/unit_test.rb
46
+ - TODO
45
47
  has_rdoc: true
46
48
  homepage: http://cho.hapgoods.com/dimensional
47
49
  licenses: []