scalar 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.
- checksums.yaml +7 -0
- data/lib/scalar.rb +5 -0
- data/lib/scalar/length.rb +26 -0
- data/lib/scalar/support_classes/conversion_table.rb +28 -0
- data/lib/scalar/support_classes/measurement.rb +86 -0
- data/lib/scalar/version.rb +3 -0
- data/lib/scalar/weight.rb +20 -0
- metadata +107 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: afde345d39409e1455a10a7d04023322ae065eea
|
4
|
+
data.tar.gz: 45de6cca4b807eebe4d3411b76bffa39629a1de0
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: e2d0a548da8f97d032a47605447360ec16089c8be5d5206c0c496f304ad567642affed258dbc850f7c78948b8f0fe1b42d3499241f55785a82224fb13737f957
|
7
|
+
data.tar.gz: 30a64216b7b6e3abf641ebb95ef2f67c96b7a3dda888782e08e3eb54500d4a64546a42fc8164e0fbea0a8505122f00b2c2a22980b533edad76c95c898eff8581
|
data/lib/scalar.rb
ADDED
@@ -0,0 +1,26 @@
|
|
1
|
+
require 'scalar/support_classes/conversion_table'
|
2
|
+
require 'scalar/support_classes/measurement'
|
3
|
+
|
4
|
+
module Scalar
|
5
|
+
class Length
|
6
|
+
include SupportClasses::Measurement
|
7
|
+
|
8
|
+
self.alias_map = {
|
9
|
+
meters: %i(m),
|
10
|
+
kilometers: %i(km),
|
11
|
+
millimeters: %i(mm),
|
12
|
+
feet: %i(ft),
|
13
|
+
inches: %i(in),
|
14
|
+
miles: %i(mi),
|
15
|
+
yards: %i(yd),
|
16
|
+
}
|
17
|
+
|
18
|
+
CONVERSIONS = SupportClasses::ConversionTable.new(base_unit: :meters)
|
19
|
+
CONVERSIONS.add name: :kilometers, base_unit_per: 1000
|
20
|
+
CONVERSIONS.add name: :millimeters, base_unit_per: 0.001
|
21
|
+
CONVERSIONS.add name: :feet, base_unit_per: 0.3048
|
22
|
+
CONVERSIONS.add name: :inches, base_unit_per: 0.3048 / 12
|
23
|
+
CONVERSIONS.add name: :miles, base_unit_per: 0.3048 * 5280
|
24
|
+
CONVERSIONS.add name: :yards, base_unit_per: 0.3048 * 3
|
25
|
+
end
|
26
|
+
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
module Scalar
|
2
|
+
module SupportClasses
|
3
|
+
class ConversionTable
|
4
|
+
def initialize(base_unit:)
|
5
|
+
self.table = {}
|
6
|
+
self.base_unit = base_unit
|
7
|
+
add(name: base_unit, base_unit_per: 1.to_r)
|
8
|
+
end
|
9
|
+
|
10
|
+
def add(name:, base_unit_per:)
|
11
|
+
raise unless name.is_a? Symbol
|
12
|
+
|
13
|
+
table[name] = {name => 1.to_r}
|
14
|
+
|
15
|
+
table.keys.each do |k|
|
16
|
+
table[k][name] = (table[k][base_unit] / base_unit_per).to_r
|
17
|
+
table[name][k] = 1.to_r / table[k][name]
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
def call(from:, to:)
|
22
|
+
table[from][to]
|
23
|
+
end
|
24
|
+
|
25
|
+
attr_accessor :table, :base_unit
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
@@ -0,0 +1,86 @@
|
|
1
|
+
module Scalar
|
2
|
+
module SupportClasses
|
3
|
+
module Measurement
|
4
|
+
include Comparable
|
5
|
+
|
6
|
+
module ClassMethods
|
7
|
+
def alias_map=(alias_map)
|
8
|
+
alias_map.each do |name,aliases|
|
9
|
+
define_factory_method(name)
|
10
|
+
define_conversion_method(name)
|
11
|
+
define_conversion_aliases(name, aliases)
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
def define_factory_method(name)
|
16
|
+
define_singleton_method(name) {|scalar| new(scalar, name) }
|
17
|
+
end
|
18
|
+
|
19
|
+
def define_conversion_method(name)
|
20
|
+
define_method(name) { convert(from: unit, to: name) }
|
21
|
+
end
|
22
|
+
|
23
|
+
def define_conversion_aliases(name, aliases)
|
24
|
+
aliases.each {|aka| alias_method aka, name }
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
def self.included(base)
|
29
|
+
base.extend ClassMethods
|
30
|
+
# .new is not a necessary public method
|
31
|
+
base.private_class_method :new
|
32
|
+
end
|
33
|
+
|
34
|
+
def <=>(other)
|
35
|
+
return nil unless other.is_a?(self.class)
|
36
|
+
scalar <=> other.send(unit).scalar
|
37
|
+
end
|
38
|
+
|
39
|
+
# this is part of making Weight ranges work.
|
40
|
+
def succ
|
41
|
+
self.class.send(unit, scalar + 1)
|
42
|
+
end
|
43
|
+
|
44
|
+
def -(other)
|
45
|
+
if !other.is_a?(self.class)
|
46
|
+
raise TypeError, "#{other.class} can't be coerced into #{self.class}"
|
47
|
+
end
|
48
|
+
|
49
|
+
self.class.send(unit, scalar - other.send(unit).scalar)
|
50
|
+
end
|
51
|
+
|
52
|
+
def +(other)
|
53
|
+
if !other.is_a?(self.class)
|
54
|
+
raise TypeError, "#{other.class} can't be coerced into #{self.class}"
|
55
|
+
end
|
56
|
+
|
57
|
+
self.class.send(unit, scalar + other.send(unit).scalar)
|
58
|
+
end
|
59
|
+
|
60
|
+
def initialize(scalar, unit)
|
61
|
+
self.scalar = scalar.to_r
|
62
|
+
self.unit = unit
|
63
|
+
end
|
64
|
+
|
65
|
+
def inspect
|
66
|
+
hex_id = (object_id << 1).to_s(16).rjust(14, '0')
|
67
|
+
"#<#{self.class.name}:0x#{hex_id} #{scalar.to_f} #{unit}>"
|
68
|
+
end
|
69
|
+
|
70
|
+
attr_reader :scalar
|
71
|
+
alias abs scalar
|
72
|
+
|
73
|
+
protected
|
74
|
+
attr_reader :unit
|
75
|
+
|
76
|
+
private
|
77
|
+
attr_writer :unit, :scalar
|
78
|
+
|
79
|
+
def convert(from:, to:)
|
80
|
+
converted_scalar = self.class::CONVERSIONS.call(from: from, to: to) * scalar
|
81
|
+
self.class.send(to, converted_scalar)
|
82
|
+
end
|
83
|
+
|
84
|
+
end
|
85
|
+
end
|
86
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
require 'scalar/support_classes/conversion_table'
|
2
|
+
require 'scalar/support_classes/measurement'
|
3
|
+
|
4
|
+
module Scalar
|
5
|
+
class Weight
|
6
|
+
include SupportClasses::Measurement
|
7
|
+
|
8
|
+
self.alias_map = {
|
9
|
+
pounds: %i(pound lbs lb),
|
10
|
+
ounces: %i(ounce ozs oz),
|
11
|
+
kilograms: %i(kilogram kg),
|
12
|
+
grams: %i(gram gm g),
|
13
|
+
}
|
14
|
+
|
15
|
+
CONVERSIONS = SupportClasses::ConversionTable.new(base_unit: :grams)
|
16
|
+
CONVERSIONS.add name: :kilograms, base_unit_per: 1000
|
17
|
+
CONVERSIONS.add name: :ounces, base_unit_per: 1.to_r / 0.035274
|
18
|
+
CONVERSIONS.add name: :pounds, base_unit_per: 16.to_r / 0.035274
|
19
|
+
end
|
20
|
+
end
|
metadata
ADDED
@@ -0,0 +1,107 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: scalar
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.1.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Kelly Stannard
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2016-09-07 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: bundler
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - "~>"
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '1.12'
|
20
|
+
type: :development
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - "~>"
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '1.12'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: rake
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - "~>"
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '10.0'
|
34
|
+
type: :development
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - "~>"
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '10.0'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: pry
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - ">="
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '0'
|
48
|
+
type: :development
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - ">="
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '0'
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: rspec
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - "~>"
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '3.0'
|
62
|
+
type: :development
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - "~>"
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '3.0'
|
69
|
+
description: Thin and performant measurement library
|
70
|
+
email:
|
71
|
+
- kwstannard@gmail.com
|
72
|
+
executables: []
|
73
|
+
extensions: []
|
74
|
+
extra_rdoc_files: []
|
75
|
+
files:
|
76
|
+
- lib/scalar.rb
|
77
|
+
- lib/scalar/length.rb
|
78
|
+
- lib/scalar/support_classes/conversion_table.rb
|
79
|
+
- lib/scalar/support_classes/measurement.rb
|
80
|
+
- lib/scalar/version.rb
|
81
|
+
- lib/scalar/weight.rb
|
82
|
+
homepage: https://github.com/CasperSleep/scalar
|
83
|
+
licenses:
|
84
|
+
- MIT
|
85
|
+
metadata:
|
86
|
+
allowed_push_host: https://rubygems.org
|
87
|
+
post_install_message:
|
88
|
+
rdoc_options: []
|
89
|
+
require_paths:
|
90
|
+
- lib
|
91
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
92
|
+
requirements:
|
93
|
+
- - ">="
|
94
|
+
- !ruby/object:Gem::Version
|
95
|
+
version: '0'
|
96
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
97
|
+
requirements:
|
98
|
+
- - ">="
|
99
|
+
- !ruby/object:Gem::Version
|
100
|
+
version: '0'
|
101
|
+
requirements: []
|
102
|
+
rubyforge_project:
|
103
|
+
rubygems_version: 2.5.1
|
104
|
+
signing_key:
|
105
|
+
specification_version: 4
|
106
|
+
summary: Thin and performant measurement library
|
107
|
+
test_files: []
|