m9t 0.3.4 → 0.3.5
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +6 -0
- data/.rspec +3 -0
- data/.travis.yml +11 -0
- data/Rakefile +0 -10
- data/lib/m9t.rb +4 -21
- data/lib/m9t/base.rb +19 -15
- data/lib/m9t/direction.rb +5 -10
- data/lib/m9t/distance.rb +8 -10
- data/lib/m9t/errors.rb +7 -0
- data/lib/m9t/i18n.rb +6 -2
- data/lib/m9t/pressure.rb +6 -11
- data/lib/m9t/speed.rb +11 -13
- data/lib/m9t/temperature.rb +12 -17
- data/lib/m9t/version.rb +1 -4
- data/m9t.gemspec +5 -12
- data/spec/spec_helper.rb +3 -9
- data/spec/unit/base_spec.rb +34 -7
- data/spec/unit/direction_spec.rb +5 -5
- data/spec/unit/distance_spec.rb +11 -11
- data/spec/unit/i18n_spec.rb +2 -2
- data/spec/unit/pressure_spec.rb +1 -1
- data/spec/unit/speed_spec.rb +6 -6
- data/spec/unit/temperature_spec.rb +44 -29
- metadata +20 -8
data/.gitignore
ADDED
data/.rspec
ADDED
data/.travis.yml
ADDED
data/Rakefile
CHANGED
@@ -1,6 +1,5 @@
|
|
1
1
|
#!/usr/bin/env rake
|
2
2
|
require 'bundler/gem_tasks'
|
3
|
-
require 'rcov/rcovtask' if RUBY_VERSION < '1.9'
|
4
3
|
require 'rspec/core/rake_task'
|
5
4
|
|
6
5
|
task :default => :spec
|
@@ -8,12 +7,3 @@ task :default => :spec
|
|
8
7
|
RSpec::Core::RakeTask.new do |t|
|
9
8
|
t.pattern = 'spec/**/*_spec.rb'
|
10
9
|
end
|
11
|
-
|
12
|
-
if RUBY_VERSION < '1.9'
|
13
|
-
RSpec::Core::RakeTask.new('spec:rcov') do |t|
|
14
|
-
t.pattern = 'spec/**/*_spec.rb'
|
15
|
-
t.rcov = true
|
16
|
-
t.rcov_opts = ['--exclude', 'spec/,/gems/']
|
17
|
-
end
|
18
|
-
end
|
19
|
-
|
data/lib/m9t.rb
CHANGED
@@ -22,26 +22,9 @@
|
|
22
22
|
#++
|
23
23
|
|
24
24
|
# encoding: utf-8
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
I18n.load_path += Dir.glob("#{ locales_path }/*.yml")
|
29
|
-
I18n.reload!
|
30
|
-
|
31
|
-
libs = %w( base direction distance i18n pressure speed temperature version )
|
32
|
-
libs.each do | library |
|
33
|
-
require "m9t/#{ library }"
|
34
|
-
end
|
35
|
-
|
36
|
-
module M9t
|
37
|
-
|
38
|
-
# Base class for all M9t exceptions
|
39
|
-
class M9tError < StandardError
|
40
|
-
end
|
41
|
-
|
42
|
-
# Raised when a M9t class receives an unrecogized ':units' value
|
43
|
-
class UnitError < M9tError
|
44
|
-
end
|
45
|
-
|
25
|
+
libs = %w(i18n base direction distance pressure speed temperature version)
|
26
|
+
libs.each do |library|
|
27
|
+
require "m9t/#{library}"
|
46
28
|
end
|
47
29
|
|
30
|
+
module M9t; end
|
data/lib/m9t/base.rb
CHANGED
@@ -1,5 +1,6 @@
|
|
1
1
|
# encoding: utf-8
|
2
|
-
require '
|
2
|
+
require 'm9t/errors'
|
3
|
+
require 'm9t/i18n'
|
3
4
|
|
4
5
|
module M9t
|
5
6
|
module Base
|
@@ -31,7 +32,6 @@ module M9t
|
|
31
32
|
return true if legal_conversion?(from, to)
|
32
33
|
end
|
33
34
|
return legal_constructor?(name)
|
34
|
-
super
|
35
35
|
end
|
36
36
|
|
37
37
|
private
|
@@ -50,7 +50,7 @@ module M9t
|
|
50
50
|
|
51
51
|
def define_conversion(from, to)
|
52
52
|
self.class.instance_exec do
|
53
|
-
define_method("#{
|
53
|
+
define_method("#{from}_to_#{to}") do |value|
|
54
54
|
convert(from.to_sym, to.to_sym, value)
|
55
55
|
end
|
56
56
|
end
|
@@ -64,8 +64,8 @@ module M9t
|
|
64
64
|
# from the unit and returns an instance
|
65
65
|
def define_constructor(name)
|
66
66
|
self.class.instance_exec do
|
67
|
-
define_method(
|
68
|
-
new(
|
67
|
+
define_method(name.to_sym) do | *args |
|
68
|
+
new(args[0].to_f / self::CONVERSIONS[name])
|
69
69
|
end
|
70
70
|
end
|
71
71
|
end
|
@@ -114,7 +114,7 @@ module M9t
|
|
114
114
|
attr_reader :value, :options
|
115
115
|
alias :to_f :value
|
116
116
|
|
117
|
-
def initialize(
|
117
|
+
def initialize(value)
|
118
118
|
@value = value.to_f
|
119
119
|
end
|
120
120
|
|
@@ -136,23 +136,28 @@ module M9t
|
|
136
136
|
|
137
137
|
# Returns the string representation of the measurement,
|
138
138
|
# taking into account locale, desired units and abbreviation.
|
139
|
-
def to_s(
|
140
|
-
options = self.class.options.merge(
|
141
|
-
|
142
|
-
|
143
|
-
|
139
|
+
def to_s(options = {})
|
140
|
+
options = self.class.options.merge(options)
|
141
|
+
if not self.class::CONVERSIONS.has_key?(options[:units])
|
142
|
+
units_error(options[:units])
|
143
|
+
end
|
144
|
+
value_in_units = self.send("to_#{options[:units]}")
|
145
|
+
localized_value = I18n.localize_float(
|
146
|
+
value_in_units, {format: "%0.#{options[:precision]}f"}
|
147
|
+
)
|
144
148
|
|
145
149
|
key = 'units.' + self.class.measurement_name + '.' + options[:units].to_s
|
146
150
|
options[:abbreviated] ? key += '.abbreviated' : key += '.full'
|
147
|
-
unit = I18n.t(key, {:
|
151
|
+
unit = I18n.t(key, {count: value_in_units})
|
148
152
|
|
149
|
-
"#{
|
153
|
+
"#{localized_value}%s#{unit}" % (options[:abbreviated] ? '' : ' ')
|
150
154
|
end
|
151
155
|
|
152
156
|
private
|
153
157
|
|
154
158
|
def units_error(units)
|
155
|
-
|
159
|
+
known = self.class::CONVERSIONS.keys.collect{|unit| unit.to_s}.join(', ')
|
160
|
+
raise M9t::UnitError.new("Unknown units '#{units}'. Known: #{known}")
|
156
161
|
end
|
157
162
|
|
158
163
|
def extract_to(name)
|
@@ -176,4 +181,3 @@ module M9t
|
|
176
181
|
end
|
177
182
|
end
|
178
183
|
end
|
179
|
-
|
data/lib/m9t/direction.rb
CHANGED
@@ -1,14 +1,13 @@
|
|
1
1
|
# encoding: utf-8
|
2
|
-
require '
|
2
|
+
require 'm9t/base'
|
3
3
|
|
4
4
|
module M9t
|
5
|
-
|
6
5
|
# Represents a geographical direction
|
7
6
|
class Direction
|
8
|
-
DEFAULT_OPTIONS = {:
|
7
|
+
DEFAULT_OPTIONS = {units: :degrees, abbreviated: false, decimals: 5}
|
9
8
|
CONVERSIONS = {
|
10
|
-
:
|
11
|
-
:
|
9
|
+
degrees: 1.0,
|
10
|
+
compass: nil,
|
12
11
|
}
|
13
12
|
|
14
13
|
# Conversions
|
@@ -18,7 +17,6 @@ module M9t
|
|
18
17
|
include M9t::Base
|
19
18
|
|
20
19
|
class << self
|
21
|
-
|
22
20
|
# Given a value in degrees, returns the nearest (localized) compass direction
|
23
21
|
# M9t::Directions.to_compass(42) => 'NE'
|
24
22
|
def degrees_to_compass(degrees)
|
@@ -34,7 +32,7 @@ module M9t
|
|
34
32
|
# M9t::Direction.compass('NE') => #<M9t::Direction:0xb76cc750 @value=45.0, @options={:units=>:degrees, :decimals=>5, :abbreviated=>false}>
|
35
33
|
def compass(compass_direction)
|
36
34
|
sector = I18n.t(self.measurement_name + '.sectors').find_index(compass_direction)
|
37
|
-
raise "Compass direction '#{
|
35
|
+
raise "Compass direction '#{compass_direction}' not recognised" if sector.nil?
|
38
36
|
new(sector.to_f * COMPASS_SECTOR_DEGREES)
|
39
37
|
end
|
40
38
|
|
@@ -50,7 +48,6 @@ module M9t
|
|
50
48
|
degrees
|
51
49
|
end
|
52
50
|
end
|
53
|
-
|
54
51
|
end
|
55
52
|
|
56
53
|
# Handles the special case where compass directions are the desired output.
|
@@ -65,7 +62,5 @@ module M9t
|
|
65
62
|
def to_compass
|
66
63
|
self.class.degrees_to_compass(@value)
|
67
64
|
end
|
68
|
-
|
69
65
|
end
|
70
|
-
|
71
66
|
end
|
data/lib/m9t/distance.rb
CHANGED
@@ -1,23 +1,21 @@
|
|
1
1
|
# encoding: utf-8
|
2
|
-
require 'i18n'
|
3
2
|
require 'm9t/base'
|
4
3
|
|
5
4
|
module M9t
|
6
|
-
|
7
5
|
# Represents a distance
|
8
6
|
class Distance
|
9
|
-
DEFAULT_OPTIONS
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
:
|
14
|
-
:
|
7
|
+
DEFAULT_OPTIONS = {
|
8
|
+
units: :meters, abbreviated: false, precision: 5
|
9
|
+
}
|
10
|
+
CONVERSIONS = {
|
11
|
+
meters: 1.0,
|
12
|
+
kilometers: 1.0 / 1000.0,
|
13
|
+
feet: 1.0 / 0.3048,
|
14
|
+
miles: 1.0 / 1609.344
|
15
15
|
}
|
16
16
|
|
17
17
|
include M9t::Base
|
18
18
|
|
19
19
|
alias :to_meters :value
|
20
|
-
|
21
20
|
end
|
22
|
-
|
23
21
|
end
|
data/lib/m9t/errors.rb
ADDED
data/lib/m9t/i18n.rb
CHANGED
@@ -1,9 +1,14 @@
|
|
1
1
|
# encoding: utf-8
|
2
2
|
require 'i18n'
|
3
3
|
|
4
|
+
locales_path = File.expand_path(
|
5
|
+
File.join('..', '..', 'locales'), File.dirname(__FILE__)
|
6
|
+
)
|
7
|
+
I18n.load_path += Dir.glob("#{ locales_path }/*.yml")
|
8
|
+
I18n.reload!
|
9
|
+
|
4
10
|
# Monkey patch I18n
|
5
11
|
module I18n
|
6
|
-
|
7
12
|
# Handle non-English numerical separators
|
8
13
|
# with I18n.locale = :it,
|
9
14
|
# I18n.localize_float(5.23) => '5,23000'
|
@@ -22,4 +27,3 @@ module I18n
|
|
22
27
|
integers + decimal_separator + decimal
|
23
28
|
end
|
24
29
|
end
|
25
|
-
|
data/lib/m9t/pressure.rb
CHANGED
@@ -1,23 +1,18 @@
|
|
1
1
|
# encoding: utf-8
|
2
|
-
require 'i18n'
|
3
2
|
require 'm9t/base'
|
4
3
|
|
5
4
|
module M9t
|
6
|
-
|
7
5
|
# Represents atmospheric (or other) pressure
|
8
6
|
class Pressure
|
9
|
-
DEFAULT_OPTIONS = {:
|
7
|
+
DEFAULT_OPTIONS = {units: :bar, abbreviated: false, precision: 5}
|
10
8
|
CONVERSIONS = {
|
11
|
-
:
|
12
|
-
:
|
13
|
-
:
|
14
|
-
:
|
15
|
-
:
|
9
|
+
bar: 1.0,
|
10
|
+
pascals: 1.0 / 0.00001,
|
11
|
+
hectopascals: 1.0 / 0.001,
|
12
|
+
kilopascals: 1.0 / 0.01,
|
13
|
+
inches_of_mercury: 1.0 / (3386.389 * 0.00001)
|
16
14
|
}
|
17
15
|
|
18
16
|
include M9t::Base
|
19
|
-
|
20
17
|
end
|
21
|
-
|
22
18
|
end
|
23
|
-
|
data/lib/m9t/speed.rb
CHANGED
@@ -1,28 +1,26 @@
|
|
1
1
|
# encoding: utf-8
|
2
|
-
require '
|
2
|
+
require 'm9t/base'
|
3
3
|
require 'm9t/distance'
|
4
4
|
|
5
5
|
module M9t
|
6
|
-
|
7
6
|
# Represents a speed
|
8
7
|
class Speed
|
9
|
-
DEFAULT_OPTIONS = {
|
8
|
+
DEFAULT_OPTIONS = {
|
9
|
+
units: :meters_per_second, abbreviated: false, precision: 5
|
10
|
+
}
|
10
11
|
SECONDS_PER_HOUR = 60.0 * 60
|
11
|
-
KMH
|
12
|
-
MPH
|
13
|
-
KNOTS
|
12
|
+
KMH = M9t::Distance::CONVERSIONS[:kilometers] * SECONDS_PER_HOUR
|
13
|
+
MPH = M9t::Distance::CONVERSIONS[:miles] * SECONDS_PER_HOUR
|
14
|
+
KNOTS = KMH / 1.852
|
14
15
|
CONVERSIONS = {
|
15
|
-
:
|
16
|
-
:
|
17
|
-
:
|
18
|
-
:
|
16
|
+
meters_per_second: 1.0,
|
17
|
+
kilometers_per_hour: KMH,
|
18
|
+
miles_per_hour: MPH,
|
19
|
+
knots: KNOTS
|
19
20
|
}
|
20
21
|
|
21
22
|
include M9t::Base
|
22
23
|
|
23
24
|
alias :to_meters_per_second :value
|
24
|
-
|
25
25
|
end
|
26
|
-
|
27
26
|
end
|
28
|
-
|
data/lib/m9t/temperature.rb
CHANGED
@@ -1,17 +1,17 @@
|
|
1
1
|
# encoding: utf-8
|
2
|
-
require 'i18n'
|
3
2
|
require 'm9t/base'
|
4
3
|
|
5
4
|
module M9t
|
6
|
-
|
7
5
|
# Represents a temperature
|
8
6
|
# Using degrees (celcius), not kelvin, as default unit
|
9
7
|
class Temperature
|
10
|
-
DEFAULT_OPTIONS
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
:
|
8
|
+
DEFAULT_OPTIONS = {
|
9
|
+
units: :degrees, abbreviated: false, precision: 5
|
10
|
+
}
|
11
|
+
CONVERSIONS = {
|
12
|
+
degrees: 1.0,
|
13
|
+
kelvin: nil,
|
14
|
+
fahrenheit: nil
|
15
15
|
}
|
16
16
|
|
17
17
|
# Conversions
|
@@ -20,14 +20,13 @@ module M9t
|
|
20
20
|
include M9t::Base
|
21
21
|
|
22
22
|
class << self
|
23
|
-
|
24
23
|
# Accepts a value in kelvin and returns the equivalent M9t::Temperature
|
25
|
-
def kelvin(
|
26
|
-
new(
|
24
|
+
def kelvin(kelvin)
|
25
|
+
new(kelvin.to_f + ABSOLUTE_ZERO)
|
27
26
|
end
|
28
27
|
|
29
|
-
def fahrenheit(
|
30
|
-
new(
|
28
|
+
def fahrenheit(fahrenheit)
|
29
|
+
new(fahrenheit_to_degrees(fahrenheit))
|
31
30
|
end
|
32
31
|
|
33
32
|
# Converts degrees to kelvin
|
@@ -47,9 +46,8 @@ module M9t
|
|
47
46
|
|
48
47
|
# Converts Fahrenheit to degrees
|
49
48
|
def fahrenheit_to_degrees(fahrenheit)
|
50
|
-
fahrenheit.to_f - 32 * 5.0 / 9.0
|
49
|
+
(fahrenheit.to_f - 32) * 5.0 / 9.0
|
51
50
|
end
|
52
|
-
|
53
51
|
end
|
54
52
|
|
55
53
|
alias :to_degrees :value
|
@@ -62,8 +60,5 @@ module M9t
|
|
62
60
|
def to_fahrenheit
|
63
61
|
self.class.to_fahrenheit(@value)
|
64
62
|
end
|
65
|
-
|
66
63
|
end
|
67
|
-
|
68
64
|
end
|
69
|
-
|
data/lib/m9t/version.rb
CHANGED
data/m9t.gemspec
CHANGED
@@ -1,5 +1,5 @@
|
|
1
1
|
# -*- encoding: utf-8 -*-
|
2
|
-
|
2
|
+
$LOAD_PATH.unshift(File.expand_path('../lib', __FILE__))
|
3
3
|
require 'm9t/version'
|
4
4
|
|
5
5
|
gemspec = Gem::Specification.new do |s|
|
@@ -14,8 +14,8 @@ gemspec = Gem::Specification.new do |s|
|
|
14
14
|
s.author = 'Joe Yates'
|
15
15
|
s.email = 'joe.g.yates@gmail.com'
|
16
16
|
|
17
|
-
s.files = `git ls-files`.lines.map(
|
18
|
-
s.test_files = `git ls-files`.lines.map(
|
17
|
+
s.files = `git ls-files`.lines.map(&:chomp!)
|
18
|
+
s.test_files = `git ls-files spec`.lines.map(&:chomp!)
|
19
19
|
s.require_paths = ['lib']
|
20
20
|
|
21
21
|
s.rubyforge_project = 'nowarning'
|
@@ -23,13 +23,6 @@ gemspec = Gem::Specification.new do |s|
|
|
23
23
|
s.add_dependency 'rake'
|
24
24
|
s.add_dependency 'i18n', '>= 0.3.5'
|
25
25
|
|
26
|
-
s.add_development_dependency 'rspec'
|
27
|
-
if
|
28
|
-
if RUBY_PLATFORM != 'java'
|
29
|
-
s.add_development_dependency 'rcov'
|
30
|
-
end
|
31
|
-
else
|
32
|
-
s.add_development_dependency 'simplecov'
|
33
|
-
end
|
26
|
+
s.add_development_dependency 'rspec', '>= 3.0.0'
|
27
|
+
s.add_development_dependency 'simplecov' if RUBY_PLATFORM != 'java'
|
34
28
|
end
|
35
|
-
|
data/spec/spec_helper.rb
CHANGED
@@ -1,23 +1,17 @@
|
|
1
|
-
# See http://rubydoc.info/gems/rspec-core/RSpec/Core/Configuration
|
2
1
|
require 'rspec'
|
3
|
-
require 'rspec/autorun'
|
4
2
|
|
5
|
-
if
|
3
|
+
if RUBY_PLATFORM != 'java'
|
6
4
|
require 'simplecov'
|
7
|
-
|
8
|
-
|
9
|
-
add_filter '/spec/'
|
10
|
-
end
|
5
|
+
SimpleCov.start do
|
6
|
+
add_filter '/spec/'
|
11
7
|
end
|
12
8
|
end
|
13
9
|
|
14
10
|
require 'm9t'
|
15
11
|
|
16
12
|
RSpec.configure do |config|
|
17
|
-
config.treat_symbols_as_metadata_keys_with_true_values = true
|
18
13
|
config.run_all_when_everything_filtered = true
|
19
14
|
config.filter_run :focus
|
20
15
|
|
21
16
|
config.order = 'random'
|
22
17
|
end
|
23
|
-
|
data/spec/unit/base_spec.rb
CHANGED
@@ -1,15 +1,15 @@
|
|
1
1
|
# encoding: utf-8
|
2
|
-
require '
|
2
|
+
require 'm9t/base'
|
3
3
|
|
4
4
|
class SomeMeasurement
|
5
5
|
DEFAULT_OPTIONS = {
|
6
|
-
:
|
7
|
-
:
|
8
|
-
:
|
6
|
+
units: :foos,
|
7
|
+
abbreviated: false,
|
8
|
+
decimals: 1
|
9
9
|
}
|
10
10
|
CONVERSIONS = {
|
11
|
-
:
|
12
|
-
:
|
11
|
+
foos: 1.0,
|
12
|
+
bars: 1 / 42.0
|
13
13
|
}
|
14
14
|
|
15
15
|
include M9t::Base
|
@@ -18,6 +18,16 @@ end
|
|
18
18
|
class SomeDerivedMeasurement < SomeMeasurement; end
|
19
19
|
|
20
20
|
describe M9t::Base do
|
21
|
+
describe '.respond_to?' do
|
22
|
+
it 'is true for conversion between known units' do
|
23
|
+
expect(SomeMeasurement.respond_to?(:foos_to_bars)).to be_truthy
|
24
|
+
end
|
25
|
+
|
26
|
+
it 'is false for unknown units' do
|
27
|
+
expect(SomeMeasurement.respond_to?(:bazs_to_bars)).to be_falsey
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
21
31
|
describe '.method_missing' do
|
22
32
|
it 'handles conversion between known units' do
|
23
33
|
expect(SomeMeasurement.foos_to_bars(3.0)).to be_a(Float)
|
@@ -30,6 +40,24 @@ describe M9t::Base do
|
|
30
40
|
end
|
31
41
|
end
|
32
42
|
|
43
|
+
describe '#respond_to?' do
|
44
|
+
subject { SomeMeasurement.new(3.0) }
|
45
|
+
|
46
|
+
it 'is true for conversion to known units' do
|
47
|
+
expect(subject.respond_to?(:to_bars)).to be_truthy
|
48
|
+
end
|
49
|
+
|
50
|
+
it 'is false for unknown units' do
|
51
|
+
expect(subject.respond_to?(:to_bazs)).to be_falsey
|
52
|
+
end
|
53
|
+
|
54
|
+
context 'for unrecognized calls' do
|
55
|
+
it 'calls super' do
|
56
|
+
expect(subject.respond_to?(:ciao)).to be_falsey
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
33
61
|
describe '#method_missing' do
|
34
62
|
subject { SomeMeasurement.new(3.0) }
|
35
63
|
|
@@ -50,4 +78,3 @@ describe M9t::Base do
|
|
50
78
|
end
|
51
79
|
end
|
52
80
|
end
|
53
|
-
|
data/spec/unit/direction_spec.rb
CHANGED
@@ -1,5 +1,5 @@
|
|
1
1
|
# encoding: utf-8
|
2
|
-
require '
|
2
|
+
require 'm9t/direction'
|
3
3
|
|
4
4
|
describe M9t::Direction do
|
5
5
|
before do
|
@@ -19,7 +19,7 @@ describe M9t::Direction do
|
|
19
19
|
|
20
20
|
context 'abbreviated' do
|
21
21
|
it 'is false' do
|
22
|
-
expect(M9t::Direction.options[:abbreviated]).to
|
22
|
+
expect(M9t::Direction.options[:abbreviated]).to be_falsey
|
23
23
|
end
|
24
24
|
end
|
25
25
|
|
@@ -156,7 +156,7 @@ describe M9t::Direction do
|
|
156
156
|
subject { M9t::Direction.new(135) }
|
157
157
|
|
158
158
|
it 'uses the symbol' do
|
159
|
-
expect(subject.to_s(:
|
159
|
+
expect(subject.to_s(abbreviated: true)).to eq('135°')
|
160
160
|
end
|
161
161
|
end
|
162
162
|
|
@@ -164,12 +164,12 @@ describe M9t::Direction do
|
|
164
164
|
subject { M9t::Direction.new(225) }
|
165
165
|
|
166
166
|
it 'works' do
|
167
|
-
expect(subject.to_s(:
|
167
|
+
expect(subject.to_s(units: :compass)).to eq('SW')
|
168
168
|
end
|
169
169
|
|
170
170
|
it 'translates' do
|
171
171
|
I18n.locale = :it
|
172
|
-
expect(subject.to_s(:
|
172
|
+
expect(subject.to_s(units: :compass)).to eq('SO')
|
173
173
|
end
|
174
174
|
end
|
175
175
|
end
|
data/spec/unit/distance_spec.rb
CHANGED
@@ -1,5 +1,5 @@
|
|
1
1
|
# encoding: utf-8
|
2
|
-
require '
|
2
|
+
require 'm9t/distance'
|
3
3
|
|
4
4
|
describe M9t::Distance do
|
5
5
|
context 'class methods' do
|
@@ -13,7 +13,7 @@ describe M9t::Distance do
|
|
13
13
|
end
|
14
14
|
|
15
15
|
it 'not abbreviated' do
|
16
|
-
expect(M9t::Distance.options[:abbreviated]).to
|
16
|
+
expect(M9t::Distance.options[:abbreviated]).to be_falsey
|
17
17
|
end
|
18
18
|
|
19
19
|
it 'units: meters' do
|
@@ -76,32 +76,32 @@ describe M9t::Distance do
|
|
76
76
|
|
77
77
|
it 'handles singluar' do
|
78
78
|
distance = M9t::Distance.new(1)
|
79
|
-
expect(distance.to_s(:
|
79
|
+
expect(distance.to_s(precision: 0)).to eq('1 meter')
|
80
80
|
end
|
81
81
|
|
82
82
|
it 'handles plural' do
|
83
83
|
distance = M9t::Distance.new(10)
|
84
|
-
expect(distance.to_s(:
|
84
|
+
expect(distance.to_s(precision: 0)).to eq('10 meters')
|
85
85
|
end
|
86
86
|
|
87
87
|
it 'handles abbreviation' do
|
88
88
|
distance = M9t::Distance.new(0.3)
|
89
|
-
expect(distance.to_s(:
|
89
|
+
expect(distance.to_s(abbreviated: true)).to eq('0.30000m')
|
90
90
|
end
|
91
91
|
|
92
92
|
specify 'units: kilometers' do
|
93
93
|
distance = M9t::Distance.new( 156003 )
|
94
|
-
expect(distance.to_s(:
|
94
|
+
expect(distance.to_s(precision: 1, units: :kilometers)).to eq('156.0 kilometers')
|
95
95
|
end
|
96
96
|
|
97
97
|
specify 'units: miles, singular' do
|
98
98
|
marathon = M9t::Distance.miles(26.21875)
|
99
|
-
expect(marathon.to_s(:
|
99
|
+
expect(marathon.to_s(units: :miles, precision: 0)).to eq('26 miles')
|
100
100
|
end
|
101
101
|
|
102
102
|
specify 'units: miles, plural' do
|
103
103
|
ten_km = M9t::Distance.new(10000)
|
104
|
-
expect(ten_km.to_s(:
|
104
|
+
expect(ten_km.to_s(units: :miles, precision: 1)).to eq('6.2 miles')
|
105
105
|
end
|
106
106
|
|
107
107
|
context 'i18n' do
|
@@ -111,17 +111,17 @@ describe M9t::Distance do
|
|
111
111
|
|
112
112
|
specify 'precision: 0' do
|
113
113
|
distance = M9t::Distance.new(10)
|
114
|
-
expect(distance.to_s(:
|
114
|
+
expect(distance.to_s(precision: 0)).to eq('10 metri')
|
115
115
|
end
|
116
116
|
|
117
117
|
specify 'units: miles' do
|
118
118
|
marathon = M9t::Distance.miles(26.21875)
|
119
|
-
expect(marathon.to_s(:
|
119
|
+
expect(marathon.to_s(units: :miles, precision: 0)).to eq('26 miglia')
|
120
120
|
end
|
121
121
|
|
122
122
|
specify 'units: miles, precision: 1' do
|
123
123
|
ten_km = M9t::Distance.new(10000)
|
124
|
-
expect(ten_km.to_s(:
|
124
|
+
expect(ten_km.to_s(units: :miles, precision: 1)).to eq('6,2 miglia')
|
125
125
|
end
|
126
126
|
end
|
127
127
|
end
|
data/spec/unit/i18n_spec.rb
CHANGED
@@ -1,5 +1,5 @@
|
|
1
1
|
# encoding: utf-8
|
2
|
-
require '
|
2
|
+
require 'm9t/i18n'
|
3
3
|
|
4
4
|
describe I18n do
|
5
5
|
before do
|
@@ -49,7 +49,7 @@ describe I18n do
|
|
49
49
|
|
50
50
|
it 'accepts a format indicator' do
|
51
51
|
I18n.locale = :en
|
52
|
-
expect(I18n.localize_float(1.5, {:
|
52
|
+
expect(I18n.localize_float(1.5, {format: '%0.1f'})).to eq('1.5')
|
53
53
|
end
|
54
54
|
end
|
55
55
|
end
|
data/spec/unit/pressure_spec.rb
CHANGED
data/spec/unit/speed_spec.rb
CHANGED
@@ -1,5 +1,5 @@
|
|
1
1
|
# encoding: utf-8
|
2
|
-
require '
|
2
|
+
require 'm9t/speed'
|
3
3
|
|
4
4
|
describe M9t::Speed do
|
5
5
|
context 'conversion constants' do
|
@@ -12,7 +12,7 @@ describe M9t::Speed do
|
|
12
12
|
it 'gives an error for unknown units' do
|
13
13
|
speed = M9t::Speed.new(10)
|
14
14
|
expect {
|
15
|
-
speed.to_s(
|
15
|
+
speed.to_s(units: :foos)
|
16
16
|
}.to raise_error(M9t::UnitError)
|
17
17
|
end
|
18
18
|
end
|
@@ -83,21 +83,21 @@ describe M9t::Speed do
|
|
83
83
|
|
84
84
|
specify 'precision' do
|
85
85
|
I18n.locale = :en
|
86
|
-
expect(subject.to_s(:
|
86
|
+
expect(subject.to_s(precision: 0)).to eq('135 meters per second')
|
87
87
|
end
|
88
88
|
|
89
89
|
specify 'abbreviated' do
|
90
|
-
expect(subject.to_s(:
|
90
|
+
expect(subject.to_s(abbreviated: true, precision: 0)).to eq('135m/s')
|
91
91
|
end
|
92
92
|
|
93
93
|
specify 'units: knots, en' do
|
94
94
|
I18n.locale = :en
|
95
|
-
expect(subject.to_s(:
|
95
|
+
expect(subject.to_s(units: :knots, precision: 0)).to eq('262 knots')
|
96
96
|
end
|
97
97
|
|
98
98
|
specify 'units: knots, it' do
|
99
99
|
I18n.locale = :it
|
100
|
-
expect(subject.to_s(:
|
100
|
+
expect(subject.to_s(units: :knots, precision: 0)).to eq('262 nodi')
|
101
101
|
end
|
102
102
|
end
|
103
103
|
end
|
@@ -1,7 +1,12 @@
|
|
1
1
|
# encoding: utf-8
|
2
|
-
require '
|
2
|
+
require 'm9t/temperature'
|
3
3
|
|
4
4
|
describe M9t::Temperature do
|
5
|
+
CONVERSIONS = [
|
6
|
+
[:kelvin, 100, 373.15],
|
7
|
+
[:fahrenheit, 100, 212.0],
|
8
|
+
]
|
9
|
+
|
5
10
|
context 'constants' do
|
6
11
|
specify 'absolute zero' do
|
7
12
|
expect(M9t::Temperature::ABSOLUTE_ZERO).to be_within(0.0001).of(-273.15)
|
@@ -13,7 +18,7 @@ describe M9t::Temperature do
|
|
13
18
|
expect(M9t::Temperature.options[:units]).to eq(:degrees)
|
14
19
|
end
|
15
20
|
|
16
|
-
specify 'precision:
|
21
|
+
specify 'precision: 5' do
|
17
22
|
expect(M9t::Temperature.options[:precision]).to eq(5)
|
18
23
|
end
|
19
24
|
end
|
@@ -32,39 +37,44 @@ describe M9t::Temperature do
|
|
32
37
|
end
|
33
38
|
|
34
39
|
context 'conversion factories' do
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
specify unit do
|
40
|
-
expect(M9t::Temperature.send(unit, 0.0).value).to be_within(expected.abs / 1000.0).of(expected)
|
40
|
+
CONVERSIONS.each do |unit, degrees, other|
|
41
|
+
specify ".#{unit}" do
|
42
|
+
expect(M9t::Temperature.send(unit, other).value).
|
43
|
+
to be_within(degrees.abs / 1000.0).of(degrees)
|
41
44
|
end
|
42
45
|
end
|
43
46
|
end
|
44
47
|
|
45
48
|
context 'conversions' do
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
49
|
+
context 'from degrees' do
|
50
|
+
CONVERSIONS.each do |unit, degrees, other|
|
51
|
+
method = :"to_#{unit}"
|
52
|
+
specify method do
|
53
|
+
expect(M9t::Temperature.send(method, degrees)).to eq(other)
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
context 'to degrees' do
|
59
|
+
CONVERSIONS.each do |unit, degrees, other|
|
60
|
+
method = :"#{unit}_to_degrees"
|
61
|
+
specify method do
|
62
|
+
expect(M9t::Temperature.send(method, other)).to eq(degrees)
|
63
|
+
end
|
53
64
|
end
|
54
65
|
end
|
55
66
|
end
|
56
67
|
end
|
57
68
|
|
58
69
|
context 'conversions' do
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
expect(subject.send(method)).to be_within(expected.abs / 1000.0).of(expected)
|
70
|
+
context 'from degrees' do
|
71
|
+
CONVERSIONS.each do |unit, degrees, other|
|
72
|
+
subject { M9t::Temperature.new(degrees) }
|
73
|
+
|
74
|
+
method = :"to_#{unit}"
|
75
|
+
specify method do
|
76
|
+
expect(subject.send(method)).to be_within(other.abs / 1000.0).of(other)
|
77
|
+
end
|
68
78
|
end
|
69
79
|
end
|
70
80
|
end
|
@@ -84,27 +94,32 @@ describe M9t::Temperature do
|
|
84
94
|
|
85
95
|
specify 'precision' do
|
86
96
|
I18n.locale = :en
|
87
|
-
expect(subject.to_s(:
|
97
|
+
expect(subject.to_s(precision: 0)).to eq('135 degrees')
|
88
98
|
end
|
89
99
|
|
90
100
|
specify 'abbreviated, en' do
|
91
101
|
I18n.locale = :en
|
92
|
-
expect(subject.to_s(:
|
102
|
+
expect(subject.to_s(abbreviated: true, precision: 0)).
|
103
|
+
to eq('135°C')
|
93
104
|
end
|
94
105
|
|
95
106
|
specify 'kelvin, en' do
|
96
107
|
I18n.locale = :en
|
97
|
-
expect(subject.to_s(:
|
108
|
+
expect(subject.to_s(units: :kelvin, precision: 2)).
|
109
|
+
to eq('408.15 kelvin')
|
98
110
|
end
|
99
111
|
|
100
112
|
specify 'kelvin, it' do
|
101
113
|
I18n.locale = :it
|
102
|
-
expect(subject.to_s(:
|
114
|
+
expect(subject.to_s(units: :kelvin, precision: 2)).
|
115
|
+
to eq('408,15 kelvin')
|
103
116
|
end
|
104
117
|
|
105
118
|
specify 'abbreviated, kelvin, it' do
|
106
119
|
I18n.locale = :it
|
107
|
-
expect(
|
120
|
+
expect(
|
121
|
+
subject.to_s(units: :kelvin, abbreviated: true, precision: 2)
|
122
|
+
).to eq('408,15K')
|
108
123
|
end
|
109
124
|
end
|
110
125
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: m9t
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.3.
|
4
|
+
version: 0.3.5
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date:
|
12
|
+
date: 2015-10-18 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: rake
|
@@ -50,7 +50,7 @@ dependencies:
|
|
50
50
|
requirements:
|
51
51
|
- - ! '>='
|
52
52
|
- !ruby/object:Gem::Version
|
53
|
-
version:
|
53
|
+
version: 3.0.0
|
54
54
|
type: :development
|
55
55
|
prerelease: false
|
56
56
|
version_requirements: !ruby/object:Gem::Requirement
|
@@ -58,7 +58,7 @@ dependencies:
|
|
58
58
|
requirements:
|
59
59
|
- - ! '>='
|
60
60
|
- !ruby/object:Gem::Version
|
61
|
-
version:
|
61
|
+
version: 3.0.0
|
62
62
|
- !ruby/object:Gem::Dependency
|
63
63
|
name: simplecov
|
64
64
|
requirement: !ruby/object:Gem::Requirement
|
@@ -82,6 +82,9 @@ executables: []
|
|
82
82
|
extensions: []
|
83
83
|
extra_rdoc_files: []
|
84
84
|
files:
|
85
|
+
- .gitignore
|
86
|
+
- .rspec
|
87
|
+
- .travis.yml
|
85
88
|
- GPL-LICENSE.txt
|
86
89
|
- Gemfile
|
87
90
|
- MIT-LICENSE.txt
|
@@ -91,6 +94,7 @@ files:
|
|
91
94
|
- lib/m9t/base.rb
|
92
95
|
- lib/m9t/direction.rb
|
93
96
|
- lib/m9t/distance.rb
|
97
|
+
- lib/m9t/errors.rb
|
94
98
|
- lib/m9t/i18n.rb
|
95
99
|
- lib/m9t/pressure.rb
|
96
100
|
- lib/m9t/speed.rb
|
@@ -122,7 +126,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
122
126
|
version: '0'
|
123
127
|
segments:
|
124
128
|
- 0
|
125
|
-
hash: -
|
129
|
+
hash: -4097874954869017235
|
126
130
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
127
131
|
none: false
|
128
132
|
requirements:
|
@@ -131,11 +135,19 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
131
135
|
version: '0'
|
132
136
|
segments:
|
133
137
|
- 0
|
134
|
-
hash: -
|
138
|
+
hash: -4097874954869017235
|
135
139
|
requirements: []
|
136
140
|
rubyforge_project: nowarning
|
137
|
-
rubygems_version: 1.8.23
|
141
|
+
rubygems_version: 1.8.23.2
|
138
142
|
signing_key:
|
139
143
|
specification_version: 3
|
140
144
|
summary: Measurements and conversions library for Ruby
|
141
|
-
test_files:
|
145
|
+
test_files:
|
146
|
+
- spec/spec_helper.rb
|
147
|
+
- spec/unit/base_spec.rb
|
148
|
+
- spec/unit/direction_spec.rb
|
149
|
+
- spec/unit/distance_spec.rb
|
150
|
+
- spec/unit/i18n_spec.rb
|
151
|
+
- spec/unit/pressure_spec.rb
|
152
|
+
- spec/unit/speed_spec.rb
|
153
|
+
- spec/unit/temperature_spec.rb
|