unicode_scanner 1.0.0 → 1.0.1
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 +7 -0
- data/.rspec +1 -0
- data/.ruby-gemset +1 -0
- data/.ruby-version +1 -0
- data/.travis.yml +7 -0
- data/Gemfile +1 -1
- data/Gemfile.lock +64 -19
- data/Rakefile +5 -7
- data/VERSION +1 -1
- data/lib/unicode_scanner.rb +36 -17
- data/spec/spec_helper.rb +1 -2
- data/spec/unicode_scanner_spec.rb +120 -122
- data/unicode_scanner.gemspec +29 -32
- metadata +22 -36
- data/.rvmrc +0 -1
checksums.yaml
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
---
|
|
2
|
+
SHA256:
|
|
3
|
+
metadata.gz: 544fe42b2d42bf92fd7d75f883dfaaa302bfebe3e5d63915041981f6826fd992
|
|
4
|
+
data.tar.gz: ce414e2699c4d09bc6792ba23358ec7a58f8e275d3ba6b849e646528e74c42f3
|
|
5
|
+
SHA512:
|
|
6
|
+
metadata.gz: c23b7ee2d1604f260fd5007243b71ab8d93b5bedd44c3b3951ed4c462b0210412e7ac0500b28ea2654e6e57c83419e439a55d02434ea8cf20b80119f3bb9b7fe
|
|
7
|
+
data.tar.gz: 325d033aa740c34e0d6c819bc62e14ed45f28f769919dc9920d1c24d39552bf7ef153116920fd7481a3c7bce8d0e397eb86c851f009d43726a1741e6a0bb96dd
|
data/.rspec
CHANGED
data/.ruby-gemset
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
scanner
|
data/.ruby-version
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
2.7.0
|
data/.travis.yml
ADDED
data/Gemfile
CHANGED
data/Gemfile.lock
CHANGED
|
@@ -1,27 +1,69 @@
|
|
|
1
1
|
GEM
|
|
2
|
-
remote:
|
|
2
|
+
remote: https://rubygems.org/
|
|
3
3
|
specs:
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
4
|
+
addressable (2.4.0)
|
|
5
|
+
builder (3.2.4)
|
|
6
|
+
descendants_tracker (0.0.4)
|
|
7
|
+
thread_safe (~> 0.3, >= 0.3.1)
|
|
8
|
+
diff-lcs (1.3)
|
|
9
|
+
faraday (0.9.2)
|
|
10
|
+
multipart-post (>= 1.2, < 3)
|
|
11
|
+
git (1.5.0)
|
|
12
|
+
github_api (0.16.0)
|
|
13
|
+
addressable (~> 2.4.0)
|
|
14
|
+
descendants_tracker (~> 0.0.4)
|
|
15
|
+
faraday (~> 0.8, < 0.10)
|
|
16
|
+
hashie (>= 3.4)
|
|
17
|
+
mime-types (>= 1.16, < 3.0)
|
|
18
|
+
oauth2 (~> 1.0)
|
|
19
|
+
hashie (4.0.0)
|
|
20
|
+
highline (2.0.3)
|
|
21
|
+
jeweler (2.3.9)
|
|
22
|
+
builder
|
|
23
|
+
bundler
|
|
8
24
|
git (>= 1.2.5)
|
|
25
|
+
github_api (~> 0.16.0)
|
|
26
|
+
highline (>= 1.6.15)
|
|
27
|
+
nokogiri (>= 1.5.10)
|
|
28
|
+
psych
|
|
9
29
|
rake
|
|
10
30
|
rdoc
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
31
|
+
semver2
|
|
32
|
+
jwt (2.2.1)
|
|
33
|
+
mime-types (2.99.3)
|
|
34
|
+
mini_portile2 (2.4.0)
|
|
35
|
+
multi_json (1.14.1)
|
|
36
|
+
multi_xml (0.6.0)
|
|
37
|
+
multipart-post (2.1.1)
|
|
38
|
+
nokogiri (1.10.7)
|
|
39
|
+
mini_portile2 (~> 2.4.0)
|
|
40
|
+
oauth2 (1.4.2)
|
|
41
|
+
faraday (>= 0.8, < 2.0)
|
|
42
|
+
jwt (>= 1.0, < 3.0)
|
|
43
|
+
multi_json (~> 1.3)
|
|
44
|
+
multi_xml (~> 0.5)
|
|
45
|
+
rack (>= 1.2, < 3)
|
|
46
|
+
psych (3.1.0)
|
|
47
|
+
rack (2.0.8)
|
|
48
|
+
rake (13.0.1)
|
|
49
|
+
rdoc (6.2.1)
|
|
50
|
+
redcarpet (3.5.0)
|
|
51
|
+
rspec (3.9.0)
|
|
52
|
+
rspec-core (~> 3.9.0)
|
|
53
|
+
rspec-expectations (~> 3.9.0)
|
|
54
|
+
rspec-mocks (~> 3.9.0)
|
|
55
|
+
rspec-core (3.9.0)
|
|
56
|
+
rspec-support (~> 3.9.0)
|
|
57
|
+
rspec-expectations (3.9.0)
|
|
58
|
+
diff-lcs (>= 1.2.0, < 2.0)
|
|
59
|
+
rspec-support (~> 3.9.0)
|
|
60
|
+
rspec-mocks (3.9.0)
|
|
61
|
+
diff-lcs (>= 1.2.0, < 2.0)
|
|
62
|
+
rspec-support (~> 3.9.0)
|
|
63
|
+
rspec-support (3.9.0)
|
|
64
|
+
semver2 (3.4.2)
|
|
65
|
+
thread_safe (0.3.6)
|
|
66
|
+
yard (0.9.20)
|
|
25
67
|
|
|
26
68
|
PLATFORMS
|
|
27
69
|
ruby
|
|
@@ -32,3 +74,6 @@ DEPENDENCIES
|
|
|
32
74
|
redcarpet
|
|
33
75
|
rspec
|
|
34
76
|
yard
|
|
77
|
+
|
|
78
|
+
BUNDLED WITH
|
|
79
|
+
2.1.2
|
data/Rakefile
CHANGED
|
@@ -1,12 +1,10 @@
|
|
|
1
|
-
# encoding: utf-8
|
|
2
|
-
|
|
3
1
|
require 'rubygems'
|
|
4
2
|
require 'bundler'
|
|
5
3
|
begin
|
|
6
4
|
Bundler.setup(:default, :development)
|
|
7
5
|
rescue Bundler::BundlerError => e
|
|
8
|
-
|
|
9
|
-
|
|
6
|
+
warn e.message
|
|
7
|
+
warn "Run `bundle install` to install missing gems"
|
|
10
8
|
exit e.status_code
|
|
11
9
|
end
|
|
12
10
|
require 'rake'
|
|
@@ -17,8 +15,8 @@ Jeweler::Tasks.new do |gem|
|
|
|
17
15
|
gem.name = "unicode_scanner"
|
|
18
16
|
gem.homepage = "http://github.com/RISCfuture/unicode_scanner"
|
|
19
17
|
gem.license = "MIT"
|
|
20
|
-
gem.summary = %
|
|
21
|
-
gem.description = %
|
|
18
|
+
gem.summary = %(Unicode-aware implementation of StringScanner)
|
|
19
|
+
gem.description = %(An implementation of StringScanner that doesn't split multibyte characters.)
|
|
22
20
|
gem.email = "git@timothymorgan.info"
|
|
23
21
|
gem.authors = ["Tim Morgan"]
|
|
24
22
|
# dependencies defined in Gemfile
|
|
@@ -49,5 +47,5 @@ YARD::Rake::YardocTask.new('doc') do |doc|
|
|
|
49
47
|
doc.options << '-o' << 'doc'
|
|
50
48
|
doc.options << '--title' << 'Unicode String Scanner Documentation'
|
|
51
49
|
|
|
52
|
-
doc.files = %w
|
|
50
|
+
doc.files = %w[lib/**/* README.md]
|
|
53
51
|
end
|
data/VERSION
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
1.0.
|
|
1
|
+
1.0.1
|
data/lib/unicode_scanner.rb
CHANGED
|
@@ -165,8 +165,9 @@ class UnicodeScanner
|
|
|
165
165
|
# s.bol? # => true
|
|
166
166
|
|
|
167
167
|
def beginning_of_line?
|
|
168
|
-
return nil if @current > @string.
|
|
169
|
-
return true if @current
|
|
168
|
+
return nil if @current > @string.size
|
|
169
|
+
return true if @current.zero?
|
|
170
|
+
|
|
170
171
|
return @string[@current - 1] == "\n"
|
|
171
172
|
end
|
|
172
173
|
|
|
@@ -259,7 +260,8 @@ class UnicodeScanner
|
|
|
259
260
|
|
|
260
261
|
def getch
|
|
261
262
|
return nil if eos?
|
|
262
|
-
|
|
263
|
+
|
|
264
|
+
do_scan(/./u, true, true, true)
|
|
263
265
|
end
|
|
264
266
|
|
|
265
267
|
# Returns a string that represents the UnicodeScanner object, showing:
|
|
@@ -277,14 +279,23 @@ class UnicodeScanner
|
|
|
277
279
|
# s.inspect # -> '#<UnicodeScanner 10/21 "...ec 12" @ " 1975...">'
|
|
278
280
|
|
|
279
281
|
def inspect
|
|
280
|
-
return "#<#{self.class
|
|
281
|
-
return "#<#{self.class
|
|
282
|
-
|
|
283
|
-
if @current
|
|
284
|
-
return "#<%
|
|
282
|
+
return "#<#{self.class} (uninitialized)>" if @string.nil?
|
|
283
|
+
return "#<#{self.class} fin>" if eos?
|
|
284
|
+
|
|
285
|
+
if @current.zero?
|
|
286
|
+
return format("#<%{class} %<cur>d/%<len>d @ %{after}>",
|
|
287
|
+
class: self.class.to_s,
|
|
288
|
+
cur: @current,
|
|
289
|
+
len: @string.length,
|
|
290
|
+
after: inspect_after.inspect)
|
|
285
291
|
end
|
|
286
292
|
|
|
287
|
-
"#<%
|
|
293
|
+
format("#<%{class} %<cur>d/%<len>d %{before} @ %{after}>",
|
|
294
|
+
class: self.class.to_s,
|
|
295
|
+
cur: @current,
|
|
296
|
+
len: @string.length,
|
|
297
|
+
before: inspect_before.inspect,
|
|
298
|
+
after: inspect_after.inspect)
|
|
288
299
|
end
|
|
289
300
|
|
|
290
301
|
# Tests whether the given `pattern` is matched from the current scan pointer.
|
|
@@ -311,6 +322,7 @@ class UnicodeScanner
|
|
|
311
322
|
|
|
312
323
|
def matched
|
|
313
324
|
return nil unless @matched
|
|
325
|
+
|
|
314
326
|
@matches[0]
|
|
315
327
|
end
|
|
316
328
|
|
|
@@ -335,6 +347,7 @@ class UnicodeScanner
|
|
|
335
347
|
|
|
336
348
|
def matched_size
|
|
337
349
|
return nil unless @matched
|
|
350
|
+
|
|
338
351
|
@matches.end(0) - @matches.begin(0)
|
|
339
352
|
end
|
|
340
353
|
|
|
@@ -351,6 +364,7 @@ class UnicodeScanner
|
|
|
351
364
|
|
|
352
365
|
def peek(len)
|
|
353
366
|
return '' if eos?
|
|
367
|
+
|
|
354
368
|
@string[@current, len]
|
|
355
369
|
end
|
|
356
370
|
|
|
@@ -384,9 +398,10 @@ class UnicodeScanner
|
|
|
384
398
|
# s.rest # -> "ring"
|
|
385
399
|
|
|
386
400
|
def pos=(n)
|
|
387
|
-
n += @string.length if n
|
|
388
|
-
raise RangeError, "index out of range" if n
|
|
401
|
+
n += @string.length if n.negative?
|
|
402
|
+
raise RangeError, "index out of range" if n.negative?
|
|
389
403
|
raise RangeError, "index out of range" if n > @string.length
|
|
404
|
+
|
|
390
405
|
@current = n
|
|
391
406
|
end
|
|
392
407
|
|
|
@@ -401,6 +416,7 @@ class UnicodeScanner
|
|
|
401
416
|
|
|
402
417
|
def post_match
|
|
403
418
|
return nil unless @matched
|
|
419
|
+
|
|
404
420
|
@string[@previous + @matches.end(0), @string.length]
|
|
405
421
|
end
|
|
406
422
|
|
|
@@ -415,6 +431,7 @@ class UnicodeScanner
|
|
|
415
431
|
|
|
416
432
|
def pre_match
|
|
417
433
|
return nil unless @matched
|
|
434
|
+
|
|
418
435
|
@string[0, @previous + @matches.begin(0)]
|
|
419
436
|
end
|
|
420
437
|
|
|
@@ -430,6 +447,7 @@ class UnicodeScanner
|
|
|
430
447
|
|
|
431
448
|
def rest
|
|
432
449
|
return '' if eos?
|
|
450
|
+
|
|
433
451
|
return @string[@current, @string.length]
|
|
434
452
|
end
|
|
435
453
|
|
|
@@ -437,6 +455,7 @@ class UnicodeScanner
|
|
|
437
455
|
|
|
438
456
|
def rest_size
|
|
439
457
|
return 0 if eos?
|
|
458
|
+
|
|
440
459
|
@string.length - @current
|
|
441
460
|
end
|
|
442
461
|
|
|
@@ -550,7 +569,7 @@ class UnicodeScanner
|
|
|
550
569
|
|
|
551
570
|
# @return [String] The string being scanned.
|
|
552
571
|
|
|
553
|
-
|
|
572
|
+
attr_reader :string
|
|
554
573
|
|
|
555
574
|
# Changes the string being scanned to `str` and resets the scanner.
|
|
556
575
|
#
|
|
@@ -561,7 +580,6 @@ class UnicodeScanner
|
|
|
561
580
|
@string = str
|
|
562
581
|
@matched = false
|
|
563
582
|
@current = 0
|
|
564
|
-
str
|
|
565
583
|
end
|
|
566
584
|
|
|
567
585
|
# Set the scan pointer to the end of the string and clear matching data.
|
|
@@ -586,6 +604,7 @@ class UnicodeScanner
|
|
|
586
604
|
|
|
587
605
|
def unscan
|
|
588
606
|
raise ScanError, "unscan failed: previous match record not exist" unless @matched
|
|
607
|
+
|
|
589
608
|
@current = @previous
|
|
590
609
|
@matched = false
|
|
591
610
|
self
|
|
@@ -602,7 +621,7 @@ class UnicodeScanner
|
|
|
602
621
|
@matches = regex.match(@string[@current, @string.length])
|
|
603
622
|
return nil unless @matches
|
|
604
623
|
|
|
605
|
-
if head_only && @matches.begin(0)
|
|
624
|
+
if head_only && @matches.begin(0).positive?
|
|
606
625
|
@matches = nil
|
|
607
626
|
return nil
|
|
608
627
|
end
|
|
@@ -618,8 +637,8 @@ class UnicodeScanner
|
|
|
618
637
|
end
|
|
619
638
|
end
|
|
620
639
|
|
|
621
|
-
def inspect_before
|
|
622
|
-
return '' if @current
|
|
640
|
+
def inspect_before
|
|
641
|
+
return '' if @current.zero?
|
|
623
642
|
|
|
624
643
|
str = String.new
|
|
625
644
|
len = 0
|
|
@@ -635,7 +654,7 @@ class UnicodeScanner
|
|
|
635
654
|
return str
|
|
636
655
|
end
|
|
637
656
|
|
|
638
|
-
def inspect_after
|
|
657
|
+
def inspect_after
|
|
639
658
|
return '' if eos?
|
|
640
659
|
|
|
641
660
|
str = String.new
|
data/spec/spec_helper.rb
CHANGED
|
@@ -5,8 +5,7 @@ require 'unicode_scanner'
|
|
|
5
5
|
|
|
6
6
|
# Requires supporting files with custom matchers and macros, etc,
|
|
7
7
|
# in ./support/ and its subdirectories.
|
|
8
|
-
Dir["#{File.dirname(__FILE__)}/support/**/*.rb"].each {|f| require f}
|
|
8
|
+
Dir["#{File.dirname(__FILE__)}/support/**/*.rb"].sort.each { |f| require f }
|
|
9
9
|
|
|
10
10
|
RSpec.configure do |config|
|
|
11
|
-
|
|
12
11
|
end
|
|
@@ -1,206 +1,204 @@
|
|
|
1
|
-
# encoding: utf-8
|
|
2
|
-
|
|
3
1
|
require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
|
|
4
2
|
|
|
5
3
|
describe UnicodeScanner do
|
|
6
4
|
it "should pass all the class-level examples" do
|
|
7
|
-
s =
|
|
8
|
-
s.eos
|
|
5
|
+
s = described_class.new('This is an example string')
|
|
6
|
+
expect(s.eos?).to eq(false)
|
|
9
7
|
|
|
10
|
-
s.scan(/\w+/).
|
|
11
|
-
s.scan(/\w+/).
|
|
12
|
-
s.scan(/\s+/).
|
|
13
|
-
s.scan(/\s+/).
|
|
14
|
-
s.scan(/\w+/).
|
|
15
|
-
s.eos
|
|
8
|
+
expect(s.scan(/\w+/)).to eq("This")
|
|
9
|
+
expect(s.scan(/\w+/)).to eq(nil)
|
|
10
|
+
expect(s.scan(/\s+/)).to eq(" ")
|
|
11
|
+
expect(s.scan(/\s+/)).to eq(nil)
|
|
12
|
+
expect(s.scan(/\w+/)).to eq("is")
|
|
13
|
+
expect(s.eos?).to eq(false)
|
|
16
14
|
|
|
17
|
-
s.scan(/\s+/).
|
|
18
|
-
s.scan(/\w+/).
|
|
19
|
-
s.scan(/\s+/).
|
|
20
|
-
s.scan(/\w+/).
|
|
21
|
-
s.scan(/\s+/).
|
|
22
|
-
s.scan(/\w+/).
|
|
23
|
-
s.eos
|
|
15
|
+
expect(s.scan(/\s+/)).to eq(" ")
|
|
16
|
+
expect(s.scan(/\w+/)).to eq("an")
|
|
17
|
+
expect(s.scan(/\s+/)).to eq(" ")
|
|
18
|
+
expect(s.scan(/\w+/)).to eq("example")
|
|
19
|
+
expect(s.scan(/\s+/)).to eq(" ")
|
|
20
|
+
expect(s.scan(/\w+/)).to eq("string")
|
|
21
|
+
expect(s.eos?).to eq(true)
|
|
24
22
|
|
|
25
|
-
s.scan(/\s+/).
|
|
26
|
-
s.scan(/\w+/).
|
|
23
|
+
expect(s.scan(/\s+/)).to eq(nil)
|
|
24
|
+
expect(s.scan(/\w+/)).to eq(nil)
|
|
27
25
|
end
|
|
28
26
|
|
|
29
27
|
it "should pass the #concat example" do
|
|
30
|
-
s =
|
|
28
|
+
s = described_class.new("Fri Dec 12 1975 14:39")
|
|
31
29
|
s.scan(/Fri /)
|
|
32
30
|
s << " +1000 GMT"
|
|
33
|
-
s.string.
|
|
34
|
-
s.scan(/Dec/).
|
|
31
|
+
expect(s.string).to eq("Fri Dec 12 1975 14:39 +1000 GMT")
|
|
32
|
+
expect(s.scan(/Dec/)).to eq("Dec")
|
|
35
33
|
end
|
|
36
34
|
|
|
37
35
|
it "should pass the #[] example" do
|
|
38
|
-
s =
|
|
39
|
-
s.scan(/(\w+) (\w+) (\d+) /).
|
|
40
|
-
s[0].
|
|
41
|
-
s[1].
|
|
42
|
-
s[2].
|
|
43
|
-
s[3].
|
|
44
|
-
s.post_match.
|
|
45
|
-
s.pre_match.
|
|
36
|
+
s = described_class.new("Fri Dec 12 1975 14:39")
|
|
37
|
+
expect(s.scan(/(\w+) (\w+) (\d+) /)).to eq("Fri Dec 12 ")
|
|
38
|
+
expect(s[0]).to eq("Fri Dec 12 ")
|
|
39
|
+
expect(s[1]).to eq("Fri")
|
|
40
|
+
expect(s[2]).to eq("Dec")
|
|
41
|
+
expect(s[3]).to eq("12")
|
|
42
|
+
expect(s.post_match).to eq("1975 14:39")
|
|
43
|
+
expect(s.pre_match).to eq("")
|
|
46
44
|
end
|
|
47
45
|
|
|
48
46
|
it "should pass the #beginning_of_line? example" do
|
|
49
|
-
s =
|
|
50
|
-
s.bol
|
|
47
|
+
s = described_class.new("test\ntest\n")
|
|
48
|
+
expect(s.bol?).to eq(true)
|
|
51
49
|
s.scan(/te/)
|
|
52
|
-
s.bol
|
|
50
|
+
expect(s.bol?).to eq(false)
|
|
53
51
|
s.scan(/st\n/)
|
|
54
|
-
s.bol
|
|
52
|
+
expect(s.bol?).to eq(true)
|
|
55
53
|
s.terminate
|
|
56
|
-
s.bol
|
|
54
|
+
expect(s.bol?).to eq(true)
|
|
57
55
|
end
|
|
58
56
|
|
|
59
57
|
it "should pass the #check example" do
|
|
60
|
-
s =
|
|
61
|
-
s.check(/Fri/).
|
|
62
|
-
s.pos.
|
|
63
|
-
s.matched.
|
|
64
|
-
s.check(/12/).
|
|
65
|
-
s.matched.
|
|
58
|
+
s = described_class.new("Fri Dec 12 1975 14:39")
|
|
59
|
+
expect(s.check(/Fri/)).to eq("Fri")
|
|
60
|
+
expect(s.pos).to eq(0)
|
|
61
|
+
expect(s.matched).to eq("Fri")
|
|
62
|
+
expect(s.check(/12/)).to eq(nil)
|
|
63
|
+
expect(s.matched).to eq(nil)
|
|
66
64
|
end
|
|
67
65
|
|
|
68
66
|
it "should pass the #check_until example" do
|
|
69
|
-
s =
|
|
70
|
-
s.check_until(/12/).
|
|
71
|
-
s.pos.
|
|
72
|
-
s.matched.
|
|
67
|
+
s = described_class.new("Fri Dec 12 1975 14:39")
|
|
68
|
+
expect(s.check_until(/12/)).to eq("Fri Dec 12")
|
|
69
|
+
expect(s.pos).to eq(0)
|
|
70
|
+
expect(s.matched).to eq("12")
|
|
73
71
|
end
|
|
74
72
|
|
|
75
73
|
it "should pass the #eos? example" do
|
|
76
|
-
s =
|
|
77
|
-
s.eos
|
|
74
|
+
s = described_class.new('test string')
|
|
75
|
+
expect(s.eos?).to eq(false)
|
|
78
76
|
s.scan(/test/)
|
|
79
|
-
s.eos
|
|
77
|
+
expect(s.eos?).to eq(false)
|
|
80
78
|
s.terminate
|
|
81
|
-
s.eos
|
|
79
|
+
expect(s.eos?).to eq(true)
|
|
82
80
|
end
|
|
83
81
|
|
|
84
82
|
it "should pass the #exist? example" do
|
|
85
|
-
s =
|
|
86
|
-
s.exist?(/s/).
|
|
87
|
-
s.scan(/test/).
|
|
88
|
-
s.exist?(/s/).
|
|
89
|
-
s.exist?(/e/).
|
|
83
|
+
s = described_class.new('test string')
|
|
84
|
+
expect(s.exist?(/s/)).to eq(3)
|
|
85
|
+
expect(s.scan(/test/)).to eq("test")
|
|
86
|
+
expect(s.exist?(/s/)).to eq(2)
|
|
87
|
+
expect(s.exist?(/e/)).to eq(nil)
|
|
90
88
|
end
|
|
91
89
|
|
|
92
90
|
it "should pass a tweaked version of the #getch example" do
|
|
93
|
-
s =
|
|
94
|
-
s.getch.
|
|
95
|
-
s.getch.
|
|
96
|
-
s.getch.
|
|
91
|
+
s = described_class.new("ab")
|
|
92
|
+
expect(s.getch).to eq("a")
|
|
93
|
+
expect(s.getch).to eq("b")
|
|
94
|
+
expect(s.getch).to eq(nil)
|
|
97
95
|
|
|
98
|
-
s =
|
|
99
|
-
s.getch.
|
|
100
|
-
s.getch.
|
|
96
|
+
s = described_class.new("ぁ")
|
|
97
|
+
expect(s.getch).to eq("ぁ") # Japanese hira-kana "A" in EUC-JP
|
|
98
|
+
expect(s.getch).to eq(nil)
|
|
101
99
|
end
|
|
102
100
|
|
|
103
101
|
it "should pass the #inspect example" do
|
|
104
|
-
s =
|
|
105
|
-
s.inspect.
|
|
106
|
-
s.scan_until(/12/).
|
|
107
|
-
s.inspect.
|
|
102
|
+
s = described_class.new("Fri Dec 12 1975 14:39")
|
|
103
|
+
expect(s.inspect).to eq('#<UnicodeScanner 0/21 @ "Fri D...">')
|
|
104
|
+
expect(s.scan_until(/12/)).to eq("Fri Dec 12")
|
|
105
|
+
expect(s.inspect).to eq('#<UnicodeScanner 10/21 "...ec 12" @ " 1975...">')
|
|
108
106
|
end
|
|
109
107
|
|
|
110
108
|
it "should pass the #match? example" do
|
|
111
|
-
s =
|
|
112
|
-
s.match?(/\w+/).
|
|
113
|
-
s.match?(/\w+/).
|
|
114
|
-
s.match?(/\s+/).
|
|
109
|
+
s = described_class.new('test string')
|
|
110
|
+
expect(s.match?(/\w+/)).to eq(4)
|
|
111
|
+
expect(s.match?(/\w+/)).to eq(4)
|
|
112
|
+
expect(s.match?(/\s+/)).to eq(nil)
|
|
115
113
|
end
|
|
116
114
|
|
|
117
115
|
it "should pass the #matched example" do
|
|
118
|
-
s =
|
|
119
|
-
s.match?(/\w+/).
|
|
120
|
-
s.matched.
|
|
116
|
+
s = described_class.new('test string')
|
|
117
|
+
expect(s.match?(/\w+/)).to eq(4)
|
|
118
|
+
expect(s.matched).to eq("test")
|
|
121
119
|
end
|
|
122
120
|
|
|
123
121
|
it "should pass the #matched? example" do
|
|
124
|
-
s =
|
|
125
|
-
s.match?(/\w+/).
|
|
126
|
-
s.matched
|
|
127
|
-
s.match?(/\d+/).
|
|
128
|
-
s.matched
|
|
122
|
+
s = described_class.new('test string')
|
|
123
|
+
expect(s.match?(/\w+/)).to eq(4)
|
|
124
|
+
expect(s.matched?).to eq(true)
|
|
125
|
+
expect(s.match?(/\d+/)).to eq(nil)
|
|
126
|
+
expect(s.matched?).to eq(false)
|
|
129
127
|
end
|
|
130
128
|
|
|
131
129
|
it "should pass the #matched_size example" do
|
|
132
|
-
s =
|
|
133
|
-
s.check(/\w+/).
|
|
134
|
-
s.matched_size.
|
|
135
|
-
s.check(/\d+/).
|
|
136
|
-
s.matched_size.
|
|
130
|
+
s = described_class.new('test string')
|
|
131
|
+
expect(s.check(/\w+/)).to eq("test")
|
|
132
|
+
expect(s.matched_size).to eq(4)
|
|
133
|
+
expect(s.check(/\d+/)).to eq(nil)
|
|
134
|
+
expect(s.matched_size).to eq(nil)
|
|
137
135
|
end
|
|
138
136
|
|
|
139
137
|
it "should pass the #peek example" do
|
|
140
|
-
s =
|
|
141
|
-
s.peek(7).
|
|
142
|
-
s.peek(7).
|
|
138
|
+
s = described_class.new('test string')
|
|
139
|
+
expect(s.peek(7)).to eq("test st")
|
|
140
|
+
expect(s.peek(7)).to eq("test st")
|
|
143
141
|
end
|
|
144
142
|
|
|
145
143
|
it "should pass the #pos example" do
|
|
146
|
-
s =
|
|
147
|
-
s.pos.
|
|
148
|
-
s.scan_until(/str/).
|
|
149
|
-
s.pos.
|
|
150
|
-
s.terminate.inspect.
|
|
151
|
-
s.pos.
|
|
144
|
+
s = described_class.new('test string')
|
|
145
|
+
expect(s.pos).to eq(0)
|
|
146
|
+
expect(s.scan_until(/str/)).to eq("test str")
|
|
147
|
+
expect(s.pos).to eq(8)
|
|
148
|
+
expect(s.terminate.inspect).to eq("#<UnicodeScanner fin>")
|
|
149
|
+
expect(s.pos).to eq(11)
|
|
152
150
|
end
|
|
153
151
|
|
|
154
152
|
it "should pass the #pos= example" do
|
|
155
|
-
s =
|
|
156
|
-
(s.pos = 7).
|
|
157
|
-
s.rest.
|
|
153
|
+
s = described_class.new('test string')
|
|
154
|
+
expect(s.pos = 7).to eq(7)
|
|
155
|
+
expect(s.rest).to eq("ring")
|
|
158
156
|
end
|
|
159
157
|
|
|
160
158
|
it "should pass the #post_match/#pre_match example" do
|
|
161
|
-
s =
|
|
162
|
-
s.scan(/\w+/).
|
|
163
|
-
s.scan(/\s+/).
|
|
164
|
-
s.pre_match.
|
|
165
|
-
s.post_match.
|
|
159
|
+
s = described_class.new('test string')
|
|
160
|
+
expect(s.scan(/\w+/)).to eq("test")
|
|
161
|
+
expect(s.scan(/\s+/)).to eq(" ")
|
|
162
|
+
expect(s.pre_match).to eq("test")
|
|
163
|
+
expect(s.post_match).to eq("string")
|
|
166
164
|
end
|
|
167
165
|
|
|
168
166
|
it "should pass the #scan example" do
|
|
169
|
-
s =
|
|
170
|
-
s.scan(/\w+/).
|
|
171
|
-
s.scan(/\w+/).
|
|
172
|
-
s.scan(/\s+/).
|
|
173
|
-
s.scan(/\w+/).
|
|
174
|
-
s.scan(/./).
|
|
167
|
+
s = described_class.new('test string')
|
|
168
|
+
expect(s.scan(/\w+/)).to eq("test")
|
|
169
|
+
expect(s.scan(/\w+/)).to eq(nil)
|
|
170
|
+
expect(s.scan(/\s+/)).to eq(" ")
|
|
171
|
+
expect(s.scan(/\w+/)).to eq("string")
|
|
172
|
+
expect(s.scan(/./)).to eq(nil)
|
|
175
173
|
end
|
|
176
174
|
|
|
177
175
|
it "should pass the #scan_until example" do
|
|
178
|
-
s =
|
|
179
|
-
s.scan_until(/1/).
|
|
180
|
-
s.pre_match.
|
|
181
|
-
s.scan_until(/XYZ/).
|
|
176
|
+
s = described_class.new("Fri Dec 12 1975 14:39")
|
|
177
|
+
expect(s.scan_until(/1/)).to eq("Fri Dec 1")
|
|
178
|
+
expect(s.pre_match).to eq("Fri Dec ")
|
|
179
|
+
expect(s.scan_until(/XYZ/)).to eq(nil)
|
|
182
180
|
end
|
|
183
181
|
|
|
184
182
|
it "should pass the #skip example" do
|
|
185
|
-
s =
|
|
186
|
-
s.skip(/\w+/).
|
|
187
|
-
s.skip(/\w+/).
|
|
188
|
-
s.skip(/\s+/).
|
|
189
|
-
s.skip(/\w+/).
|
|
190
|
-
s.skip(/./).
|
|
183
|
+
s = described_class.new('test string')
|
|
184
|
+
expect(s.skip(/\w+/)).to eq(4)
|
|
185
|
+
expect(s.skip(/\w+/)).to eq(nil)
|
|
186
|
+
expect(s.skip(/\s+/)).to eq(1)
|
|
187
|
+
expect(s.skip(/\w+/)).to eq(6)
|
|
188
|
+
expect(s.skip(/./)).to eq(nil)
|
|
191
189
|
end
|
|
192
190
|
|
|
193
191
|
it "should pass the half-finished #skip_until example" do
|
|
194
|
-
s =
|
|
195
|
-
s.skip_until(/12/).
|
|
192
|
+
s = described_class.new("Fri Dec 12 1975 14:39")
|
|
193
|
+
expect(s.skip_until(/12/)).to eq(10)
|
|
196
194
|
end
|
|
197
195
|
|
|
198
196
|
it "should pass the #unscan example" do
|
|
199
|
-
s =
|
|
200
|
-
s.scan(/\w+/).
|
|
197
|
+
s = described_class.new('test string')
|
|
198
|
+
expect(s.scan(/\w+/)).to eq("test")
|
|
201
199
|
s.unscan
|
|
202
|
-
s.scan(/../).
|
|
203
|
-
s.scan(/\d/).
|
|
204
|
-
|
|
200
|
+
expect(s.scan(/../)).to eq("te")
|
|
201
|
+
expect(s.scan(/\d/)).to eq(nil)
|
|
202
|
+
expect { s.unscan }.to raise_error(ScanError, 'unscan failed: previous match record not exist')
|
|
205
203
|
end
|
|
206
204
|
end
|
data/unicode_scanner.gemspec
CHANGED
|
@@ -2,16 +2,18 @@
|
|
|
2
2
|
# DO NOT EDIT THIS FILE DIRECTLY
|
|
3
3
|
# Instead, edit Jeweler::Tasks in Rakefile, and run 'rake gemspec'
|
|
4
4
|
# -*- encoding: utf-8 -*-
|
|
5
|
+
# stub: unicode_scanner 1.0.1 ruby lib
|
|
5
6
|
|
|
6
7
|
Gem::Specification.new do |s|
|
|
7
|
-
s.name = "unicode_scanner"
|
|
8
|
-
s.version = "1.0.
|
|
8
|
+
s.name = "unicode_scanner".freeze
|
|
9
|
+
s.version = "1.0.1"
|
|
9
10
|
|
|
10
|
-
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
|
11
|
-
s.
|
|
12
|
-
s.
|
|
13
|
-
s.
|
|
14
|
-
s.
|
|
11
|
+
s.required_rubygems_version = Gem::Requirement.new(">= 0".freeze) if s.respond_to? :required_rubygems_version=
|
|
12
|
+
s.require_paths = ["lib".freeze]
|
|
13
|
+
s.authors = ["Tim Morgan".freeze]
|
|
14
|
+
s.date = "2019-12-26"
|
|
15
|
+
s.description = "An implementation of StringScanner that doesn't split multibyte characters.".freeze
|
|
16
|
+
s.email = "git@timothymorgan.info".freeze
|
|
15
17
|
s.extra_rdoc_files = [
|
|
16
18
|
"LICENSE.txt",
|
|
17
19
|
"README.md"
|
|
@@ -19,7 +21,9 @@ Gem::Specification.new do |s|
|
|
|
19
21
|
s.files = [
|
|
20
22
|
".document",
|
|
21
23
|
".rspec",
|
|
22
|
-
".
|
|
24
|
+
".ruby-gemset",
|
|
25
|
+
".ruby-version",
|
|
26
|
+
".travis.yml",
|
|
23
27
|
"Gemfile",
|
|
24
28
|
"Gemfile.lock",
|
|
25
29
|
"LICENSE.txt",
|
|
@@ -31,34 +35,27 @@ Gem::Specification.new do |s|
|
|
|
31
35
|
"spec/unicode_scanner_spec.rb",
|
|
32
36
|
"unicode_scanner.gemspec"
|
|
33
37
|
]
|
|
34
|
-
s.homepage = "http://github.com/RISCfuture/unicode_scanner"
|
|
35
|
-
s.licenses = ["MIT"]
|
|
36
|
-
s.
|
|
37
|
-
s.
|
|
38
|
-
s.summary = "Unicode-aware implementation of StringScanner"
|
|
38
|
+
s.homepage = "http://github.com/RISCfuture/unicode_scanner".freeze
|
|
39
|
+
s.licenses = ["MIT".freeze]
|
|
40
|
+
s.rubygems_version = "3.1.2".freeze
|
|
41
|
+
s.summary = "Unicode-aware implementation of StringScanner".freeze
|
|
39
42
|
|
|
40
43
|
if s.respond_to? :specification_version then
|
|
41
|
-
s.specification_version =
|
|
44
|
+
s.specification_version = 4
|
|
45
|
+
end
|
|
42
46
|
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
else
|
|
50
|
-
s.add_dependency(%q<rspec>, [">= 0"])
|
|
51
|
-
s.add_dependency(%q<redcarpet>, [">= 0"])
|
|
52
|
-
s.add_dependency(%q<yard>, [">= 0"])
|
|
53
|
-
s.add_dependency(%q<bundler>, [">= 0"])
|
|
54
|
-
s.add_dependency(%q<jeweler>, [">= 0"])
|
|
55
|
-
end
|
|
47
|
+
if s.respond_to? :add_runtime_dependency then
|
|
48
|
+
s.add_development_dependency(%q<rspec>.freeze, [">= 0"])
|
|
49
|
+
s.add_development_dependency(%q<redcarpet>.freeze, [">= 0"])
|
|
50
|
+
s.add_development_dependency(%q<yard>.freeze, [">= 0"])
|
|
51
|
+
s.add_development_dependency(%q<bundler>.freeze, [">= 0"])
|
|
52
|
+
s.add_development_dependency(%q<jeweler>.freeze, [">= 0"])
|
|
56
53
|
else
|
|
57
|
-
s.add_dependency(%q<rspec
|
|
58
|
-
s.add_dependency(%q<redcarpet
|
|
59
|
-
s.add_dependency(%q<yard
|
|
60
|
-
s.add_dependency(%q<bundler
|
|
61
|
-
s.add_dependency(%q<jeweler
|
|
54
|
+
s.add_dependency(%q<rspec>.freeze, [">= 0"])
|
|
55
|
+
s.add_dependency(%q<redcarpet>.freeze, [">= 0"])
|
|
56
|
+
s.add_dependency(%q<yard>.freeze, [">= 0"])
|
|
57
|
+
s.add_dependency(%q<bundler>.freeze, [">= 0"])
|
|
58
|
+
s.add_dependency(%q<jeweler>.freeze, [">= 0"])
|
|
62
59
|
end
|
|
63
60
|
end
|
|
64
61
|
|
metadata
CHANGED
|
@@ -1,94 +1,83 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: unicode_scanner
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 1.0.
|
|
5
|
-
prerelease:
|
|
4
|
+
version: 1.0.1
|
|
6
5
|
platform: ruby
|
|
7
6
|
authors:
|
|
8
7
|
- Tim Morgan
|
|
9
8
|
autorequire:
|
|
10
9
|
bindir: bin
|
|
11
10
|
cert_chain: []
|
|
12
|
-
date:
|
|
11
|
+
date: 2019-12-26 00:00:00.000000000 Z
|
|
13
12
|
dependencies:
|
|
14
13
|
- !ruby/object:Gem::Dependency
|
|
15
14
|
name: rspec
|
|
16
15
|
requirement: !ruby/object:Gem::Requirement
|
|
17
|
-
none: false
|
|
18
16
|
requirements:
|
|
19
|
-
- -
|
|
17
|
+
- - ">="
|
|
20
18
|
- !ruby/object:Gem::Version
|
|
21
19
|
version: '0'
|
|
22
20
|
type: :development
|
|
23
21
|
prerelease: false
|
|
24
22
|
version_requirements: !ruby/object:Gem::Requirement
|
|
25
|
-
none: false
|
|
26
23
|
requirements:
|
|
27
|
-
- -
|
|
24
|
+
- - ">="
|
|
28
25
|
- !ruby/object:Gem::Version
|
|
29
26
|
version: '0'
|
|
30
27
|
- !ruby/object:Gem::Dependency
|
|
31
28
|
name: redcarpet
|
|
32
29
|
requirement: !ruby/object:Gem::Requirement
|
|
33
|
-
none: false
|
|
34
30
|
requirements:
|
|
35
|
-
- -
|
|
31
|
+
- - ">="
|
|
36
32
|
- !ruby/object:Gem::Version
|
|
37
33
|
version: '0'
|
|
38
34
|
type: :development
|
|
39
35
|
prerelease: false
|
|
40
36
|
version_requirements: !ruby/object:Gem::Requirement
|
|
41
|
-
none: false
|
|
42
37
|
requirements:
|
|
43
|
-
- -
|
|
38
|
+
- - ">="
|
|
44
39
|
- !ruby/object:Gem::Version
|
|
45
40
|
version: '0'
|
|
46
41
|
- !ruby/object:Gem::Dependency
|
|
47
42
|
name: yard
|
|
48
43
|
requirement: !ruby/object:Gem::Requirement
|
|
49
|
-
none: false
|
|
50
44
|
requirements:
|
|
51
|
-
- -
|
|
45
|
+
- - ">="
|
|
52
46
|
- !ruby/object:Gem::Version
|
|
53
47
|
version: '0'
|
|
54
48
|
type: :development
|
|
55
49
|
prerelease: false
|
|
56
50
|
version_requirements: !ruby/object:Gem::Requirement
|
|
57
|
-
none: false
|
|
58
51
|
requirements:
|
|
59
|
-
- -
|
|
52
|
+
- - ">="
|
|
60
53
|
- !ruby/object:Gem::Version
|
|
61
54
|
version: '0'
|
|
62
55
|
- !ruby/object:Gem::Dependency
|
|
63
56
|
name: bundler
|
|
64
57
|
requirement: !ruby/object:Gem::Requirement
|
|
65
|
-
none: false
|
|
66
58
|
requirements:
|
|
67
|
-
- -
|
|
59
|
+
- - ">="
|
|
68
60
|
- !ruby/object:Gem::Version
|
|
69
61
|
version: '0'
|
|
70
62
|
type: :development
|
|
71
63
|
prerelease: false
|
|
72
64
|
version_requirements: !ruby/object:Gem::Requirement
|
|
73
|
-
none: false
|
|
74
65
|
requirements:
|
|
75
|
-
- -
|
|
66
|
+
- - ">="
|
|
76
67
|
- !ruby/object:Gem::Version
|
|
77
68
|
version: '0'
|
|
78
69
|
- !ruby/object:Gem::Dependency
|
|
79
70
|
name: jeweler
|
|
80
71
|
requirement: !ruby/object:Gem::Requirement
|
|
81
|
-
none: false
|
|
82
72
|
requirements:
|
|
83
|
-
- -
|
|
73
|
+
- - ">="
|
|
84
74
|
- !ruby/object:Gem::Version
|
|
85
75
|
version: '0'
|
|
86
76
|
type: :development
|
|
87
77
|
prerelease: false
|
|
88
78
|
version_requirements: !ruby/object:Gem::Requirement
|
|
89
|
-
none: false
|
|
90
79
|
requirements:
|
|
91
|
-
- -
|
|
80
|
+
- - ">="
|
|
92
81
|
- !ruby/object:Gem::Version
|
|
93
82
|
version: '0'
|
|
94
83
|
description: An implementation of StringScanner that doesn't split multibyte characters.
|
|
@@ -99,9 +88,11 @@ extra_rdoc_files:
|
|
|
99
88
|
- LICENSE.txt
|
|
100
89
|
- README.md
|
|
101
90
|
files:
|
|
102
|
-
- .document
|
|
103
|
-
- .rspec
|
|
104
|
-
- .
|
|
91
|
+
- ".document"
|
|
92
|
+
- ".rspec"
|
|
93
|
+
- ".ruby-gemset"
|
|
94
|
+
- ".ruby-version"
|
|
95
|
+
- ".travis.yml"
|
|
105
96
|
- Gemfile
|
|
106
97
|
- Gemfile.lock
|
|
107
98
|
- LICENSE.txt
|
|
@@ -115,29 +106,24 @@ files:
|
|
|
115
106
|
homepage: http://github.com/RISCfuture/unicode_scanner
|
|
116
107
|
licenses:
|
|
117
108
|
- MIT
|
|
109
|
+
metadata: {}
|
|
118
110
|
post_install_message:
|
|
119
111
|
rdoc_options: []
|
|
120
112
|
require_paths:
|
|
121
113
|
- lib
|
|
122
114
|
required_ruby_version: !ruby/object:Gem::Requirement
|
|
123
|
-
none: false
|
|
124
115
|
requirements:
|
|
125
|
-
- -
|
|
116
|
+
- - ">="
|
|
126
117
|
- !ruby/object:Gem::Version
|
|
127
118
|
version: '0'
|
|
128
|
-
segments:
|
|
129
|
-
- 0
|
|
130
|
-
hash: -3935821298050612576
|
|
131
119
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
|
132
|
-
none: false
|
|
133
120
|
requirements:
|
|
134
|
-
- -
|
|
121
|
+
- - ">="
|
|
135
122
|
- !ruby/object:Gem::Version
|
|
136
123
|
version: '0'
|
|
137
124
|
requirements: []
|
|
138
|
-
|
|
139
|
-
rubygems_version: 1.8.24
|
|
125
|
+
rubygems_version: 3.1.2
|
|
140
126
|
signing_key:
|
|
141
|
-
specification_version:
|
|
127
|
+
specification_version: 4
|
|
142
128
|
summary: Unicode-aware implementation of StringScanner
|
|
143
129
|
test_files: []
|
data/.rvmrc
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
rvm 1.9.3@scanner --create
|