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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: 93b93a3d35fe674240ee1b437dfce34bf07f8b79
4
- data.tar.gz: a15b6939c253701e737ccdda1abc1a809e874d72
2
+ SHA256:
3
+ metadata.gz: 56db6cb67bc3f529296291bc228c342104c4f2c1ec4a39b535635773579b5a7c
4
+ data.tar.gz: 95e4d5af5c333feb061664d4724b65ab0fab4adc6fee8852eedca096ad795955
5
5
  SHA512:
6
- metadata.gz: 987529dd302b6245d280e3ddb27b60418d8b56dc72ac69910cb30a4eeee2b676273eeb936ddab2f2a35208ad3d92c3e1b21ce0f8fa03f79e747c6e6977f8912d
7
- data.tar.gz: e88bf6448952931a795942eaecbb7ea97f1c41b4318ad0fa594f3ccf32c18b1e9e76c3968d01feea990fb2c7b58a7cfa8569a64de2049dddeb194c8553047693
6
+ metadata.gz: 5290d48338267e7d5712030618a8e3d08ae2565fdd341bdfa8b3ceb7666ff931f2f6b805aec7d768e07017a0f35940a156c6da0aeca8ba415da2b1ad77c21994
7
+ data.tar.gz: 38ea3569c0a9ac937da44385164d0a9d99d95c6cbb4a650f7d18199b72468961d809d85d8c4ecef224ebadaa6a87d15581e5f6c9a5d1e9031352346a6f6298ce
data/.ruby-version ADDED
@@ -0,0 +1 @@
1
+ 3.0.0
data/.travis.yml CHANGED
@@ -1,6 +1,8 @@
1
1
  language: ruby
2
+ sudo: false
2
3
  rvm:
3
- - 2.1.2
4
+ - 2.3.3
5
+ - 2.4.1
4
6
  before_install:
5
7
  - gem install bundler --pre
6
- script: bundle exec rake spec
8
+ script: bundle exec rake spec
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::Parser.new('6ft').parse = 72
9
- TapeMeasure::Parser.new('6in').parse = 6
10
- TapeMeasure::Parser.new('6ft 6in').parse = 78
11
- TapeMeasure::Parser.new('6 * 6').parse = 36
12
- TapeMeasure::Parser.new('(6ft 6in) + 6in').parse = 84
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
- .to_mixed_number('12"') = ['1ft', '12in', '#m', etc]
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
- require 'tape_measure/formatter'
2
- require 'tape_measure/parser'
3
- require 'tape_measure/version'
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
- @mixed_number = @unit_array.compact.join
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
- if @inches > 0
27
- @unit_array << ' ' if @feet > 0
28
- @unit_array << "#{@inches}"
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.to_f }
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.to_r }
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 [ \t\n\r] end
122
- end
127
+ rule space [\s] end
128
+ end
@@ -1,22 +1,33 @@
1
1
  require 'citrus'
2
2
  require 'ruby_units/namespaced'
3
- Citrus.load 'lib/tape_measure/length_grammar'
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
- return @string.blank? if @string == 0.0
13
- parse
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
- @value = LengthGrammar.parse(@string.strip).value
18
- rescue => ex
19
- ex.message
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
@@ -1,3 +1,3 @@
1
1
  module TapeMeasure
2
- VERSION = '0.0.1'
2
+ VERSION = '0.1.0'
3
3
  end
data/spec/spec_helper.rb CHANGED
@@ -7,7 +7,6 @@
7
7
  require 'tape_measure'
8
8
 
9
9
  RSpec.configure do |config|
10
- config.treat_symbols_as_metadata_keys_with_true_values = true
11
10
  config.run_all_when_everything_filtered = true
12
11
  config.filter_run :focus
13
12
 
@@ -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.should eq 10
27
- TapeMeasure::Parser.new('8+2').value.should eq 10
28
- TapeMeasure::Parser.new('(8 + 2)').value.should eq 10
29
- TapeMeasure::Parser.new('8 + 2').value.should eq 10
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.should eq 2
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.should eq 16
38
- TapeMeasure::Parser.new('(8)*(2)*(2)').value.should eq 32
39
- TapeMeasure::Parser.new('(8)*(2)').value.should eq 16
40
- TapeMeasure::Parser.new('(8*2)').value.should eq 16
41
- TapeMeasure::Parser.new('(8)(2)').value.should eq 10
42
- TapeMeasure::Parser.new('(2+8*2+2)*2').value.should eq 40
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.should eq 5
54
- TapeMeasure::Parser.new('(3/4 +4/4)').value.should eq '7/4'.to_r
55
- TapeMeasure::Parser.new('(3/4 *4/1)').value.should eq '12/4'.to_r
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.should eq 7.0 / 4.0
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.should eq 2
66
- TapeMeasure::Parser.new('2 "').value.should eq 2
67
- TapeMeasure::Parser.new('2in').value.should eq 2
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.should eq 24
72
- TapeMeasure::Parser.new('2\'').value.should eq 24
73
- TapeMeasure::Parser.new('2ft').value.should eq 24
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.should eq 39.3701
78
- TapeMeasure::Parser.new('1m').value.should eq 39.3701
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.should eq 50
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.should eq 50
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.should eq 50
92
- TapeMeasure::Parser.new('1270mm').value.should eq 50
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.should eq 50
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("4'2\"").value.should eq 50
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 twice to inches' do
108
- TapeMeasure::Parser.new('3ft10in').value.should eq 46
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('3ft13in').value.should eq 49
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
- .should eq(12 + 2 + (1 / 3).to_f.round(4))
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
- .should eq(12 + 2 + (1 / 3).to_f.round(4))
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.should eq 14.24
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.should eq 13.2
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.should eq 13.2
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.should eq 122.0
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.should eq 5
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.should eq 10
148
- TapeMeasure::Parser.new('(5)(5)(5)').value.should eq 15
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.should eq 25
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.should eq 31
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(7.1711)
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 inch').value).to eq(12)
169
- expect(TapeMeasure::Parser.new('(3 ft 1/4") * 3 1/2 inch').value).to eq(126.875)
170
- expect(TapeMeasure::Parser.new('(3 ft 1/4") * 3 1/2 inch * 4/4" ').value).to eq(126.875)
171
- expect(TapeMeasure::Parser.new('(3 ft 1/4") * 3 1/2 inch * 3/4" ').value).to eq(95.15625)
172
- end
173
- it 'when no brackets to define order of operations' do
174
- expect(TapeMeasure::Parser.new('3\' 1/4" * 3 1/2"').value).to eq(126.875)
175
- expect(TapeMeasure::Parser.new('3\' 1/4" * 3 1/2" * 4/4" ').value).to eq(126.875)
176
- expect(TapeMeasure::Parser.new('3\' 1/4" * 3 1/2" * 3/4" ').value).to eq(95.15625)
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', '~> 1.6'
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.1
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: 2014-05-28 00:00:00.000000000 Z
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: '1.6'
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: '1.6'
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
- - .travis.yml
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
- rubyforge_project:
127
- rubygems_version: 2.0.3
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: