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.
@@ -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: []