regexp-examples 0.5.2 → 0.5.3

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
2
  SHA1:
3
- metadata.gz: 0d34e8d62dc70d3b7b1ba17930f94a3799e9f669
4
- data.tar.gz: 62b828f1e6207cf7198ad96a2b61ab5f08dea5d2
3
+ metadata.gz: 9a3253848cbd5e95b1b662848d999c23863fcbbf
4
+ data.tar.gz: b18197c5e6c64813fef50dbb35d1f8d73a9ca703
5
5
  SHA512:
6
- metadata.gz: 3e41e5d5a41dfaa44c67c3e99f28b0b37675774b3509f22d417f7bc2e9c664cccb9b480c8218a72ba63ce9876d2c7d09cbfc0bf8ab2c04d773f0e9e8d3818657
7
- data.tar.gz: 82393a8ad2d76ebd853845a9f1de46cf1aa2175d56e0883004dc770fb9eaf5253dc23750a9eafb4cb36a8a751f5794071bd42fda0d8a2f4f68989486f31dccdc
6
+ metadata.gz: 2d83e121338b0a2a70d4c9615f33571d782bb026c9fb231b72ae517f0b7a9b78e957874452358566514fac71c082c6d57bd57745f65777d60b1cccc67188e790
7
+ data.tar.gz: 0ec1e6b521e9a5cf8e6a66ab0674d365829ef4096ece2ff5fb0501126e0f77d05b65b8d5d417f8ddcc03d741f51eb0c73ead5cd6fe0c1cdca72d684482faa232
data/README.md CHANGED
@@ -77,7 +77,7 @@ Using any of the following will raise a RegexpExamples::IllegalSyntax exception:
77
77
 
78
78
  * Lookarounds, e.g. `/foo(?=bar)/`, `/foo(?!bar)/`, `/(?<=foo)bar/`, `/(?<!foo)bar/`
79
79
  * [Anchors](http://ruby-doc.org/core-2.2.0/Regexp.html#class-Regexp-label-Anchors) (`\b`, `\B`, `\G`, `^`, `\A`, `$`, `\z`, `\Z`), e.g. `/\bword\b/`, `/line1\n^line2/`
80
- * However, a special case has been made to allow `^` and `\A` at the start of a pattern; and to allow `$`, `\z` and `\Z` at the end of pattern. In such cases, the characters are effectively just ignored.
80
+ * However, a special case has been made to allow `^`, `\A` and `\G` at the start of a pattern; and to allow `$`, `\z` and `\Z` at the end of pattern. In such cases, the characters are effectively just ignored.
81
81
 
82
82
  (Note: Backreferences are not really "regular" either, but I got these to work with a bit of hackery!)
83
83
 
Binary file
@@ -20,6 +20,8 @@ module RegexpExamples
20
20
  full_example.all_subgroups.detect do |subgroup|
21
21
  subgroup.group_id == group_id
22
22
  end || raise(RegexpExamples::BackrefNotFound)
23
+ # TODO: Regex like /\10/ should match the octal representation of their character code,
24
+ # if there is no nth grouped subexpression. For example, `/\10/.examples` should return `["\x08"]`
23
25
  end
24
26
 
25
27
  end
@@ -48,6 +48,16 @@ module RegexpExamples
48
48
  end
49
49
  end
50
50
 
51
+ # Used as a workaround for when a grep is expected to be returned,
52
+ # but there are no results for the group.
53
+ # i.e. PlaceHolderGroup.new.result == '' == SingleCharGroup.new('').result
54
+ # (But using PlaceHolderGroup makes it clearer what the intention is!)
55
+ class PlaceHolderGroup
56
+ def result
57
+ [GroupResult.new('')]
58
+ end
59
+ end
60
+
51
61
  class CharGroup
52
62
  prepend GroupWithIgnoreCase
53
63
  def initialize(chars, ignorecase)
@@ -44,22 +44,22 @@ module RegexpExamples
44
44
  group = parse_or_group(repeaters)
45
45
  when '\\'
46
46
  group = parse_after_backslash_group
47
- when '^', 'A'
47
+ when '^'
48
48
  if @current_position == 0
49
- group = parse_single_char_group('') # Ignore the "illegal" character
49
+ group = PlaceHolderGroup.new # Ignore the "illegal" character
50
50
  else
51
- raise IllegalSyntaxError, "Anchors cannot be supported, as they are not regular"
51
+ raise IllegalSyntaxError, "Anchors ('#{next_char}') cannot be supported, as they are not regular"
52
52
  end
53
- when '$', 'z', 'Z'
53
+ when '$'
54
54
  if @current_position == (regexp_string.length - 1)
55
- group = parse_single_char_group('') # Ignore the "illegal" character
55
+ group = PlaceHolderGroup.new # Ignore the "illegal" character
56
56
  else
57
- raise IllegalSyntaxError, "Anchors cannot be supported, as they are not regular"
57
+ raise IllegalSyntaxError, "Anchors ('#{next_char}') cannot be supported, as they are not regular"
58
58
  end
59
59
  when /[#\s]/
60
60
  if @extended
61
61
  parse_extended_whitespace
62
- group = parse_single_char_group('') # Ignore the whitespace/comment
62
+ group = PlaceHolderGroup.new # Ignore the whitespace/comment
63
63
  else
64
64
  group = parse_single_char_group(next_char)
65
65
  end
@@ -103,22 +103,26 @@ module RegexpExamples
103
103
  when rest_of_string =~ /\Ap\{([^}]+)\}/ # Named properties
104
104
  @current_position += ($1.length + 2)
105
105
  raise UnsupportedSyntaxError, "Named properties ({\\p#{$1}}) are not yet supported"
106
- when rest_of_string =~ /\Ag/ # Subexpression call
106
+ when next_char == 'K' # Keep (special lookbehind that CAN be supported safely!)
107
+ group = PlaceHolderGroup.new
108
+ when next_char == 'R' # Linebreak
109
+ group = CharGroup.new(["\r\n", "\n", "\v", "\f", "\r"], @ignorecase) # A bit hacky...
110
+ when next_char == 'g' # Subexpression call
107
111
  # TODO: Should this be IllegalSyntaxError ?
108
112
  raise UnsupportedSyntaxError, "Subexpression calls (\g) are not yet supported"
109
- when rest_of_string =~ /\A[GbB]/ # Anchors
110
- raise IllegalSyntaxError, "Anchors cannot be supported, as they are not regular"
111
- when rest_of_string =~ /\AA/ # Start of string
113
+ when next_char =~ /[bB]/ # Anchors
114
+ raise IllegalSyntaxError, "Anchors ('\\#{next_char}') cannot be supported, as they are not regular"
115
+ when next_char =~ /[AG]/ # Start of string
112
116
  if @current_position == 1
113
- group = parse_single_char_group('') # Ignore the "illegal" character
117
+ group = PlaceHolderGroup.new
114
118
  else
115
- raise IllegalSyntaxError, "Anchors cannot be supported, as they are not regular"
119
+ raise IllegalSyntaxError, "Anchors ('\\#{next_char}') cannot be supported, as they are not regular"
116
120
  end
117
- when rest_of_string =~ /\A[zZ]/ # End of string
121
+ when next_char =~ /[zZ]/ # End of string
118
122
  if @current_position == (regexp_string.length - 1)
119
- group = parse_single_char_group('') # Ignore the "illegal" character
123
+ group = PlaceHolderGroup.new
120
124
  else
121
- raise IllegalSyntaxError, "Anchors cannot be supported, as they are not regular"
125
+ raise IllegalSyntaxError, "Anchors ('\\#{next_char}') cannot be supported, as they are not regular"
122
126
  end
123
127
  else
124
128
  group = parse_single_char_group( next_char )
@@ -182,7 +186,7 @@ module RegexpExamples
182
186
  if next_char == ':' # e.g. /(?i:subexpr)/
183
187
  @current_position += 1
184
188
  else
185
- return parse_single_char_group('')
189
+ return PlaceHolderGroup.new
186
190
  end
187
191
  when %w(! =).include?(match[2]) # e.g. /(?=lookahead)/, /(?!neglookahead)/
188
192
  raise IllegalSyntaxError, "Lookaheads are not regular; cannot generate examples"
@@ -1,3 +1,3 @@
1
1
  module RegexpExamples
2
- VERSION = '0.5.2'
2
+ VERSION = '0.5.3'
3
3
  end
@@ -103,23 +103,15 @@ RSpec.describe Regexp, "#examples" do
103
103
  end
104
104
 
105
105
  context "for escaped characters" do
106
- examples_exist_and_match(
107
- /\w/,
108
- /\W/,
109
- /\s/,
110
- /\S/,
111
- /\d/,
112
- /\D/,
113
- /\h/,
114
- /\H/,
115
- /\t/,
116
- /\n/,
117
- /\f/,
118
- /\a/,
119
- /\v/,
120
- /\e/,
121
- /[\b]/
122
- )
106
+ all_letters = Array('a'..'z') | Array('A'..'Z')
107
+ special_letters = %w(b c g p u x z A B C G M P Z)
108
+ valid_letters = all_letters - special_letters
109
+
110
+ valid_letters.each do |char|
111
+ backslash_char = "\\#{char}"
112
+ examples_exist_and_match( /#{backslash_char}/ )
113
+ end
114
+ examples_exist_and_match( /[\b]/ )
123
115
  end
124
116
 
125
117
  context "for backreferences" do
@@ -158,7 +150,6 @@ RSpec.describe Regexp, "#examples" do
158
150
  /(?<!neglookbehind)/,
159
151
  /\bword-boundary/,
160
152
  /no\Bn-word-boundary/,
161
- /\Glast-match/,
162
153
  /start-of\A-string/,
163
154
  /start-of^-line/,
164
155
  /end-of\Z-string/,
@@ -170,6 +161,7 @@ RSpec.describe Regexp, "#examples" do
170
161
  context "ignore start/end anchors if at start/end" do
171
162
  examples_exist_and_match(
172
163
  /\Astart/,
164
+ /\Glast-match/,
173
165
  /^start/,
174
166
  /end$/,
175
167
  /end\z/,
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: regexp-examples
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.5.2
4
+ version: 0.5.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Tom Lord
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-02-08 00:00:00.000000000 Z
11
+ date: 2015-02-10 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -86,7 +86,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
86
86
  version: '0'
87
87
  requirements: []
88
88
  rubyforge_project:
89
- rubygems_version: 2.4.5
89
+ rubygems_version: 2.2.2
90
90
  signing_key:
91
91
  specification_version: 4
92
92
  summary: Extends the Regexp class with '#examples'