scalar 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -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
@@ -0,0 +1,5 @@
1
+ require "scalar/version"
2
+
3
+ module Scalar
4
+ # Your code goes here...
5
+ end
@@ -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,3 @@
1
+ module Scalar
2
+ VERSION = "0.1.0"
3
+ 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: []