regexp-examples 1.3.2 → 1.4.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 +4 -4
- data/README.md +29 -6
- data/lib/core_extensions/regexp/examples.rb +6 -10
- data/lib/regexp-examples/constants.rb +41 -25
- data/lib/regexp-examples/helpers.rb +5 -2
- data/lib/regexp-examples/max_results_limiter.rb +4 -2
- data/lib/regexp-examples/repeaters.rb +11 -16
- data/lib/regexp-examples/version.rb +1 -1
- data/spec/config_spec.rb +135 -0
- data/spec/regexp-examples_spec.rb +0 -53
- metadata +4 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: e7ea454116c6367dba39b57fb8ca5fdd6b1e5062
|
4
|
+
data.tar.gz: a41c56176c0bbf007e99780790f3e196d4605190
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 41f307047bbd5ca1539d6eda5d4035b91649187fdb015c449c2f56a64353c601911b1da465df0e891d01fed3344e70b3bc1efbfeaa8bfd61d371b0e1a0bf5c12
|
7
|
+
data.tar.gz: 2c126a5b52842b9c2b5b13fbf3243e09f6ae29d0d290561e050566bf6fa94401fa3d33a6d492bdec177ce1be9bacd49cee363ff0ce552b2986b1e0da22eea9ce
|
data/README.md
CHANGED
@@ -10,9 +10,8 @@ Extends the `Regexp` class with the methods: `Regexp#examples` and `Regexp#rando
|
|
10
10
|
|
11
11
|
`Regexp#random_example` returns one, random string (from all possible strings!!) that matches the regex.
|
12
12
|
|
13
|
-
\* If the regex has an infinite number of possible
|
13
|
+
\* If the regex has an infinite number of possible strings that match it, such as `/a*b+c{2,}/`,
|
14
14
|
or a huge number of possible matches, such as `/.\w/`, then only a subset of these will be listed.
|
15
|
-
|
16
15
|
For more detail on this, see [configuration options](#configuration-options).
|
17
16
|
|
18
17
|
If you'd like to understand how/why this gem works, please check out my [blog post](https://tom-lord.github.io/Reverse-Engineering-Regular-Expressions/) about it.
|
@@ -112,11 +111,11 @@ Long answer:
|
|
112
111
|
* Non-capture groups, e.g. `/(?:foo)/`
|
113
112
|
* Comment groups, e.g. `/foo(?#comment)bar/`
|
114
113
|
* Control characters, e.g. `/\ca/`, `/\cZ/`, `/\C-9/`
|
115
|
-
* Escape sequences, e.g. `/\x42/`, `/\x5word/`, `/#{"\x80".
|
114
|
+
* Escape sequences, e.g. `/\x42/`, `/\x5word/`, `/#{"\x80".force_encoding("ASCII-8BIT")}/`
|
116
115
|
* Unicode characters, e.g. `/\u0123/`, `/\uabcd/`, `/\u{789}/`
|
117
116
|
* Octal characters, e.g. `/\10/`, `/\177/`
|
118
117
|
* Named properties, e.g. `/\p{L}/` ("Letter"), `/\p{Arabic}/` ("Arabic character")
|
119
|
-
, `/\p{^Ll}/` ("Not a lowercase letter"), `/\P{^
|
118
|
+
, `/\p{^Ll}/` ("Not a lowercase letter"), `/\P{^Canadian_Aboriginal}/` ("Not not a Canadian aboriginal character")
|
120
119
|
* ...Even between different ruby versions!! (e.g. `/\p{Arabic}/.examples(max_group_results: 999)` will give you a different answer in ruby v2.1.x and v2.2.x)
|
121
120
|
* **Arbitrarily complex combinations of all the above!**
|
122
121
|
|
@@ -126,7 +125,7 @@ Long answer:
|
|
126
125
|
* Extended form examples: `/line1 #comment \n line2/x.examples #=> ["line1line2"]`
|
127
126
|
* Options toggling supported: `/before(?imx-imx)after/`, `/before(?imx-imx:subexpr)after/`
|
128
127
|
|
129
|
-
##Configuration Options
|
128
|
+
## Configuration Options
|
130
129
|
|
131
130
|
When generating examples, the gem uses 3 configurable values to limit how many examples are listed:
|
132
131
|
|
@@ -149,7 +148,9 @@ When generating examples, the gem uses 3 configurable values to limit how many e
|
|
149
148
|
|
150
149
|
`Rexexp#examples` makes use of *all* these options; `Rexexp#random_example` only uses `max_repeater_variance`, since the other options are redundant.
|
151
150
|
|
152
|
-
|
151
|
+
### Defining custom configuration values
|
152
|
+
|
153
|
+
To use an alternative value, you can either pass the configuration option as a parameter:
|
153
154
|
|
154
155
|
```ruby
|
155
156
|
/a*/.examples(max_repeater_variance: 5)
|
@@ -162,6 +163,24 @@ To use an alternative value, simply pass the configuration option as follows:
|
|
162
163
|
#=> "A very unlikely result!"
|
163
164
|
```
|
164
165
|
|
166
|
+
Or, set an alternative value *within a block*:
|
167
|
+
|
168
|
+
```ruby
|
169
|
+
RegexpExamples::Config.with_configuration(max_repeater_variance: 5) do
|
170
|
+
# ...
|
171
|
+
end
|
172
|
+
```
|
173
|
+
|
174
|
+
Or, globally set a different default value:
|
175
|
+
|
176
|
+
```ruby
|
177
|
+
# e.g In a rails project, you may wish to place this in
|
178
|
+
# config/initializers/regexp_examples.rb
|
179
|
+
RegexpExamples::Config.max_repeater_variance = 5
|
180
|
+
RegexpExamples::Config.max_group_results = 10
|
181
|
+
RegexpExamples::Config.max_results_limit = 20000
|
182
|
+
```
|
183
|
+
|
165
184
|
A sensible use case might be, for example, to generate all 1-5 digit strings:
|
166
185
|
|
167
186
|
```ruby
|
@@ -169,12 +188,16 @@ A sensible use case might be, for example, to generate all 1-5 digit strings:
|
|
169
188
|
#=> ['0', '1', '2', ..., '99998', '99999']
|
170
189
|
```
|
171
190
|
|
191
|
+
### Configuration Notes
|
192
|
+
|
172
193
|
Due to code optimisation, `Regexp#random_example` runs pretty fast even on very complex patterns.
|
173
194
|
(I.e. It's typically a _lot_ faster than using `/pattern/.examples.sample(1)`.)
|
174
195
|
For instance, the following takes no more than ~ 1 second on my machine:
|
175
196
|
|
176
197
|
`/.*\w+\d{100}/.random_example(max_repeater_variance: 1000)`
|
177
198
|
|
199
|
+
All forms of configuration mentioned above **are thread safe**.
|
200
|
+
|
178
201
|
## Bugs and TODOs
|
179
202
|
|
180
203
|
There are no known major bugs with this library. However, there are a few obscure issues that you *may* encounter:
|
@@ -5,19 +5,15 @@ module CoreExtensions
|
|
5
5
|
# No core classes are extended in any way, other than the above two methods.
|
6
6
|
module Examples
|
7
7
|
def examples(**config_options)
|
8
|
-
RegexpExamples::
|
9
|
-
|
10
|
-
|
11
|
-
max_results_limit: config_options[:max_results_limit]
|
12
|
-
)
|
13
|
-
examples_by_method(:result)
|
8
|
+
RegexpExamples::Config.with_configuration(config_options) do
|
9
|
+
examples_by_method(:result)
|
10
|
+
end
|
14
11
|
end
|
15
12
|
|
16
13
|
def random_example(**config_options)
|
17
|
-
RegexpExamples::
|
18
|
-
|
19
|
-
|
20
|
-
examples_by_method(:random_result).sample(1).first
|
14
|
+
RegexpExamples::Config.with_configuration(config_options) do
|
15
|
+
examples_by_method(:random_result).sample
|
16
|
+
end
|
21
17
|
end
|
22
18
|
|
23
19
|
private
|
@@ -1,9 +1,47 @@
|
|
1
1
|
# :nodoc:
|
2
2
|
module RegexpExamples
|
3
3
|
# Configuration settings to limit the number/length of Regexp examples generated
|
4
|
-
class
|
4
|
+
class Config
|
5
|
+
class << self
|
6
|
+
def with_configuration(**new_config)
|
7
|
+
original_config = config.dup
|
8
|
+
|
9
|
+
begin
|
10
|
+
self.config = new_config
|
11
|
+
result = yield
|
12
|
+
ensure
|
13
|
+
self.config = original_config
|
14
|
+
end
|
15
|
+
|
16
|
+
result
|
17
|
+
end
|
18
|
+
|
19
|
+
# Thread-safe getters and setters
|
20
|
+
%i[max_repeater_variance max_group_results max_results_limit].each do |m|
|
21
|
+
define_method(m) do
|
22
|
+
config[m]
|
23
|
+
end
|
24
|
+
define_method("#{m}=") do |value|
|
25
|
+
config[m] = value
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
private
|
30
|
+
|
31
|
+
def config=(**args)
|
32
|
+
Thread.current[:regexp_examples_config].merge!(args)
|
33
|
+
end
|
34
|
+
|
35
|
+
def config
|
36
|
+
Thread.current[:regexp_examples_config] ||= {
|
37
|
+
max_repeater_variance: MAX_REPEATER_VARIANCE_DEFAULT,
|
38
|
+
max_group_results: MAX_GROUP_RESULTS_DEFAULT,
|
39
|
+
max_results_limit: MAX_RESULTS_LIMIT_DEFAULT
|
40
|
+
}
|
41
|
+
end
|
42
|
+
end
|
5
43
|
# The maximum variance for any given repeater, to prevent a huge/infinite number of
|
6
|
-
# examples from being listed. For example, if
|
44
|
+
# examples from being listed. For example, if self.max_repeater_variance = 2 then:
|
7
45
|
# .* is equivalent to .{0,2}
|
8
46
|
# .+ is equivalent to .{1,3}
|
9
47
|
# .{2,} is equivalent to .{2,4}
|
@@ -12,7 +50,7 @@ module RegexpExamples
|
|
12
50
|
MAX_REPEATER_VARIANCE_DEFAULT = 2
|
13
51
|
|
14
52
|
# Maximum number of characters returned from a char set, to reduce output spam
|
15
|
-
# For example, if
|
53
|
+
# For example, if self.max_group_results = 5 then:
|
16
54
|
# \d is equivalent to [01234]
|
17
55
|
# \w is equivalent to [abcde]
|
18
56
|
MAX_GROUP_RESULTS_DEFAULT = 5
|
@@ -22,28 +60,6 @@ module RegexpExamples
|
|
22
60
|
# /[ab]{30}/.examples
|
23
61
|
# (Which would attempt to generate 2**30 == 1073741824 examples!!!)
|
24
62
|
MAX_RESULTS_LIMIT_DEFAULT = 10_000
|
25
|
-
class << self
|
26
|
-
attr_reader :max_repeater_variance, :max_group_results, :max_results_limit
|
27
|
-
def configure!(max_repeater_variance: nil,
|
28
|
-
max_group_results: nil,
|
29
|
-
max_results_limit: nil)
|
30
|
-
@max_repeater_variance = (max_repeater_variance || MAX_REPEATER_VARIANCE_DEFAULT)
|
31
|
-
@max_group_results = (max_group_results || MAX_GROUP_RESULTS_DEFAULT)
|
32
|
-
@max_results_limit = (max_results_limit || MAX_RESULTS_LIMIT_DEFAULT)
|
33
|
-
end
|
34
|
-
end
|
35
|
-
end
|
36
|
-
|
37
|
-
def self.max_repeater_variance
|
38
|
-
ResultCountLimiters.max_repeater_variance
|
39
|
-
end
|
40
|
-
|
41
|
-
def self.max_group_results
|
42
|
-
ResultCountLimiters.max_group_results
|
43
|
-
end
|
44
|
-
|
45
|
-
def self.max_results_limit
|
46
|
-
ResultCountLimiters.max_results_limit
|
47
63
|
end
|
48
64
|
|
49
65
|
# Definitions of various special characters, used in regular expressions.
|
@@ -10,10 +10,13 @@ module RegexpExamples
|
|
10
10
|
# Edge case:
|
11
11
|
# permutations_of_strings [ [] ] #=> nil
|
12
12
|
# (For example, ths occurs during /[^\d\D]/.examples #=> [])
|
13
|
-
def self.permutations_of_strings(arrays_of_strings,
|
13
|
+
def self.permutations_of_strings(arrays_of_strings,
|
14
|
+
max_results_limiter = MaxResultsLimiterByProduct.new)
|
14
15
|
partial_result = max_results_limiter.limit_results(arrays_of_strings.shift)
|
15
16
|
return partial_result if arrays_of_strings.empty?
|
16
|
-
partial_result.product(
|
17
|
+
partial_result.product(
|
18
|
+
permutations_of_strings(arrays_of_strings, max_results_limiter)
|
19
|
+
).map do |result|
|
17
20
|
join_preserving_capture_groups(result)
|
18
21
|
end
|
19
22
|
end
|
@@ -1,5 +1,6 @@
|
|
1
1
|
module RegexpExamples
|
2
|
-
class
|
2
|
+
# Abstract (base) class to assist limiting Regexp.examples max results
|
3
|
+
class MaxResultsLimiter
|
3
4
|
def initialize(initial_results_count)
|
4
5
|
@results_count = initial_results_count
|
5
6
|
end
|
@@ -25,7 +26,8 @@ module RegexpExamples
|
|
25
26
|
|
26
27
|
def results_allowed_from(partial_results, limiter_method)
|
27
28
|
partial_results.first(
|
28
|
-
RegexpExamples.max_results_limit
|
29
|
+
RegexpExamples::Config.max_results_limit
|
30
|
+
.public_send(limiter_method, @results_count)
|
29
31
|
)
|
30
32
|
end
|
31
33
|
end
|
@@ -10,7 +10,7 @@ module RegexpExamples
|
|
10
10
|
end
|
11
11
|
|
12
12
|
def result
|
13
|
-
group_results = group.result.first(RegexpExamples.max_group_results)
|
13
|
+
group_results = group.result.first(RegexpExamples::Config.max_group_results)
|
14
14
|
results = []
|
15
15
|
max_results_limiter = MaxResultsLimiterBySum.new
|
16
16
|
min_repeats.upto(max_repeats) do |repeats|
|
@@ -51,7 +51,7 @@ module RegexpExamples
|
|
51
51
|
def initialize(group)
|
52
52
|
super
|
53
53
|
@min_repeats = 0
|
54
|
-
@max_repeats = RegexpExamples.max_repeater_variance
|
54
|
+
@max_repeats = RegexpExamples::Config.max_repeater_variance
|
55
55
|
end
|
56
56
|
end
|
57
57
|
|
@@ -61,7 +61,7 @@ module RegexpExamples
|
|
61
61
|
def initialize(group)
|
62
62
|
super
|
63
63
|
@min_repeats = 1
|
64
|
-
@max_repeats = RegexpExamples.max_repeater_variance + 1
|
64
|
+
@max_repeats = RegexpExamples::Config.max_repeater_variance + 1
|
65
65
|
end
|
66
66
|
end
|
67
67
|
|
@@ -80,19 +80,14 @@ module RegexpExamples
|
|
80
80
|
def initialize(group, min, has_comma, max)
|
81
81
|
super(group)
|
82
82
|
@min_repeats = min || 0
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
private
|
93
|
-
|
94
|
-
def smallest(x, y)
|
95
|
-
x < y ? x : y
|
83
|
+
@max_repeats = if !has_comma
|
84
|
+
@min_repeats
|
85
|
+
else
|
86
|
+
[
|
87
|
+
max,
|
88
|
+
@min_repeats + RegexpExamples::Config.max_repeater_variance
|
89
|
+
].compact.min
|
90
|
+
end
|
96
91
|
end
|
97
92
|
end
|
98
93
|
end
|
data/spec/config_spec.rb
ADDED
@@ -0,0 +1,135 @@
|
|
1
|
+
RSpec.describe RegexpExamples::Config do
|
2
|
+
|
3
|
+
describe 'max_repeater_variance' do
|
4
|
+
context 'as a passed parameter' do
|
5
|
+
it 'with low limit' do
|
6
|
+
expect(/[A-Z]/.examples(max_results_limit: 5))
|
7
|
+
.to match_array %w(A B C D E)
|
8
|
+
end
|
9
|
+
it 'with (default) high limit' do
|
10
|
+
expect(/[ab]{14}/.examples.length)
|
11
|
+
.to be <= 10000 # NOT 2**14 == 16384, because it's been limited
|
12
|
+
end
|
13
|
+
it 'with (custom) high limit' do
|
14
|
+
expect(/[ab]{14}/.examples(max_results_limit: 20000).length)
|
15
|
+
.to eq 16384 # NOT 10000, because it's below the limit
|
16
|
+
end
|
17
|
+
it 'for boolean or groups' do
|
18
|
+
expect(/[ab]{3}|[cd]{3}/.examples(max_results_limit: 10).length)
|
19
|
+
.to eq 10
|
20
|
+
end
|
21
|
+
it 'for case insensitive examples' do
|
22
|
+
expect(/[ab]{3}/i.examples(max_results_limit: 10).length)
|
23
|
+
.to be <= 10
|
24
|
+
end
|
25
|
+
it 'for range repeaters' do
|
26
|
+
expect(/[ab]{2,3}/.examples(max_results_limit: 10).length)
|
27
|
+
.to be <= 10 # NOT 4 + 8 = 12
|
28
|
+
end
|
29
|
+
it 'for backreferences' do
|
30
|
+
expect(/([ab]{3})\1?/.examples(max_results_limit: 10).length)
|
31
|
+
.to be <= 10 # NOT 8 * 2 = 16
|
32
|
+
end
|
33
|
+
it 'for a complex pattern' do
|
34
|
+
expect(/(a|[bc]{2})\1{1,3}/.examples(max_results_limit: 14).length)
|
35
|
+
.to be <= 14 # NOT (1 + 4) * 3 = 15
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
context 'as a global setting' do
|
40
|
+
before do
|
41
|
+
@original = RegexpExamples::Config.max_results_limit
|
42
|
+
RegexpExamples::Config.max_results_limit = 5
|
43
|
+
end
|
44
|
+
after do
|
45
|
+
RegexpExamples::Config.max_results_limit = @original
|
46
|
+
end
|
47
|
+
|
48
|
+
it 'sets limit without passing explicitly' do
|
49
|
+
expect(/[A-Z]/.examples)
|
50
|
+
.to match_array %w(A B C D E)
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end # describe 'max_results_limit'
|
54
|
+
|
55
|
+
describe 'max_repeater_variance' do
|
56
|
+
context 'as a passed parameter' do
|
57
|
+
it 'with a larger value' do
|
58
|
+
expect(/a+/.examples(max_repeater_variance: 5))
|
59
|
+
.to match_array %w(a aa aaa aaaa aaaaa aaaaaa)
|
60
|
+
end
|
61
|
+
it 'with a lower value' do
|
62
|
+
expect(/a{4,8}/.examples(max_repeater_variance: 0))
|
63
|
+
.to eq %w(aaaa)
|
64
|
+
end
|
65
|
+
end
|
66
|
+
|
67
|
+
context 'as a global setting' do
|
68
|
+
before do
|
69
|
+
@original = RegexpExamples::Config.max_repeater_variance
|
70
|
+
RegexpExamples::Config.max_repeater_variance = 5
|
71
|
+
end
|
72
|
+
after do
|
73
|
+
RegexpExamples::Config.max_repeater_variance = @original
|
74
|
+
end
|
75
|
+
|
76
|
+
it 'sets limit without passing explicitly' do
|
77
|
+
expect(/a+/.examples)
|
78
|
+
.to match_array %w(a aa aaa aaaa aaaaa aaaaaa)
|
79
|
+
end
|
80
|
+
end
|
81
|
+
end # describe 'max_repeater_variance'
|
82
|
+
|
83
|
+
describe 'max_group_results' do
|
84
|
+
context 'as a passed parameter' do
|
85
|
+
it 'with a larger value' do
|
86
|
+
expect(/\d/.examples(max_group_results: 10))
|
87
|
+
.to match_array %w(0 1 2 3 4 5 6 7 8 9)
|
88
|
+
end
|
89
|
+
it 'with a lower value' do
|
90
|
+
expect(/\d/.examples(max_group_results: 3))
|
91
|
+
.to match_array %w(0 1 2)
|
92
|
+
end
|
93
|
+
end
|
94
|
+
|
95
|
+
context 'as a global setting' do
|
96
|
+
before do
|
97
|
+
@original = RegexpExamples::Config.max_group_results
|
98
|
+
RegexpExamples::Config.max_group_results = 10
|
99
|
+
end
|
100
|
+
after do
|
101
|
+
RegexpExamples::Config.max_group_results = @original
|
102
|
+
end
|
103
|
+
|
104
|
+
it 'sets limit without passing explicitly' do
|
105
|
+
expect(/\d/.examples)
|
106
|
+
.to match_array %w(0 1 2 3 4 5 6 7 8 9)
|
107
|
+
end
|
108
|
+
end
|
109
|
+
end # describe 'max_group_results'
|
110
|
+
|
111
|
+
describe 'thread safety' do
|
112
|
+
it 'uses thread-local global config values' do
|
113
|
+
thread = Thread.new do
|
114
|
+
RegexpExamples::Config.max_group_results = 1
|
115
|
+
expect(/\d/.examples).to eq %w(0)
|
116
|
+
end
|
117
|
+
sleep 0.1 # Give the above thread time to run
|
118
|
+
expect(/\d/.examples).to eq %w(0 1 2 3 4)
|
119
|
+
thread.join
|
120
|
+
end
|
121
|
+
|
122
|
+
it 'uses thread-local block config values' do
|
123
|
+
thread = Thread.new do
|
124
|
+
RegexpExamples::Config.with_configuration(max_group_results: 1) do
|
125
|
+
expect(/\d/.examples).to eq %w(0)
|
126
|
+
sleep 0.2 # Give the below thread time to run while this block is open
|
127
|
+
end
|
128
|
+
end
|
129
|
+
sleep 0.1 # Give the above thread time to run
|
130
|
+
expect(/\d/.examples).to eq %w(0 1 2 3 4)
|
131
|
+
thread.join
|
132
|
+
end
|
133
|
+
end # describe 'thread safety'
|
134
|
+
|
135
|
+
end
|
@@ -316,24 +316,6 @@ RSpec.describe Regexp, '#examples' do
|
|
316
316
|
end
|
317
317
|
end
|
318
318
|
|
319
|
-
context 'max_repeater_variance config option' do
|
320
|
-
it do
|
321
|
-
expect(/a+/.examples(max_repeater_variance: 5))
|
322
|
-
.to match_array %w(a aa aaa aaaa aaaaa aaaaaa)
|
323
|
-
end
|
324
|
-
it do
|
325
|
-
expect(/a{4,8}/.examples(max_repeater_variance: 0))
|
326
|
-
.to eq %w(aaaa)
|
327
|
-
end
|
328
|
-
end
|
329
|
-
|
330
|
-
context 'max_group_results config option' do
|
331
|
-
it do
|
332
|
-
expect(/\d/.examples(max_group_results: 10))
|
333
|
-
.to match_array %w(0 1 2 3 4 5 6 7 8 9)
|
334
|
-
end
|
335
|
-
end
|
336
|
-
|
337
319
|
context 'case insensitive' do
|
338
320
|
it { expect(/ab/i.examples).to match_array %w(ab aB Ab AB) }
|
339
321
|
it do
|
@@ -377,39 +359,4 @@ RSpec.describe Regexp, '#examples' do
|
|
377
359
|
end
|
378
360
|
end # context 'exact examples match'
|
379
361
|
end # context 'returns matching strings'
|
380
|
-
|
381
|
-
context 'max_results_limit config option' do
|
382
|
-
it 'with low limit' do
|
383
|
-
expect(/[A-Z]/.examples(max_results_limit: 5))
|
384
|
-
.to match_array %w(A B C D E)
|
385
|
-
end
|
386
|
-
it 'with (default) high limit' do
|
387
|
-
expect(/[ab]{14}/.examples.length)
|
388
|
-
.to be <= 10000 # NOT 2**14 == 16384, because it's been limited
|
389
|
-
end
|
390
|
-
it 'with (custom) high limit' do
|
391
|
-
expect(/[ab]{14}/.examples(max_results_limit: 20000).length)
|
392
|
-
.to eq 16384 # NOT 10000, because it's below the limit
|
393
|
-
end
|
394
|
-
it 'for boolean or groups' do
|
395
|
-
expect(/[ab]{3}|[cd]{3}/.examples(max_results_limit: 10).length)
|
396
|
-
.to eq 10
|
397
|
-
end
|
398
|
-
it 'for case insensitive examples' do
|
399
|
-
expect(/[ab]{3}/i.examples(max_results_limit: 10).length)
|
400
|
-
.to be <= 10
|
401
|
-
end
|
402
|
-
it 'for range repeaters' do
|
403
|
-
expect(/[ab]{2,3}/.examples(max_results_limit: 10).length)
|
404
|
-
.to be <= 10 # NOT 4 + 8 = 12
|
405
|
-
end
|
406
|
-
it 'for backreferences' do
|
407
|
-
expect(/([ab]{3})\1?/.examples(max_results_limit: 10).length)
|
408
|
-
.to be <= 10 # NOT 8 * 2 = 16
|
409
|
-
end
|
410
|
-
it 'for a complex pattern' do
|
411
|
-
expect(/(a|[bc]{2})\1{1,3}/.examples(max_results_limit: 14).length)
|
412
|
-
.to be <= 14 # NOT (1 + 4) * 3 = 15
|
413
|
-
end
|
414
|
-
end
|
415
362
|
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
|
+
version: 1.4.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: 2017-
|
11
|
+
date: 2017-10-15 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -76,6 +76,7 @@ files:
|
|
76
76
|
- lib/regexp-examples/version.rb
|
77
77
|
- regexp-examples.gemspec
|
78
78
|
- scripts/unicode_lister.rb
|
79
|
+
- spec/config_spec.rb
|
79
80
|
- spec/helpers.rb
|
80
81
|
- spec/regexp-examples_spec.rb
|
81
82
|
- spec/regexp-random_example_spec.rb
|
@@ -105,6 +106,7 @@ signing_key:
|
|
105
106
|
specification_version: 4
|
106
107
|
summary: Extends the Regexp class with '#examples' and '#random_example'
|
107
108
|
test_files:
|
109
|
+
- spec/config_spec.rb
|
108
110
|
- spec/helpers.rb
|
109
111
|
- spec/regexp-examples_spec.rb
|
110
112
|
- spec/regexp-random_example_spec.rb
|