m9t 0.3.2 → 1.0.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.
- checksums.yaml +7 -0
- data/.gitignore +6 -0
- data/.rspec +2 -0
- data/.travis.yml +13 -0
- data/Gemfile +2 -2
- data/README.md +28 -23
- data/Rakefile +6 -28
- data/lib/m9t.rb +5 -21
- data/lib/m9t/base.rb +86 -43
- data/lib/m9t/direction.rb +15 -23
- data/lib/m9t/distance.rb +9 -12
- data/lib/m9t/errors.rb +9 -0
- data/lib/m9t/i18n.rb +19 -11
- data/lib/m9t/pressure.rb +7 -13
- data/lib/m9t/speed.rb +12 -15
- data/lib/m9t/temperature.rb +13 -19
- data/lib/m9t/version.rb +4 -7
- data/locales/de.yml +68 -0
- data/locales/en.yml +13 -0
- data/m9t.gemspec +19 -17
- data/spec/base_spec.rb +79 -0
- data/spec/direction_spec.rb +195 -0
- data/spec/distance_spec.rb +127 -0
- data/spec/i18n_spec.rb +54 -0
- data/spec/pressure_spec.rb +22 -0
- data/spec/spec_helper.rb +20 -0
- data/spec/speed_spec.rb +102 -0
- data/spec/temperature_spec.rb +124 -0
- metadata +67 -47
- data/test/base_test.rb +0 -55
- data/test/direction_test.rb +0 -106
- data/test/distance_test.rb +0 -161
- data/test/i18n_test.rb +0 -30
- data/test/pressure_test.rb +0 -25
- data/test/speed_test.rb +0 -104
- data/test/temperature_test.rb +0 -111
- data/test/test_helper.rb +0 -17
data/lib/m9t/distance.rb
CHANGED
@@ -1,23 +1,20 @@
|
|
1
|
-
|
2
|
-
require 'i18n'
|
3
|
-
require 'm9t/base'
|
1
|
+
require "m9t/base"
|
4
2
|
|
5
3
|
module M9t
|
6
|
-
|
7
4
|
# Represents a distance
|
8
5
|
class Distance
|
9
|
-
DEFAULT_OPTIONS
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
:
|
14
|
-
:
|
6
|
+
DEFAULT_OPTIONS = {
|
7
|
+
units: :meters, abbreviated: false, precision: 5
|
8
|
+
}
|
9
|
+
CONVERSIONS = {
|
10
|
+
meters: 1.0,
|
11
|
+
kilometers: 1.0 / 1000.0,
|
12
|
+
feet: 1.0 / 0.3048,
|
13
|
+
miles: 1.0 / 1609.344
|
15
14
|
}
|
16
15
|
|
17
16
|
include M9t::Base
|
18
17
|
|
19
18
|
alias :to_meters :value
|
20
|
-
|
21
19
|
end
|
22
|
-
|
23
20
|
end
|
data/lib/m9t/errors.rb
ADDED
data/lib/m9t/i18n.rb
CHANGED
@@ -1,25 +1,33 @@
|
|
1
|
-
|
2
|
-
|
1
|
+
require "i18n"
|
2
|
+
|
3
|
+
locales_path = File.expand_path(
|
4
|
+
File.join("..", "..", "locales"), File.dirname(__FILE__)
|
5
|
+
)
|
6
|
+
I18n.load_path += Dir.glob("#{ locales_path }/*.yml")
|
7
|
+
I18n.reload!
|
3
8
|
|
4
9
|
# Monkey patch I18n
|
10
|
+
# i18n does not handle localizing numbers.
|
11
|
+
# See the following GitHub issues:
|
12
|
+
# * https://github.com/svenfuchs/i18n/issues/328
|
13
|
+
# * https://github.com/svenfuchs/i18n/issues/135
|
14
|
+
# * https://github.com/svenfuchs/i18n/issues/183
|
5
15
|
module I18n
|
6
|
-
|
7
16
|
# Handle non-English numerical separators
|
8
17
|
# with I18n.locale = :it,
|
9
|
-
# I18n.localize_float(5.23) =>
|
18
|
+
# I18n.localize_float(5.23) => "5,23000"
|
10
19
|
def I18n.localize_float(float, options = {})
|
11
|
-
format = options[:format] ||
|
20
|
+
format = options[:format] || "%f"
|
12
21
|
english = format % float
|
13
|
-
integers, decimal = english.split(
|
14
|
-
integers ||=
|
22
|
+
integers, decimal = english.split(".")
|
23
|
+
integers ||= ""
|
15
24
|
|
16
|
-
thousands_separator = I18n.t(
|
17
|
-
integers.gsub(
|
25
|
+
thousands_separator = I18n.t("numbers.thousands_separator")
|
26
|
+
integers.gsub(",", thousands_separator)
|
18
27
|
|
19
28
|
return integers if decimal.nil?
|
20
29
|
|
21
|
-
decimal_separator = I18n.t(
|
30
|
+
decimal_separator = I18n.t("numbers.decimal_separator")
|
22
31
|
integers + decimal_separator + decimal
|
23
32
|
end
|
24
33
|
end
|
25
|
-
|
data/lib/m9t/pressure.rb
CHANGED
@@ -1,23 +1,17 @@
|
|
1
|
-
|
2
|
-
require 'i18n'
|
3
|
-
require 'm9t/base'
|
1
|
+
require "m9t/base"
|
4
2
|
|
5
3
|
module M9t
|
6
|
-
|
7
4
|
# Represents atmospheric (or other) pressure
|
8
5
|
class Pressure
|
9
|
-
DEFAULT_OPTIONS = {:
|
6
|
+
DEFAULT_OPTIONS = {units: :bar, abbreviated: false, precision: 5}
|
10
7
|
CONVERSIONS = {
|
11
|
-
:
|
12
|
-
:
|
13
|
-
:
|
14
|
-
:
|
15
|
-
:
|
8
|
+
bar: 1.0,
|
9
|
+
pascals: 1.0 / 0.00001,
|
10
|
+
hectopascals: 1.0 / 0.001,
|
11
|
+
kilopascals: 1.0 / 0.01,
|
12
|
+
inches_of_mercury: 1.0 / (3386.389 * 0.00001)
|
16
13
|
}
|
17
14
|
|
18
15
|
include M9t::Base
|
19
|
-
|
20
16
|
end
|
21
|
-
|
22
17
|
end
|
23
|
-
|
data/lib/m9t/speed.rb
CHANGED
@@ -1,28 +1,25 @@
|
|
1
|
-
|
2
|
-
require
|
3
|
-
require 'm9t/distance'
|
1
|
+
require "m9t/base"
|
2
|
+
require "m9t/distance"
|
4
3
|
|
5
4
|
module M9t
|
6
|
-
|
7
5
|
# Represents a speed
|
8
6
|
class Speed
|
9
|
-
DEFAULT_OPTIONS = {
|
7
|
+
DEFAULT_OPTIONS = {
|
8
|
+
units: :meters_per_second, abbreviated: false, precision: 5
|
9
|
+
}
|
10
10
|
SECONDS_PER_HOUR = 60.0 * 60
|
11
|
-
KMH
|
12
|
-
MPH
|
13
|
-
KNOTS
|
11
|
+
KMH = M9t::Distance::CONVERSIONS[:kilometers] * SECONDS_PER_HOUR
|
12
|
+
MPH = M9t::Distance::CONVERSIONS[:miles] * SECONDS_PER_HOUR
|
13
|
+
KNOTS = KMH / 1.852
|
14
14
|
CONVERSIONS = {
|
15
|
-
:
|
16
|
-
:
|
17
|
-
:
|
18
|
-
:
|
15
|
+
meters_per_second: 1.0,
|
16
|
+
kilometers_per_hour: KMH,
|
17
|
+
miles_per_hour: MPH,
|
18
|
+
knots: KNOTS
|
19
19
|
}
|
20
20
|
|
21
21
|
include M9t::Base
|
22
22
|
|
23
23
|
alias :to_meters_per_second :value
|
24
|
-
|
25
24
|
end
|
26
|
-
|
27
25
|
end
|
28
|
-
|
data/lib/m9t/temperature.rb
CHANGED
@@ -1,17 +1,16 @@
|
|
1
|
-
|
2
|
-
require 'i18n'
|
3
|
-
require 'm9t/base'
|
1
|
+
require "m9t/base"
|
4
2
|
|
5
3
|
module M9t
|
6
|
-
|
7
4
|
# Represents a temperature
|
8
5
|
# Using degrees (celcius), not kelvin, as default unit
|
9
6
|
class Temperature
|
10
|
-
DEFAULT_OPTIONS
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
:
|
7
|
+
DEFAULT_OPTIONS = {
|
8
|
+
units: :degrees, abbreviated: false, precision: 5
|
9
|
+
}
|
10
|
+
CONVERSIONS = {
|
11
|
+
degrees: 1.0,
|
12
|
+
kelvin: nil,
|
13
|
+
fahrenheit: nil
|
15
14
|
}
|
16
15
|
|
17
16
|
# Conversions
|
@@ -20,14 +19,13 @@ module M9t
|
|
20
19
|
include M9t::Base
|
21
20
|
|
22
21
|
class << self
|
23
|
-
|
24
22
|
# Accepts a value in kelvin and returns the equivalent M9t::Temperature
|
25
|
-
def kelvin(
|
26
|
-
new(
|
23
|
+
def kelvin(kelvin)
|
24
|
+
new(kelvin.to_f + ABSOLUTE_ZERO)
|
27
25
|
end
|
28
26
|
|
29
|
-
def fahrenheit(
|
30
|
-
new(
|
27
|
+
def fahrenheit(fahrenheit)
|
28
|
+
new(fahrenheit_to_degrees(fahrenheit))
|
31
29
|
end
|
32
30
|
|
33
31
|
# Converts degrees to kelvin
|
@@ -47,9 +45,8 @@ module M9t
|
|
47
45
|
|
48
46
|
# Converts Fahrenheit to degrees
|
49
47
|
def fahrenheit_to_degrees(fahrenheit)
|
50
|
-
fahrenheit.to_f - 32 * 5.0 / 9.0
|
48
|
+
(fahrenheit.to_f - 32) * 5.0 / 9.0
|
51
49
|
end
|
52
|
-
|
53
50
|
end
|
54
51
|
|
55
52
|
alias :to_degrees :value
|
@@ -62,8 +59,5 @@ module M9t
|
|
62
59
|
def to_fahrenheit
|
63
60
|
self.class.to_fahrenheit(@value)
|
64
61
|
end
|
65
|
-
|
66
62
|
end
|
67
|
-
|
68
63
|
end
|
69
|
-
|
data/lib/m9t/version.rb
CHANGED
data/locales/de.yml
ADDED
@@ -0,0 +1,68 @@
|
|
1
|
+
# encoding: utf8
|
2
|
+
de:
|
3
|
+
numbers:
|
4
|
+
thousands_separator: '.'
|
5
|
+
decimal_separator: ','
|
6
|
+
units:
|
7
|
+
distance:
|
8
|
+
meters:
|
9
|
+
full:
|
10
|
+
zero: Meter
|
11
|
+
one: Meter
|
12
|
+
other: Meter
|
13
|
+
abbreviated: m
|
14
|
+
kilometers:
|
15
|
+
full:
|
16
|
+
zero: Kilometer
|
17
|
+
one: Kilometer
|
18
|
+
other: Kilometer
|
19
|
+
abbreviated: km
|
20
|
+
miles:
|
21
|
+
full:
|
22
|
+
zero: Meilen
|
23
|
+
one: Meile
|
24
|
+
other: Meilen
|
25
|
+
feet:
|
26
|
+
full:
|
27
|
+
one: Fuß
|
28
|
+
other: Fuß
|
29
|
+
abbreviated: ft
|
30
|
+
direction:
|
31
|
+
degrees:
|
32
|
+
full:
|
33
|
+
zero: Grad
|
34
|
+
one: Grad
|
35
|
+
other: Grad
|
36
|
+
abbreviated: °
|
37
|
+
speed:
|
38
|
+
meters_per_second:
|
39
|
+
full:
|
40
|
+
zero: Meter pro Sekunde
|
41
|
+
one: Meter pro Sekunde
|
42
|
+
other: Meter pro Sekunde
|
43
|
+
abbreviated: m/s
|
44
|
+
kilometers_per_hour:
|
45
|
+
full:
|
46
|
+
one: Kilometer pro Stunde
|
47
|
+
other: Kilometer pro Stunde
|
48
|
+
abbreviated: km/h
|
49
|
+
knots:
|
50
|
+
full:
|
51
|
+
zero: Knoten
|
52
|
+
one: Knoten
|
53
|
+
other: Knoten
|
54
|
+
temperature:
|
55
|
+
degrees:
|
56
|
+
full:
|
57
|
+
zero: Grad
|
58
|
+
one: Grad
|
59
|
+
other: Grad
|
60
|
+
abbreviated: °C
|
61
|
+
kelvin:
|
62
|
+
full:
|
63
|
+
zero: Kelvin
|
64
|
+
one: Kelvin
|
65
|
+
other: Kelvin
|
66
|
+
abbreviated: K
|
67
|
+
direction:
|
68
|
+
sectors: ['N', 'NNO', 'NO', 'ONO', 'O', 'OSO', 'SO', 'SSO', 'S', 'SSW', 'SW', 'WSW', 'W', 'WNW', 'NW', 'NNW', 'N']
|
data/locales/en.yml
CHANGED
@@ -22,6 +22,7 @@ en:
|
|
22
22
|
zero: miles
|
23
23
|
one: mile
|
24
24
|
other: miles
|
25
|
+
abbreviated: mi
|
25
26
|
feet:
|
26
27
|
full:
|
27
28
|
one: foot
|
@@ -35,6 +36,12 @@ en:
|
|
35
36
|
other: degrees
|
36
37
|
abbreviated: °
|
37
38
|
speed:
|
39
|
+
miles_per_hour:
|
40
|
+
full:
|
41
|
+
zero: miles per hour
|
42
|
+
one: mile per hour
|
43
|
+
other: miles per hour
|
44
|
+
abbreviated: mph
|
38
45
|
meters_per_second:
|
39
46
|
full:
|
40
47
|
zero: meters per second
|
@@ -52,6 +59,12 @@ en:
|
|
52
59
|
one: knot
|
53
60
|
other: knots
|
54
61
|
temperature:
|
62
|
+
fahrenheit:
|
63
|
+
full:
|
64
|
+
zero: degrees
|
65
|
+
one: degree
|
66
|
+
other: degrees
|
67
|
+
abbreviated: °F
|
55
68
|
degrees:
|
56
69
|
full:
|
57
70
|
zero: degrees
|
data/m9t.gemspec
CHANGED
@@ -1,28 +1,30 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
require 'm9t/version'
|
1
|
+
$LOAD_PATH.unshift(File.expand_path("../lib", __FILE__))
|
2
|
+
require "m9t/version"
|
4
3
|
|
5
4
|
gemspec = Gem::Specification.new do |s|
|
6
|
-
s.name =
|
5
|
+
s.name = "m9t"
|
7
6
|
s.platform = Gem::Platform::RUBY
|
8
7
|
s.version = M9t::VERSION::STRING
|
8
|
+
s.required_ruby_version = ">= 2.4.0"
|
9
9
|
|
10
|
-
s.summary =
|
11
|
-
s.description =
|
10
|
+
s.summary = "Measurements and conversions library for Ruby"
|
11
|
+
s.description = "Classes for handling basic measurement units: distance, direction, speed, temperature and pressure"
|
12
|
+
s.license = "MIT"
|
12
13
|
|
13
|
-
s.homepage =
|
14
|
-
s.author =
|
15
|
-
s.email =
|
14
|
+
s.homepage = "https://github.com/joeyates/m9t"
|
15
|
+
s.author = "Joe Yates"
|
16
|
+
s.email = "joe.g.yates@gmail.com"
|
16
17
|
|
17
|
-
s.files = `git ls-files`.lines.map(
|
18
|
-
s.test_files = `git ls-files`.lines.map(
|
19
|
-
s.require_paths = [
|
18
|
+
s.files = `git ls-files`.lines.map(&:chomp!)
|
19
|
+
s.test_files = `git ls-files spec`.lines.map(&:chomp!)
|
20
|
+
s.require_paths = ["lib"]
|
20
21
|
|
21
|
-
s.rubyforge_project =
|
22
|
+
s.rubyforge_project = "nowarning"
|
22
23
|
|
23
|
-
s.add_dependency
|
24
|
-
s.add_dependency
|
24
|
+
s.add_dependency "rake"
|
25
|
+
s.add_dependency "i18n", ">= 0.3.5"
|
25
26
|
|
26
|
-
s.add_development_dependency
|
27
|
-
s.add_development_dependency
|
27
|
+
s.add_development_dependency "codeclimate-test-reporter", "~> 0.4.8"
|
28
|
+
s.add_development_dependency "rspec", ">= 3.0.0"
|
29
|
+
s.add_development_dependency "simplecov" if RUBY_PLATFORM != "java"
|
28
30
|
end
|
data/spec/base_spec.rb
ADDED
@@ -0,0 +1,79 @@
|
|
1
|
+
require "m9t/base"
|
2
|
+
|
3
|
+
class SomeMeasurement
|
4
|
+
DEFAULT_OPTIONS = {
|
5
|
+
units: :foos,
|
6
|
+
abbreviated: false,
|
7
|
+
decimals: 1
|
8
|
+
}
|
9
|
+
CONVERSIONS = {
|
10
|
+
foos: 1.0,
|
11
|
+
bars: 1 / 42.0
|
12
|
+
}
|
13
|
+
|
14
|
+
include M9t::Base
|
15
|
+
end
|
16
|
+
|
17
|
+
class SomeDerivedMeasurement < SomeMeasurement; end
|
18
|
+
|
19
|
+
describe M9t::Base do
|
20
|
+
describe ".respond_to?" do
|
21
|
+
it "is true for conversion between known units" do
|
22
|
+
expect(SomeMeasurement.respond_to?(:foos_to_bars)).to be_truthy
|
23
|
+
end
|
24
|
+
|
25
|
+
it "is false for unknown units" do
|
26
|
+
expect(SomeMeasurement.respond_to?(:bazs_to_bars)).to be_falsey
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
describe ".method_missing" do
|
31
|
+
it "handles conversion between known units" do
|
32
|
+
expect(SomeMeasurement.foos_to_bars(3.0)).to be_a(Float)
|
33
|
+
end
|
34
|
+
|
35
|
+
it "fails for unknown units" do
|
36
|
+
expect {
|
37
|
+
SomeMeasurement.bazs_to_bars(3.0)
|
38
|
+
}.to raise_error(NoMethodError)
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
describe "#respond_to?" do
|
43
|
+
subject { SomeMeasurement.new(3.0) }
|
44
|
+
|
45
|
+
it "is true for conversion to known units" do
|
46
|
+
expect(subject.respond_to?(:to_bars)).to be_truthy
|
47
|
+
end
|
48
|
+
|
49
|
+
it "is false for unknown units" do
|
50
|
+
expect(subject.respond_to?(:to_bazs)).to be_falsey
|
51
|
+
end
|
52
|
+
|
53
|
+
context "for unrecognized calls" do
|
54
|
+
it "calls super" do
|
55
|
+
expect(subject.respond_to?(:ciao)).to be_falsey
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
60
|
+
describe "#method_missing" do
|
61
|
+
subject { SomeMeasurement.new(3.0) }
|
62
|
+
|
63
|
+
it "handles conversion to known units" do
|
64
|
+
expect(subject.to_bars).to be_a(Float)
|
65
|
+
end
|
66
|
+
|
67
|
+
it "fails for unknown units" do
|
68
|
+
expect {
|
69
|
+
subject.to_bazs(3.0)
|
70
|
+
}.to raise_error(NoMethodError)
|
71
|
+
end
|
72
|
+
end
|
73
|
+
|
74
|
+
describe "derived class" do
|
75
|
+
it "inherits options" do
|
76
|
+
expect(SomeDerivedMeasurement.options).to eq(SomeMeasurement.options)
|
77
|
+
end
|
78
|
+
end
|
79
|
+
end
|