regextest 0.1.4 → 0.1.5
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/Rakefile +8 -8
- data/lib/{pre-case-folding.rb → pre/case-folding.rb} +0 -0
- data/lib/{pre-generate-spec.rb → pre/generate-spec.rb} +0 -0
- data/lib/{pre-posix-char-class.rb → pre/posix-char-class.rb} +0 -0
- data/lib/{pre-unicode.rb → pre/unicode.rb} +4 -3
- data/lib/regextest.rb +12 -13
- data/lib/regextest/back.rb +9 -7
- data/lib/regextest/back/main.rb +20 -6
- data/lib/regextest/front.rb +16 -12
- data/lib/regextest/front/back-refer.rb +1 -1
- data/lib/regextest/front/bracket-scanner.rb +2 -2
- data/lib/regextest/front/char-class.rb +5 -8
- data/lib/regextest/front/letter.rb +3 -18
- data/lib/regextest/{front/unicode.rb → unicode.rb} +3 -2
- data/lib/regextest/version.rb +1 -1
- metadata +7 -7
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 1ebc162f43002fb402e523b7d9a504a9593cce57
|
4
|
+
data.tar.gz: ef3b47e4e0b53e2d8a0c2eac831688fe805fe6c2
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 642b88f4089090dad4b15a4b7b9486987d5d6ffd9a8c7ff7e76e6a95c6d6e51852718adc76e09e9a7589f66815d302dfa7c4ef44af70c7672667cd93b73cc545
|
7
|
+
data.tar.gz: 04c4b88d7f133428f2594fc6a7d623030702d01444f3846ca3d34839b2bd46b3d30e4c5a0a7da718bed5468c8e515aeebee16d5aca8f928235f2ee1af65fad22
|
data/Rakefile
CHANGED
@@ -20,21 +20,21 @@ file 'lib/regextest/front/bracket-parser.rb' => 'lib/regextest/front/bracket-par
|
|
20
20
|
end
|
21
21
|
|
22
22
|
# Generating Unicode parser
|
23
|
-
file 'lib/regextest/
|
24
|
-
puts "making regextest/
|
25
|
-
sh 'ruby lib/pre
|
23
|
+
file 'lib/regextest/unicode.rb' => 'lib/pre/unicode.rb' do
|
24
|
+
puts "making regextest/unicode.rb"
|
25
|
+
sh 'ruby lib/pre/unicode.rb'
|
26
26
|
end
|
27
27
|
|
28
28
|
# Generating case-folding mapping
|
29
|
-
file 'lib/regextest/front/case-folding.rb' => 'lib/pre
|
29
|
+
file 'lib/regextest/front/case-folding.rb' => 'lib/pre/case-folding.rb' do
|
30
30
|
puts "making regextest/front/case-folding.rb"
|
31
|
-
sh 'ruby lib/pre
|
31
|
+
sh 'ruby lib/pre/case-folding.rb'
|
32
32
|
end
|
33
33
|
|
34
34
|
# Generating regression test suite
|
35
|
-
file 'spec/regression_spec.rb' => 'lib/pre
|
35
|
+
file 'spec/regression_spec.rb' => 'lib/pre/generate-spec.rb' do
|
36
36
|
puts "making spec/regression_spec.rb"
|
37
|
-
sh 'ruby lib/pre
|
37
|
+
sh 'ruby lib/pre/generate-spec.rb'
|
38
38
|
end
|
39
39
|
|
40
40
|
# Generating documents
|
@@ -46,8 +46,8 @@ end
|
|
46
46
|
task :make =>
|
47
47
|
['lib/regextest/front/parser.rb',
|
48
48
|
'lib/regextest/front/bracket-parser.rb',
|
49
|
-
'lib/regextest/front/unicode.rb',
|
50
49
|
'lib/regextest/front/case-folding.rb',
|
50
|
+
'lib/regextest/unicode.rb',
|
51
51
|
'spec/regression_spec.rb',
|
52
52
|
'doc/index.html',
|
53
53
|
] do
|
File without changes
|
File without changes
|
File without changes
|
@@ -13,7 +13,7 @@ class RegextestPreUnicode
|
|
13
13
|
# Get valid properties of Ruby
|
14
14
|
onig_properties = read_onig_properties("./contrib/Onigmo/UnicodeProps.txt")
|
15
15
|
ranges = get_ranges_of_properties(onig_properties)
|
16
|
-
puts_unicode_ranges('lib/regextest/
|
16
|
+
puts_unicode_ranges('lib/regextest/unicode.rb', ranges)
|
17
17
|
end
|
18
18
|
|
19
19
|
# Get list of Unicode classes from Onigmo manual
|
@@ -85,13 +85,14 @@ class RegextestPreUnicode
|
|
85
85
|
# DO NOT Modify This File Since Automatically Generated
|
86
86
|
|
87
87
|
# Range of Unicode
|
88
|
-
class Regextest::
|
88
|
+
class Regextest::Unicode
|
89
89
|
# Generate hash of properties
|
90
90
|
def self.property(class_name)
|
91
91
|
case class_name.downcase
|
92
92
|
#{ranges_source}
|
93
93
|
else
|
94
|
-
|
94
|
+
warn "Class name (#\{class_name\}) not found. Ignored."
|
95
|
+
[]
|
95
96
|
end
|
96
97
|
end
|
97
98
|
|
data/lib/regextest.rb
CHANGED
@@ -46,11 +46,8 @@ class Regextest
|
|
46
46
|
# Parse string
|
47
47
|
@front_end = Regextest::Front.new(@reg_string, @@parse_options)
|
48
48
|
|
49
|
-
# To json (use json format for backend)
|
50
|
-
@json_obj = @front_end.get_json_obj
|
51
|
-
|
52
49
|
# Prepare back-end process. (use generate method for generating string)
|
53
|
-
@back_end = Regextest::Back.new(@
|
50
|
+
@back_end = Regextest::Back.new(@front_end)
|
54
51
|
|
55
52
|
@result = nil
|
56
53
|
@reason = nil
|
@@ -75,11 +72,11 @@ class Regextest
|
|
75
72
|
# @raise [RuntimeError] if something wrong...
|
76
73
|
# @raise [Regextest::RegextestTimeout] if detected timeout while verification. Option 'verification: false' may be workaround.
|
77
74
|
def generate
|
78
|
-
TstConstRetryMax.times do
|
75
|
+
TstConstRetryMax.times do | retry_count |
|
79
76
|
|
80
77
|
# generate string
|
81
78
|
reset_random_called
|
82
|
-
@result = @back_end.generate
|
79
|
+
@result = @back_end.generate(retry_count)
|
83
80
|
if !@result
|
84
81
|
TstLog "NG: Failed to generate"
|
85
82
|
@reason = :failed_to_generate
|
@@ -143,14 +140,14 @@ class Regextest
|
|
143
140
|
@reg_string = new_param
|
144
141
|
@reg_exp = /#{@reg_string}/
|
145
142
|
end
|
146
|
-
@@parse_options[:reg_source] = @reg_string
|
147
143
|
when Regexp
|
148
144
|
@reg_exp = param
|
149
145
|
@@parse_options[:reg_options].set(@reg_exp.options) # inner regex options have priorty
|
150
|
-
@reg_string = @reg_exp
|
146
|
+
@reg_string = "#{@reg_exp}" # this generates string with options
|
151
147
|
else
|
152
148
|
raise "Error: string or regular expression required"
|
153
149
|
end
|
150
|
+
@@parse_options[:reg_source] = @reg_string
|
154
151
|
end
|
155
152
|
|
156
153
|
# add built-in functions if any
|
@@ -213,20 +210,22 @@ if __FILE__ == $0
|
|
213
210
|
begin
|
214
211
|
|
215
212
|
regex = ARGV[0] || $<
|
213
|
+
|
216
214
|
if(regex == "reg")
|
217
|
-
regex = /ab # comment
|
215
|
+
regex = /(?ix:ab # comment
|
218
216
|
[a-z]{5,10}
|
219
|
-
cd /
|
217
|
+
cd )/
|
220
218
|
end
|
219
|
+
|
221
220
|
if(regex == "reg2")
|
222
|
-
regex = %r(
|
221
|
+
regex = %r((?x:
|
223
222
|
(?<name> [a-zA-Z_:]+ ){0}
|
224
223
|
(?<stag> < \g<name> > ){0}
|
225
|
-
(?<content>
|
224
|
+
(?<content> \w+ (\g<element> | \w+)* ){0}
|
226
225
|
(?<etag> </ \k<name+1> >){0}
|
227
226
|
(?<element> \g<stag> \g<content>* \g<etag> ){0}
|
228
227
|
\g<element>
|
229
|
-
)x
|
228
|
+
))x
|
230
229
|
end
|
231
230
|
|
232
231
|
begin
|
data/lib/regextest/back.rb
CHANGED
@@ -11,23 +11,25 @@ class Regextest::Back
|
|
11
11
|
include Regextest::Common
|
12
12
|
|
13
13
|
# Constructor
|
14
|
-
def initialize(
|
15
|
-
|
16
|
-
@
|
14
|
+
def initialize(front_end)
|
15
|
+
# To json (use json format for backend)
|
16
|
+
@parsed_object = front_end.get_object
|
17
|
+
@parse_result = @parsed_object["regex"]
|
18
|
+
@reg_source = @parsed_object["source"]
|
17
19
|
|
18
20
|
# COMMENTED OUT at present
|
19
21
|
# make a hash to manage names and corresponding objects
|
20
|
-
# @name_hash = make_name_hash(@
|
22
|
+
# @name_hash = make_name_hash(@parse_result, {})
|
21
23
|
# get test cases (commented at present)
|
22
|
-
# @test_info = Regextest::Back::TestCase.new(@
|
24
|
+
# @test_info = Regextest::Back::TestCase.new(@parse_result, @name_hash)
|
23
25
|
|
24
26
|
# default max recursion is 8.
|
25
27
|
@max_nest = TstConstRecursionMax
|
26
28
|
end
|
27
29
|
|
28
30
|
# A public method that generates string to match the regexp
|
29
|
-
def generate
|
30
|
-
generate_obj = Regextest::Back::Main.new(@
|
31
|
+
def generate(retry_count = 0)
|
32
|
+
generate_obj = Regextest::Back::Main.new(@parse_result, @max_nest, retry_count)
|
31
33
|
generate_obj.generate
|
32
34
|
end
|
33
35
|
|
data/lib/regextest/back/main.rb
CHANGED
@@ -9,9 +9,10 @@ require 'regextest/back/result'
|
|
9
9
|
# Main class of back-end. Construct candidates array and narrow down
|
10
10
|
class Regextest::Back::Main
|
11
11
|
include Regextest::Common
|
12
|
-
def initialize(json_obj, max_nest)
|
12
|
+
def initialize(json_obj, max_nest, retry_count = 0)
|
13
13
|
@json_obj = json_obj
|
14
14
|
@max_nest = max_nest
|
15
|
+
@retry_count = retry_count
|
15
16
|
@parens_hash = {} # hash to keep string generated by parentheses
|
16
17
|
@nest = 0 # current nest of back-reference
|
17
18
|
@quit_mode = false # flag for preventing from increase of nest
|
@@ -228,12 +229,19 @@ class Regextest::Back::Main
|
|
228
229
|
# repeat
|
229
230
|
def generate_candidates_repeat(param)
|
230
231
|
target = param[:json]
|
232
|
+
max_repeat = target["max_repeat"]
|
233
|
+
min_repeat = target["min_repeat"]
|
234
|
+
|
235
|
+
if @retry_count > 0
|
236
|
+
@retry_count.times{ max_repeat = (max_repeat + 1)/2 }
|
237
|
+
end
|
238
|
+
|
231
239
|
if(@quit_mode)
|
232
|
-
repeat =
|
233
|
-
elsif(
|
234
|
-
repeat =
|
240
|
+
repeat = min_repeat
|
241
|
+
elsif(max_repeat > min_repeat)
|
242
|
+
repeat = min_repeat + TstRand(max_repeat - min_repeat + 1)
|
235
243
|
else
|
236
|
-
repeat =
|
244
|
+
repeat = min_repeat
|
237
245
|
end
|
238
246
|
result = []
|
239
247
|
if target["repeat_option"].index("reluctant")
|
@@ -273,7 +281,13 @@ class Regextest::Back::Main
|
|
273
281
|
def generate_candidates_back_refer(param)
|
274
282
|
target = param[:json]
|
275
283
|
if @parens_hash[target["refer_name"]][:generated]
|
276
|
-
relative_num =
|
284
|
+
relative_num = -1 # default value
|
285
|
+
if target["relative_num"] != ""
|
286
|
+
work = @nest + target["relative_num"].to_i
|
287
|
+
return nil if(work < 0 || !@parens_hash[target["refer_name"]][:generated][work])
|
288
|
+
relative_num = work
|
289
|
+
end
|
290
|
+
# puts "relative: #{relative_num}, nest=#{@nest}, :#{target}"
|
277
291
|
result = @parens_hash[target["refer_name"]][:generated][relative_num]
|
278
292
|
else
|
279
293
|
result = nil
|
data/lib/regextest/front.rb
CHANGED
@@ -16,6 +16,9 @@ class Regextest::Front
|
|
16
16
|
def initialize(reg_string, options)
|
17
17
|
@options = options
|
18
18
|
|
19
|
+
# Json option as a workaround for ruby 1.9.*
|
20
|
+
@json_option = { max_nesting: 999 }
|
21
|
+
|
19
22
|
# scanning the string
|
20
23
|
scanner = Regextest::Front::Scanner.new
|
21
24
|
lex_words = scanner.scan(reg_string)
|
@@ -27,30 +30,31 @@ class Regextest::Front
|
|
27
30
|
@parser = RegextestFrontParser.new
|
28
31
|
|
29
32
|
# Do parse
|
30
|
-
@
|
33
|
+
@parse_result = @parser.parse(lex_words, @options)
|
31
34
|
|
32
35
|
# process options
|
33
|
-
@
|
36
|
+
@parse_result.set_options(options)
|
34
37
|
|
35
38
|
# sort parentheses, since number of parenthesis is by offset-order (not by parsing-order)
|
36
39
|
@options[:parens].sort
|
37
40
|
|
38
|
-
@
|
41
|
+
@parse_result
|
39
42
|
end
|
40
43
|
|
41
44
|
# Output JSON format parse result of the regex
|
42
|
-
def
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
45
|
+
def get_object
|
46
|
+
json_obj = JSON.parse(@parse_result.json, @json_option)
|
47
|
+
parsed_object = {
|
48
|
+
"regex" => json_obj,
|
49
|
+
"source" => @options[:reg_source]
|
50
|
+
}
|
51
|
+
TstLog("JSON param:\n" + JSON.pretty_generate(parsed_object, @json_option))
|
52
|
+
parsed_object
|
47
53
|
end
|
48
54
|
|
49
55
|
# Return JSON string
|
50
|
-
def get_json_string
|
51
|
-
|
52
|
-
option = { max_nesting: 999} # work around for ruby 1.9.*
|
53
|
-
JSON.pretty_generate(json_obj, option)
|
56
|
+
def get_json_string
|
57
|
+
JSON.pretty_generate(get_object, @json_option)
|
54
58
|
end
|
55
59
|
|
56
60
|
end
|
@@ -40,8 +40,8 @@ class Regextest::Front::BracketScanner
|
|
40
40
|
/-(?!\]|\z)/ ], # a letter must succeeds to minus
|
41
41
|
[:LEX_AND_AND,
|
42
42
|
%r!\&\&! ],
|
43
|
-
[:LEX_SPECIAL_LETTER,
|
44
|
-
|
43
|
+
# [:LEX_SPECIAL_LETTER, # special letters are not valid in bracket
|
44
|
+
# %r!\\[RX]! ],
|
45
45
|
[:LEX_ESCAPED_LETTER,
|
46
46
|
%r!\\.! ], # \b is valid within character class
|
47
47
|
[:LEX_SPACE,
|
@@ -6,7 +6,7 @@ require 'regextest/common'
|
|
6
6
|
require 'regextest/front/range' # Range of character
|
7
7
|
require 'regextest/front/case-folding' # case folding class
|
8
8
|
require 'regextest/regex-option' # Options of regex
|
9
|
-
require 'regextest/
|
9
|
+
require 'regextest/unicode'
|
10
10
|
|
11
11
|
# character class elements
|
12
12
|
module Regextest::Front::CharClass
|
@@ -40,7 +40,7 @@ module Regextest::Front::CharClass
|
|
40
40
|
class_names = value
|
41
41
|
@candidates = []
|
42
42
|
class_names.split("|").each do | class_name |
|
43
|
-
work = Regextest::
|
43
|
+
work = Regextest::Unicode.property(class_name) ||
|
44
44
|
raise("Invalid Unicode class #{class_name}")
|
45
45
|
# construct char class
|
46
46
|
@candidates += work.map{|elem| TRange.new(elem[0], elem[1])}
|
@@ -153,19 +153,16 @@ module Regextest::Front::CharClass
|
|
153
153
|
|
154
154
|
# Get whole code set of ascii
|
155
155
|
def get_ascii_whole_set
|
156
|
-
|
157
|
-
|
158
|
-
ascii_set = Regextest::Front::Unicode.enumerate("ascii")
|
159
|
-
print_set = Regextest::Front::Unicode.enumerate("print")
|
156
|
+
ascii_set = Regextest::Unicode.enumerate("ascii")
|
157
|
+
print_set = Regextest::Unicode.enumerate("print")
|
160
158
|
ascii_set & print_set
|
161
159
|
end
|
162
160
|
|
163
161
|
# Get whole code set of unicode
|
164
162
|
def get_unicode_whole_set
|
165
|
-
# require 'regextest/front/unicode'
|
166
163
|
char_set = []
|
167
164
|
TstConstUnicodeCharSet.split("|").each do | elem |
|
168
|
-
char_set |= Regextest::
|
165
|
+
char_set |= Regextest::Unicode.enumerate(elem)
|
169
166
|
end
|
170
167
|
char_set
|
171
168
|
end
|
@@ -6,7 +6,6 @@ require 'regextest/common'
|
|
6
6
|
require 'regextest/front/char-class' # character class element
|
7
7
|
require 'regextest/front/range' # range of character point
|
8
8
|
require 'regextest/regex-option'
|
9
|
-
require 'regextest/front/unicode'
|
10
9
|
|
11
10
|
# A letter
|
12
11
|
module Regextest::Front::Letter
|
@@ -179,37 +178,23 @@ module Regextest::Front::Letter
|
|
179
178
|
|
180
179
|
# generate Unicode class (ie. \p{...} | \P{...})
|
181
180
|
def generate_unicode_char(val)
|
182
|
-
# Dynamic loading of Unicode regarding modules (for better performance).
|
183
|
-
# commented out since this code not executed at ruby 2.0.0
|
184
|
-
# require 'regextest/front/unicode'
|
185
|
-
|
186
181
|
if(md = val.match(/(p|P)\{(\^?)(\w+)\}/))
|
187
182
|
class_name = md[3].downcase
|
188
183
|
reverse = (md[2] && md[2]=="^")?true:false
|
189
184
|
|
190
|
-
|
191
|
-
if !@@unicode_ranges[class_name]
|
192
|
-
#work = Regextest::Front::Unicode.property(class_name) ||
|
193
|
-
# raise("Invalid Unicode class #{class_name} in #{val}")
|
194
|
-
# construct char class
|
195
|
-
#work = work.map{|elem| TRange.new(elem[0], elem[1])}
|
196
|
-
@@unicode_ranges[class_name] = CharClass.new(class_name)
|
197
|
-
end
|
185
|
+
obj = CharClass.new(class_name)
|
198
186
|
else
|
199
187
|
raise "Internal error, inconsistent Unicode class #{val}"
|
200
188
|
end
|
201
189
|
|
202
190
|
# ¥P{^...} is equivalent to \p{...}
|
203
191
|
if((md[1] == "p" && !reverse) || (md[1] == "P" && reverse))
|
204
|
-
|
192
|
+
obj
|
205
193
|
else # \P{} or \p{^}
|
206
|
-
|
194
|
+
obj.set_reverse(@options)
|
207
195
|
end
|
208
196
|
end
|
209
197
|
|
210
|
-
def classname_to_ranges(arrays)
|
211
|
-
end
|
212
|
-
|
213
198
|
# generate POSIX character class (ie. [[:alpha:]], etc.)
|
214
199
|
def generate_char_class(val)
|
215
200
|
if(md = val.match(/^\[\:(\^)?(\w+)\:\]$/))
|
@@ -2,7 +2,7 @@
|
|
2
2
|
# DO NOT Modify This File Since Automatically Generated
|
3
3
|
|
4
4
|
# Range of Unicode
|
5
|
-
class Regextest::
|
5
|
+
class Regextest::Unicode
|
6
6
|
# Generate hash of properties
|
7
7
|
def self.property(class_name)
|
8
8
|
case class_name.downcase
|
@@ -1257,7 +1257,8 @@ class Regextest::Front::Unicode
|
|
1257
1257
|
when "in_no_block"
|
1258
1258
|
([[2144, 2207], [6832, 6911], [7296, 7359], [12256, 12271], [43488, 43519], [43824, 43967], [66048, 66175], [66272, 66303], [66384, 66431], [66528, 66559], [66736, 67583], [67680, 67839], [67904, 67967], [68224, 68351], [68480, 68607], [68688, 69215], [69248, 69631], [69968, 70015], [70112, 71295], [71376, 73727], [74880, 77823], [78896, 92159], [92736, 93951], [94112, 110591], [110848, 118783], [119376, 119551], [119680, 119807], [120832, 126463], [126720, 126975], [128592, 128639], [128896, 131071], [173792, 173823], [178208, 194559], [195104, 917503], [917632, 917759], [918000, 983039]])
|
1259
1259
|
else
|
1260
|
-
|
1260
|
+
warn "Class name (#{class_name}) not found. Ignored."
|
1261
|
+
[]
|
1261
1262
|
end
|
1262
1263
|
end
|
1263
1264
|
|
data/lib/regextest/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: regextest
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.5
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- IKOMA, Mikio
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-
|
11
|
+
date: 2016-09-02 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: ruby
|
@@ -128,10 +128,10 @@ files:
|
|
128
128
|
- contrib/unicode/README.txt
|
129
129
|
- contrib/unicode/Scripts.txt
|
130
130
|
- contrib/unicode/UnicodeData.txt
|
131
|
-
- lib/pre
|
132
|
-
- lib/pre
|
133
|
-
- lib/pre
|
134
|
-
- lib/pre
|
131
|
+
- lib/pre/case-folding.rb
|
132
|
+
- lib/pre/generate-spec.rb
|
133
|
+
- lib/pre/posix-char-class.rb
|
134
|
+
- lib/pre/unicode.rb
|
135
135
|
- lib/regextest.rb
|
136
136
|
- lib/regextest/back.rb
|
137
137
|
- lib/regextest/back/element.rb
|
@@ -162,9 +162,9 @@ files:
|
|
162
162
|
- lib/regextest/front/scanner.rb
|
163
163
|
- lib/regextest/front/selectable.rb
|
164
164
|
- lib/regextest/front/sequence.rb
|
165
|
-
- lib/regextest/front/unicode.rb
|
166
165
|
- lib/regextest/regex-option.rb
|
167
166
|
- lib/regextest/regexp.rb
|
167
|
+
- lib/regextest/unicode.rb
|
168
168
|
- lib/regextest/version.rb
|
169
169
|
- lib/tst-reg-test.rb
|
170
170
|
- regextest.gemspec
|