tape_measure 0.0.4 → 0.0.8
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 +4 -4
- 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 +13 -13
- data/lib/tape_measure/parser.rb +24 -6
- data/lib/tape_measure/version.rb +1 -1
- data/spec/spec_helper.rb +0 -1
- data/spec/tape_measure/formatter_spec.rb +1 -1
- data/spec/tape_measure/parser_spec.rb +90 -61
- metadata +19 -18
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: f9d69c91b96f8b88480885236d314696bdf17221
|
4
|
+
data.tar.gz: 346425787b761da85bde19b1f20952d8fdf62e72
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: b9e792bd397c623d42f08b99686acc9d63843b9f9a27bc6d443454091ac690d7b0f93b14e006c583cb00b073f9f42b37e16f6269e12772042361b79559833e7b
|
7
|
+
data.tar.gz: c552ecb3597b58db118a508309fa6d5d06d764866cdfc64789e8519cacdfb69210ce4b5b577af0f0e343865700128be240d87a10be77601b8727b8598ec814a7
|
data/.ruby-version
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
2.4.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
|
@@ -99,13 +105,7 @@ grammar LengthGrammar
|
|
99
105
|
end
|
100
106
|
|
101
107
|
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
|
-
}
|
108
|
+
(float '/' float) { Rational(*captures(:float).map(&:to_str).map(&:to_f)) }
|
109
109
|
end
|
110
110
|
|
111
111
|
rule unit
|
@@ -118,5 +118,5 @@ grammar LengthGrammar
|
|
118
118
|
|
119
119
|
rule lparen '(' space* end
|
120
120
|
rule rparen ')' space* end
|
121
|
-
rule space [
|
122
|
-
end
|
121
|
+
rule space [\s] end
|
122
|
+
end
|
data/lib/tape_measure/parser.rb
CHANGED
@@ -5,7 +5,7 @@ Citrus.load File.expand_path("../length_grammar", __FILE__)
|
|
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
|
@@ -14,14 +14,20 @@ module TapeMeasure
|
|
14
14
|
else
|
15
15
|
@value = string
|
16
16
|
end
|
17
|
-
|
18
|
-
|
19
17
|
end
|
20
18
|
|
21
19
|
def parse
|
22
|
-
|
23
|
-
|
24
|
-
|
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
|
25
31
|
end
|
26
32
|
end
|
27
33
|
|
@@ -30,5 +36,17 @@ module TapeMeasure
|
|
30
36
|
def parse(string)
|
31
37
|
Parser.new(string).value
|
32
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
|
33
51
|
end
|
34
52
|
end
|
data/lib/tape_measure/version.rb
CHANGED
data/spec/spec_helper.rb
CHANGED
@@ -23,35 +23,35 @@ describe TapeMeasure do
|
|
23
23
|
# 3-3/4" = 2.75
|
24
24
|
|
25
25
|
it 'can handle integer' do
|
26
|
-
TapeMeasure.parse(6).
|
26
|
+
expect(TapeMeasure.parse(6)).to eq 6
|
27
27
|
end
|
28
28
|
|
29
29
|
it 'can handle nil' do
|
30
|
-
TapeMeasure.parse(nil).
|
30
|
+
expect(TapeMeasure.parse(nil)).to eq nil
|
31
31
|
end
|
32
32
|
|
33
33
|
it 'can handle empty string' do
|
34
|
-
TapeMeasure.parse("").
|
34
|
+
expect(TapeMeasure.parse("")).to eq nil
|
35
35
|
end
|
36
36
|
|
37
37
|
describe :grammar do
|
38
38
|
it 'can add' do
|
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('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
|
43
43
|
end
|
44
44
|
it 'can subtract' do
|
45
|
-
TapeMeasure::Parser.new('4 - 2').value.
|
45
|
+
expect(TapeMeasure::Parser.new('4 - 2').value).to eq 2
|
46
46
|
end
|
47
47
|
|
48
48
|
it 'can evaluate parens' do
|
49
|
-
TapeMeasure::Parser.new('(8*2)').value.
|
50
|
-
TapeMeasure::Parser.new('(8)*(2)*(2)').value.
|
51
|
-
TapeMeasure::Parser.new('(8)*(2)').value.
|
52
|
-
TapeMeasure::Parser.new('(8*2)').value.
|
53
|
-
TapeMeasure::Parser.new('(8)(2)').value.
|
54
|
-
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
|
55
55
|
end
|
56
56
|
|
57
57
|
it 'will perform flops' do
|
@@ -62,46 +62,53 @@ describe TapeMeasure do
|
|
62
62
|
end
|
63
63
|
|
64
64
|
it 'can multiply rationals' do
|
65
|
-
TapeMeasure::Parser.new('(4/4 + 4)').value.
|
66
|
-
TapeMeasure::Parser.new('(3/4 +4/4)').value.
|
67
|
-
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)
|
68
68
|
end
|
69
69
|
|
70
70
|
it 'can multiply rationals and fractions' do
|
71
|
-
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 (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 77/88
|
78
|
+
expect(TapeMeasure::Parser.new('(77/88 mm)').unit).to eq "mm"
|
72
79
|
end
|
73
80
|
|
74
81
|
describe 'recognizes mixed numbers' do
|
75
82
|
|
76
83
|
it 'recognizes inches' do
|
77
|
-
TapeMeasure::Parser.new('2 inches').value.
|
78
|
-
TapeMeasure::Parser.new('2 "').value.
|
79
|
-
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
|
80
87
|
end
|
81
88
|
|
82
89
|
it 'recognizes feet' do
|
83
|
-
TapeMeasure::Parser.new('2 feet').value.
|
84
|
-
TapeMeasure::Parser.new('2\'').value.
|
85
|
-
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
|
86
93
|
end
|
87
94
|
|
88
95
|
it 'converts meters' do
|
89
|
-
TapeMeasure::Parser.new('1 meter').value.
|
90
|
-
TapeMeasure::Parser.new('1m').value.
|
96
|
+
expect(TapeMeasure::Parser.new('1 meter').value).to eq (5000/127)
|
97
|
+
expect(TapeMeasure::Parser.new('1m').value).to eq (5000/127)
|
91
98
|
end
|
92
99
|
|
93
100
|
describe 'converts centimeters' do
|
94
101
|
it 'with whitespace' do
|
95
|
-
TapeMeasure::Parser.new('127 cm').value.
|
102
|
+
expect(TapeMeasure::Parser.new('127 cm').value).to eq 50
|
96
103
|
end
|
97
104
|
it 'without whitespace' do
|
98
|
-
TapeMeasure::Parser.new('127cm').value.
|
105
|
+
expect(TapeMeasure::Parser.new('127cm').value).to eq 50
|
99
106
|
end
|
100
107
|
end
|
101
108
|
|
102
109
|
it 'converts millimeters' do
|
103
|
-
TapeMeasure::Parser.new('1270 mm').value.
|
104
|
-
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
|
105
112
|
end
|
106
113
|
end
|
107
114
|
end
|
@@ -109,86 +116,108 @@ describe TapeMeasure do
|
|
109
116
|
describe :unit_conversion do
|
110
117
|
|
111
118
|
it 'number + space + string unit twice to inches' do
|
112
|
-
TapeMeasure::Parser.new('4feet 2inches').value.
|
119
|
+
expect(TapeMeasure::Parser.new('4feet 2inches').value).to eq 50
|
120
|
+
end
|
121
|
+
|
122
|
+
it 'number + symbol unit twice to inches' do
|
123
|
+
expect(TapeMeasure::Parser.new("4'2\"").value).to eq 50
|
113
124
|
end
|
114
125
|
|
115
|
-
it 'number + string unit twice to inches' do
|
116
|
-
TapeMeasure::Parser.new(
|
126
|
+
it 'number + string unit twice to inches with no whitespace' do
|
127
|
+
expect(TapeMeasure::Parser.new('3ft10in').value).to eq 46
|
117
128
|
end
|
118
129
|
|
119
|
-
it 'number + string unit
|
120
|
-
TapeMeasure::Parser.new('
|
130
|
+
it 'number + string unit once to inches' do
|
131
|
+
expect(TapeMeasure::Parser.new('3ft').value).to eq 36
|
121
132
|
end
|
122
133
|
|
123
|
-
it 'number + string unit twice to inches' do
|
124
|
-
TapeMeasure::Parser.new('
|
134
|
+
it 'number + string unit twice to inches seperated by whitespace' do
|
135
|
+
expect(TapeMeasure::Parser.new('3ft 13in').value).to eq 49
|
125
136
|
end
|
126
137
|
|
127
138
|
it 'converts single quotes to feet' do
|
128
|
-
TapeMeasure::Parser.new("1\' 2 1/3\"").value
|
129
|
-
.
|
139
|
+
expect(TapeMeasure::Parser.new("1\' 2 1/3\"").value)
|
140
|
+
.to eq(12 + 2 + (1 / 3).to_f)
|
130
141
|
end
|
131
142
|
|
132
143
|
it 'lots of junk spaces' do
|
133
|
-
TapeMeasure::Parser.new(" 1\' 2 1/3\" ").value
|
134
|
-
.
|
144
|
+
expect(TapeMeasure::Parser.new(" 1\' 2 1/3\" ").value)
|
145
|
+
.to eq(12 + 2 + (1 / 3).to_f)
|
135
146
|
end
|
136
147
|
|
137
148
|
it 'converts decimal inches' do
|
138
|
-
TapeMeasure::Parser.new(" 1\' 2.24\" ").value.
|
149
|
+
expect(TapeMeasure::Parser.new(" 1\' 2.24\" ").value).to eq 14.24
|
139
150
|
end
|
140
151
|
|
141
152
|
it 'converts decimal feet' do
|
142
|
-
TapeMeasure::Parser.new(" 1.1\' ").value.
|
153
|
+
expect(TapeMeasure::Parser.new(" 1.1\' ").value).to eq 13.2
|
143
154
|
end
|
144
155
|
|
145
156
|
it 'converts rational feet' do
|
146
|
-
TapeMeasure::Parser.new(" 1 1/10\' ").value.
|
157
|
+
expect(TapeMeasure::Parser.new(" 1 1/10\' ").value).to eq 13.2
|
147
158
|
end
|
148
159
|
|
149
160
|
it 'handle a shit ton of units when someone thinks they are funny' do
|
150
|
-
TapeMeasure::Parser.new("1' 2' 3' 127cm").value.
|
161
|
+
expect(TapeMeasure::Parser.new("1' 2' 3' 127cm").value).to eq 122.0
|
151
162
|
end
|
152
163
|
|
153
164
|
it 'handles no units' do
|
154
|
-
TapeMeasure::Parser.new('5').value.
|
165
|
+
expect(TapeMeasure::Parser.new('5').value).to eq 5
|
155
166
|
end
|
156
167
|
|
157
168
|
# expected to hand parens in this way
|
158
169
|
it 'handles paren parsing as predicted' do
|
159
|
-
TapeMeasure::Parser.new('(5) 5').value.
|
160
|
-
TapeMeasure::Parser.new('(5)(5)(5)').value.
|
170
|
+
expect(TapeMeasure::Parser.new('(5) 5').value).to eq 10
|
171
|
+
expect(TapeMeasure::Parser.new('(5)(5)(5)').value).to eq 15
|
161
172
|
end
|
162
173
|
|
163
174
|
it 'handles no units' do
|
164
|
-
TapeMeasure::Parser.new('(5+5) 5 (5+5)').value.
|
175
|
+
expect(TapeMeasure::Parser.new('(5+5) 5 (5+5)').value).to eq 25
|
165
176
|
end
|
166
177
|
|
167
178
|
it 'order of operations' do
|
168
|
-
TapeMeasure::Parser.new('(5+5*5) 5/5').value.
|
179
|
+
expect(TapeMeasure::Parser.new('(5+5*5) 5/5').value).to eq 31
|
169
180
|
end
|
170
181
|
|
171
182
|
end
|
172
183
|
|
173
184
|
describe :calculator do
|
174
185
|
it 'with length style input' do
|
175
|
-
expect(TapeMeasure::Parser.new('15.5\' + 12.7').value).to eq(198.7)
|
186
|
+
expect(TapeMeasure::Parser.new('15.5\' + 12.7"').value).to eq(198.7)
|
176
187
|
expect(TapeMeasure::Parser.new('7 1/3 inches - 4.12mm').value)
|
177
|
-
.to eq(
|
188
|
+
.to eq(13661/1905)
|
178
189
|
expect(TapeMeasure::Parser.new('4.5 * 3').value).to eq(13.5)
|
179
190
|
expect(TapeMeasure::Parser.new('5.5 / 11').value).to eq(0.5)
|
180
|
-
expect(TapeMeasure::Parser.new('1 ft * 1
|
181
|
-
expect(TapeMeasure::Parser.new('
|
182
|
-
expect(TapeMeasure::Parser.new('
|
183
|
-
expect(TapeMeasure::Parser.new('(3 ft 1/4") * 3 1/2
|
184
|
-
|
185
|
-
|
186
|
-
expect(TapeMeasure::Parser.new('3
|
187
|
-
|
188
|
-
|
191
|
+
expect(TapeMeasure::Parser.new('1 ft * 1').value).to eq(12)
|
192
|
+
expect(TapeMeasure::Parser.new('1 ft * 1').unit).to eq("ft")
|
193
|
+
expect(TapeMeasure::Parser.new('1 ft * 1').scalar).to eq(1)
|
194
|
+
expect(TapeMeasure::Parser.new('(3 ft 1/4") * 3 1/2').value).to eq(126.875)
|
195
|
+
expect(TapeMeasure::Parser.new('(3 ft 1/4") * 3 1/2 * 4/4" ').value).to be_within(1).of(10.572916666666666)
|
196
|
+
expect(TapeMeasure::Parser.new('(3 ft 1/4") * 3 1/2 * 4/4" ').unit).to eq("ft*in")
|
197
|
+
expect(TapeMeasure::Parser.new('(3 ft 1/4") * 3 1/2 * 3/4 ').value).to eq((3045/32))
|
198
|
+
end
|
199
|
+
it 'when no brackets to define order of operations' do
|
200
|
+
expect(TapeMeasure::Parser.new('3\' 1/4" * 3 1/2').value).to eq(126.875)
|
201
|
+
expect(TapeMeasure::Parser.new('3\' 1/4" * 3 1/2" * 4/4" ').value).to be_within(1).of(10.572916666666666)
|
202
|
+
expect(TapeMeasure::Parser.new('3\' 1/4" * 3 1/2" * 4/4" ').unit).to eq("ft*in^2")
|
203
|
+
expect(TapeMeasure::Parser.new('3\' 1/4" * 3 1/2 * 3/4 ').value).to eq((3045/32))
|
189
204
|
end
|
190
205
|
end
|
191
206
|
it 'when called via class method helper' do
|
192
207
|
expect(TapeMeasure.parse("1\"")).to eq(1)
|
193
208
|
end
|
209
|
+
|
210
|
+
describe :match do
|
211
|
+
it 'matches' do
|
212
|
+
expect(TapeMeasure.match?('3\' 1/4" * 3 1/2" * 3/4" ')).to eq(true)
|
213
|
+
end
|
214
|
+
|
215
|
+
it 'does not match' do
|
216
|
+
expect(TapeMeasure.match?('3\' 1/4" * 3 1/2" *" ')).to eq(false)
|
217
|
+
end
|
218
|
+
|
219
|
+
it 'does not match' do
|
220
|
+
expect(TapeMeasure.match?('3\' 1/4" * 3 1/2" x hihi how are you')).to eq(false)
|
221
|
+
end
|
222
|
+
end
|
194
223
|
end
|
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.0.8
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Sam Congleton
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2016-12-29 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
19
|
version: '1.6'
|
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
26
|
version: '1.6'
|
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
|
@@ -114,17 +115,17 @@ 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
|
rubyforge_project:
|
127
|
-
rubygems_version: 2.
|
128
|
+
rubygems_version: 2.6.8
|
128
129
|
signing_key:
|
129
130
|
specification_version: 4
|
130
131
|
summary: Measurements parser and converter.
|