rubysl-strscan 1.0.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 +7 -0
- data/.gitignore +17 -0
- data/.travis.yml +7 -0
- data/Gemfile +4 -0
- data/LICENSE +25 -0
- data/README.md +29 -0
- data/Rakefile +1 -0
- data/lib/rubysl/strscan.rb +2 -0
- data/lib/rubysl/strscan/strscan.rb +286 -0
- data/lib/rubysl/strscan/version.rb +5 -0
- data/lib/strscan.rb +1 -0
- data/rubysl-strscan.gemspec +22 -0
- data/spec/append_spec.rb +10 -0
- data/spec/beginning_of_line_spec.rb +6 -0
- data/spec/bol_spec.rb +6 -0
- data/spec/check_spec.rb +15 -0
- data/spec/check_until_spec.rb +14 -0
- data/spec/clear_spec.rb +24 -0
- data/spec/concat_spec.rb +10 -0
- data/spec/dup_spec.rb +38 -0
- data/spec/element_reference_spec.rb +48 -0
- data/spec/empty_spec.rb +24 -0
- data/spec/eos_spec.rb +6 -0
- data/spec/exist_spec.rb +23 -0
- data/spec/get_byte_spec.rb +6 -0
- data/spec/getbyte_spec.rb +27 -0
- data/spec/getch_spec.rb +43 -0
- data/spec/initialize_spec.rb +27 -0
- data/spec/inspect_spec.rb +19 -0
- data/spec/match_spec.rb +27 -0
- data/spec/matched_size_spec.rb +6 -0
- data/spec/matched_spec.rb +40 -0
- data/spec/matchedsize_spec.rb +26 -0
- data/spec/must_C_version_spec.rb +7 -0
- data/spec/peek_spec.rb +7 -0
- data/spec/peep_spec.rb +24 -0
- data/spec/pointer_spec.rb +10 -0
- data/spec/pos_spec.rb +10 -0
- data/spec/post_match_spec.rb +27 -0
- data/spec/pre_match_spec.rb +40 -0
- data/spec/reset_spec.rb +14 -0
- data/spec/rest_size_spec.rb +6 -0
- data/spec/rest_spec.rb +47 -0
- data/spec/restsize_spec.rb +24 -0
- data/spec/scan_full_spec.rb +29 -0
- data/spec/scan_spec.rb +81 -0
- data/spec/scan_until_spec.rb +22 -0
- data/spec/search_full_spec.rb +29 -0
- data/spec/shared/bol.rb +25 -0
- data/spec/shared/concat.rb +30 -0
- data/spec/shared/eos.rb +17 -0
- data/spec/shared/extract_range.rb +22 -0
- data/spec/shared/extract_range_matched.rb +22 -0
- data/spec/shared/get_byte.rb +28 -0
- data/spec/shared/matched_size.rb +21 -0
- data/spec/shared/peek.rb +44 -0
- data/spec/shared/pos.rb +83 -0
- data/spec/shared/rest_size.rb +18 -0
- data/spec/shared/terminate.rb +17 -0
- data/spec/skip_spec.rb +17 -0
- data/spec/skip_until_spec.rb +17 -0
- data/spec/string_spec.rb +39 -0
- data/spec/terminate_spec.rb +6 -0
- data/spec/unscan_spec.rb +28 -0
- metadata +201 -0
data/spec/bol_spec.rb
ADDED
data/spec/check_spec.rb
ADDED
@@ -0,0 +1,15 @@
|
|
1
|
+
require 'strscan'
|
2
|
+
|
3
|
+
describe "StringScanner#check" do
|
4
|
+
before :each do
|
5
|
+
@s = StringScanner.new("This is a test")
|
6
|
+
end
|
7
|
+
|
8
|
+
it "returns the value that scan would return, without advancing the scan pointer" do
|
9
|
+
@s.check(/This/).should == "This"
|
10
|
+
@s.matched.should == "This"
|
11
|
+
@s.pos.should == 0
|
12
|
+
@s.check(/is/).should == nil
|
13
|
+
@s.matched.should == nil
|
14
|
+
end
|
15
|
+
end
|
@@ -0,0 +1,14 @@
|
|
1
|
+
require 'strscan'
|
2
|
+
|
3
|
+
describe "StringScanner#check_until" do
|
4
|
+
before :each do
|
5
|
+
@s = StringScanner.new("This is a test")
|
6
|
+
end
|
7
|
+
|
8
|
+
it "returns the same value of scan_until, but don't advances the scan pointer" do
|
9
|
+
@s.check_until(/a/).should == "This is a"
|
10
|
+
@s.pos.should == 0
|
11
|
+
@s.matched.should == "a"
|
12
|
+
@s.check_until(/test/).should == "This is a test"
|
13
|
+
end
|
14
|
+
end
|
data/spec/clear_spec.rb
ADDED
@@ -0,0 +1,24 @@
|
|
1
|
+
require File.expand_path('../shared/terminate.rb', __FILE__)
|
2
|
+
require 'strscan'
|
3
|
+
|
4
|
+
describe "StringScanner#clear" do
|
5
|
+
it_behaves_like(:strscan_terminate, :clear)
|
6
|
+
|
7
|
+
it "warns in verbose mode that the method is obsolete" do
|
8
|
+
s = StringScanner.new("abc")
|
9
|
+
begin
|
10
|
+
old = $VERBOSE
|
11
|
+
lambda {
|
12
|
+
$VERBOSE = true
|
13
|
+
s.clear
|
14
|
+
}.should complain(/clear.*obsolete.*terminate/)
|
15
|
+
|
16
|
+
lambda {
|
17
|
+
$VERBOSE = false
|
18
|
+
s.clear
|
19
|
+
}.should_not complain
|
20
|
+
ensure
|
21
|
+
$VERBOSE = old
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
data/spec/concat_spec.rb
ADDED
@@ -0,0 +1,10 @@
|
|
1
|
+
require File.expand_path('../shared/concat.rb', __FILE__)
|
2
|
+
require 'strscan'
|
3
|
+
|
4
|
+
describe "StringScanner#concat" do
|
5
|
+
it_behaves_like(:strscan_concat, :concat)
|
6
|
+
end
|
7
|
+
|
8
|
+
describe "StringScanner#concat when passed a Fixnum" do
|
9
|
+
it_behaves_like(:strscan_concat_fixnum, :concat)
|
10
|
+
end
|
data/spec/dup_spec.rb
ADDED
@@ -0,0 +1,38 @@
|
|
1
|
+
require 'strscan'
|
2
|
+
|
3
|
+
describe "StringScanner#dup" do
|
4
|
+
before(:each) do
|
5
|
+
@string = "this is a test"
|
6
|
+
@orig_s = StringScanner.new(@string)
|
7
|
+
end
|
8
|
+
|
9
|
+
it "copies the passed StringScanner's content to self" do
|
10
|
+
s = @orig_s.dup
|
11
|
+
s.string.should == @string
|
12
|
+
end
|
13
|
+
|
14
|
+
it "copies the passed StringSCanner's position to self" do
|
15
|
+
@orig_s.pos = 5
|
16
|
+
s = @orig_s.dup
|
17
|
+
s.pos.should eql(5)
|
18
|
+
end
|
19
|
+
|
20
|
+
it "copies previous match state" do
|
21
|
+
@orig_s.scan(/\w+/)
|
22
|
+
@orig_s.scan(/\s/)
|
23
|
+
|
24
|
+
@orig_s.pre_match.should == "this"
|
25
|
+
|
26
|
+
s = @orig_s.dup
|
27
|
+
s.pre_match.should == "this"
|
28
|
+
|
29
|
+
s.unscan
|
30
|
+
s.scan(/\s/).should == " "
|
31
|
+
end
|
32
|
+
|
33
|
+
it "copies the passed StringScanner scan pointer to self" do
|
34
|
+
@orig_s.terminate
|
35
|
+
s = @orig_s.dup
|
36
|
+
s.eos?.should be_true
|
37
|
+
end
|
38
|
+
end
|
@@ -0,0 +1,48 @@
|
|
1
|
+
require 'strscan'
|
2
|
+
|
3
|
+
describe "StringScanner#[]" do
|
4
|
+
before :each do
|
5
|
+
@s = StringScanner.new("Fri Jun 13 2008 22:43")
|
6
|
+
end
|
7
|
+
|
8
|
+
it "returns nil if there is no current match" do
|
9
|
+
@s[0].should be_nil
|
10
|
+
end
|
11
|
+
|
12
|
+
it "returns the n-th subgroup in the most recent match" do
|
13
|
+
@s.scan(/(\w+) (\w+) (\d+) /)
|
14
|
+
@s[0].should == "Fri Jun 13 "
|
15
|
+
@s[1].should == "Fri"
|
16
|
+
@s[2].should == "Jun"
|
17
|
+
@s[3].should == "13"
|
18
|
+
@s[-3].should == "Fri"
|
19
|
+
@s[-2].should == "Jun"
|
20
|
+
@s[-1].should == "13"
|
21
|
+
end
|
22
|
+
|
23
|
+
it "returns nil if index is outside of self" do
|
24
|
+
@s.scan(/(\w+) (\w+) (\d+) /)
|
25
|
+
@s[5].should == nil
|
26
|
+
@s[-5].should == nil
|
27
|
+
end
|
28
|
+
|
29
|
+
it "calls to_int on the given index" do
|
30
|
+
@s.scan(/(\w+) (\w+) (\d+) /)
|
31
|
+
@s[0.5].should == "Fri Jun 13 "
|
32
|
+
end
|
33
|
+
|
34
|
+
it "raises a TypeError if the given index is nil" do
|
35
|
+
@s.scan(/(\w+) (\w+) (\d+) /)
|
36
|
+
lambda { @s[nil]}.should raise_error(TypeError)
|
37
|
+
end
|
38
|
+
|
39
|
+
it "raises a TypeError when a String is as argument" do
|
40
|
+
@s.scan(/(\w+) (\w+) (\d+) /)
|
41
|
+
lambda { @s["Fri"]}.should raise_error(TypeError)
|
42
|
+
end
|
43
|
+
|
44
|
+
it "raises a TypeError when a Range is as argument" do
|
45
|
+
@s.scan(/(\w+) (\w+) (\d+) /)
|
46
|
+
lambda { @s[0..2]}.should raise_error(TypeError)
|
47
|
+
end
|
48
|
+
end
|
data/spec/empty_spec.rb
ADDED
@@ -0,0 +1,24 @@
|
|
1
|
+
require File.expand_path('../shared/eos.rb', __FILE__)
|
2
|
+
require 'strscan'
|
3
|
+
|
4
|
+
describe "StringScanner#empty?" do
|
5
|
+
it_behaves_like(:strscan_eos, :empty?)
|
6
|
+
|
7
|
+
it "warns in verbose mode that the method is obsolete" do
|
8
|
+
s = StringScanner.new("abc")
|
9
|
+
begin
|
10
|
+
old = $VERBOSE
|
11
|
+
lambda {
|
12
|
+
$VERBOSE = true
|
13
|
+
s.empty?
|
14
|
+
}.should complain(/empty?.*obsolete.*eos?/)
|
15
|
+
|
16
|
+
lambda {
|
17
|
+
$VERBOSE = false
|
18
|
+
s.empty?
|
19
|
+
}.should_not complain
|
20
|
+
ensure
|
21
|
+
$VERBOSE = old
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
data/spec/eos_spec.rb
ADDED
data/spec/exist_spec.rb
ADDED
@@ -0,0 +1,23 @@
|
|
1
|
+
require 'strscan'
|
2
|
+
|
3
|
+
describe "StringScanner#exist?" do
|
4
|
+
before :each do
|
5
|
+
@s = StringScanner.new("This is a test")
|
6
|
+
end
|
7
|
+
|
8
|
+
it "returns the index of the first occurrence of the given pattern" do
|
9
|
+
@s.exist?(/s/).should == 4
|
10
|
+
@s.scan(/This is/)
|
11
|
+
@s.exist?(/s/).should == 6
|
12
|
+
end
|
13
|
+
|
14
|
+
it "returns 0 if the pattern is empty" do
|
15
|
+
@s.exist?(//).should == 0
|
16
|
+
end
|
17
|
+
|
18
|
+
it "returns nil if the pattern isn't found in the string" do
|
19
|
+
@s.exist?(/S/).should == nil
|
20
|
+
@s.scan(/This is/)
|
21
|
+
@s.exist?(/i/).should == nil
|
22
|
+
end
|
23
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
require File.expand_path('../shared/get_byte', __FILE__)
|
2
|
+
require File.expand_path('../shared/extract_range', __FILE__)
|
3
|
+
require 'strscan'
|
4
|
+
|
5
|
+
describe "StringScanner#getbyte" do
|
6
|
+
it_behaves_like :strscan_get_byte, :getbyte
|
7
|
+
|
8
|
+
it "warns in verbose mode that the method is obsolete" do
|
9
|
+
s = StringScanner.new("abc")
|
10
|
+
begin
|
11
|
+
old = $VERBOSE
|
12
|
+
lambda {
|
13
|
+
$VERBOSE = true
|
14
|
+
s.getbyte
|
15
|
+
}.should complain(/getbyte.*obsolete.*get_byte/)
|
16
|
+
|
17
|
+
lambda {
|
18
|
+
$VERBOSE = false
|
19
|
+
s.getbyte
|
20
|
+
}.should_not complain
|
21
|
+
ensure
|
22
|
+
$VERBOSE = old
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
it_behaves_like :extract_range, :getbyte
|
27
|
+
end
|
data/spec/getch_spec.rb
ADDED
@@ -0,0 +1,43 @@
|
|
1
|
+
require File.expand_path('../shared/extract_range', __FILE__)
|
2
|
+
require 'strscan'
|
3
|
+
|
4
|
+
describe "StringScanner#getch" do
|
5
|
+
before :each do
|
6
|
+
@kcode = $KCODE
|
7
|
+
end
|
8
|
+
|
9
|
+
after :each do
|
10
|
+
$KCODE = @kcode
|
11
|
+
end
|
12
|
+
|
13
|
+
it "scans one character and returns it" do
|
14
|
+
s = StringScanner.new('abc')
|
15
|
+
s.getch.should == "a"
|
16
|
+
s.getch.should == "b"
|
17
|
+
s.getch.should == "c"
|
18
|
+
end
|
19
|
+
|
20
|
+
it "is multi-byte character sensitive" do
|
21
|
+
$KCODE = 'EUC'
|
22
|
+
|
23
|
+
# Japanese hiragana "A" in EUC-JP
|
24
|
+
src = encode("\244\242", "euc-jp")
|
25
|
+
|
26
|
+
s = StringScanner.new(src)
|
27
|
+
s.getch.should == src
|
28
|
+
end
|
29
|
+
|
30
|
+
it "returns nil at the end of the string" do
|
31
|
+
# empty string case
|
32
|
+
s = StringScanner.new('')
|
33
|
+
s.getch.should == nil
|
34
|
+
s.getch.should == nil
|
35
|
+
|
36
|
+
# non-empty string case
|
37
|
+
s = StringScanner.new('a')
|
38
|
+
s.getch # skip one
|
39
|
+
s.getch.should == nil
|
40
|
+
end
|
41
|
+
|
42
|
+
it_behaves_like :extract_range, :getch
|
43
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
require 'strscan'
|
2
|
+
|
3
|
+
describe "StringScanner#initialize" do
|
4
|
+
before :each do
|
5
|
+
@s = StringScanner.new("This is a test")
|
6
|
+
end
|
7
|
+
|
8
|
+
it "is a private method" do
|
9
|
+
StringScanner.should have_private_instance_method(:initialize)
|
10
|
+
end
|
11
|
+
|
12
|
+
it "returns an instance of StringScanner" do
|
13
|
+
@s.should be_kind_of(StringScanner)
|
14
|
+
@s.tainted?.should be_false
|
15
|
+
@s.eos?.should be_false
|
16
|
+
end
|
17
|
+
|
18
|
+
it "converts the argument into a string using #to_str" do
|
19
|
+
m = mock(:str)
|
20
|
+
|
21
|
+
s = "test"
|
22
|
+
m.should_receive(:to_str).and_return(s)
|
23
|
+
|
24
|
+
scan = StringScanner.new(m)
|
25
|
+
scan.string.should == s
|
26
|
+
end
|
27
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
require 'strscan'
|
2
|
+
|
3
|
+
describe "StringScanner#inspect" do
|
4
|
+
before :each do
|
5
|
+
@s = StringScanner.new("This is a test")
|
6
|
+
end
|
7
|
+
|
8
|
+
it "returns a String object" do
|
9
|
+
@s.inspect.should be_kind_of(String)
|
10
|
+
end
|
11
|
+
|
12
|
+
it "returns a string that represents the StringScanner object" do
|
13
|
+
@s.inspect.should == "#<StringScanner 0/14 @ \"This ...\">"
|
14
|
+
@s.scan_until /is/
|
15
|
+
@s.inspect.should == "#<StringScanner 4/14 \"This\" @ \" is a...\">"
|
16
|
+
@s.terminate
|
17
|
+
@s.inspect.should == "#<StringScanner fin>"
|
18
|
+
end
|
19
|
+
end
|
data/spec/match_spec.rb
ADDED
@@ -0,0 +1,27 @@
|
|
1
|
+
require 'strscan'
|
2
|
+
|
3
|
+
describe "StringScanner#match?" do
|
4
|
+
before :each do
|
5
|
+
@s = StringScanner.new("This is a test")
|
6
|
+
end
|
7
|
+
|
8
|
+
it "returns the length of the match and the scan pointer is not advanced" do
|
9
|
+
@s.match?(/\w+/).should == 4
|
10
|
+
@s.match?(/\w+/).should == 4
|
11
|
+
@s.pos.should == 0
|
12
|
+
end
|
13
|
+
|
14
|
+
it "returns nil if there's no match" do
|
15
|
+
@s.match?(/\d+/).should == nil
|
16
|
+
@s.match?(/\s+/).should == nil
|
17
|
+
end
|
18
|
+
|
19
|
+
it "effects pre_match" do
|
20
|
+
@s.scan(/\w+/)
|
21
|
+
@s.scan(/\s/)
|
22
|
+
|
23
|
+
@s.pre_match.should == "This"
|
24
|
+
@s.match?(/\w+/)
|
25
|
+
@s.pre_match.should == "This "
|
26
|
+
end
|
27
|
+
end
|
@@ -0,0 +1,40 @@
|
|
1
|
+
require File.expand_path('../shared/extract_range_matched', __FILE__)
|
2
|
+
require 'strscan'
|
3
|
+
|
4
|
+
describe "StringScanner#matched" do
|
5
|
+
before :each do
|
6
|
+
@s = StringScanner.new("This is a test")
|
7
|
+
end
|
8
|
+
|
9
|
+
it "returns the last matched string" do
|
10
|
+
@s.match?(/\w+/)
|
11
|
+
@s.matched.should == "This"
|
12
|
+
@s.getch
|
13
|
+
@s.matched.should == "T"
|
14
|
+
@s.get_byte
|
15
|
+
@s.matched.should == "h"
|
16
|
+
end
|
17
|
+
|
18
|
+
it "returns nil if there's no match" do
|
19
|
+
@s.match?(/\d+/)
|
20
|
+
@s.matched.should == nil
|
21
|
+
end
|
22
|
+
|
23
|
+
it_behaves_like :extract_range_matched, :matched
|
24
|
+
end
|
25
|
+
|
26
|
+
describe "StringScanner#matched?" do
|
27
|
+
before :each do
|
28
|
+
@s = StringScanner.new("This is a test")
|
29
|
+
end
|
30
|
+
|
31
|
+
it "returns true if the last match was successful" do
|
32
|
+
@s.match?(/\w+/)
|
33
|
+
@s.matched?.should be_true
|
34
|
+
end
|
35
|
+
|
36
|
+
it "returns false if there's no match" do
|
37
|
+
@s.match?(/\d+/)
|
38
|
+
@s.matched?.should be_false
|
39
|
+
end
|
40
|
+
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
require File.expand_path('../shared/matched_size.rb', __FILE__)
|
2
|
+
require 'strscan'
|
3
|
+
|
4
|
+
ruby_version_is "" ... "1.9" do
|
5
|
+
describe "StringScanner#matchedsize" do
|
6
|
+
it_behaves_like(:strscan_matched_size, :matchedsize)
|
7
|
+
|
8
|
+
it "warns in verbose mode that the method is obsolete" do
|
9
|
+
s = StringScanner.new("abc")
|
10
|
+
begin
|
11
|
+
old = $VERBOSE
|
12
|
+
lambda {
|
13
|
+
$VERBOSE = true
|
14
|
+
s.matchedsize
|
15
|
+
}.should complain(/matchedsize.*obsolete.*matched_size/)
|
16
|
+
|
17
|
+
lambda {
|
18
|
+
$VERBOSE = false
|
19
|
+
s.matchedsize
|
20
|
+
}.should_not complain
|
21
|
+
ensure
|
22
|
+
$VERBOSE = old
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|