farski-systeme 0.2.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/VERSION.yml +4 -0
- data/lib/systeme/conversions.rb +15 -0
- data/lib/systeme/imperial.rb +59 -0
- data/lib/systeme/metric.rb +62 -0
- data/lib/systeme/registration.rb +8 -0
- data/lib/systeme.rb +12 -0
- data/test/imperial_test.rb +24 -0
- data/test/metric_test.rb +23 -0
- data/test/test_helper.rb +9 -0
- metadata +62 -0
data/VERSION.yml
ADDED
@@ -0,0 +1,15 @@
|
|
1
|
+
require 'systeme/registration'
|
2
|
+
|
3
|
+
module Systeme
|
4
|
+
module Conversions
|
5
|
+
def method_missing(method_name, *arguments)
|
6
|
+
if match_data = method_name.to_s.match(/in_([a-zA-Z]+)/)
|
7
|
+
if Systeme::Registration::names.include?(match_data[1])
|
8
|
+
return self / 1.0.send(match_data[1])
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
return super
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
@@ -0,0 +1,59 @@
|
|
1
|
+
require 'systeme/registration'
|
2
|
+
|
3
|
+
module Systeme
|
4
|
+
module Imperial
|
5
|
+
def self.included(caller)
|
6
|
+
caller.send :include, Systeme::Imperial::Declarations
|
7
|
+
end
|
8
|
+
|
9
|
+
module Units
|
10
|
+
IMPERIAL_MEASURES = Hash.new
|
11
|
+
|
12
|
+
IMPERIAL_MEASURES['length'] = Hash.new
|
13
|
+
IMPERIAL_MEASURES['length'][:si] = 0.3048
|
14
|
+
IMPERIAL_MEASURES['length'][:units] = Array.new
|
15
|
+
IMPERIAL_MEASURES['length'][:units] << { :unit => "thou", :factor => (1.0/12000), :aliases => ["mil"] }
|
16
|
+
IMPERIAL_MEASURES['length'][:units] << { :unit => "inch", :factor => (1.0/12), :aliases => ["in", "inches"] }
|
17
|
+
IMPERIAL_MEASURES['length'][:units] << { :unit => "foot", :factor => 1, :aliases => ["feet", "ft"] }
|
18
|
+
IMPERIAL_MEASURES['length'][:units] << { :unit => "yard", :factor => 3, :aliases => ["yd"] }
|
19
|
+
IMPERIAL_MEASURES['length'][:units] << { :unit => "furlong", :factor => 660 }
|
20
|
+
IMPERIAL_MEASURES['length'][:units] << { :unit => "mile", :factor => 5280, :aliases => ["mi"] }
|
21
|
+
IMPERIAL_MEASURES['length'][:units] << { :unit => "league", :factor => 15840 }
|
22
|
+
# maritime units
|
23
|
+
IMPERIAL_MEASURES['length'][:units] << { :unit => "fathom", :factor => 6 }
|
24
|
+
IMPERIAL_MEASURES['length'][:units] << { :unit => "cable", :factor => 608 }
|
25
|
+
IMPERIAL_MEASURES['length'][:units] << { :unit => "nautical_mile", :factor => 6080, :aliases => ["NM", "nmi", "M"] }
|
26
|
+
IMPERIAL_MEASURES['length'][:units] << { :unit => "link", :factor => (66/100), :aliases => ["lnk"] }
|
27
|
+
IMPERIAL_MEASURES['length'][:units] << { :unit => "rod", :factor => (66/4), :aliases => ["perch", "perches", "pole", "lug"] }
|
28
|
+
IMPERIAL_MEASURES['length'][:units] << { :unit => "chain", :factor => 66 }
|
29
|
+
|
30
|
+
IMPERIAL_MEASURES['weight'] = Hash.new
|
31
|
+
IMPERIAL_MEASURES['weight'][:si] = 0.45359237
|
32
|
+
IMPERIAL_MEASURES['weight'][:units] = Array.new
|
33
|
+
IMPERIAL_MEASURES['weight'][:units] << { :unit => "grain", :factor => (1/7000) }
|
34
|
+
IMPERIAL_MEASURES['weight'][:units] << { :unit => "drachm", :factor => (1/256) }
|
35
|
+
IMPERIAL_MEASURES['weight'][:units] << { :unit => "ounce", :factor => (1/16), :aliases => ["oz"] }
|
36
|
+
IMPERIAL_MEASURES['weight'][:units] << { :unit => "pound", :factor => 1, :aliases => ["lb", "lbm", "lbs"] }
|
37
|
+
IMPERIAL_MEASURES['weight'][:units] << { :unit => "stone", :factor => 14, :aliases => ["st"] }
|
38
|
+
IMPERIAL_MEASURES['weight'][:units] << { :unit => "quarter", :factor => 28 }
|
39
|
+
IMPERIAL_MEASURES['weight'][:units] << { :unit => "hundredweight", :factor => 112, :aliases => ["cwt"] }
|
40
|
+
IMPERIAL_MEASURES['weight'][:units] << { :unit => "ton", :factor => 2240 }
|
41
|
+
end # Units
|
42
|
+
|
43
|
+
module Declarations
|
44
|
+
Systeme::Imperial::Units::IMPERIAL_MEASURES.each do |measure, data|
|
45
|
+
data[:units].each do |unit|
|
46
|
+
define_method(unit[:unit].to_sym) { self * unit[:factor].to_f * data[:si] }
|
47
|
+
class_eval("alias :" + unit[:unit] + "s :" + unit[:unit])
|
48
|
+
Systeme::Registration::names << unit[:unit] << unit[:unit]+"s"
|
49
|
+
if unit[:aliases]
|
50
|
+
unit[:aliases].each do |aka|
|
51
|
+
class_eval("alias :" + aka + " :" + unit[:unit])
|
52
|
+
Systeme::Registration::names << aka
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end # Declarations
|
58
|
+
end
|
59
|
+
end
|
@@ -0,0 +1,62 @@
|
|
1
|
+
require 'systeme/registration'
|
2
|
+
|
3
|
+
module Systeme
|
4
|
+
module Metric
|
5
|
+
def self.included(caller)
|
6
|
+
caller.send :include, Systeme::Metric::Declarations
|
7
|
+
end
|
8
|
+
|
9
|
+
module Units
|
10
|
+
SI_BASE_UNITS = Hash.new
|
11
|
+
SI_BASE_UNITS[:meter] = { :symbol => :m, :measure => "length" }
|
12
|
+
SI_BASE_UNITS[:gram] = { :symbol => :g, :measure => "mass", :factor_offset => -3 }
|
13
|
+
SI_BASE_UNITS[:second] = { :symbol => :s, :measure => "time" }
|
14
|
+
SI_BASE_UNITS[:ampere] = { :symbol => :A, :measure => "electric current" }
|
15
|
+
SI_BASE_UNITS[:kelvin] = { :symbol => :K, :measure => "thermodynamic temperature" }
|
16
|
+
|
17
|
+
SI_UNIT_PREFIXES = Hash.new
|
18
|
+
SI_UNIT_PREFIXES[:yocto] = { :factor => -24, :symbol_prefix => "y" }
|
19
|
+
SI_UNIT_PREFIXES[:zepto] = { :factor => -21, :symbol_prefix => "z" }
|
20
|
+
SI_UNIT_PREFIXES[:atto] = { :factor => -18, :symbol_prefix => "a" }
|
21
|
+
SI_UNIT_PREFIXES[:femto] = { :factor => -15, :symbol_prefix => "f" }
|
22
|
+
SI_UNIT_PREFIXES[:pico] = { :factor => -12, :symbol_prefix => "p" }
|
23
|
+
SI_UNIT_PREFIXES[:nano] = { :factor => -9, :symbol_prefix => "n" }
|
24
|
+
SI_UNIT_PREFIXES[:micro] = { :factor => -6, :symbol_prefix => "u" } # use of 'µ' should be supported with unicode?
|
25
|
+
SI_UNIT_PREFIXES[:milli] = { :factor => -3, :symbol_prefix => "m" }
|
26
|
+
SI_UNIT_PREFIXES[:centi] = { :factor => -2, :symbol_prefix => "c" }
|
27
|
+
SI_UNIT_PREFIXES[:deci] = { :factor => -1, :symbol_prefix => "d" }
|
28
|
+
SI_UNIT_PREFIXES[:deca] = { :factor => 1, :symbol_prefix => "da" }
|
29
|
+
SI_UNIT_PREFIXES[:hecto] = { :factor => 2, :symbol_prefix => "h" }
|
30
|
+
SI_UNIT_PREFIXES[:kilo] = { :factor => 3, :symbol_prefix => "k" }
|
31
|
+
SI_UNIT_PREFIXES[:mega] = { :factor => 6, :symbol_prefix => "M" }
|
32
|
+
SI_UNIT_PREFIXES[:giga] = { :factor => 9, :symbol_prefix => "G" }
|
33
|
+
SI_UNIT_PREFIXES[:tera] = { :factor => 12, :symbol_prefix => "T" }
|
34
|
+
SI_UNIT_PREFIXES[:peta] = { :factor => 15, :symbol_prefix => "P" }
|
35
|
+
SI_UNIT_PREFIXES[:exa] = { :factor => 18, :symbol_prefix => "E" }
|
36
|
+
SI_UNIT_PREFIXES[:zetta] = { :factor => 21, :symbol_prefix => "Z" }
|
37
|
+
SI_UNIT_PREFIXES[:yotta] = { :factor => 24, :symbol_prefix => "Y" }
|
38
|
+
end # Units
|
39
|
+
|
40
|
+
module Declarations
|
41
|
+
Systeme::Metric::Units::SI_BASE_UNITS.each do |unit, unit_data|
|
42
|
+
unit_factor_offset = (unit_data[:factor_offset] ? unit_data[:factor_offset] : 0 )
|
43
|
+
plural_unit_name = unit.to_s + "s"
|
44
|
+
|
45
|
+
define_method(plural_unit_name.to_sym) { self * (10**(unit_factor_offset)) }
|
46
|
+
class_eval("alias :" + unit_data[:symbol].to_s + " :" + plural_unit_name)
|
47
|
+
class_eval("alias :" + plural_unit_name.chop + " :" + plural_unit_name)
|
48
|
+
Systeme::Registration::names << plural_unit_name << unit_data[:symbol].to_s << plural_unit_name.chop
|
49
|
+
|
50
|
+
Systeme::Metric::Units::SI_UNIT_PREFIXES.each do |prefix, prefix_data|
|
51
|
+
plural_prefixed_unit_name = prefix.to_s + plural_unit_name
|
52
|
+
prefixed_symbol = prefix_data[:symbol_prefix] + unit_data[:symbol].to_s
|
53
|
+
|
54
|
+
define_method(plural_prefixed_unit_name.to_sym) { self * (10**(prefix_data[:factor] + unit_factor_offset)) }
|
55
|
+
class_eval("alias :" + prefixed_symbol + " :" + plural_prefixed_unit_name)
|
56
|
+
class_eval("alias :" + plural_prefixed_unit_name.chop + " :" + plural_prefixed_unit_name)
|
57
|
+
Systeme::Registration::names << plural_prefixed_unit_name << prefixed_symbol << plural_prefixed_unit_name.chop
|
58
|
+
end
|
59
|
+
end
|
60
|
+
end # Declarations
|
61
|
+
end
|
62
|
+
end
|
data/lib/systeme.rb
ADDED
@@ -0,0 +1,12 @@
|
|
1
|
+
require 'systeme/metric'
|
2
|
+
require 'systeme/imperial'
|
3
|
+
require 'systeme/conversions'
|
4
|
+
require 'systeme/registration'
|
5
|
+
|
6
|
+
module Systeme
|
7
|
+
include Systeme::Metric
|
8
|
+
include Systeme::Imperial
|
9
|
+
include Systeme::Conversions
|
10
|
+
end
|
11
|
+
|
12
|
+
Numeric.send :include, Systeme
|
@@ -0,0 +1,24 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/test_helper'
|
2
|
+
|
3
|
+
class ImperialTest < Test::Unit::TestCase
|
4
|
+
should "maintain base unit value through declaration" do
|
5
|
+
assert_equal 1, 1
|
6
|
+
# assert_equal 1, 1.ft
|
7
|
+
# assert_equal 1, 1.lb
|
8
|
+
end
|
9
|
+
#
|
10
|
+
# should "express non-base unit value in the base unit" do
|
11
|
+
# assert_equal 3, 1.yd
|
12
|
+
# assert_equal 14, 1.stone
|
13
|
+
# end
|
14
|
+
|
15
|
+
# should "convert value from base unit to any other unit" do
|
16
|
+
# assert_equal 1000, 1.kg.to_g
|
17
|
+
# assert_equal 100, 1.m.to_cm
|
18
|
+
# end
|
19
|
+
#
|
20
|
+
# should "convert value between arbitrary units" do
|
21
|
+
# assert_equal 1, 1000.mg.to_g
|
22
|
+
# assert_equal 10, 1.cm.to_mm
|
23
|
+
# end
|
24
|
+
end
|
data/test/metric_test.rb
ADDED
@@ -0,0 +1,23 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/test_helper'
|
2
|
+
|
3
|
+
class MetricTest < Test::Unit::TestCase
|
4
|
+
should "maintain base unit value through declaration" do
|
5
|
+
assert_equal 1, 1.kg
|
6
|
+
assert_equal 1, 1.m
|
7
|
+
end
|
8
|
+
|
9
|
+
should "express non-base unit value in the base unit" do
|
10
|
+
assert_equal 0.001, 1.g
|
11
|
+
assert_equal 1000, 1.km
|
12
|
+
end
|
13
|
+
|
14
|
+
should "convert value from base unit to any other unit" do
|
15
|
+
assert_equal 1000, 1.kg.in_g
|
16
|
+
assert_equal 100, 1.m.in_cm
|
17
|
+
end
|
18
|
+
|
19
|
+
should "convert value between arbitrary units" do
|
20
|
+
assert_equal 1, 1000.mg.in_g
|
21
|
+
assert_equal 10, 1.cm.in_mm
|
22
|
+
end
|
23
|
+
end
|
data/test/test_helper.rb
ADDED
metadata
ADDED
@@ -0,0 +1,62 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: farski-systeme
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.2.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Chris Kalafarski
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
|
12
|
+
date: 2009-01-17 00:00:00 -08:00
|
13
|
+
default_executable:
|
14
|
+
dependencies: []
|
15
|
+
|
16
|
+
description: TODO
|
17
|
+
email: chris@farski.com
|
18
|
+
executables: []
|
19
|
+
|
20
|
+
extensions: []
|
21
|
+
|
22
|
+
extra_rdoc_files: []
|
23
|
+
|
24
|
+
files:
|
25
|
+
- VERSION.yml
|
26
|
+
- lib/systeme
|
27
|
+
- lib/systeme/conversions.rb
|
28
|
+
- lib/systeme/imperial.rb
|
29
|
+
- lib/systeme/metric.rb
|
30
|
+
- lib/systeme/registration.rb
|
31
|
+
- lib/systeme.rb
|
32
|
+
- test/imperial_test.rb
|
33
|
+
- test/metric_test.rb
|
34
|
+
- test/test_helper.rb
|
35
|
+
has_rdoc: false
|
36
|
+
homepage: http://github.com/farski/systeme
|
37
|
+
post_install_message:
|
38
|
+
rdoc_options: []
|
39
|
+
|
40
|
+
require_paths:
|
41
|
+
- lib
|
42
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
43
|
+
requirements:
|
44
|
+
- - ">="
|
45
|
+
- !ruby/object:Gem::Version
|
46
|
+
version: "0"
|
47
|
+
version:
|
48
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
49
|
+
requirements:
|
50
|
+
- - ">="
|
51
|
+
- !ruby/object:Gem::Version
|
52
|
+
version: "0"
|
53
|
+
version:
|
54
|
+
requirements: []
|
55
|
+
|
56
|
+
rubyforge_project:
|
57
|
+
rubygems_version: 1.2.0
|
58
|
+
signing_key:
|
59
|
+
specification_version: 2
|
60
|
+
summary: TODO
|
61
|
+
test_files: []
|
62
|
+
|