list_matcher 1.0.3 → 1.0.4
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/README.md +19 -0
- data/lib/list_matcher/version.rb +1 -1
- data/lib/list_matcher.rb +45 -24
- data/test/basic_test.rb +35 -0
- data/test/doc_test.rb +4 -0
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 621a7ac90f1ec09b2b73fd4b233f16953c0e958e
|
4
|
+
data.tar.gz: e8512d9fb2232a7951ee8cad6608eb082675ece6
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 8042b06b05edacc8ecceb31ac2057c14333c4a84c6c09f83f52858368e8733a7081dfc60c2afc7775fd3b62337c79b07afd96938fdf701fc9722a6d241d74a86
|
7
|
+
data.tar.gz: fcade9f49ae41f514cf8078766932068c3dc44d0cb0f53b5cedbad55c6f4e689828f8650828c58e3935d75015eab784f90edd6e286caae32eff76086e92ae475
|
data/README.md
CHANGED
@@ -151,6 +151,22 @@ Each item should match the entire string compared against, so the boundary symbo
|
|
151
151
|
List::Matcher.pattern %w(cat), bound: :string # "(?:\\Acat\\z)"
|
152
152
|
```
|
153
153
|
|
154
|
+
**NOTE** for each of these variants, `:word`, `:line`, and `:string` there are `left` and `right` subvarieties that
|
155
|
+
only append their boundary marker to that side of the word:
|
156
|
+
|
157
|
+
```ruby
|
158
|
+
List::Matcher.pattern %w(cat), bound: :word_left # "(?:\\bcat)"
|
159
|
+
List::Matcher.pattern %w(cat), bound: :string_left # "(?:\\Acat)"
|
160
|
+
List::Matcher.pattern %w(cat), bound: :line_right # "(?:cat$)"
|
161
|
+
```
|
162
|
+
|
163
|
+
Note also that `List::Matcher` will only append the boundary marker when it is appropriate according to
|
164
|
+
the test, so items for which the test fails will not receive a boundary marker of any sort:
|
165
|
+
|
166
|
+
```ruby
|
167
|
+
List::Matcher.pattern %w( cat #@% ), bound: :word # "(?:\\#@%|\\bcat\\b)"
|
168
|
+
```
|
169
|
+
|
154
170
|
```ruby
|
155
171
|
bound: { test: /\d/, left: '(?<!\d)', right: '(?!\d)'}
|
156
172
|
```
|
@@ -163,6 +179,9 @@ List::Matcher.pattern (1...1000).to_a, bound: { test: /\d/, left: '(?<!\d)', rig
|
|
163
179
|
# "(?:(?<!\\d)[1-9](?:\\d\\d?)?(?!\\d))"
|
164
180
|
```
|
165
181
|
|
182
|
+
As with the predefined boundaries -- `:word_left`, `:line_right`, `:string_left`, etc. -- you can bound items only at one
|
183
|
+
margin, in this case by providing only the `left:` or `right:` key-value pair.
|
184
|
+
|
166
185
|
**NOTE** Because boundary tests cannot be applied to symbols, the bound option will give you strange results if you use it
|
167
186
|
with a list any of whose items have a symbol at their leading or trailing margin.
|
168
187
|
|
data/lib/list_matcher/version.rb
CHANGED
data/lib/list_matcher.rb
CHANGED
@@ -49,23 +49,40 @@ module List
|
|
49
49
|
@name = name
|
50
50
|
end
|
51
51
|
end
|
52
|
-
|
53
|
-
|
54
|
-
@left_bound = '\A'
|
55
|
-
@right_bound = '\z'
|
56
|
-
elsif bound == :line
|
57
|
-
@word_test = /./
|
58
|
-
@left_bound = '^'
|
59
|
-
@right_bound = '$'
|
60
|
-
elsif bound.is_a? Hash
|
61
|
-
@word_test = bound[:test] || raise(SyntaxError.new('no boundary test provided'))
|
62
|
-
@left_bound = bound[:left] || raise(SyntaxError.new('no left boundary expression provided'))
|
63
|
-
@right_bound = bound[:right] || raise(SyntaxError.new('no right boundary expression provided'))
|
64
|
-
elsif bound === true || bound == :word
|
52
|
+
case bound
|
53
|
+
when TrueClass
|
65
54
|
@word_test = /\w/
|
66
55
|
@left_bound = '\b'
|
67
56
|
@right_bound = '\b'
|
68
|
-
|
57
|
+
when FalseClass
|
58
|
+
when Symbol
|
59
|
+
case bound
|
60
|
+
when :string, :string_left, :string_right
|
61
|
+
@word_test = /./
|
62
|
+
@left_bound = '\A'
|
63
|
+
@right_bound = '\z'
|
64
|
+
when :line, :line_left, :line_right
|
65
|
+
@word_test = /./
|
66
|
+
@left_bound = '^'
|
67
|
+
@right_bound = '$'
|
68
|
+
when :word, :word_left, :word_right
|
69
|
+
@word_test = /\w/
|
70
|
+
@left_bound = '\b'
|
71
|
+
@right_bound = '\b'
|
72
|
+
else
|
73
|
+
raise "unfamiliar value for :bound option: #{bound.inspect}"
|
74
|
+
end
|
75
|
+
if /_left/ === bound.to_s
|
76
|
+
@right_bound = nil
|
77
|
+
elsif /_right/ === bound.to_s
|
78
|
+
@left_bound = nil
|
79
|
+
end
|
80
|
+
when Hash
|
81
|
+
@word_test = bound[:test] || raise('no boundary test provided')
|
82
|
+
@left_bound = bound[:left]
|
83
|
+
@right_bound = bound[:right]
|
84
|
+
raise 'neither bound provided' unless @left_bound || @right_bound
|
85
|
+
else
|
69
86
|
raise "unfamiliar value for :bound option: #{bound.inspect}"
|
70
87
|
end
|
71
88
|
symbols.keys.each do |k|
|
@@ -339,12 +356,16 @@ module List
|
|
339
356
|
end
|
340
357
|
end
|
341
358
|
if engine.bound
|
342
|
-
|
343
|
-
|
344
|
-
|
345
|
-
|
346
|
-
|
347
|
-
|
359
|
+
if engine.left_bound
|
360
|
+
c = ( max += 1 ).chr
|
361
|
+
@left = SpecialPattern.new engine, c, c, engine.left_bound
|
362
|
+
@specials << @left
|
363
|
+
end
|
364
|
+
if engine.right_bound
|
365
|
+
c = ( max += 1 ).chr
|
366
|
+
@right = SpecialPattern.new engine, c, c, engine.right_bound
|
367
|
+
@specials << @right
|
368
|
+
end
|
348
369
|
end
|
349
370
|
end
|
350
371
|
|
@@ -384,11 +405,11 @@ module List
|
|
384
405
|
p = specials.detect{ |sp| sp.var === p }
|
385
406
|
special_map[p.char] = p
|
386
407
|
if engine.bound
|
387
|
-
if i == 0 && p.left
|
408
|
+
if i == 0 && engine.left_bound && p.left
|
388
409
|
p = "#{left}#{p}" if t
|
389
410
|
l = true
|
390
411
|
end
|
391
|
-
if i == e && p.right
|
412
|
+
if i == e && engine.right_bound && p.right
|
392
413
|
p = "#{p}#{right}"
|
393
414
|
r = true
|
394
415
|
end
|
@@ -396,11 +417,11 @@ module List
|
|
396
417
|
else
|
397
418
|
p = p.downcase if engine.case_insensitive
|
398
419
|
if engine.bound
|
399
|
-
if i == 0 && engine.word_test === p[0]
|
420
|
+
if i == 0 && engine.left_bound && engine.word_test === p[0]
|
400
421
|
p = "#{left}#{p}"
|
401
422
|
l = true
|
402
423
|
end
|
403
|
-
if i == e && engine.word_test === p[-1]
|
424
|
+
if i == e && engine.right_bound && engine.word_test === p[-1]
|
404
425
|
p = "#{p}#{right}"
|
405
426
|
r = true
|
406
427
|
end
|
data/test/basic_test.rb
CHANGED
@@ -149,6 +149,16 @@ class BasicTest < Minitest::Test
|
|
149
149
|
assert ' cat ' !~ rx, 'word boundaries do not suffice'
|
150
150
|
end
|
151
151
|
|
152
|
+
def test_string_left_bound
|
153
|
+
rx = List::Matcher.pattern ['cat'], bound: :string_left
|
154
|
+
assert_equal '(?:\Acat)', rx
|
155
|
+
end
|
156
|
+
|
157
|
+
def test_string_right_bound
|
158
|
+
rx = List::Matcher.pattern ['cat'], bound: :string_right
|
159
|
+
assert_equal '(?:cat\z)', rx
|
160
|
+
end
|
161
|
+
|
152
162
|
def test_line_bound
|
153
163
|
rx = List::Matcher.pattern ['cat'], bound: :line
|
154
164
|
assert_equal '(?:^cat$)', rx
|
@@ -158,6 +168,31 @@ class BasicTest < Minitest::Test
|
|
158
168
|
assert ' cat ' !~ rx, 'word boundaries do not suffice'
|
159
169
|
end
|
160
170
|
|
171
|
+
def test_line_left_bound
|
172
|
+
rx = List::Matcher.pattern ['cat'], bound: :line_left
|
173
|
+
assert_equal '(?:^cat)', rx
|
174
|
+
end
|
175
|
+
|
176
|
+
def test_line_right_bound
|
177
|
+
rx = List::Matcher.pattern ['cat'], bound: :line_right
|
178
|
+
assert_equal '(?:cat$)', rx
|
179
|
+
end
|
180
|
+
|
181
|
+
def test_word_bound
|
182
|
+
rx = List::Matcher.pattern %w( cat dog ), bound: :word
|
183
|
+
assert_equal '(?:\b(?:cat|dog)\b)', rx
|
184
|
+
end
|
185
|
+
|
186
|
+
def test_word_left_bound
|
187
|
+
rx = List::Matcher.pattern %w( cat dog ), bound: :word_left
|
188
|
+
assert_equal '(?:\b(?:cat|dog))', rx
|
189
|
+
end
|
190
|
+
|
191
|
+
def test_word_right_bound
|
192
|
+
rx = List::Matcher.pattern %w( cat dog ), bound: :word_right
|
193
|
+
assert_equal '(?:(?:cat|dog)\b)', rx
|
194
|
+
end
|
195
|
+
|
161
196
|
def test_dup_atomic
|
162
197
|
m = List::Matcher.new atomic: true
|
163
198
|
rx = m.pattern %w( cat dog ), atomic: false
|
data/test/doc_test.rb
CHANGED
@@ -99,6 +99,10 @@ class DocTest < Minitest::Test
|
|
99
99
|
assert_nil date_20th_century.match('this is not actually a date')
|
100
100
|
assert_equal "(?:\\#\\ is\\ sometimes\\ called\\ the\\ pound\\ symbol|cat\\ and\\ dog)", (List::Matcher.pattern [ 'cat and dog', '# is sometimes called the pound symbol' ])
|
101
101
|
assert_equal "(?-x:cat and dog|# is sometimes called the pound symbol)", (List::Matcher.pattern [ 'cat and dog', '# is sometimes called the pound symbol' ], not_extended: true)
|
102
|
+
assert_equal "(?:\\bcat)", List::Matcher.pattern( %w(cat), bound: :word_left )
|
103
|
+
assert_equal "(?:\\Acat)", List::Matcher.pattern( %w(cat), bound: :string_left )
|
104
|
+
assert_equal "(?:cat$)", List::Matcher.pattern( %w(cat), bound: :line_right )
|
105
|
+
assert_equal "(?:\\#@%|\\bcat\\b)", List::Matcher.pattern( %w( cat #@% ), bound: :word )
|
102
106
|
end
|
103
107
|
|
104
108
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: list_matcher
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.0.
|
4
|
+
version: 1.0.4
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- dfhoughton
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-08-
|
11
|
+
date: 2015-08-30 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|