eymiha_units 0.1.0

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.
data/gem_package.rb ADDED
@@ -0,0 +1,34 @@
1
+ class GemPackage
2
+
3
+ attr_reader :name, :version, :files
4
+
5
+ def initialize
6
+ @name = 'eymiha_units'
7
+ @version = '0.1.0'
8
+ @files = FileList[
9
+ '*.rb',
10
+ 'lib/**/*',
11
+ 'test/*',
12
+ 'html/**/*'
13
+ ]
14
+ end
15
+
16
+ def fill_spec(s)
17
+ s.name = name
18
+ s.version = version
19
+ s.summary = "Emiyha - units and conversions"
20
+ s.files = files.to_a
21
+ s.require_path = 'lib'
22
+ # s.autorequire = name
23
+ s.has_rdoc = true
24
+ s.rdoc_options << "--all"
25
+ s.author = "Dave Anderson"
26
+ s.email = "dave@eymiha.com"
27
+ s.homepage = "http://www.eymiha.com"
28
+ s.rubyforge_project = "cori"
29
+ s.add_dependency("eymiha",">= 0.1.1")
30
+ s.add_dependency("eymiha_math",">= 0.1.1")
31
+ s.add_dependency("eymiha_util",">= 0.1.5")
32
+ end
33
+
34
+ end
@@ -0,0 +1,5 @@
1
+ Units.derive :area, Units[:length]**2 do |m|
2
+ m.system :english do |s|
3
+ s.unit :name => :acre, :equals => 4840.yd^2
4
+ end
5
+ end
@@ -0,0 +1,34 @@
1
+ Units.create :length do |m|
2
+ m.system :english do |s|
3
+ s.unit :name => :inch, :plural => :inches, :abbrev => :in
4
+ s.unit :name => :foot, :plural => :feet, :equals => 12.inches,
5
+ :abbrev => :ft
6
+ s.unit :name => :yard, :equals => 3.feet, :abbrev => :yd
7
+ s.unit :name => :mile, :equals => 5280.feet, :abbrev => :mi
8
+ s.unit :name => :nautical_mile, :equals => 1852.meters, :abbrev => :nmi
9
+ s.format :name => :feet_inches_and_32s,
10
+ :format => lambda { |u|
11
+ ru = u.round_to_nearest(1.inch,32)
12
+ feet = ru.feet.floor
13
+ inches = (ru-feet).inches
14
+ "#{feet} #{inches.with_fraction 32}" }
15
+ end
16
+ m.system :old_english do |s|
17
+ s.unit :name => :fathom, :equals => 2.yards
18
+ s.unit :name => :chain, :equals => 22.yards
19
+ s.unit :name => :furlong, :equals => 660.feet
20
+ s.unit :name => :league, :equals => 3.nmi
21
+ end
22
+ m.system :metric do |s|
23
+ s.unit :name => :meter, :equals =>39.37.inches, :abbrev => :m,
24
+ :greek => :ten
25
+ s.unit :name => :anstrom, :equals => 0.1.nanometers, :abbrev => :A
26
+ end
27
+ m.system :astronomical do |s|
28
+ s.unit :name => :astronomical_unit, :equals => 149598000.kilometers,
29
+ :abbrev => :AU
30
+ s.unit :name => :light_year, :equals => speed_of_light*(year.seconds),
31
+ :abbrev => :ly
32
+ s.unit :name => :parsec, :equals => 3.262.light_years, :abbrev => :pc
33
+ end
34
+ end
@@ -0,0 +1,16 @@
1
+ Units.create :mass do |m|
2
+ m.system :metric do |s|
3
+ s.unit :name => :gram, :abbrev => :g, :greek => :ten
4
+ end
5
+ end
6
+
7
+ Units.create :weight do |m|
8
+ m.system :avoirdupois do |s|
9
+ s.unit :name => :grain, :equals => (1/7000.0).lb, :abbrev => :gr
10
+ s.unit :name => :dram, :equals => (1/16.0).oz, :abbrev => :dr
11
+ s.unit :name => :ounce, :equals => (1/16.0).lb, :abbrev => :oz
12
+ s.unit :name => :pound, :equals => 454.g, :abbrev => :lb
13
+ s.unit :name => :hundredweight, :equals => 100.lb, :abbrev => :cwt
14
+ s.unit :name => :ton, :equals => 20.cwt
15
+ end
16
+ end
@@ -0,0 +1,6 @@
1
+ require 'units/definitions/length'
2
+ require 'units/definitions/time'
3
+ require 'units/definitions/velocity'
4
+ require 'units/definitions/area'
5
+ require 'units/definitions/volume'
6
+ require 'units/definitions/mass'
@@ -0,0 +1,61 @@
1
+ Units.create :time do |m|
2
+ m.system :base do |s|
3
+ s.unit :name => :nanosecond, :equals => 0.000000001.seconds,
4
+ :abbrev => [:ns, :nsec]
5
+ s.unit :name => :microsecond, :equals => 0.000001.seconds,
6
+ :abbrev => [:us, :usec]
7
+ s.unit :name => :millisecond, :equals => 0.001.seconds,
8
+ :abbrev => [:ms, :msec]
9
+ s.unit :name => :second, :abbrev => [:s, :sec]
10
+ s.unit :name => :minute, :equals => 60.seconds, :abbrev => [:m, :min]
11
+ s.unit :name => :hour, :equals => 60.minutes, :abbrev => [:h, :hr]
12
+ s.unit :name => :day, :equals => 24.hours, :abbrev => [:d, :dy]
13
+ s.unit :name => :week, :equals => 7.days, :abbrev => [:w, :wk]
14
+ s.format :name => :weeks_and_days,
15
+ :format => lambda { |u|
16
+ weeks = u.weeks.floor
17
+ days = (u-weeks).days.round
18
+ weeks == 0 ?
19
+ (days == 0 ? "#{weeks}" : "#{days}") :
20
+ "#{weeks} #{days}" }
21
+ end
22
+ m.system :common do |s|
23
+ s.unit :name => :month, :equals => [30.days, 4.weeks], :abbrev => [:m, :mo]
24
+ s.unit :name => :year, :equals => [365.days, 12.months, 52.weeks],
25
+ :abbrev => [:y, :yr]
26
+ end
27
+ m.system :long do |s|
28
+ s.unit :name => :decade, :equals => 10.years
29
+ s.unit :name => :century, :plural => :centuries, :equals => 100.years
30
+ s.unit :name => :millenium, :plural => :millenia, :equals => 1000.years
31
+ end
32
+ m.system :old_english do |s|
33
+ s.unit :name => :fortnight, :equals => 2.weeks
34
+ end
35
+ m.system :months do |s|
36
+ s.unit :name => :january, :equals => 31.days, :singular => true,
37
+ :sequence => 1
38
+ s.unit :name => :february, :equals => [28.days, 29.days], :singular => true,
39
+ :sequence => 2
40
+ s.unit :name => :march, :equals => 31.days, :singular => true,
41
+ :sequence => 3
42
+ s.unit :name => :april, :equals => 30.days, :singular => true,
43
+ :sequence => 4
44
+ s.unit :name => :may, :equals => 31.days, :singular => true,
45
+ :sequence => 5
46
+ s.unit :name => :june, :equals => 30.days, :singular => true,
47
+ :sequence => 6
48
+ s.unit :name => :july, :equals => 31.days, :singular => true,
49
+ :sequence => 7
50
+ s.unit :name => :august, :equals => 31.days, :singular => true,
51
+ :sequence => 8
52
+ s.unit :name => :september, :equals => 30.days, :singular => true,
53
+ :sequence => 9
54
+ s.unit :name => :october, :equals => 31.days, :singular => true,
55
+ :sequence => 10
56
+ s.unit :name => :november, :equals => 30.days, :singular => true,
57
+ :sequence => 11
58
+ s.unit :name => :december, :equals => 31.days, :singular => true,
59
+ :sequence => 12
60
+ end
61
+ end
@@ -0,0 +1,9 @@
1
+ Units.derive :velocity, Units.length/Units.time do |m|
2
+ m.system :metric do |s|
3
+ s.unit :constant => true,
4
+ :name => :speed_of_light,
5
+ :no_plural => true,
6
+ :equals => 299792458.meters/second,
7
+ :abbrev => :c
8
+ end
9
+ end
@@ -0,0 +1,27 @@
1
+ Units.derive :volume, Units[:length]**3 do |m|
2
+ m.system :metric do |s|
3
+ s.unit :name => :liter, :equals => (10.cm)**3, :abbrev => :L, :greek => :ten
4
+ end
5
+ m.system :us do |s|
6
+ s.unit :name => :minim, :equals => (1/480.0).floz, :abbrev => :min
7
+ s.unit :name => :drop, :equals => (1/360.0).floz, :abbrev => :gtt
8
+ s.unit :name => :fluid_dram, :equals => 0.125.floz, :abbrev => :fldr
9
+ s.unit :name => :teaspoon, :equals => (1/3.0).tbsp, :abbrev => :tsp
10
+ s.unit :name => :tablespoon, :equals => 0.5.floz, :abbrev => :tbsp
11
+ s.unit :name => :fluid_ounce, :equals => 29.5735295625.mL, :abbrev => :floz
12
+ s.unit :name => :cup, :equals => 8.floz, :abbrev => :c
13
+ s.unit :name => :pint, :equals => 2.cups, :abbrev => :pt
14
+ s.unit :name => :quart, :equals => 2.pints, :abbrev => :qt
15
+ s.unit :name => :gallon, :equals => 4.quarts, :abbrev => :gal
16
+ s.unit :name => :firkin, :equals => 9.gallons
17
+ s.unit :name => :barrel, :equals => 31.5.gallons, :abbrev => :flbl
18
+ s.unit :name => :hogshead, :equals => 2.barrels, :abbrev => :hhd
19
+ end
20
+ m.system :mixology do |s|
21
+ s.unit :name => :pony, :equals => 0.75.shots
22
+ s.unit :name => :shot, :equals => 1.floz
23
+ s.unit :name => :jigger, :equals => 1.5.shots
24
+ s.unit :name => :fifth, :equals => 0.2.gallons
25
+ end
26
+ end
27
+
@@ -0,0 +1,88 @@
1
+ require 'units/units'
2
+ require 'eymiha_math'
3
+ require 'approximately_equals'
4
+
5
+ # Numerics are extended to allow them to be united with units.
6
+ #
7
+ # Part of this extension is in the added dynamism of the class. During
8
+ # unit definition, if an unencountered unit is referenced, the use is held
9
+ # until more information is loaded into the system and the unknown unit has
10
+ # been resolved. During use, unencountered units are raised.
11
+ class Numeric
12
+
13
+ alias :method_missing_before_units :method_missing
14
+
15
+ def method_missing(method,*args) # :nodoc:
16
+ if Units.defining?
17
+ reference = Units.make_forward_reference(method,Units.defining?)
18
+ begin
19
+ value = Units.convert self, method
20
+ Units.release_forward_reference reference
21
+ value
22
+ rescue MissingUnitsException
23
+ Units.hold_forward_reference
24
+ rescue UnitsException => exception
25
+ units_problem("definition",exception,method,args)
26
+ rescue Exception => exception
27
+ method_missing_before_units(method,args)
28
+ end
29
+ else
30
+ begin
31
+ ps = method.to_s.split '_per_'
32
+ case ps.size
33
+ when 1 then unite method
34
+ when 2 then unite(ps[0])/(1.unite(ps[1]))
35
+ else raise UnitsException('invalid per method')
36
+ end
37
+ rescue UnitsException => exception
38
+ units_problem("usage",exception,method,args)
39
+ rescue Exception
40
+ method_missing_before_units(method,*args)
41
+ end
42
+ end
43
+ end
44
+
45
+ # Returns a NumericWithUnits whose numeric value is the value of the
46
+ # instance, and whose unit is determined from the provided unit and power in
47
+ # the context of a given measure:
48
+ # * as a String or Symbol equal to the singular, plural or abbreviated name of a unit,
49
+ # * as a UnitsHash,
50
+ # * as the unit part of a NumericWithUnits,
51
+ # * as an Array of any of the above.
52
+ def unite(unit=nil,power=1,measure=nil)
53
+ if !unit
54
+ self
55
+ else
56
+ if (unit.kind_of? Array)
57
+ units = UnitsHash.new
58
+ unit.each {|u| units.merge! 1.unite(u)}
59
+ unit = units
60
+ elsif (unit.kind_of? String)||(unit.kind_of? Symbol)
61
+ s = unit.to_s
62
+ as = s.split('_and_')
63
+ if as.size == 1
64
+ units = Units.lookup(as[0])
65
+ case units.size
66
+ when 1 then unit = units[0]
67
+ when 0 then
68
+ as = as[0].split('_')
69
+ units_problem("usage",
70
+ AmbiguousUnitsException.new(unit),
71
+ :unit=,unit) if as.size == 0
72
+ unit = unite(as,power,measure).unit
73
+ else
74
+ units_problem("usage",
75
+ AmbiguousUnitsException.new(unit),
76
+ :unit=,unit)
77
+ end
78
+ else
79
+ unit = unite(as,power,measure).unit
80
+ end
81
+ elsif unit.kind_of? NumericWithUnits
82
+ unit = unit.unit
83
+ end
84
+ NumericWithUnits.new(self,unit,power)
85
+ end
86
+ end
87
+
88
+ end