regexp-examples 0.4.2 → 0.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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 7e76c8504f718a77052f24bdd8785042ded1b584
4
- data.tar.gz: 5f63fd56430a4f8f0f10fd9ffc4f82d7b1301b2e
3
+ metadata.gz: 460970b9b7691fe163a9334542ccd57c71241c2a
4
+ data.tar.gz: 0c4ce5df7f59e72af6de41b8538d72b52c40939d
5
5
  SHA512:
6
- metadata.gz: ead89c6fead001d78b5336a69fa044af6fce905664c48a1430594b811b3729d4ea341e369ef190a43159672c4ca16a75a3c92c9a068c3638774b6030d318932a
7
- data.tar.gz: d9edc5da0d9f2d3a6b856f00b202e5c119a1733f130cdf40b27e70875771f3f08707a9f0523b607b9882220b39e486a844e2013d774660c17c3b0f51743db02a
6
+ metadata.gz: 5932e6ea64e3008dad054d67f906863244366324e28cf1d280a222966b77dc1bc816760d6af1d9f023518b40ccfbdd8ad9c634060d2811ca5d687e333604e268
7
+ data.tar.gz: fd2c136a9457aac2e953fe77c972925a6af9f420f025ca9f7500a8252636ebf1ba2b1104232d17719de5b1c53cf8e1a4316c52e789bed113b6589b8cf71c7dda
data/.travis.yml CHANGED
@@ -2,4 +2,8 @@ language: ruby
2
2
  rvm:
3
3
  - 2.0.0-p598
4
4
  - 2.1.5
5
- - ruby-head
5
+ - 2.2.0
6
+ # One (ruby 2.3-dev) test fails, due to a change of behaviour in Array#delete_if,
7
+ # but I don't know if this is intentional. I'll fix it once the behaviour change is documented.
8
+ # For now, I don't really care if 2.3-dev tests all pass.
9
+ # - ruby-head
data/README.md CHANGED
@@ -45,9 +45,9 @@ For more detail on this, see [configuration options](#configuration-options).
45
45
 
46
46
  ## Bugs and Not-Yet-Supported syntax
47
47
 
48
- * Options, e.g. `/pattern/i`, `/foo.*bar/m` - Using options will currently just be ignored, for example:
49
- * `/test/i.examples` will NOT include `"TEST"`
48
+ * Other options (besides ingnorecase), will currently just be ignored, for example:
50
49
  * `/white space/x.examples` will not strip out the whitespace from the pattern, i.e. this incorrectly returns `["white space"]` rather than `["whitespace"]`
50
+ * `/./m.examples(max_group_results: 999)` will not include `"\n"`
51
51
 
52
52
  * Nested character classes, and the use of set intersection ([See here](http://www.ruby-doc.org/core-2.2.0/Regexp.html#class-Regexp-label-Character+Classes) for the official documentation on this.) For example:
53
53
  * `/[[abc]]/.examples` (which _should_ return `["a", "b", "c"]`)
Binary file
@@ -1,9 +1,9 @@
1
1
  module CoreExtensions
2
2
  module Regexp
3
3
  module Examples
4
- def examples(options={})
4
+ def examples(config_options={})
5
5
  full_examples = RegexpExamples.map_results(
6
- RegexpExamples::Parser.new(source, options).parse
6
+ RegexpExamples::Parser.new(source, options, config_options).parse
7
7
  )
8
8
  RegexpExamples::BackReferenceReplacer.new.substitute_backreferences(full_examples)
9
9
  end
@@ -16,11 +16,32 @@ module RegexpExamples
16
16
  def all_subgroups
17
17
  [self, subgroups].flatten.reject { |subgroup| subgroup.group_id.nil? }
18
18
  end
19
+
20
+ def swapcase
21
+ # Override to preserve subgroups
22
+ GroupResult.new(super.to_s, group_id, subgroups)
23
+ end
24
+ end
25
+
26
+ module GroupWithOptions
27
+ attr_reader :options
28
+ def result
29
+ group_result = super
30
+ if options[:ignorecase]
31
+ group_result
32
+ .concat( group_result.map(&:swapcase) )
33
+ .uniq
34
+ else
35
+ group_result
36
+ end
37
+ end
19
38
  end
20
39
 
21
40
  class SingleCharGroup
22
- def initialize(char)
41
+ prepend GroupWithOptions
42
+ def initialize(char, options)
23
43
  @char = char
44
+ @options = options
24
45
  end
25
46
  def result
26
47
  [GroupResult.new(@char)]
@@ -28,8 +49,10 @@ module RegexpExamples
28
49
  end
29
50
 
30
51
  class CharGroup
31
- def initialize(chars)
52
+ prepend GroupWithOptions
53
+ def initialize(chars, options)
32
54
  @chars = chars
55
+ @options = options
33
56
  if chars[0] == "^"
34
57
  @negative = true
35
58
  @chars = @chars[1..-1]
@@ -43,6 +66,7 @@ module RegexpExamples
43
66
 
44
67
  def init_ranges
45
68
  # save first and last "-" if present
69
+
46
70
  first = nil
47
71
  last = nil
48
72
  first = @chars.shift if @chars.first == "-"
@@ -95,6 +119,11 @@ module RegexpExamples
95
119
  end
96
120
 
97
121
  class DotGroup
122
+ prepend GroupWithOptions
123
+ def initialize(options={})
124
+ @options = options
125
+ end
126
+
98
127
  def result
99
128
  CharSets::Any.map do |result|
100
129
  GroupResult.new(result)
@@ -103,10 +132,12 @@ module RegexpExamples
103
132
  end
104
133
 
105
134
  class MultiGroup
135
+ prepend GroupWithOptions
106
136
  attr_reader :group_id
107
- def initialize(groups, group_id)
137
+ def initialize(groups, group_id, options)
108
138
  @groups = groups
109
139
  @group_id = group_id
140
+ @options = options
110
141
  end
111
142
 
112
143
  # Generates the result of each contained group
@@ -1,13 +1,14 @@
1
1
  module RegexpExamples
2
2
  class Parser
3
3
  attr_reader :regexp_string
4
- def initialize(regexp_string, options={})
4
+ def initialize(regexp_string, regexp_options, config_options={})
5
5
  @regexp_string = regexp_string
6
+ @ignorecase = ( regexp_options & Regexp::IGNORECASE == 1 )
6
7
  @num_groups = 0
7
8
  @current_position = 0
8
9
  RegexpExamples::ResultCountLimiters.configure!(
9
- options[:max_repeater_variance],
10
- options[:max_group_results]
10
+ config_options[:max_repeater_variance],
11
+ config_options[:max_group_results]
11
12
  )
12
13
  end
13
14
 
@@ -27,6 +28,10 @@ module RegexpExamples
27
28
 
28
29
  private
29
30
 
31
+ def regexp_options
32
+ {ignorecase: @ignorecase}
33
+ end
34
+
30
35
  def parse_group(repeaters)
31
36
  case next_char
32
37
  when '('
@@ -72,7 +77,8 @@ module RegexpExamples
72
77
  group = CharGroup.new(
73
78
  # Note: The `.dup` is important, as it prevents modifying the constant, in
74
79
  # CharGroup#init_ranges (where the '-' is moved to the front)
75
- BackslashCharMap[next_char].dup
80
+ BackslashCharMap[next_char].dup,
81
+ regexp_options
76
82
  )
77
83
  when rest_of_string =~ /\A(c|C-)(.)/ # Control character
78
84
  @current_position += $1.length
@@ -147,7 +153,7 @@ module RegexpExamples
147
153
  end
148
154
  end
149
155
  groups = parse
150
- MultiGroup.new(groups, group_id)
156
+ MultiGroup.new(groups, group_id, regexp_options)
151
157
  end
152
158
 
153
159
  def parse_multi_end_group
@@ -175,11 +181,11 @@ module RegexpExamples
175
181
  chars << next_char
176
182
  @current_position += 1
177
183
  end
178
- CharGroup.new(chars)
184
+ CharGroup.new(chars, regexp_options)
179
185
  end
180
186
 
181
187
  def parse_dot_group
182
- DotGroup.new
188
+ DotGroup.new(regexp_options)
183
189
  end
184
190
 
185
191
  def parse_or_group(left_repeaters)
@@ -190,7 +196,7 @@ module RegexpExamples
190
196
 
191
197
 
192
198
  def parse_single_char_group(char)
193
- SingleCharGroup.new(char)
199
+ SingleCharGroup.new(char, regexp_options)
194
200
  end
195
201
 
196
202
  def parse_backreference_group(match)
@@ -1,3 +1,3 @@
1
1
  module RegexpExamples
2
- VERSION = '0.4.2'
2
+ VERSION = '0.5.0'
3
3
  end
@@ -242,6 +242,7 @@ RSpec.describe Regexp, "#examples" do
242
242
  # a{1}? should be equivalent to (?:a{1})?, i.e. NOT a "non-greedy quantifier"
243
243
  it { expect(/a{1}?/.examples).to eq ["", "a"] }
244
244
  end
245
+
245
246
  context "max_repeater_variance option" do
246
247
  it do
247
248
  expect(/a+/.examples(max_repeater_variance: 5))
@@ -252,12 +253,19 @@ RSpec.describe Regexp, "#examples" do
252
253
  .to eq %w(aaaa)
253
254
  end
254
255
  end
256
+
255
257
  context "max_group_results option" do
256
258
  it do
257
259
  expect(/\d/.examples(max_group_results: 10))
258
260
  .to eq %w(0 1 2 3 4 5 6 7 8 9)
259
261
  end
260
262
  end
263
+
264
+ context "case insensitive" do
265
+ it { expect(/ab/i.examples).to eq %w(ab aB Ab AB) }
266
+ it { expect(/a+/i.examples).to eq %w(a A aa aA Aa AA aaa aaA aAa aAA Aaa AaA AAa AAA) }
267
+ it { expect(/([ab])\1/i.examples).to eq %w(aa bb AA BB) }
268
+ end
261
269
  end
262
270
 
263
271
  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: 0.4.2
4
+ version: 0.5.0
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-03 00:00:00.000000000 Z
11
+ date: 2015-02-04 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler