tape_measure 0.0.1 → 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 +5 -5
- data/.ruby-version +1 -0
- data/.travis.yml +4 -2
- data/README.md +7 -6
- data/lib/tape_measure.rb +3 -4
- data/lib/tape_measure/formatter.rb +10 -6
- data/lib/tape_measure/length_grammar.citrus +20 -14
- data/lib/tape_measure/parser.rb +30 -7
- data/lib/tape_measure/version.rb +1 -1
- data/spec/spec_helper.rb +0 -1
- data/spec/tape_measure/formatter_spec.rb +5 -1
- data/spec/tape_measure/parser_spec.rb +109 -59
- data/tape_measure.gemspec +1 -1
- metadata +24 -24
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: 56db6cb67bc3f529296291bc228c342104c4f2c1ec4a39b535635773579b5a7c
|
4
|
+
data.tar.gz: 95e4d5af5c333feb061664d4724b65ab0fab4adc6fee8852eedca096ad795955
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 5290d48338267e7d5712030618a8e3d08ae2565fdd341bdfa8b3ceb7666ff931f2f6b805aec7d768e07017a0f35940a156c6da0aeca8ba415da2b1ad77c21994
|
7
|
+
data.tar.gz: 38ea3569c0a9ac937da44385164d0a9d99d95c6cbb4a650f7d18199b72468961d809d85d8c4ecef224ebadaa6a87d15581e5f6c9a5d1e9031352346a6f6298ce
|
data/.ruby-version
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
3.0.0
|
data/.travis.yml
CHANGED
data/README.md
CHANGED
@@ -5,15 +5,16 @@
|
|
5
5
|
|
6
6
|
Contains a text parser for converting various measurements into their inch :/ equivilent, as well as doing multiplication with those numbers:
|
7
7
|
|
8
|
-
TapeMeasure
|
9
|
-
TapeMeasure
|
10
|
-
TapeMeasure
|
11
|
-
TapeMeasure
|
12
|
-
TapeMeasure
|
8
|
+
TapeMeasure.parse('6ft').parse = 72
|
9
|
+
TapeMeasure.parse('6in').parse = 6
|
10
|
+
TapeMeasure.parse('6ft 6in').parse = 78
|
11
|
+
TapeMeasure.parse('6 * 6').parse = 36
|
12
|
+
TapeMeasure.parse('(6ft 6in) + 6in').parse = 84
|
13
13
|
|
14
|
+
They underlying library supports all units and could easily be expanded to handle natural lanuage parsing of other units in strings.
|
14
15
|
Also contains a formatter that converts a measurement to all of it's corresponding measurements:
|
15
16
|
|
16
|
-
.
|
17
|
+
TapeMeasure.format(13.5) = "1' 1 1/2""
|
17
18
|
|
18
19
|
## Installation:
|
19
20
|
|
data/lib/tape_measure.rb
CHANGED
@@ -1,7 +1,6 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
4
|
-
require 'bigdecimal'
|
1
|
+
require_relative 'tape_measure/formatter'
|
2
|
+
require_relative 'tape_measure/parser'
|
3
|
+
require_relative 'tape_measure/version'
|
5
4
|
|
6
5
|
# Silence is golden
|
7
6
|
module TapeMeasure
|
@@ -4,7 +4,7 @@ module TapeMeasure
|
|
4
4
|
attr_reader :mixed_number
|
5
5
|
|
6
6
|
def initialize(number = 0.0)
|
7
|
-
@number = number
|
7
|
+
@number = number.to_f
|
8
8
|
@unit_array = []
|
9
9
|
@feet = @number.div(12)
|
10
10
|
@raw_inches = @number.remainder(12)
|
@@ -15,7 +15,12 @@ module TapeMeasure
|
|
15
15
|
format_inches
|
16
16
|
format_fraction
|
17
17
|
|
18
|
-
|
18
|
+
if @unit_array.size > 0
|
19
|
+
@mixed_number = @unit_array.compact.join
|
20
|
+
else
|
21
|
+
@mixed_number = 0
|
22
|
+
end
|
23
|
+
|
19
24
|
end
|
20
25
|
|
21
26
|
def format_feet
|
@@ -23,10 +28,9 @@ module TapeMeasure
|
|
23
28
|
end
|
24
29
|
|
25
30
|
def format_inches
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
end
|
31
|
+
return unless @inches > 0
|
32
|
+
@unit_array << ' ' if @feet > 0
|
33
|
+
@unit_array << "#{@inches}"
|
30
34
|
end
|
31
35
|
|
32
36
|
def format_fraction
|
@@ -11,7 +11,7 @@ grammar LengthGrammar
|
|
11
11
|
end
|
12
12
|
|
13
13
|
rule factor
|
14
|
-
multiplicative | prefix
|
14
|
+
multiplicative | prefix
|
15
15
|
end
|
16
16
|
|
17
17
|
rule multiplicative
|
@@ -30,7 +30,7 @@ grammar LengthGrammar
|
|
30
30
|
s += '@' unless s == '~' # Unary + and - require an @.
|
31
31
|
capture(:prefix).value.send(s)
|
32
32
|
}
|
33
|
-
end
|
33
|
+
end
|
34
34
|
|
35
35
|
rule number_group
|
36
36
|
number_set | exponent
|
@@ -68,12 +68,18 @@ grammar LengthGrammar
|
|
68
68
|
digits_with_unit | number
|
69
69
|
end
|
70
70
|
|
71
|
+
rule digits_with_unit
|
72
|
+
(number unit space*){
|
73
|
+
RubyUnits::Unit.new capture(:number).value, capture(:unit).to_str
|
74
|
+
}
|
75
|
+
end
|
76
|
+
|
71
77
|
rule number
|
72
78
|
irrational | integer
|
73
79
|
end
|
74
80
|
|
75
81
|
rule irrational
|
76
|
-
rational | float
|
82
|
+
rational | float
|
77
83
|
end
|
78
84
|
|
79
85
|
rule float
|
@@ -81,7 +87,7 @@ grammar LengthGrammar
|
|
81
87
|
end
|
82
88
|
|
83
89
|
rule decimal
|
84
|
-
(integer '.' integer) { to_str
|
90
|
+
(integer '.' integer) { Rational(capture(:decimal).to_str) }
|
85
91
|
end
|
86
92
|
|
87
93
|
rule integer
|
@@ -89,7 +95,13 @@ grammar LengthGrammar
|
|
89
95
|
end
|
90
96
|
|
91
97
|
rule rational
|
92
|
-
leading_whole | fraction
|
98
|
+
leading_with_minus_whole | leading_whole | fraction
|
99
|
+
end
|
100
|
+
|
101
|
+
rule leading_with_minus_whole
|
102
|
+
(integer operator:('-') fraction){
|
103
|
+
capture(:integer).value + capture(:fraction).value
|
104
|
+
}
|
93
105
|
end
|
94
106
|
|
95
107
|
rule leading_whole
|
@@ -99,13 +111,7 @@ grammar LengthGrammar
|
|
99
111
|
end
|
100
112
|
|
101
113
|
rule fraction
|
102
|
-
(float '/' float) { to_str.
|
103
|
-
end
|
104
|
-
|
105
|
-
rule digits_with_unit
|
106
|
-
(number unit space*){
|
107
|
-
(RubyUnits::Unit.new( capture(:number).value.to_s.strip + ( capture(:unit).value.empty? ? "in" : capture(:unit).value)) >> "in").scalar.to_f.round(4)
|
108
|
-
}
|
114
|
+
(float '/' float) { Rational(*captures(:float).map(&:to_str).map(&:to_f)) }
|
109
115
|
end
|
110
116
|
|
111
117
|
rule unit
|
@@ -118,5 +124,5 @@ grammar LengthGrammar
|
|
118
124
|
|
119
125
|
rule lparen '(' space* end
|
120
126
|
rule rparen ')' space* end
|
121
|
-
rule space [
|
122
|
-
end
|
127
|
+
rule space [\s] end
|
128
|
+
end
|
data/lib/tape_measure/parser.rb
CHANGED
@@ -1,22 +1,33 @@
|
|
1
1
|
require 'citrus'
|
2
2
|
require 'ruby_units/namespaced'
|
3
|
-
Citrus.load
|
3
|
+
Citrus.load File.expand_path("../length_grammar", __FILE__)
|
4
4
|
|
5
5
|
module TapeMeasure
|
6
6
|
# Parse Strings into units and math them
|
7
7
|
class Parser
|
8
|
-
attr_reader :value
|
8
|
+
attr_reader :value, :match, :unit, :scalar
|
9
9
|
|
10
10
|
def initialize(string)
|
11
11
|
@string = string
|
12
|
-
|
13
|
-
|
12
|
+
if @string.is_a?(String)
|
13
|
+
parse
|
14
|
+
else
|
15
|
+
@value = string
|
16
|
+
end
|
14
17
|
end
|
15
18
|
|
16
19
|
def parse
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
+
begin
|
21
|
+
mixed_value = LengthGrammar.parse(@string.strip).value
|
22
|
+
@unit = mixed_value.units
|
23
|
+
@scalar = mixed_value.scalar
|
24
|
+
@value = mixed_value.compatible?("in") ? (mixed_value >> "in").scalar : @scalar.to_f
|
25
|
+
|
26
|
+
@match = true
|
27
|
+
rescue Citrus::ParseError => ex
|
28
|
+
ex.message
|
29
|
+
@match = false
|
30
|
+
end
|
20
31
|
end
|
21
32
|
end
|
22
33
|
|
@@ -25,5 +36,17 @@ module TapeMeasure
|
|
25
36
|
def parse(string)
|
26
37
|
Parser.new(string).value
|
27
38
|
end
|
39
|
+
|
40
|
+
def match?(string)
|
41
|
+
Parser.new(string).match
|
42
|
+
end
|
43
|
+
|
44
|
+
def scalar(string)
|
45
|
+
Parser.new(string).scalar
|
46
|
+
end
|
47
|
+
|
48
|
+
def unit(string)
|
49
|
+
Parser.new(string).unit
|
50
|
+
end
|
28
51
|
end
|
29
52
|
end
|
data/lib/tape_measure/version.rb
CHANGED
data/spec/spec_helper.rb
CHANGED
@@ -17,10 +17,14 @@ describe TapeMeasure::Formatter do
|
|
17
17
|
|
18
18
|
it 'when no length' do
|
19
19
|
expect(TapeMeasure::Formatter.new(0.0).mixed_number)
|
20
|
-
.to eq(
|
20
|
+
.to eq(0)
|
21
21
|
end
|
22
22
|
|
23
23
|
it 'when called via class method helper' do
|
24
24
|
expect(TapeMeasure.format(1)).to eq("1\"")
|
25
25
|
end
|
26
|
+
|
27
|
+
it 'when number is more clearly stated as a number' do
|
28
|
+
expect(TapeMeasure::Formatter.new(7.5).mixed_number).to eq('7 1/2"')
|
29
|
+
end
|
26
30
|
end
|
@@ -21,25 +21,37 @@ describe TapeMeasure do
|
|
21
21
|
# 1' 2' 3' 127cm
|
22
22
|
# 5 (assumes inches)
|
23
23
|
# 3-3/4" = 2.75
|
24
|
+
|
25
|
+
it 'can handle integer' do
|
26
|
+
expect(TapeMeasure.parse(6)).to eq 6
|
27
|
+
end
|
28
|
+
|
29
|
+
it 'can handle nil' do
|
30
|
+
expect(TapeMeasure.parse(nil)).to eq nil
|
31
|
+
end
|
32
|
+
|
33
|
+
it 'can handle empty string' do
|
34
|
+
expect(TapeMeasure.parse("")).to eq nil
|
35
|
+
end
|
36
|
+
|
24
37
|
describe :grammar do
|
25
38
|
it 'can add' do
|
26
|
-
TapeMeasure::Parser.new('(8+2)').value.
|
27
|
-
TapeMeasure::Parser.new('8+2').value.
|
28
|
-
TapeMeasure::Parser.new('(8 + 2)').value.
|
29
|
-
TapeMeasure::Parser.new('8 + 2').value.
|
39
|
+
expect(TapeMeasure::Parser.new('(8+2)').value).to eq 10
|
40
|
+
expect(TapeMeasure::Parser.new('8+2').value).to eq 10
|
41
|
+
expect(TapeMeasure::Parser.new('(8 + 2)').value).to eq 10
|
42
|
+
expect(TapeMeasure::Parser.new('8 + 2').value).to eq 10
|
30
43
|
end
|
31
|
-
|
32
44
|
it 'can subtract' do
|
33
|
-
TapeMeasure::Parser.new('4 - 2').value.
|
45
|
+
expect(TapeMeasure::Parser.new('4 - 2').value).to eq 2
|
34
46
|
end
|
35
47
|
|
36
48
|
it 'can evaluate parens' do
|
37
|
-
TapeMeasure::Parser.new('(8*2)').value.
|
38
|
-
TapeMeasure::Parser.new('(8)*(2)*(2)').value.
|
39
|
-
TapeMeasure::Parser.new('(8)*(2)').value.
|
40
|
-
TapeMeasure::Parser.new('(8*2)').value.
|
41
|
-
TapeMeasure::Parser.new('(8)(2)').value.
|
42
|
-
TapeMeasure::Parser.new('(2+8*2+2)*2').value.
|
49
|
+
expect(TapeMeasure::Parser.new('(8*2)').value).to eq 16
|
50
|
+
expect(TapeMeasure::Parser.new('(8)*(2)*(2)').value).to eq 32
|
51
|
+
expect(TapeMeasure::Parser.new('(8)*(2)').value).to eq 16
|
52
|
+
expect(TapeMeasure::Parser.new('(8*2)').value).to eq 16
|
53
|
+
expect(TapeMeasure::Parser.new('(8)(2)').value).to eq 10
|
54
|
+
expect(TapeMeasure::Parser.new('(2+8*2+2)*2').value).to eq 40
|
43
55
|
end
|
44
56
|
|
45
57
|
it 'will perform flops' do
|
@@ -50,133 +62,171 @@ describe TapeMeasure do
|
|
50
62
|
end
|
51
63
|
|
52
64
|
it 'can multiply rationals' do
|
53
|
-
TapeMeasure::Parser.new('(4/4 + 4)').value.
|
54
|
-
TapeMeasure::Parser.new('(3/4 +4/4)').value.
|
55
|
-
TapeMeasure::Parser.new('(3/4 *4/1)').value.
|
65
|
+
expect(TapeMeasure::Parser.new('(4/4 + 4)').value).to eq 5
|
66
|
+
expect(TapeMeasure::Parser.new('(3/4 +4/4)').value).to eq Rational(7, 4)
|
67
|
+
expect(TapeMeasure::Parser.new('(3/4 *4/1)').value).to eq Rational(12, 4)
|
56
68
|
end
|
57
69
|
|
58
70
|
it 'can multiply rationals and fractions' do
|
59
|
-
TapeMeasure::Parser.new('(3/4 +1.0)').value.
|
71
|
+
expect(TapeMeasure::Parser.new('(3/4 +1.0)').value).to eq 7.0 / 4.0
|
72
|
+
end
|
73
|
+
|
74
|
+
it 'can handle complex rationals' do
|
75
|
+
expect(TapeMeasure::Parser.new('(77/88 mm)').value).to eq Rational(35,1016)
|
76
|
+
expect(TapeMeasure::Parser.new('(77/88 mm)').match).to eq true
|
77
|
+
expect(TapeMeasure::Parser.new('(77/88 mm)').scalar).to eq Rational(77,88)
|
78
|
+
expect(TapeMeasure::Parser.new('(77/88 mm)').unit).to eq "mm"
|
60
79
|
end
|
61
80
|
|
62
81
|
describe 'recognizes mixed numbers' do
|
63
82
|
|
64
83
|
it 'recognizes inches' do
|
65
|
-
TapeMeasure::Parser.new('2 inches').value.
|
66
|
-
TapeMeasure::Parser.new('2 "').value.
|
67
|
-
TapeMeasure::Parser.new('2in').value.
|
84
|
+
expect(TapeMeasure::Parser.new('2 inches').value).to eq 2
|
85
|
+
expect(TapeMeasure::Parser.new('2 "').value).to eq 2
|
86
|
+
expect(TapeMeasure::Parser.new('2in').value).to eq 2
|
68
87
|
end
|
69
88
|
|
70
89
|
it 'recognizes feet' do
|
71
|
-
TapeMeasure::Parser.new('2 feet').value.
|
72
|
-
TapeMeasure::Parser.new('2\'').value.
|
73
|
-
TapeMeasure::Parser.new('2ft').value.
|
90
|
+
expect(TapeMeasure::Parser.new('2 feet').value).to eq 24
|
91
|
+
expect(TapeMeasure::Parser.new('2\'').value).to eq 24
|
92
|
+
expect(TapeMeasure::Parser.new('2ft').value).to eq 24
|
74
93
|
end
|
75
94
|
|
76
95
|
it 'converts meters' do
|
77
|
-
TapeMeasure::Parser.new('1 meter').value.
|
78
|
-
TapeMeasure::Parser.new('1m').value.
|
96
|
+
expect(TapeMeasure::Parser.new('1 meter').value).to eq Rational(5000, 127)
|
97
|
+
expect(TapeMeasure::Parser.new('1m').value).to eq Rational(5000, 127)
|
79
98
|
end
|
80
99
|
|
81
100
|
describe 'converts centimeters' do
|
82
101
|
it 'with whitespace' do
|
83
|
-
TapeMeasure::Parser.new('127 cm').value.
|
102
|
+
expect(TapeMeasure::Parser.new('127 cm').value).to eq 50
|
84
103
|
end
|
85
104
|
it 'without whitespace' do
|
86
|
-
TapeMeasure::Parser.new('127cm').value.
|
105
|
+
expect(TapeMeasure::Parser.new('127cm').value).to eq 50
|
87
106
|
end
|
88
107
|
end
|
89
108
|
|
90
109
|
it 'converts millimeters' do
|
91
|
-
TapeMeasure::Parser.new('1270 mm').value.
|
92
|
-
TapeMeasure::Parser.new('1270mm').value.
|
110
|
+
expect(TapeMeasure::Parser.new('1270 mm').value).to eq 50
|
111
|
+
expect(TapeMeasure::Parser.new('1270mm').value).to eq 50
|
93
112
|
end
|
94
113
|
end
|
95
114
|
end
|
96
115
|
|
97
116
|
describe :unit_conversion do
|
98
117
|
|
118
|
+
it 'number + unit - number + unit is subtraction' do
|
119
|
+
expect(TapeMeasure::Parser.new('4feet-2inches').value).to eq 46
|
120
|
+
end
|
121
|
+
|
122
|
+
# Handles US metric lumber notation of 2-1/2" to represent 2.5 inches.
|
123
|
+
it 'number - number + unit is addition' do
|
124
|
+
expect(TapeMeasure::Parser.new('2-1/2"').value).to eq 2.5
|
125
|
+
end
|
126
|
+
|
99
127
|
it 'number + space + string unit twice to inches' do
|
100
|
-
TapeMeasure::Parser.new('4feet 2inches').value.
|
128
|
+
expect(TapeMeasure::Parser.new('4feet 2inches').value).to eq 50
|
129
|
+
end
|
130
|
+
|
131
|
+
it 'number + symbol unit twice to inches' do
|
132
|
+
expect(TapeMeasure::Parser.new("4'2\"").value).to eq 50
|
101
133
|
end
|
102
134
|
|
103
|
-
it 'number + string unit twice to inches' do
|
104
|
-
TapeMeasure::Parser.new(
|
135
|
+
it 'number + string unit twice to inches with no whitespace' do
|
136
|
+
expect(TapeMeasure::Parser.new('3ft10in').value).to eq 46
|
105
137
|
end
|
106
138
|
|
107
|
-
it 'number + string unit
|
108
|
-
TapeMeasure::Parser.new('
|
139
|
+
it 'number + string unit once to inches' do
|
140
|
+
expect(TapeMeasure::Parser.new('3ft').value).to eq 36
|
109
141
|
end
|
110
142
|
|
111
|
-
it 'number + string unit twice to inches' do
|
112
|
-
TapeMeasure::Parser.new('
|
143
|
+
it 'number + string unit twice to inches seperated by whitespace' do
|
144
|
+
expect(TapeMeasure::Parser.new('3ft 13in').value).to eq 49
|
113
145
|
end
|
114
146
|
|
115
147
|
it 'converts single quotes to feet' do
|
116
|
-
TapeMeasure::Parser.new("1\' 2 1/3\"").value
|
117
|
-
.
|
148
|
+
expect(TapeMeasure::Parser.new("1\' 2 1/3\"").value)
|
149
|
+
.to eq(12 + 2 + (1.0 / 3).to_f)
|
118
150
|
end
|
119
151
|
|
120
152
|
it 'lots of junk spaces' do
|
121
|
-
TapeMeasure::Parser.new(" 1\' 2 1/3\" ").value
|
122
|
-
.
|
153
|
+
expect(TapeMeasure::Parser.new(" 1\' 2 1/3\" ").value)
|
154
|
+
.to eq(12 + 2 + (1.0 / 3).to_f)
|
123
155
|
end
|
124
156
|
|
125
157
|
it 'converts decimal inches' do
|
126
|
-
TapeMeasure::Parser.new(" 1\' 2.24\" ").value.
|
158
|
+
expect(TapeMeasure::Parser.new(" 1\' 2.24\" ").value).to eq 14.24
|
127
159
|
end
|
128
160
|
|
129
161
|
it 'converts decimal feet' do
|
130
|
-
TapeMeasure::Parser.new(" 1.1\' ").value.
|
162
|
+
expect(TapeMeasure::Parser.new(" 1.1\' ").value).to eq 13.2
|
131
163
|
end
|
132
164
|
|
133
165
|
it 'converts rational feet' do
|
134
|
-
TapeMeasure::Parser.new(" 1 1/10\' ").value.
|
166
|
+
expect(TapeMeasure::Parser.new(" 1 1/10\' ").value).to eq 13.2
|
135
167
|
end
|
136
168
|
|
137
169
|
it 'handle a shit ton of units when someone thinks they are funny' do
|
138
|
-
TapeMeasure::Parser.new("1' 2' 3' 127cm").value.
|
170
|
+
expect(TapeMeasure::Parser.new("1' 2' 3' 127cm").value).to eq 122.0
|
139
171
|
end
|
140
172
|
|
141
173
|
it 'handles no units' do
|
142
|
-
TapeMeasure::Parser.new('5').value.
|
174
|
+
expect(TapeMeasure::Parser.new('5').value).to eq 5
|
143
175
|
end
|
144
176
|
|
145
177
|
# expected to hand parens in this way
|
146
178
|
it 'handles paren parsing as predicted' do
|
147
|
-
TapeMeasure::Parser.new('(5) 5').value.
|
148
|
-
TapeMeasure::Parser.new('(5)(5)(5)').value.
|
179
|
+
expect(TapeMeasure::Parser.new('(5) 5').value).to eq 10
|
180
|
+
expect(TapeMeasure::Parser.new('(5)(5)(5)').value).to eq 15
|
149
181
|
end
|
150
182
|
|
151
183
|
it 'handles no units' do
|
152
|
-
TapeMeasure::Parser.new('(5+5) 5 (5+5)').value.
|
184
|
+
expect(TapeMeasure::Parser.new('(5+5) 5 (5+5)').value).to eq 25
|
153
185
|
end
|
154
186
|
|
155
187
|
it 'order of operations' do
|
156
|
-
TapeMeasure::Parser.new('(5+5*5) 5/5').value.
|
188
|
+
expect(TapeMeasure::Parser.new('(5+5*5) 5/5').value).to eq 31
|
157
189
|
end
|
158
190
|
|
159
191
|
end
|
160
192
|
|
161
193
|
describe :calculator do
|
162
194
|
it 'with length style input' do
|
163
|
-
expect(TapeMeasure::Parser.new('15.5\' + 12.7').value).to eq(198.7)
|
195
|
+
expect(TapeMeasure::Parser.new('15.5\' + 12.7"').value).to eq(198.7)
|
164
196
|
expect(TapeMeasure::Parser.new('7 1/3 inches - 4.12mm').value)
|
165
|
-
.to eq(
|
197
|
+
.to eq(Rational(13661, 1905))
|
166
198
|
expect(TapeMeasure::Parser.new('4.5 * 3').value).to eq(13.5)
|
167
199
|
expect(TapeMeasure::Parser.new('5.5 / 11').value).to eq(0.5)
|
168
|
-
expect(TapeMeasure::Parser.new('1 ft * 1
|
169
|
-
expect(TapeMeasure::Parser.new('
|
170
|
-
expect(TapeMeasure::Parser.new('
|
171
|
-
expect(TapeMeasure::Parser.new('(3 ft 1/4") * 3 1/2
|
172
|
-
|
173
|
-
|
174
|
-
expect(TapeMeasure::Parser.new('3
|
175
|
-
|
176
|
-
|
200
|
+
expect(TapeMeasure::Parser.new('1 ft * 1').value).to eq(12)
|
201
|
+
expect(TapeMeasure::Parser.new('1 ft * 1').unit).to eq("ft")
|
202
|
+
expect(TapeMeasure::Parser.new('1 ft * 1').scalar).to eq(1)
|
203
|
+
expect(TapeMeasure::Parser.new('(3 ft 1/4") * 3 1/2').value).to eq(126.875)
|
204
|
+
expect(TapeMeasure::Parser.new('(3 ft 1/4") * 3 1/2 * 4/4" ').value).to be_within(1).of(10.572916666666666)
|
205
|
+
expect(TapeMeasure::Parser.new('(3 ft 1/4") * 3 1/2 * 4/4" ').unit).to eq("ft*in")
|
206
|
+
expect(TapeMeasure::Parser.new('(3 ft 1/4") * 3 1/2 * 3/4 ').value).to eq(Rational(3045, 32))
|
207
|
+
end
|
208
|
+
it 'when no brackets to define order of operations' do
|
209
|
+
expect(TapeMeasure::Parser.new('3\' 1/4" * 3 1/2').value).to eq(126.875)
|
210
|
+
expect(TapeMeasure::Parser.new('3\' 1/4" * 3 1/2" * 4/4" ').value).to be_within(1).of(10.572916666666666)
|
211
|
+
expect(TapeMeasure::Parser.new('3\' 1/4" * 3 1/2" * 4/4" ').unit).to eq("ft*in^2")
|
212
|
+
expect(TapeMeasure::Parser.new('3\' 1/4" * 3 1/2 * 3/4 ').value).to eq(Rational(3045, 32))
|
177
213
|
end
|
178
214
|
end
|
179
215
|
it 'when called via class method helper' do
|
180
216
|
expect(TapeMeasure.parse("1\"")).to eq(1)
|
181
217
|
end
|
218
|
+
|
219
|
+
describe :match do
|
220
|
+
it 'matches' do
|
221
|
+
expect(TapeMeasure.match?('3\' 1/4" * 3 1/2" * 3/4" ')).to eq(true)
|
222
|
+
end
|
223
|
+
|
224
|
+
it 'does not match' do
|
225
|
+
expect(TapeMeasure.match?('3\' 1/4" * 3 1/2" *" ')).to eq(false)
|
226
|
+
end
|
227
|
+
|
228
|
+
it 'does not match' do
|
229
|
+
expect(TapeMeasure.match?('3\' 1/4" * 3 1/2" x hihi how are you')).to eq(false)
|
230
|
+
end
|
231
|
+
end
|
182
232
|
end
|
data/tape_measure.gemspec
CHANGED
@@ -18,7 +18,7 @@ Gem::Specification.new do |spec|
|
|
18
18
|
spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
|
19
19
|
spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
|
20
20
|
spec.require_paths = ['lib']
|
21
|
-
spec.add_development_dependency 'bundler', '~>
|
21
|
+
spec.add_development_dependency 'bundler', '~> 2.2'
|
22
22
|
spec.add_development_dependency 'rake'
|
23
23
|
spec.add_development_dependency 'rspec'
|
24
24
|
spec.add_dependency 'citrus'
|
metadata
CHANGED
@@ -1,83 +1,83 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: tape_measure
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0
|
4
|
+
version: 0.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Sam Congleton
|
8
|
-
autorequire:
|
8
|
+
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2021-03-08 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
16
16
|
requirements:
|
17
|
-
- - ~>
|
17
|
+
- - "~>"
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version: '
|
19
|
+
version: '2.2'
|
20
20
|
type: :development
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
|
-
- - ~>
|
24
|
+
- - "~>"
|
25
25
|
- !ruby/object:Gem::Version
|
26
|
-
version: '
|
26
|
+
version: '2.2'
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: rake
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
30
30
|
requirements:
|
31
|
-
- -
|
31
|
+
- - ">="
|
32
32
|
- !ruby/object:Gem::Version
|
33
33
|
version: '0'
|
34
34
|
type: :development
|
35
35
|
prerelease: false
|
36
36
|
version_requirements: !ruby/object:Gem::Requirement
|
37
37
|
requirements:
|
38
|
-
- -
|
38
|
+
- - ">="
|
39
39
|
- !ruby/object:Gem::Version
|
40
40
|
version: '0'
|
41
41
|
- !ruby/object:Gem::Dependency
|
42
42
|
name: rspec
|
43
43
|
requirement: !ruby/object:Gem::Requirement
|
44
44
|
requirements:
|
45
|
-
- -
|
45
|
+
- - ">="
|
46
46
|
- !ruby/object:Gem::Version
|
47
47
|
version: '0'
|
48
48
|
type: :development
|
49
49
|
prerelease: false
|
50
50
|
version_requirements: !ruby/object:Gem::Requirement
|
51
51
|
requirements:
|
52
|
-
- -
|
52
|
+
- - ">="
|
53
53
|
- !ruby/object:Gem::Version
|
54
54
|
version: '0'
|
55
55
|
- !ruby/object:Gem::Dependency
|
56
56
|
name: citrus
|
57
57
|
requirement: !ruby/object:Gem::Requirement
|
58
58
|
requirements:
|
59
|
-
- -
|
59
|
+
- - ">="
|
60
60
|
- !ruby/object:Gem::Version
|
61
61
|
version: '0'
|
62
62
|
type: :runtime
|
63
63
|
prerelease: false
|
64
64
|
version_requirements: !ruby/object:Gem::Requirement
|
65
65
|
requirements:
|
66
|
-
- -
|
66
|
+
- - ">="
|
67
67
|
- !ruby/object:Gem::Version
|
68
68
|
version: '0'
|
69
69
|
- !ruby/object:Gem::Dependency
|
70
70
|
name: ruby-units
|
71
71
|
requirement: !ruby/object:Gem::Requirement
|
72
72
|
requirements:
|
73
|
-
- -
|
73
|
+
- - ">="
|
74
74
|
- !ruby/object:Gem::Version
|
75
75
|
version: '0'
|
76
76
|
type: :runtime
|
77
77
|
prerelease: false
|
78
78
|
version_requirements: !ruby/object:Gem::Requirement
|
79
79
|
requirements:
|
80
|
-
- -
|
80
|
+
- - ">="
|
81
81
|
- !ruby/object:Gem::Version
|
82
82
|
version: '0'
|
83
83
|
description: Contains a text parser for converting various measurements into a base
|
@@ -88,9 +88,10 @@ executables: []
|
|
88
88
|
extensions: []
|
89
89
|
extra_rdoc_files: []
|
90
90
|
files:
|
91
|
-
- .gitignore
|
92
|
-
- .rspec
|
93
|
-
- .
|
91
|
+
- ".gitignore"
|
92
|
+
- ".rspec"
|
93
|
+
- ".ruby-version"
|
94
|
+
- ".travis.yml"
|
94
95
|
- Gemfile
|
95
96
|
- LICENSE.txt
|
96
97
|
- README.md
|
@@ -108,24 +109,23 @@ homepage: https://github.com/burningpony/tape_measure
|
|
108
109
|
licenses:
|
109
110
|
- GNU v3
|
110
111
|
metadata: {}
|
111
|
-
post_install_message:
|
112
|
+
post_install_message:
|
112
113
|
rdoc_options: []
|
113
114
|
require_paths:
|
114
115
|
- lib
|
115
116
|
required_ruby_version: !ruby/object:Gem::Requirement
|
116
117
|
requirements:
|
117
|
-
- -
|
118
|
+
- - ">="
|
118
119
|
- !ruby/object:Gem::Version
|
119
120
|
version: '0'
|
120
121
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
121
122
|
requirements:
|
122
|
-
- -
|
123
|
+
- - ">="
|
123
124
|
- !ruby/object:Gem::Version
|
124
125
|
version: '0'
|
125
126
|
requirements: []
|
126
|
-
|
127
|
-
|
128
|
-
signing_key:
|
127
|
+
rubygems_version: 3.2.3
|
128
|
+
signing_key:
|
129
129
|
specification_version: 4
|
130
130
|
summary: Measurements parser and converter.
|
131
131
|
test_files:
|