conversions 0.1.0 → 1.4.3

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/.gitignore CHANGED
@@ -1,5 +1,2 @@
1
- *.sw?
2
- .DS_Store
3
- coverage
4
- rdoc
5
- pkg
1
+ documentation
2
+ *.gem
data/LICENSE CHANGED
@@ -1,20 +1,18 @@
1
- Copyright (c) 2009 pascalbetz
1
+ Copyright (c) 2008 Manfred Stienstra, Fingertips <manfred@fngtps.com>
2
2
 
3
- Permission is hereby granted, free of charge, to any person obtaining
4
- a copy of this software and associated documentation files (the
5
- "Software"), to deal in the Software without restriction, including
6
- without limitation the rights to use, copy, modify, merge, publish,
7
- distribute, sublicense, and/or sell copies of the Software, and to
8
- permit persons to whom the Software is furnished to do so, subject to
9
- the following conditions:
3
+ Permission is hereby granted, free of charge, to any person obtaining a copy of
4
+ this software and associated documentation files (the "Software"), to deal in
5
+ the Software without restriction, including without limitation the rights to
6
+ use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
7
+ the Software, and to permit persons to whom the Software is furnished to do so,
8
+ subject to the following conditions:
10
9
 
11
- The above copyright notice and this permission notice shall be
12
- included in all copies or substantial portions of the Software.
10
+ The above copyright notice and this permission notice shall be included in all
11
+ copies or substantial portions of the Software.
13
12
 
14
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15
- EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16
- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17
- NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
18
- LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
19
- OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20
- WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
13
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
14
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
15
+ FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
16
+ COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
17
+ IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
18
+ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README ADDED
@@ -0,0 +1,44 @@
1
+ = Conversions
2
+
3
+ Unit conversion:
4
+
5
+ 1.miles.to(:kilometres) #=> 1.609344
6
+ 1.pounds.to(:kilograms) #=> 0.453592
7
+ 1.pounds.to(:kilograms, 2) #=> 0.45
8
+
9
+ Or, more explicitly,
10
+
11
+ 1.convert(:miles, :kilometres) #=> 1.609344
12
+ 1.convert(:pounds, :kilograms) #=> 0.453592
13
+ 1.convert(:pounds, :kilograms, :scale => 2) #=> 0.45
14
+
15
+ You can register your own conversions:
16
+
17
+ Conversions.register(:miles, :nautical_miles, 0.868976242)
18
+ 1.miles.to(:nautical_miles) #=> 0.868976242
19
+
20
+ It also adds a class method to ActiveRecord::Base that allows you to define conversion methods for attributes:
21
+
22
+ class Car < ActiveRecord::Base
23
+ conversion_accessor :weight, :internal => :kilograms, :external => :pounds
24
+ end
25
+
26
+ car = Car.new(:weight => 1500)
27
+ car.weight_in_pounds #=> 3306.93393
28
+ car.weight_in_pounds = 3306 #=> 3306
29
+
30
+ == Installation
31
+
32
+ === As a gem
33
+
34
+ Configure the gem in environment.rb:
35
+
36
+ config.gem 'Fingertips-conversions', :lib => 'conversions', :source => 'http://gems.github.com'
37
+
38
+ Install them using Rails' rake task:
39
+
40
+ $ rake gems:install
41
+
42
+ === In your vendor directory:
43
+
44
+ script/install plugin git://github.com/Fingertips/conversions.git
data/Rakefile CHANGED
@@ -5,14 +5,20 @@ begin
5
5
  require 'jeweler'
6
6
  Jeweler::Tasks.new do |gem|
7
7
  gem.name = "conversions"
8
- gem.summary = %Q{adds conversion methods to numbers}
9
- gem.description = %Q{adds conversion methods to numbers}
10
- gem.email = "pascal.betz@simplificator.com"
11
- gem.homepage = "http://github.com/simplficator/conversions"
12
- gem.authors = ["simplificator"]
13
- gem.add_development_dependency "thoughtbot-shoulda"
8
+ gem.summary = %Q{A Ruby on Rails plugin that adds conversion capabilities to numeric objects}
9
+ gem.description = %Q{A Ruby on Rails plugin that adds conversion capabilities to numeric objects}
10
+ gem.email = "seamus@abshere.net"
11
+ gem.homepage = "http://github.com/seamusabshere/conversions"
12
+ gem.authors = ["Manfred Stienstra", "Seamus Abshere"]
13
+ gem.require_path = "lib"
14
+ gem.rdoc_options << '--line-numbers' << '--inline-source'
15
+ gem.rubyforge_project = "conversions"
14
16
  # gem is a Gem::Specification... see http://www.rubygems.org/read/chapter/20 for additional settings
15
17
  end
18
+ Jeweler::GemcutterTasks.new
19
+ Jeweler::RubyforgeTasks.new do |rubyforge|
20
+ rubyforge.doc_task = "rdoc"
21
+ end
16
22
  rescue LoadError
17
23
  puts "Jeweler (or a dependency) not available. Install it with: sudo gem install jeweler"
18
24
  end
@@ -37,8 +43,6 @@ rescue LoadError
37
43
  end
38
44
  end
39
45
 
40
- task :test => :check_dependencies
41
-
42
46
  task :default => :test
43
47
 
44
48
  require 'rake/rdoctask'
@@ -53,4 +57,4 @@ Rake::RDocTask.new do |rdoc|
53
57
  rdoc.title = "conversions #{version}"
54
58
  rdoc.rdoc_files.include('README*')
55
59
  rdoc.rdoc_files.include('lib/**/*.rb')
56
- end
60
+ end
data/TODO ADDED
File without changes
data/VERSION.yml ADDED
@@ -0,0 +1,5 @@
1
+ ---
2
+ :patch: 3
3
+ :major: 1
4
+ :build:
5
+ :minor: 4
@@ -0,0 +1,63 @@
1
+ # Generated by jeweler
2
+ # DO NOT EDIT THIS FILE DIRECTLY
3
+ # Instead, edit Jeweler::Tasks in Rakefile, and run the gemspec command
4
+ # -*- encoding: utf-8 -*-
5
+
6
+ Gem::Specification.new do |s|
7
+ s.name = %q{conversions}
8
+ s.version = "1.4.3"
9
+
10
+ s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
+ s.authors = ["Manfred Stienstra", "Seamus Abshere"]
12
+ s.date = %q{2009-11-02}
13
+ s.description = %q{A Ruby on Rails plugin that adds conversion capabilities to numeric objects}
14
+ s.email = %q{seamus@abshere.net}
15
+ s.extra_rdoc_files = [
16
+ "LICENSE",
17
+ "README"
18
+ ]
19
+ s.files = [
20
+ ".gitignore",
21
+ "LICENSE",
22
+ "README",
23
+ "Rakefile",
24
+ "TODO",
25
+ "VERSION.yml",
26
+ "conversions.gemspec",
27
+ "init.rb",
28
+ "lib/conversions.rb",
29
+ "lib/conversions/active_record_accessors.rb",
30
+ "lib/conversions/defaults.rb",
31
+ "lib/conversions/unit.rb",
32
+ "rails/init.rb",
33
+ "test/accessor_test.rb",
34
+ "test/conversions_test.rb",
35
+ "test/ext_test.rb",
36
+ "test/test_helper.rb",
37
+ "test/unit_test.rb"
38
+ ]
39
+ s.homepage = %q{http://github.com/seamusabshere/conversions}
40
+ s.rdoc_options = ["--charset=UTF-8", "--line-numbers", "--inline-source"]
41
+ s.require_paths = ["lib"]
42
+ s.rubyforge_project = %q{conversions}
43
+ s.rubygems_version = %q{1.3.5}
44
+ s.summary = %q{A Ruby on Rails plugin that adds conversion capabilities to numeric objects}
45
+ s.test_files = [
46
+ "test/accessor_test.rb",
47
+ "test/conversions_test.rb",
48
+ "test/ext_test.rb",
49
+ "test/test_helper.rb",
50
+ "test/unit_test.rb"
51
+ ]
52
+
53
+ if s.respond_to? :specification_version then
54
+ current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
55
+ s.specification_version = 3
56
+
57
+ if Gem::Version.new(Gem::RubyGemsVersion) >= Gem::Version.new('1.2.0') then
58
+ else
59
+ end
60
+ else
61
+ end
62
+ end
63
+
data/init.rb ADDED
@@ -0,0 +1 @@
1
+ require 'conversions'
data/lib/conversions.rb CHANGED
@@ -1,46 +1,59 @@
1
- module UnitConversions
2
- UNITS = ['kg', 'g', 't', 'mm2', 'm2']
3
- CONVERT_TO_PATTERN = /(#{UNITS.join('|')})_to_(#{UNITS.join('|')})/
4
- CONVERSIONS = {
5
- 'kg' => {
6
- 't' => lambda() {|kg| kg / 1000.0 },
7
- 'g' => lambda() {|kg| kg * 1000 },
8
- },
9
- 'g' => {
10
- 'kg' => lambda() {|g| g / 1000.0},
11
- 't' => lambda() {|g| g / (1000.0 * 1000) },
12
- },
13
- 't' => {
14
- 'kg' => lambda() {|t| t * 1000},
15
- 'g' => lambda() {|t| t * (1000 * 1000)},
16
- },
17
- 'm2' => {
18
- 'mm2' => lambda() {|m2| m2 * (1000 * 1000.0)},
19
- },
20
- 'mm2' => {
21
- 'm2' => lambda() {|mm2| mm2 / (1000 * 1000.0)},
22
- },
23
- }
24
-
1
+ # Conversions makes it easy to convert between units.
2
+ module Conversions
3
+ mattr_accessor :conversions
4
+
5
+ # Clear all previously registered conversions
6
+ def self.clear
7
+ self.conversions = {}
8
+ end
9
+ clear
25
10
 
26
- def method_missing_with_unit_conversions(m, *args)
27
- if args.length == 0
28
- m.to_s =~ CONVERT_TO_PATTERN
29
- return CONVERSIONS[$1][$2].call(self) if CONVERSIONS[$1] && CONVERSIONS[$1][$2]
11
+ # Load all the default conversions shipped with the code
12
+ def self.load_defaults
13
+ load File.expand_path('../conversions/defaults.rb', __FILE__)
14
+ end
15
+
16
+ # Register a new conversion. This automatically also registers the inverse conversion.
17
+ #
18
+ # * _from_: The unit to convert from (ie. :miles, :stones, or :pints)
19
+ # * _to_: The unit to convert to
20
+ # * _rate_: The conversion rate from _from_ to _to_. (_from_ * _rate_ = _to_)
21
+ def self.register(from, to, rate)
22
+ conversions[from] ||= {}
23
+ conversions[from][to] = rate
24
+ conversions[to] ||= {}
25
+ conversions[to][from] = 1.0 / rate
26
+ Conversions.define_shortcut(from)
27
+ Conversions.define_shortcut(to)
28
+ end
29
+
30
+ def self.define_shortcut(unit)
31
+ Numeric.class_eval do
32
+ define_method unit do
33
+ Conversions::Unit.new(self, unit)
34
+ end unless respond_to? unit
30
35
  end
31
- method_missing_without_unit_conversions(m, args)
32
36
  end
33
-
34
- end
35
37
 
36
- class Fixnum
37
- include UnitConversions
38
- alias :method_missing_without_unit_conversions :method_missing
39
- alias :method_missing :method_missing_with_unit_conversions
38
+ module Ext
39
+ # Convert from one unit to another.
40
+ #
41
+ # * _from_: The unit to convert from (ie. :miles, :stones, or :pints)
42
+ # * _to_: The unit to convert to
43
+ # * _options_:
44
+ # * :scale: The number of digits you want after the dot.
45
+ def convert(from, to, options={})
46
+ Conversions::Unit.new(self, from).to(to, options)
47
+ end
48
+ end
40
49
  end
41
50
 
42
- class Float
43
- include UnitConversions
44
- alias :method_missing_without_unit_conversions :method_missing
45
- alias :method_missing :method_missing_with_unit_conversions
51
+ require 'conversions/unit'
52
+
53
+ Conversions.load_defaults
54
+ Numeric.send(:include, Conversions::Ext)
55
+
56
+ if defined?(ActiveRecord)
57
+ require 'conversions/active_record_accessors'
58
+ ActiveRecord::Base.send(:extend, Conversions::ActiveRecordAccessors)
46
59
  end
@@ -0,0 +1,49 @@
1
+ module Conversions
2
+ # Implements new accessor classmethods to define conversion accessors on active record classes.
3
+ module ActiveRecordAccessors
4
+ # Adds conversion methods to the model for a certain attribute.
5
+ #
6
+ # Options:
7
+ #
8
+ # * <tt>:internal</tt>: The unit of the internal value
9
+ # * <tt>:external</tt>: The unit of desired external value
10
+ # * <tt>:scale</tt>: If a scale is given, the external value is automatically rounded on the specified scale.
11
+ #
12
+ #
13
+ # Examples:
14
+ #
15
+ # require 'conversions'
16
+ #
17
+ # class Flight
18
+ # extend Conversions::ActiveRecordAccessors
19
+ #
20
+ # attr_accessor :distance
21
+ # conversion_accessor :distance, :internal => :kilometers, :external => :miles, :scale => 2
22
+ #
23
+ # def initialize(distance)
24
+ # self.distance = distance
25
+ # end
26
+ # end
27
+ #
28
+ # flight = Flight.new(1200)
29
+ # flight.distance_in_miles #=> 745.65, rounded down to two decimals as specified in :scale
30
+ #
31
+ # When used as a plugin for Rails, the ActiveRecord::Base is automatically extended.
32
+ #
33
+ # class Car < ActiveRecord::Base
34
+ # conversion_accessor :length, :internal => :kilometers, :external => :miles
35
+ # end
36
+ def conversion_accessor(attribute, options={})
37
+ if options[:internal].nil? or options[:external].nil?
38
+ raise ArgumentError, "Please specify both :external and :internal metrics."
39
+ end
40
+ define_method "#{attribute}_in_#{options[:external]}" do
41
+ value = send(attribute)
42
+ value ? value.convert(options[:internal], options[:external], options.except(:internal, :external)) : nil
43
+ end
44
+ define_method "#{attribute}_in_#{options[:external]}=" do |v|
45
+ send("#{attribute}=", v.blank? ? nil : v.to_f.convert(options[:external], options[:internal], options.except(:internal, :external)))
46
+ end
47
+ end
48
+ end
49
+ end
@@ -0,0 +1,27 @@
1
+ {
2
+ :miles => {
3
+ :kilometres => 1.609344
4
+ },
5
+ :kilograms => {
6
+ :grams => 1000.0,
7
+ :pounds => 2.20462262,
8
+ :short_tons => 0.00110231131,
9
+ :tons => 0.00110231131
10
+ },
11
+ :tons => {
12
+ :pounds => 2000.0
13
+ },
14
+ :gallons => {
15
+ :litres => 3.7854118
16
+ },
17
+ :cubic_feet => {
18
+ :cubic_meters => 0.0283168466
19
+ },
20
+ :miles_per_gallon => {
21
+ :kilometres_per_litre => 0.425143707
22
+ }
23
+ }.each do |from_unit, to_units|
24
+ to_units.each do |to_unit, rate|
25
+ Conversions.register(from_unit, to_unit, rate)
26
+ end
27
+ end
@@ -0,0 +1,47 @@
1
+ module Conversions
2
+ # Proxy class to contain the unit as well as reference the base value
3
+ class Unit
4
+ # Create a new Unit instance.
5
+ #
6
+ # * _value_: The value to convert from (ie. 4.92)
7
+ # * _from_: The unit to convert from (ie. :miles)
8
+ def initialize(value, from)
9
+ @value = value
10
+ @from = from
11
+ end
12
+
13
+ def to_i
14
+ @value.to_i
15
+ end
16
+
17
+ def to_f
18
+ @value.to_f
19
+ end
20
+
21
+ # Convert to a certain other unit.
22
+ #
23
+ # * _to_: The unit to convert to (ie. :kilometers)
24
+ # * _options_:
25
+ # * :scale: The number of digits behind the decimal point to you want to keep
26
+ def to(to, options={})
27
+ case options
28
+ when Integer
29
+ scale = options
30
+ when Hash
31
+ scale = options[:scale]
32
+ end
33
+
34
+ value = @value * self.class.exchange_rate(@from, to)
35
+ scale.nil? ? value : (value * (10 ** scale)).round / (10 ** scale).to_f
36
+ end
37
+
38
+ def self.exchange_rate(from_unit, to_unit) #:nodoc:
39
+ return 1 if from_unit == to_unit
40
+ from = Conversions.conversions[from_unit]
41
+ raise ArgumentError, "Can't convert from `#{from}', unknown unit" if from.nil?
42
+ to = from[to_unit]
43
+ raise ArgumentError, "Can't convert from `#{from_unit}' to `#{to_unit}', unknown unit" if to.nil?
44
+ to
45
+ end
46
+ end
47
+ end
data/rails/init.rb ADDED
@@ -0,0 +1 @@
1
+ require File.join(File.dirname(__FILE__), '..', 'init')
@@ -0,0 +1,59 @@
1
+ require File.dirname(__FILE__) + '/test_helper'
2
+
3
+ class Flight
4
+ extend Conversions::ActiveRecordAccessors
5
+ attr_accessor :distance, :fuel_consumption
6
+ conversion_accessor :distance, :internal => :kilometres, :external => :miles
7
+ conversion_accessor :fuel_consumption, :internal => :litres, :external => :gallons, :scale => 2
8
+
9
+ Conversions.register(:kilometres, :leagues, 0.179985601)
10
+ conversion_accessor :distance, :internal => :kilometres, :external => :leagues, :scale => 2
11
+ end
12
+
13
+ class AccessorTest < Test::Unit::TestCase
14
+ def setup
15
+ reset_defaults
16
+ end
17
+
18
+ def setup
19
+ @flight = Flight.new
20
+ end
21
+
22
+ def test_include
23
+ assert @flight.respond_to?(:distance)
24
+ assert @flight.respond_to?(:distance_in_miles)
25
+ end
26
+
27
+ def test_conversion
28
+ @flight.distance = 1200
29
+ assert_in_delta 745.645430684801, @flight.distance_in_miles, DELTA
30
+ end
31
+
32
+ def test_set_zero
33
+ assert_equal nil, @flight.distance_in_miles
34
+ @flight.distance_in_miles = 0
35
+ assert_equal 0, @flight.distance_in_miles
36
+ end
37
+
38
+ def test_set_nil
39
+ assert_equal nil, @flight.distance_in_miles
40
+ @flight.distance_in_miles = nil
41
+ assert_equal nil, @flight.distance_in_miles
42
+ end
43
+
44
+ def test_set_blank
45
+ assert_equal nil, @flight.distance_in_miles
46
+ @flight.distance_in_miles = ''
47
+ assert_equal nil, @flight.distance_in_miles
48
+ end
49
+
50
+ def test_conversion_with_scale
51
+ @flight.fuel_consumption = 3400
52
+ assert_equal 898.18, @flight.fuel_consumption_in_gallons, DELTA
53
+ end
54
+
55
+ def test_register
56
+ @flight.distance = 1200
57
+ assert_in_delta 215.98, @flight.distance_in_leagues, DELTA
58
+ end
59
+ end
@@ -1,41 +1,26 @@
1
- require 'test_helper'
1
+ require File.dirname(__FILE__) + '/test_helper'
2
2
 
3
3
  class ConversionsTest < Test::Unit::TestCase
4
- should 'convert from grams to tons' do
5
- assert_equal 1, 1000000.g_to_t
6
- assert_equal 1.234567, 1234567.g_to_t
7
- assert_equal 0.001, 1000.g_to_t
8
- assert_equal 0.000001, 1.g_to_t
4
+ def setup
5
+ Conversions.clear
9
6
  end
10
7
 
11
- should 'convert from grams to kg' do
12
- assert_equal 1, 1000.g_to_kg
13
- assert_equal 0.001, 1.g_to_kg
14
- end
15
-
16
- should 'convert from t to grams' do
17
- assert_equal 1000000, 1.t_to_g
18
- assert_equal 1234, (0.001234).t_to_g
19
- end
20
-
21
- should 'convert from kg to grams' do
22
- assert_equal 1000, 1.kg_to_g
23
- assert_equal 12, 0.012.kg_to_g
24
- end
25
-
26
- should 'convert from mm2 to m2' do
27
- assert_equal 1, (1000 * 1000).mm2_to_m2
28
- assert_equal 0.025, (100 * 250).mm2_to_m2
29
- end
30
-
31
- should 'convert from m2 to mm2' do
32
- assert_equal 1000, (0.01 * 0.1).m2_to_mm2
8
+ def test_register
9
+ Conversions.register(:records, :cds, 0.47)
10
+ assert 2, Conversions.conversions.length
11
+
12
+ assert_nothing_raised do
13
+ 1.convert(:records, :cds)
14
+ 1.convert(:cds, :records)
15
+ 1.records.to(:cds)
16
+ 1.cds.to(:records)
17
+ end
33
18
  end
34
19
 
35
-
36
- should 'raise if source or target unit can not be found' do
37
- assert_raises(NoMethodError) do
38
- 1000.kg_to_m
39
- end
20
+ def test_clear
21
+ Conversions.register(:records, :cds, 0.47)
22
+ assert 2, Conversions.conversions.length
23
+ Conversions.clear
24
+ assert 0, Conversions.conversions.length
40
25
  end
41
- end
26
+ end
data/test/ext_test.rb ADDED
@@ -0,0 +1,28 @@
1
+ require File.dirname(__FILE__) + '/test_helper'
2
+
3
+ class ExtTest < Test::Unit::TestCase
4
+ def setup
5
+ reset_defaults
6
+ end
7
+
8
+ def test_conversions
9
+ assert_in_delta 1.609344, 1.convert(:miles, :kilometres), DELTA
10
+ assert_in_delta 1.609344, 1.0.convert(:miles, :kilometres), DELTA
11
+ assert_in_delta 0.45359237, 1.convert(:pounds, :kilograms), DELTA
12
+ assert_in_delta 0.00110231131092439, 1.convert(:kilograms, :tons), DELTA
13
+ assert_in_delta 2.20462262184878, 1.convert(:kilograms, :pounds), DELTA
14
+ assert_in_delta 1, ( 1.convert(:kilograms, :pounds) * 1.convert(:pounds, :kilograms) ), DELTA
15
+ assert_in_delta 1.609344, 1.miles.to(:kilometres), DELTA
16
+ assert_in_delta 1.609344, 1.0.miles.to(:kilometres), DELTA
17
+ assert_in_delta 0.45359237, 1.pounds.to(:kilograms), DELTA
18
+ assert_in_delta 0.00110231131092439, 1.kilograms.to(:tons), DELTA
19
+ assert_in_delta 2.20462262184878, 1.kilograms.to(:pounds), DELTA
20
+ assert_in_delta 1, ( 1.kilograms.to(:pounds) * 1.pounds.to(:kilograms) ), DELTA
21
+ end
22
+
23
+ def test_register
24
+ Conversions.register(:dollars, :cents, 100.0)
25
+ assert_in_delta 1000.0, 10.convert(:dollars, :cents), DELTA
26
+ assert_in_delta 1000.0, 10.dollars.to(:cents), DELTA
27
+ end
28
+ end
data/test/test_helper.rb CHANGED
@@ -1,10 +1,16 @@
1
- require 'rubygems'
2
1
  require 'test/unit'
3
- require 'shoulda'
4
2
 
5
- $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
6
- $LOAD_PATH.unshift(File.dirname(__FILE__))
3
+ if not defined?(ActiveRecord)
4
+ require 'rubygems'
5
+ require 'active_record'
6
+ end
7
+
8
+ $:.unshift File.dirname(__FILE__) + '/../lib'
7
9
  require 'conversions'
8
10
 
9
- class Test::Unit::TestCase
11
+ def reset_defaults
12
+ Conversions.clear
13
+ Conversions.load_defaults
10
14
  end
15
+
16
+ DELTA = 0.0000001
data/test/unit_test.rb ADDED
@@ -0,0 +1,63 @@
1
+ require File.dirname(__FILE__) + '/test_helper'
2
+
3
+ class UnitTest < Test::Unit::TestCase
4
+ def setup
5
+ reset_defaults
6
+ end
7
+
8
+ def test_exchange_rate
9
+ assert_in_delta 1.609344, Conversions::Unit.exchange_rate(:miles, :kilometres), DELTA
10
+ assert_in_delta 0.621371192237334, Conversions::Unit.exchange_rate(:kilometres, :miles), DELTA
11
+ assert_raises(ArgumentError) { Conversions::Unit.exchange_rate(:unknown, :miles) }
12
+ assert_raises(ArgumentError) { Conversions::Unit.exchange_rate(:miles, :unknown) }
13
+ assert_raises(ArgumentError) { Conversions::Unit.exchange_rate(nil, :miles) }
14
+ assert_raises(ArgumentError) { Conversions::Unit.exchange_rate(:miles, nil) }
15
+ end
16
+
17
+ def test_exchange_rate_for_identity_transform
18
+ Conversions.conversions.keys.each do |unit|
19
+ assert_equal 1, Conversions::Unit.exchange_rate(unit, unit)
20
+ end
21
+ end
22
+
23
+ def test_to
24
+ amount = Conversions::Unit.new(10.0, :miles)
25
+ assert_in_delta 16.09344, amount.to(:kilometres), DELTA
26
+
27
+ amount = Conversions::Unit.new(10.0, :kilograms)
28
+ assert_in_delta 22.0462262184878, amount.to(:pounds), DELTA
29
+ end
30
+
31
+ def test_to_with_options
32
+ amount = Conversions::Unit.new(10.0, :miles)
33
+ assert_equal 16.1, amount.to(:kilometres, :scale => 1)
34
+ assert_equal 16.09, amount.to(:kilometres, :scale => 2)
35
+ assert_equal 16.093, amount.to(:kilometres, :scale => 3)
36
+ end
37
+
38
+ def test_to_with_scale
39
+ amount = Conversions::Unit.new(10.0, :miles)
40
+ assert_equal 16.1, amount.to(:kilometres, 1)
41
+ assert_equal 16.09, amount.to(:kilometres, 2)
42
+ assert_equal 16.093, amount.to(:kilometres, 3)
43
+ end
44
+
45
+ def test_identity_transforms
46
+ Conversions.conversions.keys.each do |unit|
47
+ assert_equal 1.0, Conversions::Unit.new(1.0, unit).to(unit, :scale => 2)
48
+ end
49
+ end
50
+
51
+ def test_to_f_and_to_i
52
+ amount = Conversions::Unit.new(10.5, :miles)
53
+ assert_equal 10, amount.to_i
54
+ assert_equal 10.5, amount.to_f
55
+ end
56
+
57
+ def test_register
58
+ Conversions.register(:dollars, :cents, 100.0)
59
+ assert_in_delta 0.01, Conversions::Unit.exchange_rate(:cents, :dollars), DELTA
60
+ amount = Conversions::Unit.new(10.0, :dollars)
61
+ assert_equal 1000.0, amount.to(:cents, :scale => 2), DELTA
62
+ end
63
+ end
metadata CHANGED
@@ -1,53 +1,56 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: conversions
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 1.4.3
5
5
  platform: ruby
6
6
  authors:
7
- - simplificator
7
+ - Manfred Stienstra
8
+ - Seamus Abshere
8
9
  autorequire:
9
10
  bindir: bin
10
11
  cert_chain: []
11
12
 
12
- date: 2009-10-28 00:00:00 +01:00
13
+ date: 2009-11-02 00:00:00 -05:00
13
14
  default_executable:
14
- dependencies:
15
- - !ruby/object:Gem::Dependency
16
- name: thoughtbot-shoulda
17
- type: :development
18
- version_requirement:
19
- version_requirements: !ruby/object:Gem::Requirement
20
- requirements:
21
- - - ">="
22
- - !ruby/object:Gem::Version
23
- version: "0"
24
- version:
25
- description: adds conversion methods to numbers
26
- email: pascal.betz@simplificator.com
15
+ dependencies: []
16
+
17
+ description: A Ruby on Rails plugin that adds conversion capabilities to numeric objects
18
+ email: seamus@abshere.net
27
19
  executables: []
28
20
 
29
21
  extensions: []
30
22
 
31
23
  extra_rdoc_files:
32
24
  - LICENSE
33
- - README.rdoc
25
+ - README
34
26
  files:
35
- - .document
36
27
  - .gitignore
37
28
  - LICENSE
38
- - README.rdoc
29
+ - README
39
30
  - Rakefile
40
- - VERSION
31
+ - TODO
32
+ - VERSION.yml
33
+ - conversions.gemspec
34
+ - init.rb
41
35
  - lib/conversions.rb
36
+ - lib/conversions/active_record_accessors.rb
37
+ - lib/conversions/defaults.rb
38
+ - lib/conversions/unit.rb
39
+ - rails/init.rb
40
+ - test/accessor_test.rb
42
41
  - test/conversions_test.rb
42
+ - test/ext_test.rb
43
43
  - test/test_helper.rb
44
+ - test/unit_test.rb
44
45
  has_rdoc: true
45
- homepage: http://github.com/simplficator/conversions
46
+ homepage: http://github.com/seamusabshere/conversions
46
47
  licenses: []
47
48
 
48
49
  post_install_message:
49
50
  rdoc_options:
50
51
  - --charset=UTF-8
52
+ - --line-numbers
53
+ - --inline-source
51
54
  require_paths:
52
55
  - lib
53
56
  required_ruby_version: !ruby/object:Gem::Requirement
@@ -64,11 +67,14 @@ required_rubygems_version: !ruby/object:Gem::Requirement
64
67
  version:
65
68
  requirements: []
66
69
 
67
- rubyforge_project:
70
+ rubyforge_project: conversions
68
71
  rubygems_version: 1.3.5
69
72
  signing_key:
70
73
  specification_version: 3
71
- summary: adds conversion methods to numbers
74
+ summary: A Ruby on Rails plugin that adds conversion capabilities to numeric objects
72
75
  test_files:
76
+ - test/accessor_test.rb
73
77
  - test/conversions_test.rb
78
+ - test/ext_test.rb
74
79
  - test/test_helper.rb
80
+ - test/unit_test.rb
data/.document DELETED
@@ -1,5 +0,0 @@
1
- README.rdoc
2
- lib/**/*.rb
3
- bin/*
4
- features/**/*.feature
5
- LICENSE
data/README.rdoc DELETED
@@ -1,18 +0,0 @@
1
- = conversions
2
-
3
- Description goes here.
4
-
5
- == Note on Patches/Pull Requests
6
-
7
- * Fork the project.
8
- * Make your feature addition or bug fix.
9
- * Add tests for it. This is important so I don't break it in a
10
- future version unintentionally.
11
- * Commit, do not mess with rakefile, version, or history.
12
- (if you want to have your own version, that is fine but
13
- bump version in a commit by itself I can ignore when I pull)
14
- * Send me a pull request. Bonus points for topic branches.
15
-
16
- == Copyright
17
-
18
- Copyright (c) 2009 simplificator. See LICENSE for details.
data/VERSION DELETED
@@ -1 +0,0 @@
1
- 0.1.0