units-system 0.0.1 → 0.0.2

Sign up to get free protection for your applications and to get access to all the features.
data/README.rdoc CHANGED
@@ -1,18 +1,39 @@
1
1
  = Ruby Units-System
2
2
 
3
- Units of measure conversions for Ruby 1.9, using Ruby objects and Ruby syntax rather than text strings.
3
+ Units of measure conversions for Ruby, using Ruby objects and Ruby syntax rather than text strings.
4
4
 
5
5
  There are a number of Ruby units libraries, but I don't think they take this approach (I haven't
6
6
  done much research, though.)
7
7
 
8
- Currently Ruby 1.9 is required because we use the feature that
9
- a +module.clas_eval{...}+ block can reference module's contants without qualification.
10
- To make this apt for Ruby 1.8 we should replace expressions such as +u{W}+ by either
11
- +u{W()}+, +u{self.W}+ (method invocation) or +u{self::W}+ (qualified constant).
8
+ There's a couple of caveats for using this module from Ruby 1.8:
9
+ * To use unit names that start with uppercase letters, the UseBlocks module must be included in the scope
10
+ (either global scope or a module or class definitions) where the expressions are goign to be used.
11
+ Alternatively, expressions such as <tt>u{W}</tt> could be replaced by either
12
+ <tt>u{W()}</tt>, <tt>u{self.W}</tt> (method invocation) or <tt>u{self::W}</tt> (qualified constant).
13
+ * UTF-8 characters are liberally used in identifiers, so the code must be executed with the <tt>-Ku</tt>
14
+ option (or setting <tt>$KCODE='UTF8'</tt> before requiring this library.)
15
+
16
+ = Usage examples
17
+
18
+ == Ruby 1.9
19
+
20
+ For use with Ruby 1.9, this gem can be used simply by requiring:
21
+
22
+ require 'units-system'
23
+
24
+ == Ruby 1.8
12
25
 
13
- Also, note that UTF-8 characters are liberally used in identifiers.
26
+ This library has been designed for Ruby 1.9; when using it under older versions of Ruby there's
27
+ a couple of precautions to be taken to use it (which can be used with Ruby 1.9 too):
28
+
29
+ $KCODE = 'UTF8' # avoid errors when parsing the required library under Ruby 1.8
30
+ require 'units-system'
31
+ include Units::UseBlocks # allow access to capitalized unit names from units/u blocks
14
32
 
15
- = Usage examples
33
+ Depending on you installation you may have to "require 'rubygems' first.
34
+
35
+ The following examples use UTF-8 code; so they can should be used with a "encoding: utf-8" comment at the
36
+ top of the file for Ruby 1.9, and/or with the ruby command line "-Ku" option for Ruby 1.8.
16
37
 
17
38
  To work with units a +units+ block can be used. Beware: in it +self+ is changed,
18
39
  so outer self methods or instance variables are not accessible, unless usigned to
@@ -104,6 +125,17 @@ For short expressions, the abbreviation +Units.u+ can be used instead of +Units.
104
125
  x = u{120*km/h}
105
126
  puts x.to(u{mi/h}) # => 74.5645430684801*mi/h
106
127
 
128
+ New units can be defined with +Units.define+
129
+
130
+ Units.define :kph, 1, Units.u{km/h}
131
+ puts Units.u{270*kph.to(m/s)} # => 75.0*m/s
132
+
133
+ == Caveat
134
+
135
+ Note that Ruby variable definition rules imply that this:
136
+ m = Units.u{m}
137
+ Results is a nil value (the outter m assignment defines a local m variable even before executing the block, so
138
+ the m in the block refers to that, yet-unassigned, variable and not to the meter unit)
107
139
 
108
140
  == Note on Patches/Pull Requests
109
141
 
data/Rakefile CHANGED
@@ -7,7 +7,6 @@ begin
7
7
  gem.name = "units-system"
8
8
  gem.summary = %Q{Arithmetic with units of measure}
9
9
  gem.description = %Q{Experimental unit conversion & arithmetic for Ruby 1.9}
10
- gem.required_ruby_version = '>= 1.9.1'
11
10
  gem.email = "jgoizueta@gmail.com"
12
11
  gem.homepage = "http://github.com/jgoizueta/units-system"
13
12
  gem.authors = ["Javier Goizueta"]
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.0.1
1
+ 0.0.2
data/lib/units-system.rb CHANGED
@@ -1,9 +1,9 @@
1
1
  # encoding: utf-8
2
2
 
3
- # Ruby 1.9 Units-System experiments.
3
+ # Ruby Units-System experiments.
4
4
 
5
5
  module Units
6
-
6
+
7
7
  class Measure
8
8
 
9
9
  def initialize(mag=1.0, units={})
@@ -349,8 +349,9 @@ module Units
349
349
  prefix = prefix.to_s
350
350
  if u[0...prefix.length] == prefix
351
351
  factor = f
352
- ud = UNITS[u[prefix.length..-1].to_sym].dup
353
- if ud
352
+ ud = UNITS[u[prefix.length..-1].to_sym]
353
+ if ud
354
+ ud = ud.dup
354
355
  ud.name = "#{name}#{ud.name}"
355
356
  break
356
357
  end
@@ -395,11 +396,16 @@ module Units
395
396
  equivalence = factor*ud.decomposition if ud.decomposition
396
397
  factor *= ud.factor
397
398
  end
399
+ # si_unit = (factor==1.0) # to save si_units definitions
398
400
  else
399
401
  # unidad compuesta
400
402
  equivalence = args.shift
401
403
  factor = equivalence.to_si.magnitude
402
404
  si_unit = (factor==1.0) # TODO: tolerance?
405
+ if equivalence.units.empty?
406
+ # adimensional compound dimension... (special case)
407
+ equivalence = nil
408
+ end
403
409
  end
404
410
  elsif args.first.kind_of?(Numeric)
405
411
  # unidad definida en función de otra
@@ -407,8 +413,8 @@ module Units
407
413
  factor_units = args.shift
408
414
  u = unit(factor_units)
409
415
  dim = u.dim
410
- factor *= u.factor
411
416
  equivalence = factor*u.decomposition if u.decomposition
417
+ factor *= u.factor
412
418
  bias = args.shift
413
419
  else
414
420
  # unidad simple definida en función de una expressión
@@ -546,6 +552,26 @@ module Units
546
552
  end
547
553
 
548
554
  end
555
+
556
+
557
+ # Constant look-up was different in Ruby before 1.9.1
558
+ # In older Ruby versions, this must be included in any module or class from which units expressions
559
+ # are to be used in units or u blocks.
560
+ module UseBlocks
561
+ if RUBY_VERSION<"1.9"
562
+ def self.append_features(target)
563
+ def target.const_missing(name)
564
+ begin
565
+ Units.Measure(name)
566
+ rescue ArgumentError
567
+ super
568
+ end
569
+ end
570
+ end
571
+ end
572
+ end
573
+
574
+ include UseBlocks
549
575
 
550
576
  # Units definitions
551
577
 
@@ -575,6 +601,7 @@ module Units
575
601
  define :ft, 'foot', 0.3048, :m
576
602
  # in is a Ruby keyword; to avoid having to use self.in we'll define:
577
603
  define :inch, 'inch', 1, :in
604
+ define :lb, 'pound', 0.45359237, :kg
578
605
 
579
606
  # declare derived quantities without named units
580
607
  si_units :speed, u{m/s}
@@ -630,5 +657,13 @@ module Units
630
657
 
631
658
  # define :kp, 'kilopond', :force, u{kg*g0} # or define pond?
632
659
  define :gf, 'gram-force', :force, u{g*g0} # kilopond kp = kgf
660
+ define :lbf, 'pound-force', :force, u{lb*g0}
661
+
662
+ define :dyn, 'dyne', 10, :µN # u{1*g*cm/s**2}
663
+ define :galUS, 'U.S. liquid gallon', :volume, u{231*self.in**3}
664
+ define :galUK, 'Imperial gallon', 4.546092, :l
665
+ define :hp, 'horsepower', :power, u{550*ft*lbf/s}
666
+
667
+ define :psi, 'pounds-force per square inch', :pressure, u{lbf/self.in**2}
633
668
 
634
669
  end # Units
data/test/helper.rb CHANGED
@@ -2,6 +2,7 @@ require 'rubygems'
2
2
  require 'test/unit'
3
3
  require 'shoulda'
4
4
 
5
+ $KCODE='UTF8' if RUBY_VERSION<"1.9"
5
6
  $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
6
7
  $LOAD_PATH.unshift(File.dirname(__FILE__))
7
8
  require 'units-system'
@@ -1,6 +1,8 @@
1
1
  require 'helper'
2
2
 
3
3
  class TestUnitsSystem < Test::Unit::TestCase
4
+
5
+ include Units::UseBlocks
4
6
 
5
7
  should "be possible to define Measures with a units block" do
6
8
  assert_equal Units::Measure, Units.units{m}.class
@@ -48,6 +50,7 @@ class TestUnitsSystem < Test::Unit::TestCase
48
50
  should "convert compound units correctly" do
49
51
  assert_equal 75, Units.u{(270*km/h).in(m/s)}
50
52
  assert_equal 270, Units.u{(75*m/s).in(km/h)}
53
+ assert_in_delta Units.u{g*cm/s**2}.magnitude, Units.u{dyn.to(g*cm/s**2)}.magnitude, Float::EPSILON
51
54
  end
52
55
 
53
56
  should "add units correctly" do
data/units-system.gemspec CHANGED
@@ -1,15 +1,15 @@
1
1
  # Generated by jeweler
2
2
  # DO NOT EDIT THIS FILE DIRECTLY
3
- # Instead, edit Jeweler::Tasks in rakefile, and run the gemspec command
3
+ # Instead, edit Jeweler::Tasks in Rakefile, and run the gemspec command
4
4
  # -*- encoding: utf-8 -*-
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = %q{units-system}
8
- s.version = "0.0.1"
8
+ s.version = "0.0.2"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["Javier Goizueta"]
12
- s.date = %q{2009-12-18}
12
+ s.date = %q{2010-02-01}
13
13
  s.description = %q{Experimental unit conversion & arithmetic for Ruby 1.9}
14
14
  s.email = %q{jgoizueta@gmail.com}
15
15
  s.extra_rdoc_files = [
@@ -31,7 +31,6 @@ Gem::Specification.new do |s|
31
31
  s.homepage = %q{http://github.com/jgoizueta/units-system}
32
32
  s.rdoc_options = ["--charset=UTF-8"]
33
33
  s.require_paths = ["lib"]
34
- s.required_ruby_version = Gem::Requirement.new(">= 1.9.1")
35
34
  s.rubygems_version = %q{1.3.5}
36
35
  s.summary = %q{Arithmetic with units of measure}
37
36
  s.test_files = [
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: units-system
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.1
4
+ version: 0.0.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Javier Goizueta
@@ -9,7 +9,7 @@ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
11
 
12
- date: 2009-12-18 00:00:00 +01:00
12
+ date: 2010-02-01 00:00:00 +01:00
13
13
  default_executable:
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
@@ -55,7 +55,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
55
55
  requirements:
56
56
  - - ">="
57
57
  - !ruby/object:Gem::Version
58
- version: 1.9.1
58
+ version: "0"
59
59
  version:
60
60
  required_rubygems_version: !ruby/object:Gem::Requirement
61
61
  requirements: