regexp-examples 1.4.2 → 1.4.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
- 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