regexp_parser 2.1.1 → 2.5.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.
Files changed (154) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +94 -6
  3. data/Gemfile +2 -1
  4. data/LICENSE +1 -1
  5. data/README.md +40 -30
  6. data/Rakefile +6 -70
  7. data/lib/regexp_parser/error.rb +1 -1
  8. data/lib/regexp_parser/expression/base.rb +75 -0
  9. data/lib/regexp_parser/expression/classes/anchor.rb +0 -2
  10. data/lib/regexp_parser/expression/classes/{backref.rb → backreference.rb} +1 -0
  11. data/lib/regexp_parser/expression/classes/{set → character_set}/intersection.rb +0 -0
  12. data/lib/regexp_parser/expression/classes/{set → character_set}/range.rb +2 -2
  13. data/lib/regexp_parser/expression/classes/{set.rb → character_set.rb} +2 -2
  14. data/lib/regexp_parser/expression/classes/{type.rb → character_type.rb} +0 -2
  15. data/lib/regexp_parser/expression/classes/conditional.rb +2 -2
  16. data/lib/regexp_parser/expression/classes/{escape.rb → escape_sequence.rb} +13 -7
  17. data/lib/regexp_parser/expression/classes/free_space.rb +1 -3
  18. data/lib/regexp_parser/expression/classes/group.rb +6 -6
  19. data/lib/regexp_parser/expression/classes/keep.rb +2 -0
  20. data/lib/regexp_parser/expression/classes/literal.rb +1 -5
  21. data/lib/regexp_parser/expression/classes/root.rb +3 -6
  22. data/lib/regexp_parser/expression/classes/{property.rb → unicode_property.rb} +1 -2
  23. data/lib/regexp_parser/expression/methods/construct.rb +43 -0
  24. data/lib/regexp_parser/expression/methods/match_length.rb +1 -1
  25. data/lib/regexp_parser/expression/methods/strfregexp.rb +1 -1
  26. data/lib/regexp_parser/expression/methods/tests.rb +10 -1
  27. data/lib/regexp_parser/expression/quantifier.rb +41 -23
  28. data/lib/regexp_parser/expression/sequence.rb +9 -24
  29. data/lib/regexp_parser/expression/sequence_operation.rb +2 -2
  30. data/lib/regexp_parser/expression/shared.rb +85 -0
  31. data/lib/regexp_parser/expression/subexpression.rb +11 -8
  32. data/lib/regexp_parser/expression.rb +10 -132
  33. data/lib/regexp_parser/lexer.rb +8 -6
  34. data/lib/regexp_parser/parser.rb +21 -72
  35. data/lib/regexp_parser/scanner/properties/long.csv +622 -0
  36. data/lib/regexp_parser/scanner/properties/short.csv +246 -0
  37. data/lib/regexp_parser/scanner/property.rl +1 -1
  38. data/lib/regexp_parser/scanner/scanner.rl +48 -35
  39. data/lib/regexp_parser/scanner.rb +735 -801
  40. data/lib/regexp_parser/syntax/any.rb +2 -7
  41. data/lib/regexp_parser/syntax/base.rb +91 -66
  42. data/lib/regexp_parser/syntax/token/anchor.rb +15 -0
  43. data/lib/regexp_parser/syntax/{tokens → token}/assertion.rb +2 -2
  44. data/lib/regexp_parser/syntax/token/backreference.rb +30 -0
  45. data/lib/regexp_parser/syntax/{tokens → token}/character_set.rb +2 -2
  46. data/lib/regexp_parser/syntax/{tokens → token}/character_type.rb +3 -3
  47. data/lib/regexp_parser/syntax/{tokens → token}/conditional.rb +3 -3
  48. data/lib/regexp_parser/syntax/token/escape.rb +31 -0
  49. data/lib/regexp_parser/syntax/{tokens → token}/group.rb +7 -7
  50. data/lib/regexp_parser/syntax/{tokens → token}/keep.rb +1 -1
  51. data/lib/regexp_parser/syntax/{tokens → token}/meta.rb +2 -2
  52. data/lib/regexp_parser/syntax/{tokens → token}/posix_class.rb +3 -3
  53. data/lib/regexp_parser/syntax/token/quantifier.rb +35 -0
  54. data/lib/regexp_parser/syntax/token/unicode_property.rb +717 -0
  55. data/lib/regexp_parser/syntax/token.rb +45 -0
  56. data/lib/regexp_parser/syntax/version_lookup.rb +20 -29
  57. data/lib/regexp_parser/syntax/versions/1.8.6.rb +13 -20
  58. data/lib/regexp_parser/syntax/versions/1.9.1.rb +10 -17
  59. data/lib/regexp_parser/syntax/versions/1.9.3.rb +3 -10
  60. data/lib/regexp_parser/syntax/versions/2.0.0.rb +8 -15
  61. data/lib/regexp_parser/syntax/versions/2.2.0.rb +3 -9
  62. data/lib/regexp_parser/syntax/versions/2.3.0.rb +3 -9
  63. data/lib/regexp_parser/syntax/versions/2.4.0.rb +3 -9
  64. data/lib/regexp_parser/syntax/versions/2.4.1.rb +2 -8
  65. data/lib/regexp_parser/syntax/versions/2.5.0.rb +3 -9
  66. data/lib/regexp_parser/syntax/versions/2.6.0.rb +3 -9
  67. data/lib/regexp_parser/syntax/versions/2.6.2.rb +3 -9
  68. data/lib/regexp_parser/syntax/versions/2.6.3.rb +3 -9
  69. data/lib/regexp_parser/syntax/versions/3.1.0.rb +4 -0
  70. data/lib/regexp_parser/syntax/versions/3.2.0.rb +4 -0
  71. data/lib/regexp_parser/syntax/versions.rb +1 -1
  72. data/lib/regexp_parser/syntax.rb +1 -1
  73. data/lib/regexp_parser/token.rb +9 -20
  74. data/lib/regexp_parser/version.rb +1 -1
  75. data/lib/regexp_parser.rb +0 -2
  76. data/regexp_parser.gemspec +20 -22
  77. metadata +37 -166
  78. data/lib/regexp_parser/scanner/properties/long.yml +0 -594
  79. data/lib/regexp_parser/scanner/properties/short.yml +0 -237
  80. data/lib/regexp_parser/syntax/tokens/anchor.rb +0 -15
  81. data/lib/regexp_parser/syntax/tokens/backref.rb +0 -24
  82. data/lib/regexp_parser/syntax/tokens/escape.rb +0 -30
  83. data/lib/regexp_parser/syntax/tokens/quantifier.rb +0 -35
  84. data/lib/regexp_parser/syntax/tokens/unicode_property.rb +0 -675
  85. data/lib/regexp_parser/syntax/tokens.rb +0 -45
  86. data/spec/expression/base_spec.rb +0 -104
  87. data/spec/expression/clone_spec.rb +0 -152
  88. data/spec/expression/conditional_spec.rb +0 -89
  89. data/spec/expression/free_space_spec.rb +0 -27
  90. data/spec/expression/methods/match_length_spec.rb +0 -161
  91. data/spec/expression/methods/match_spec.rb +0 -25
  92. data/spec/expression/methods/strfregexp_spec.rb +0 -224
  93. data/spec/expression/methods/tests_spec.rb +0 -99
  94. data/spec/expression/methods/traverse_spec.rb +0 -161
  95. data/spec/expression/options_spec.rb +0 -128
  96. data/spec/expression/subexpression_spec.rb +0 -50
  97. data/spec/expression/to_h_spec.rb +0 -26
  98. data/spec/expression/to_s_spec.rb +0 -108
  99. data/spec/lexer/all_spec.rb +0 -22
  100. data/spec/lexer/conditionals_spec.rb +0 -53
  101. data/spec/lexer/delimiters_spec.rb +0 -68
  102. data/spec/lexer/escapes_spec.rb +0 -14
  103. data/spec/lexer/keep_spec.rb +0 -10
  104. data/spec/lexer/literals_spec.rb +0 -64
  105. data/spec/lexer/nesting_spec.rb +0 -99
  106. data/spec/lexer/refcalls_spec.rb +0 -60
  107. data/spec/parser/all_spec.rb +0 -43
  108. data/spec/parser/alternation_spec.rb +0 -88
  109. data/spec/parser/anchors_spec.rb +0 -17
  110. data/spec/parser/conditionals_spec.rb +0 -179
  111. data/spec/parser/errors_spec.rb +0 -30
  112. data/spec/parser/escapes_spec.rb +0 -121
  113. data/spec/parser/free_space_spec.rb +0 -130
  114. data/spec/parser/groups_spec.rb +0 -108
  115. data/spec/parser/keep_spec.rb +0 -6
  116. data/spec/parser/options_spec.rb +0 -28
  117. data/spec/parser/posix_classes_spec.rb +0 -8
  118. data/spec/parser/properties_spec.rb +0 -115
  119. data/spec/parser/quantifiers_spec.rb +0 -68
  120. data/spec/parser/refcalls_spec.rb +0 -117
  121. data/spec/parser/set/intersections_spec.rb +0 -127
  122. data/spec/parser/set/ranges_spec.rb +0 -111
  123. data/spec/parser/sets_spec.rb +0 -178
  124. data/spec/parser/types_spec.rb +0 -18
  125. data/spec/scanner/all_spec.rb +0 -18
  126. data/spec/scanner/anchors_spec.rb +0 -21
  127. data/spec/scanner/conditionals_spec.rb +0 -128
  128. data/spec/scanner/delimiters_spec.rb +0 -52
  129. data/spec/scanner/errors_spec.rb +0 -67
  130. data/spec/scanner/escapes_spec.rb +0 -64
  131. data/spec/scanner/free_space_spec.rb +0 -165
  132. data/spec/scanner/groups_spec.rb +0 -61
  133. data/spec/scanner/keep_spec.rb +0 -10
  134. data/spec/scanner/literals_spec.rb +0 -39
  135. data/spec/scanner/meta_spec.rb +0 -18
  136. data/spec/scanner/options_spec.rb +0 -36
  137. data/spec/scanner/properties_spec.rb +0 -64
  138. data/spec/scanner/quantifiers_spec.rb +0 -25
  139. data/spec/scanner/refcalls_spec.rb +0 -55
  140. data/spec/scanner/sets_spec.rb +0 -151
  141. data/spec/scanner/types_spec.rb +0 -14
  142. data/spec/spec_helper.rb +0 -16
  143. data/spec/support/runner.rb +0 -42
  144. data/spec/support/shared_examples.rb +0 -77
  145. data/spec/support/warning_extractor.rb +0 -60
  146. data/spec/syntax/syntax_spec.rb +0 -48
  147. data/spec/syntax/syntax_token_map_spec.rb +0 -23
  148. data/spec/syntax/versions/1.8.6_spec.rb +0 -17
  149. data/spec/syntax/versions/1.9.1_spec.rb +0 -10
  150. data/spec/syntax/versions/1.9.3_spec.rb +0 -9
  151. data/spec/syntax/versions/2.0.0_spec.rb +0 -13
  152. data/spec/syntax/versions/2.2.0_spec.rb +0 -9
  153. data/spec/syntax/versions/aliases_spec.rb +0 -37
  154. data/spec/token/token_spec.rb +0 -85
@@ -1,14 +0,0 @@
1
- require 'spec_helper'
2
-
3
- RSpec.describe('Type scanning') do
4
- include_examples 'scan', 'a\\dc', 1 => [:type, :digit, '\\d', 1, 3]
5
- include_examples 'scan', 'a\\Dc', 1 => [:type, :nondigit, '\\D', 1, 3]
6
- include_examples 'scan', 'a\\hc', 1 => [:type, :hex, '\\h', 1, 3]
7
- include_examples 'scan', 'a\\Hc', 1 => [:type, :nonhex, '\\H', 1, 3]
8
- include_examples 'scan', 'a\\sc', 1 => [:type, :space, '\\s', 1, 3]
9
- include_examples 'scan', 'a\\Sc', 1 => [:type, :nonspace, '\\S', 1, 3]
10
- include_examples 'scan', 'a\\wc', 1 => [:type, :word, '\\w', 1, 3]
11
- include_examples 'scan', 'a\\Wc', 1 => [:type, :nonword, '\\W', 1, 3]
12
- include_examples 'scan', 'a\\Rc', 1 => [:type, :linebreak, '\\R', 1, 3]
13
- include_examples 'scan', 'a\\Xc', 1 => [:type, :xgrapheme, '\\X', 1, 3]
14
- end
data/spec/spec_helper.rb DELETED
@@ -1,16 +0,0 @@
1
- require 'ice_nine'
2
- require 'regexp_parser'
3
- require 'regexp_property_values'
4
- require_relative 'support/shared_examples'
5
-
6
- RS = Regexp::Scanner
7
- RL = Regexp::Lexer
8
- RP = Regexp::Parser
9
- RE = Regexp::Expression
10
- T = Regexp::Syntax::Token
11
-
12
- include Regexp::Expression
13
-
14
- def ruby_version_at_least(version)
15
- Gem::Version.new(RUBY_VERSION.dup) >= Gem::Version.new(version)
16
- end
@@ -1,42 +0,0 @@
1
- require 'pathname'
2
- require 'rspec'
3
-
4
- module RegexpParserSpec
5
- class Runner
6
- def initialize(arguments, warning_whitelist)
7
- @arguments = arguments
8
- @warning_whitelist = warning_whitelist
9
- end
10
-
11
- def run
12
- spec_status = nil
13
-
14
- Warning::Filter.new(warning_whitelist).assert_expected_warnings_only do
15
- setup
16
- spec_status = run_rspec
17
- end
18
-
19
- spec_status
20
- end
21
-
22
- private
23
-
24
- def setup
25
- $VERBOSE = true
26
-
27
- spec_files.each(&method(:require))
28
- end
29
-
30
- def run_rspec
31
- RSpec::Core::Runner.run([])
32
- end
33
-
34
- def spec_files
35
- arguments
36
- .map { |path| Pathname.new(path).expand_path.freeze }
37
- .select(&:file?)
38
- end
39
-
40
- attr_reader :arguments, :warning_whitelist
41
- end
42
- end
@@ -1,77 +0,0 @@
1
- RSpec.shared_examples 'syntax' do |klass, opts|
2
- opts[:implements].each do |type, tokens|
3
- tokens.each do |token|
4
- it("implements #{token} #{type}") do
5
- expect(klass.implements?(type, token)).to be true
6
- end
7
- end
8
- end
9
-
10
- opts[:excludes] && opts[:excludes].each do |type, tokens|
11
- tokens.each do |token|
12
- it("does not implement #{token} #{type}") do
13
- expect(klass.implements?(type, token)).to be false
14
- end
15
- end
16
- end
17
- end
18
-
19
- RSpec.shared_examples 'scan' do |pattern, checks|
20
- context "given the pattern #{pattern}" do
21
- before(:all) { @tokens = Regexp::Scanner.scan(pattern) }
22
-
23
- checks.each do |index, (type, token, text, ts, te)|
24
- it "scans token #{index} as #{token} #{type} at #{ts}..#{te}" do
25
- result = @tokens.at(index)
26
-
27
- expect(result[0]).to eq type
28
- expect(result[1]).to eq token
29
- expect(result[2]).to eq text
30
- expect(result[3]).to eq ts
31
- expect(result[4]).to eq te
32
- end
33
- end
34
- end
35
- end
36
-
37
- RSpec.shared_examples 'lex' do |pattern, checks|
38
- context "given the pattern #{pattern}" do
39
- before(:all) { @tokens = Regexp::Lexer.lex(pattern) }
40
-
41
- checks.each do |index, (type, token, text, ts, te, lvl, set_lvl, cond_lvl)|
42
- it "lexes token #{index} as #{token} #{type} at #{lvl}, #{set_lvl}, #{cond_lvl}" do
43
- struct = @tokens.at(index)
44
-
45
- expect(struct.type).to eq type
46
- expect(struct.token).to eq token
47
- expect(struct.text).to eq text
48
- expect(struct.ts).to eq ts
49
- expect(struct.te).to eq te
50
- expect(struct.level).to eq lvl
51
- expect(struct.set_level).to eq set_lvl
52
- expect(struct.conditional_level).to eq cond_lvl
53
- end
54
- end
55
- end
56
- end
57
-
58
- RSpec.shared_examples 'parse' do |pattern, checks|
59
- context "given the pattern #{pattern}" do
60
- before(:all) { @root = Regexp::Parser.parse(pattern, '*') }
61
-
62
- checks.each do |path, (type, token, klass, attributes)|
63
- it "parses expression at #{path} as #{klass}" do
64
- exp = @root.dig(*path)
65
-
66
- expect(exp).to be_instance_of(klass)
67
- expect(exp.type).to eq type
68
- expect(exp.token).to eq token
69
-
70
- attributes && attributes.each do |method, value|
71
- expect(exp.send(method)).to eq(value),
72
- "expected expression at #{path} to have #{method} #{value}"
73
- end
74
- end
75
- end
76
- end
77
- end
@@ -1,60 +0,0 @@
1
- require 'set'
2
- require 'delegate'
3
-
4
- module RegexpParserSpec
5
- class Warning
6
- class UnexpectedWarnings < StandardError
7
- MSG = 'Unexpected warnings: %s'.freeze
8
-
9
- def initialize(warnings)
10
- super(MSG % warnings.join("\n"))
11
- end
12
- end
13
-
14
- class Filter
15
- def initialize(whitelist)
16
- @whitelist = whitelist
17
- end
18
-
19
- def assert_expected_warnings_only
20
- original = $stderr
21
- $stderr = Extractor.new(original, @whitelist)
22
-
23
- yield
24
-
25
- assert_no_warnings($stderr.warnings)
26
- ensure
27
- $stderr = original
28
- end
29
-
30
- private
31
-
32
- def assert_no_warnings(warnings)
33
- raise UnexpectedWarnings, warnings.to_a if warnings.any?
34
- end
35
- end
36
-
37
- class Extractor < DelegateClass(IO)
38
- PATTERN = /\A(?:.+):(?:\d+): warning: (?:.+)\n\z/
39
-
40
- def initialize(io, whitelist)
41
- @whitelist = whitelist
42
- @warnings = Set.new
43
- super(io)
44
- end
45
-
46
- def write(message)
47
- return super if PATTERN !~ message
48
-
49
- warning = message.chomp
50
- @warnings << warning if @whitelist.none?(&warning.method(:include?))
51
-
52
- self
53
- end
54
-
55
- def warnings
56
- @warnings.dup.freeze
57
- end
58
- end
59
- end
60
- end
@@ -1,48 +0,0 @@
1
- require 'spec_helper'
2
-
3
- RSpec.describe(Regexp::Syntax) do
4
- specify('unknown name') do
5
- expect { Regexp::Syntax.new('ruby/1.0') }.to raise_error(Regexp::Syntax::UnknownSyntaxNameError)
6
- end
7
-
8
- specify('new') do
9
- expect(Regexp::Syntax.new('ruby/1.9.3')).to be_instance_of(Regexp::Syntax::V1_9_3)
10
- end
11
-
12
- specify('new any') do
13
- expect(Regexp::Syntax.new('any')).to be_instance_of(Regexp::Syntax::Any)
14
- expect(Regexp::Syntax.new('*')).to be_instance_of(Regexp::Syntax::Any)
15
- end
16
-
17
- specify('not implemented') do
18
- expect { RP.parse('\\p{alpha}', 'ruby/1.8') }.to raise_error(Regexp::Syntax::NotImplementedError)
19
- end
20
-
21
- specify('supported?') do
22
- expect(Regexp::Syntax.supported?('ruby/1.1.1')).to be false
23
- expect(Regexp::Syntax.supported?('ruby/2.4.3')).to be true
24
- expect(Regexp::Syntax.supported?('ruby/2.5')).to be true
25
- end
26
-
27
- specify('invalid version') do
28
- expect { Regexp::Syntax.version_class('2.0.0') }.to raise_error(Regexp::Syntax::InvalidVersionNameError)
29
-
30
- expect { Regexp::Syntax.version_class('ruby/20') }.to raise_error(Regexp::Syntax::InvalidVersionNameError)
31
- end
32
-
33
- specify('version class tiny version') do
34
- expect(Regexp::Syntax.version_class('ruby/1.9.3')).to eq Regexp::Syntax::V1_9_3
35
-
36
- expect(Regexp::Syntax.version_class('ruby/2.3.1')).to eq Regexp::Syntax::V2_3_1
37
- end
38
-
39
- specify('version class minor version') do
40
- expect(Regexp::Syntax.version_class('ruby/1.9')).to eq Regexp::Syntax::V1_9
41
-
42
- expect(Regexp::Syntax.version_class('ruby/2.3')).to eq Regexp::Syntax::V2_3
43
- end
44
-
45
- specify('raises for unknown constant lookups') do
46
- expect { Regexp::Syntax::V1 }.to raise_error(/V1/)
47
- end
48
- end
@@ -1,23 +0,0 @@
1
- require 'spec_helper'
2
-
3
- RSpec.describe(Regexp::Syntax::Token::Map) do
4
- let(:map) { Regexp::Syntax::Token::Map }
5
-
6
- specify('is complete') do
7
- latest_syntax = Regexp::Syntax.new('ruby/2.9')
8
-
9
- latest_syntax.features.each do |type, tokens|
10
- tokens.each { |token| expect(map[type]).to include(token) }
11
- end
12
- end
13
-
14
- specify('contains no duplicate type/token combinations') do
15
- combinations = map.flat_map do |type, tokens|
16
- tokens.map { |token| "#{type} #{token}" }
17
- end
18
-
19
- non_uniq = combinations.group_by { |str| str }.select { |_, v| v.count > 1 }
20
-
21
- expect(non_uniq.keys).to be_empty
22
- end
23
- end
@@ -1,17 +0,0 @@
1
- require 'spec_helper'
2
-
3
- RSpec.describe(Regexp::Syntax::V1_8_6) do
4
- include_examples 'syntax', Regexp::Syntax.new('ruby/1.8.6'),
5
- implements: {
6
- assertion: T::Assertion::Lookahead,
7
- backref: [:number],
8
- escape: T::Escape::Basic + T::Escape::ASCII + T::Escape::Meta + T::Escape::Control,
9
- group: T::Group::V1_8_6,
10
- quantifier: T::Quantifier::Greedy + T::Quantifier::Reluctant + T::Quantifier::Interval + T::Quantifier::IntervalReluctant
11
- },
12
- excludes: {
13
- assertion: T::Assertion::Lookbehind,
14
- backref: T::Backreference::All - [:number] + T::SubexpressionCall::All,
15
- quantifier: T::Quantifier::Possessive
16
- }
17
- end
@@ -1,10 +0,0 @@
1
- require 'spec_helper'
2
-
3
- RSpec.describe(Regexp::Syntax::V1_9_1) do
4
- include_examples 'syntax', Regexp::Syntax.new('ruby/1.9.1'),
5
- implements: {
6
- escape: T::Escape::Hex + T::Escape::Octal + T::Escape::Unicode,
7
- type: T::CharacterType::Hex,
8
- quantifier: T::Quantifier::Greedy + T::Quantifier::Reluctant + T::Quantifier::Possessive
9
- }
10
- end
@@ -1,9 +0,0 @@
1
- require 'spec_helper'
2
-
3
- RSpec.describe(Regexp::Syntax::V1_9_3) do
4
- include_examples 'syntax', Regexp::Syntax.new('ruby/1.9.3'),
5
- implements: {
6
- property: T::UnicodeProperty::Script_V1_9_3 + T::UnicodeProperty::Age_V1_9_3,
7
- nonproperty: T::UnicodeProperty::Script_V1_9_3 + T::UnicodeProperty::Age_V1_9_3
8
- }
9
- end
@@ -1,13 +0,0 @@
1
- require 'spec_helper'
2
-
3
- RSpec.describe(Regexp::Syntax::V2_0_0) do
4
- include_examples 'syntax', Regexp::Syntax.new('ruby/2.0.0'),
5
- implements: {
6
- property: T::UnicodeProperty::Age_V2_0_0,
7
- nonproperty: T::UnicodeProperty::Age_V2_0_0
8
- },
9
- excludes: {
10
- property: [:newline],
11
- nonproperty: [:newline]
12
- }
13
- end
@@ -1,9 +0,0 @@
1
- require 'spec_helper'
2
-
3
- RSpec.describe(Regexp::Syntax::V2_2_0) do
4
- include_examples 'syntax', Regexp::Syntax.new('ruby/2.2.0'),
5
- implements: {
6
- property: T::UnicodeProperty::Script_V2_2_0 + T::UnicodeProperty::Age_V2_2_0,
7
- nonproperty: T::UnicodeProperty::Script_V2_2_0 + T::UnicodeProperty::Age_V2_2_0
8
- }
9
- end
@@ -1,37 +0,0 @@
1
- require 'spec_helper'
2
-
3
- RSpec.describe(Regexp::Syntax) do
4
- RSpec.shared_examples 'syntax alias' do |string, klass|
5
- it "aliases #{string} to #{klass}" do
6
- syntax = Regexp::Syntax.new(string)
7
- expect(syntax).to be_a klass
8
- end
9
- end
10
-
11
- include_examples 'syntax alias', 'ruby/1.8.6', Regexp::Syntax::V1_8_6
12
- include_examples 'syntax alias', 'ruby/1.8', Regexp::Syntax::V1_8_6
13
- include_examples 'syntax alias', 'ruby/1.9.1', Regexp::Syntax::V1_9_1
14
- include_examples 'syntax alias', 'ruby/1.9', Regexp::Syntax::V1_9_3
15
- include_examples 'syntax alias', 'ruby/2.0.0', Regexp::Syntax::V1_9
16
- include_examples 'syntax alias', 'ruby/2.0', Regexp::Syntax::V2_0_0
17
- include_examples 'syntax alias', 'ruby/2.1', Regexp::Syntax::V2_0_0
18
- include_examples 'syntax alias', 'ruby/2.2.0', Regexp::Syntax::V2_0_0
19
- include_examples 'syntax alias', 'ruby/2.2.10', Regexp::Syntax::V2_0_0
20
- include_examples 'syntax alias', 'ruby/2.2', Regexp::Syntax::V2_0_0
21
- include_examples 'syntax alias', 'ruby/2.3.0', Regexp::Syntax::V2_3_0
22
- include_examples 'syntax alias', 'ruby/2.3', Regexp::Syntax::V2_3_0
23
- include_examples 'syntax alias', 'ruby/2.4.0', Regexp::Syntax::V2_4_0
24
- include_examples 'syntax alias', 'ruby/2.4.1', Regexp::Syntax::V2_4_1
25
- include_examples 'syntax alias', 'ruby/2.5.0', Regexp::Syntax::V2_4_1
26
- include_examples 'syntax alias', 'ruby/2.5', Regexp::Syntax::V2_5_0
27
- include_examples 'syntax alias', 'ruby/2.6.0', Regexp::Syntax::V2_5_0
28
- include_examples 'syntax alias', 'ruby/2.6.2', Regexp::Syntax::V2_6_2
29
- include_examples 'syntax alias', 'ruby/2.6.3', Regexp::Syntax::V2_6_3
30
- include_examples 'syntax alias', 'ruby/2.6', Regexp::Syntax::V2_6_3
31
-
32
- specify('future alias warning') do
33
- expect { Regexp::Syntax.new('ruby/5.0') }
34
- .to output(/This library .* but you are running .* \(feature set of .*\)/)
35
- .to_stderr
36
- end
37
- end
@@ -1,85 +0,0 @@
1
- require 'spec_helper'
2
-
3
- RSpec.describe(Regexp::Token) do
4
- specify('#offset') do
5
- regexp = /ab?cd/
6
- tokens = RL.lex(regexp)
7
-
8
- expect(tokens[1].text).to eq 'b'
9
- expect(tokens[1].offset).to eq [1, 2]
10
-
11
- expect(tokens[2].text).to eq '?'
12
- expect(tokens[2].offset).to eq [2, 3]
13
-
14
- expect(tokens[3].text).to eq 'cd'
15
- expect(tokens[3].offset).to eq [3, 5]
16
- end
17
-
18
- specify('#length') do
19
- regexp = /abc?def/
20
- tokens = RL.lex(regexp)
21
-
22
- expect(tokens[0].text).to eq 'ab'
23
- expect(tokens[0].length).to eq 2
24
-
25
- expect(tokens[1].text).to eq 'c'
26
- expect(tokens[1].length).to eq 1
27
-
28
- expect(tokens[2].text).to eq '?'
29
- expect(tokens[2].length).to eq 1
30
-
31
- expect(tokens[3].text).to eq 'def'
32
- expect(tokens[3].length).to eq 3
33
- end
34
-
35
- specify('#to_h') do
36
- regexp = /abc?def/
37
- tokens = RL.lex(regexp)
38
-
39
- expect(tokens[0].text).to eq 'ab'
40
- expect(tokens[0].to_h).to eq type: :literal, token: :literal, text: 'ab', ts: 0, te: 2, level: 0, set_level: 0, conditional_level: 0
41
-
42
- expect(tokens[2].text).to eq '?'
43
- expect(tokens[2].to_h).to eq type: :quantifier, token: :zero_or_one, text: '?', ts: 3, te: 4, level: 0, set_level: 0, conditional_level: 0
44
- end
45
-
46
- specify('#next') do
47
- regexp = /a+b?c*d{2,3}/
48
- tokens = RL.lex(regexp)
49
-
50
- a = tokens.first
51
- expect(a.text).to eq 'a'
52
-
53
- plus = a.next
54
- expect(plus.text).to eq '+'
55
-
56
- b = plus.next
57
- expect(b.text).to eq 'b'
58
-
59
- interval = tokens.last
60
- expect(interval.text).to eq '{2,3}'
61
-
62
- expect(interval.next).to be_nil
63
- end
64
-
65
- specify('#previous') do
66
- regexp = /a+b?c*d{2,3}/
67
- tokens = RL.lex(regexp)
68
-
69
- interval = tokens.last
70
- expect(interval.text).to eq '{2,3}'
71
-
72
- d = interval.previous
73
- expect(d.text).to eq 'd'
74
-
75
- star = d.previous
76
- expect(star.text).to eq '*'
77
-
78
- c = star.previous
79
- expect(c.text).to eq 'c'
80
-
81
- a = tokens.first
82
- expect(a.text).to eq 'a'
83
- expect(a.previous).to be_nil
84
- end
85
- end