regexp-examples 1.4.2 → 1.4.3

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA256:
3
- metadata.gz: 4c992534d7187881c9471d5145917b6887be2289e7908d66963bef9cfb2b1b23
4
- data.tar.gz: f4a147e388dca108bf32b54edf24a2c3c51937cd2cb0158dfc84f7f8c30e3de5
2
+ SHA1:
3
+ metadata.gz: 9ee8a454e1238f6a09e9d5df9b3e462fa497bea2
4
+ data.tar.gz: 30c836039ede81f568c55f2552c42eec951505ef
5
5
  SHA512:
6
- metadata.gz: b78764bd1222e9f4a416ce4b09a1f82315eced10daada19ebab746750126aa879536308ed1fbecfa7b4103242b188346d805ff2290640192578dec9f74795852
7
- data.tar.gz: 1b3b7a7022c7ed2d8cbae0a47305fb1007786ec9417f94c2bd71dc991354255f40795cdf24cfe0438b23901d22b6d662cf26790c619847726b0cc3668f3c7779
6
+ metadata.gz: dbef5b7698904308ab77ce262ab00d806936cde7fe00f567733cb4aba8bf71a75e714f9e2c525d00b5dca4e5ab11b2d9b1713e2b58dabfbc0210c9ef21e80e76
7
+ data.tar.gz: be725e51de4a04371d78fe99844d3778c104a6a0951059655d99f2bfa98c1b269b412f4d688b852a85e86466323e48e0d7dcdac53d40e4781cfab10f7681028b
data/.travis.yml CHANGED
@@ -2,9 +2,10 @@ language: ruby
2
2
  rvm:
3
3
  - 2.0.0
4
4
  - 2.1.10
5
- - 2.2.8
6
- - 2.3.5
7
- - 2.4.2
5
+ - 2.2.9
6
+ - 2.3.6
7
+ - 2.4.3
8
+ - 2.5.0
8
9
  - ruby-head
9
10
  matrix:
10
11
  allow_failures:
data/README.md CHANGED
@@ -57,6 +57,7 @@ Obviously, you will get different (random) results if you try these yourself!
57
57
  * MRI 2.2.x
58
58
  * MRI 2.3.x
59
59
  * MRI 2.4.x
60
+ * MRI 2.5.x
60
61
 
61
62
  MRI ≤ 1.9.3 are not supported. This is primarily because MRI 2.0.0 introduced a new
62
63
  regexp engine (`Oniguruma` was replaced by `Onigmo`). Whilst *most* of this gem could
@@ -110,6 +111,9 @@ Long answer:
110
111
  * ...and even if nested or optional, e.g. `/(even(this(works?))) \1 \2 \3/`, `/what about (this)? \1/`
111
112
  * Non-capture groups, e.g. `/(?:foo)/`
112
113
  * Comment groups, e.g. `/foo(?#comment)bar/`
114
+ * [Absent operator groups, e.g. `/(?~exp)/`](https://medium.com/rubyinside/the-new-absent-operator-in-ruby-s-regular-expressions-7c3ef6cd0b99)
115
+ This feature is available in ruby version `>= 2.4.1`.
116
+ However, support in this gem is [limited](https://github.com/tom-lord/regexp-examples/issues/22).
113
117
  * Control characters, e.g. `/\ca/`, `/\cZ/`, `/\C-9/`
114
118
  * Escape sequences, e.g. `/\x42/`, `/\x5word/`, `/#{"\x80".force_encoding("ASCII-8BIT")}/`
115
119
  * Unicode characters, e.g. `/\u0123/`, `/\uabcd/`, `/\u{789}/`
@@ -200,15 +204,10 @@ All forms of configuration mentioned above **are thread safe**.
200
204
 
201
205
  ## Bugs and TODOs
202
206
 
203
- There are no known major bugs with this library. However, there are a few obscure issues that you *may* encounter:
207
+ There are no known major bugs with this library. However, there are a few obscure issues that you *may* encounter.
204
208
 
205
- * Conditional capture groups, e.g. `/(group1)? (?(1)yes|no)/.examples` are not yet supported. (This example *should* return: `["group1 yes", " no"]`)
206
- * Nested repeat operators are incorrectly parsed, e.g. `/b{2}{3}/` - which *should* be interpreted like `/b{6}/`. (However, there is probably no reason
207
- to ever write regexes like this!)
208
- * A new ["absent operator" (`/(?~exp)/`)](https://medium.com/rubyinside/the-new-absent-operator-in-ruby-s-regular-expressions-7c3ef6cd0b99)
209
- was added to Ruby version `2.4.1`. This gem does not yet support it (or gracefully fail when used).
210
- * Ideally, `regexp#examples` should always return up to `max_results_limit`. Currenty, it usually "aborts" before this limit is reached.
211
- (I.e. the exact number of examples generated can be hard to predict, for complex patterns.)
209
+ All known bugs/missing features are [documented in GitHub](https://github.com/tom-lord/regexp-examples/issues).
210
+ Please discuss known issues there, or raise a new issue if required. Pull requests are welcome!
212
211
 
213
212
  Some of the most obscure regexp features are not even mentioned in [the ruby docs](http://ruby-doc.org/core/Regexp.html).
214
213
  However, full documentation on all the intricate obscurities in the ruby (version 2.x) regexp parser can be found
@@ -125,7 +125,7 @@ module RegexpExamples
125
125
  # Generates the result of each contained group
126
126
  # and adds the filled group of each result to itself
127
127
  def result
128
- strings = @groups.map { |repeater| repeater.public_send(__method__) }
128
+ strings = @groups.map { |repeater| repeater.public_send(__callee__) }
129
129
  RegexpExamples.permutations_of_strings(strings).map do |result|
130
130
  GroupResult.new(result, group_id)
131
131
  end
@@ -18,6 +18,7 @@ module RegexpExamples
18
18
  |! # Neglookahead
19
19
  |= # Lookahead
20
20
  |\# # Comment group
21
+ |~ # Absent operator (ruby 2.4.1+)
21
22
  |< # Lookbehind or named capture
22
23
  (
23
24
  ! # Neglookbehind
@@ -31,10 +32,27 @@ module RegexpExamples
31
32
  if match[1].nil? # e.g. /(normal)/
32
33
  group_id = @num_groups.to_s
33
34
  elsif match[2] == ':' # e.g. /(?:nocapture)/
35
+ @num_groups -= 1
34
36
  @current_position += 2
35
37
  elsif match[2] == '#' # e.g. /(?#comment)/
36
- comment_group = rest_of_string.match(/.*?[^\\](?:\\{2})*\)/)[0]
38
+ @num_groups -= 1
39
+ comment_group = rest_of_string.match(/.*?[^\\](?:\\{2})*(?=\))/)[0]
37
40
  @current_position += comment_group.length
41
+ return PlaceHolderGroup.new
42
+ elsif match[2] == '~' # e.g. /(?~absent operator)/
43
+ # The "best" way to replicate this is with a negative lookbehind:
44
+ # e.g. (?~abc) --> (?:.(?<!abc))*
45
+ # But since look-behinds are irregular, this library cannot support
46
+ # that! A possible workaround would be to replace the group with a
47
+ # repetition of the first letter negated, e.g.
48
+ # (?~abc) --> (?:[^a]*)
49
+ # However (!!) this generalisation is not always possible:
50
+ # (?~\wa|\Wb) --> ???
51
+ # Therefore, the only 100% reliable option is just to match "nothing"
52
+ @num_groups -= 1 # "Absence groups" are not counted as backrefs
53
+ absence_group = rest_of_string.match(/.*?[^\\](?:\\{2})*(?=\))/)[0]
54
+ @current_position += absence_group.length
55
+ return PlaceHolderGroup.new
38
56
  elsif match[2] =~ /\A(?=[mix-]+)([mix]*)-?([mix]*)/ # e.g. /(?i-mx)/
39
57
  regexp_options_toggle(Regexp.last_match(1), Regexp.last_match(2))
40
58
  @num_groups -= 1 # Toggle "groups" should not increase backref group count
@@ -1,4 +1,4 @@
1
1
  # Gem version
2
2
  module RegexpExamples
3
- VERSION = '1.4.2'.freeze
3
+ VERSION = '1.4.3'.freeze
4
4
  end
@@ -1,3 +1,8 @@
1
+ # Load from a separate file to avoid unrescuable SyntaxError
2
+ if RUBY_VERSION >= '2.4.1'
3
+ require_relative 'regexp-examples_spec_2.4.1'
4
+ end
5
+
1
6
  RSpec.describe Regexp, '#examples' do
2
7
  def self.examples_exist_and_match(*regexps)
3
8
  regexps.each do |regexp|
@@ -69,7 +74,7 @@ RSpec.describe Regexp, '#examples' do
69
74
  /[abc-e]/,
70
75
  /[^a-zA-Z]/,
71
76
  /[\w]/,
72
- /[]]/, # TODO: How to suppress annoying warnings on this test?
77
+ /[]]/,
73
78
  /[\]]/,
74
79
  /[\\]/,
75
80
  /[\\\]]/,
@@ -92,6 +97,7 @@ RSpec.describe Regexp, '#examples' do
92
97
  examples_exist_and_match(
93
98
  /(normal)/,
94
99
  /(?:nocapture)/,
100
+ /(?:nocapture)(normal) \1/, # Ensure the group counter is correct
95
101
  /(?<name>namedgroup)/,
96
102
  /(?<name>namedgroup) \k<name>/,
97
103
  /(?<name>namedgroup) \k'name'/
@@ -268,6 +274,7 @@ RSpec.describe Regexp, '#examples' do
268
274
  context 'for comment groups' do
269
275
  examples_exist_and_match(
270
276
  /a(?#comment)b/,
277
+ /(?#comment)(group1)\1/, # Ensure the group counter is correct
271
278
  /a(?#ugly backslashy\ comment\\\))b/
272
279
  )
273
280
  end
@@ -0,0 +1,7 @@
1
+ RSpec.describe Regexp, '#examples' do
2
+ context 'absent operator' do
3
+ it 'treats the group as an empty match' do
4
+ expect(/abc(?~def)ghi/.examples).to eq(['abcghi'])
5
+ end
6
+ end
7
+ end
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: 1.4.2
4
+ version: 1.4.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: 2017-12-25 00:00:00.000000000 Z
11
+ date: 2018-07-29 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -81,6 +81,7 @@ files:
81
81
  - spec/config_spec.rb
82
82
  - spec/helpers.rb
83
83
  - spec/regexp-examples_spec.rb
84
+ - spec/regexp-examples_spec_2.4.1.rb
84
85
  - spec/regexp-random_example_spec.rb
85
86
  - spec/spec_helper.rb
86
87
  homepage: http://rubygems.org/gems/regexp-examples
@@ -103,7 +104,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
103
104
  version: '0'
104
105
  requirements: []
105
106
  rubyforge_project:
106
- rubygems_version: 2.7.3
107
+ rubygems_version: 2.6.14.1
107
108
  signing_key:
108
109
  specification_version: 4
109
110
  summary: Extends the Regexp class with '#examples' and '#random_example'
@@ -111,5 +112,6 @@ test_files:
111
112
  - spec/config_spec.rb
112
113
  - spec/helpers.rb
113
114
  - spec/regexp-examples_spec.rb
115
+ - spec/regexp-examples_spec_2.4.1.rb
114
116
  - spec/regexp-random_example_spec.rb
115
117
  - spec/spec_helper.rb