regextest 0.1.2

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.
Files changed (64) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +11 -0
  3. data/.rspec +2 -0
  4. data/.travis.yml +3 -0
  5. data/Gemfile +4 -0
  6. data/LICENSE.txt +25 -0
  7. data/README.md +88 -0
  8. data/Rakefile +55 -0
  9. data/bin/console +14 -0
  10. data/bin/regextest +4 -0
  11. data/bin/setup +7 -0
  12. data/contrib/Onigmo/RE.txt +522 -0
  13. data/contrib/Onigmo/UnicodeProps.txt +728 -0
  14. data/contrib/Onigmo/testpy.py +1319 -0
  15. data/contrib/unicode/Blocks.txt +298 -0
  16. data/contrib/unicode/CaseFolding.txt +1414 -0
  17. data/contrib/unicode/DerivedAge.txt +1538 -0
  18. data/contrib/unicode/DerivedCoreProperties.txt +11029 -0
  19. data/contrib/unicode/PropList.txt +1525 -0
  20. data/contrib/unicode/PropertyAliases.txt +193 -0
  21. data/contrib/unicode/PropertyValueAliases.txt +1420 -0
  22. data/contrib/unicode/README.txt +25 -0
  23. data/contrib/unicode/Scripts.txt +2539 -0
  24. data/contrib/unicode/UnicodeData.txt +29215 -0
  25. data/lib/pre-case-folding.rb +101 -0
  26. data/lib/pre-posix-char-class.rb +150 -0
  27. data/lib/pre-unicode.rb +116 -0
  28. data/lib/regextest.rb +268 -0
  29. data/lib/regextest/back.rb +58 -0
  30. data/lib/regextest/back/element.rb +151 -0
  31. data/lib/regextest/back/main.rb +356 -0
  32. data/lib/regextest/back/result.rb +498 -0
  33. data/lib/regextest/back/test-case.rb +268 -0
  34. data/lib/regextest/back/work-thread.rb +119 -0
  35. data/lib/regextest/common.rb +63 -0
  36. data/lib/regextest/front.rb +60 -0
  37. data/lib/regextest/front/anchor.rb +45 -0
  38. data/lib/regextest/front/back-refer.rb +120 -0
  39. data/lib/regextest/front/bracket-parser.rb +400 -0
  40. data/lib/regextest/front/bracket-parser.y +117 -0
  41. data/lib/regextest/front/bracket-scanner.rb +124 -0
  42. data/lib/regextest/front/bracket.rb +64 -0
  43. data/lib/regextest/front/builtin-functions.rb +31 -0
  44. data/lib/regextest/front/case-folding.rb +18 -0
  45. data/lib/regextest/front/char-class.rb +243 -0
  46. data/lib/regextest/front/empty.rb +43 -0
  47. data/lib/regextest/front/letter.rb +327 -0
  48. data/lib/regextest/front/manage-parentheses.rb +74 -0
  49. data/lib/regextest/front/parenthesis.rb +153 -0
  50. data/lib/regextest/front/parser.rb +1366 -0
  51. data/lib/regextest/front/parser.y +271 -0
  52. data/lib/regextest/front/range.rb +60 -0
  53. data/lib/regextest/front/repeat.rb +90 -0
  54. data/lib/regextest/front/repeatable.rb +77 -0
  55. data/lib/regextest/front/scanner.rb +187 -0
  56. data/lib/regextest/front/selectable.rb +65 -0
  57. data/lib/regextest/front/sequence.rb +73 -0
  58. data/lib/regextest/front/unicode.rb +1272 -0
  59. data/lib/regextest/regex-option.rb +144 -0
  60. data/lib/regextest/regexp.rb +44 -0
  61. data/lib/regextest/version.rb +5 -0
  62. data/lib/tst-reg-test.rb +159 -0
  63. data/regextest.gemspec +26 -0
  64. metadata +162 -0
@@ -0,0 +1,144 @@
1
+ # encoding: utf-8
2
+
3
+ # Copyright (C) 2016 Mikio Ikoma
4
+
5
+ # A class that manages options of regular expression
6
+ class Regextest::RegexOption
7
+ # Constants for the class
8
+ TstRegOptDefault = 1
9
+ TstRegOptAscii = 2
10
+ TstRegOptUnicode = 3
11
+
12
+ attr_accessor :reg_options, :char_set
13
+
14
+ def initialize(options = nil)
15
+ self.set(options)
16
+ @char_set = TstRegOptDefault
17
+ end
18
+
19
+ # a method for copy (maybe unnecessary)
20
+ def initialize_copy(source_obj)
21
+ @reg_options = source_obj.reg_options
22
+ @char_set = source_obj.char_set
23
+ end
24
+
25
+ # set one or more options
26
+ def set(options)
27
+ @reg_options = 0
28
+ modify(options)
29
+ end
30
+
31
+ # modify one or more options
32
+ def modify(options)
33
+ case options
34
+ when String
35
+ modify_string(options)
36
+ when Integer
37
+ modify_integer(options)
38
+ end
39
+ end
40
+
41
+ # modify regoption by string (like 'x-im')
42
+ def modify_string(opt_string)
43
+ opts = opt_string.split("-")
44
+ raise "Option string (#{opt_string}) is invalid." if(opts.size > 2)
45
+
46
+ # set option bits
47
+ if(opts[0])
48
+ opts[0].split(//).each do | opt |
49
+ case opt
50
+ when 'i'
51
+ @reg_options |= Regexp::IGNORECASE
52
+ when 'x'
53
+ @reg_options |= Regexp::EXTENDED
54
+ when 'm'
55
+ @reg_options |= Regexp::MULTILINE
56
+ when 'd'
57
+ @char_set = TstRegOptDefault
58
+ when 'u'
59
+ @char_set = TstRegOptUnicode
60
+ when 'a'
61
+ @char_set = TstRegOptAscii
62
+ else
63
+ raise "Invalid char (#{opt}) found in regexp option"
64
+ end
65
+ end
66
+ end
67
+
68
+ # reset option bits
69
+ if(opts[1])
70
+ opts[1].split(//).each do | opt |
71
+ case opt
72
+ when 'i'
73
+ @reg_options &= ~Regexp::IGNORECASE
74
+ when 'x'
75
+ @reg_options &= ~Regexp::EXTENDED
76
+ when 'm'
77
+ @reg_options &= ~Regexp::MULTILINE
78
+ else
79
+ raise "Invalid char (#{opt}) found in regexp option"
80
+ end
81
+ end
82
+ end
83
+ @reg_options
84
+ end
85
+
86
+ # modify options by integer
87
+ def modify_integer(options)
88
+ @reg_options |= options
89
+ end
90
+
91
+
92
+ # methods for checking each flag
93
+ def is_ignore?
94
+ (@reg_options & Regexp::IGNORECASE != 0)
95
+ end
96
+
97
+ def is_extended?
98
+ (@reg_options & Regexp::EXTENDED != 0)
99
+ end
100
+
101
+ def is_multiline?
102
+ (@reg_options & Regexp::MULTILINE != 0)
103
+ end
104
+
105
+ def is_default_char_set?
106
+ (@char_set == TstRegOptDefault)
107
+ end
108
+
109
+ def is_ascii?
110
+ (@char_set == TstRegOptAscii)
111
+ end
112
+
113
+ def is_unicode?
114
+ (@char_set == TstRegOptUnicode)
115
+ end
116
+ end
117
+
118
+
119
+ # Test suite (execute when this file is specified in command line)
120
+ if __FILE__ == $0
121
+ puts "test #{__FILE__}"
122
+
123
+ opts = Regextest::RegexOption.new("ixm")
124
+ puts "OK igonore" if(opts.is_ignore?)
125
+ puts "OK extended" if(opts.is_extended?)
126
+ puts "OK multiline" if(opts.is_multiline?)
127
+
128
+ opts2 = opts.dup
129
+ puts "OK dup igonore" if(opts2.is_ignore?)
130
+ puts "OK dup extended" if(opts2.is_extended?)
131
+ puts "OK dup multiline" if(opts2.is_multiline?)
132
+
133
+ opts.modify("-ixm")
134
+ puts "OK mod igonore" if(!opts.is_ignore?)
135
+ puts "OK mod extended" if(!opts.is_extended?)
136
+ puts "OK mod multiline" if(!opts.is_multiline?)
137
+
138
+ # verify opt2 is independent of opt
139
+ puts "OK mod igonore" if(opts2.is_ignore?)
140
+ puts "OK mod extended" if(opts2.is_extended?)
141
+ puts "OK mod multiline" if(opts2.is_multiline?)
142
+
143
+ end
144
+
@@ -0,0 +1,44 @@
1
+ # encoding: utf-8
2
+
3
+ # Copyright (C) 2016 Mikio Ikoma
4
+
5
+ # Add-on methods (samples, sample, match_data) for Regexp class
6
+ # @raise [Regextest::RegextestError] if impossible to generate.
7
+ # @raise [Regextest::RegextestFailedToGenerate] if failed to generate. Mainly caused by Regextest's restrictions.
8
+ # @raise [Regextest::RegextestTimeout] if detected timeout while verification. Option 'verification: false' may be workaround.
9
+ # @raise [RuntimeError] if something wrong... mainly caused by Regextest's bug
10
+ class Regexp
11
+
12
+ # generate a sample string of regexp
13
+ # @param [Hash] option option parameters for sampling
14
+ # @option option [Fixnum] :seed seed for randomization
15
+ # @option option [TrueClass] :verification specify true (or not speficy) if verified using ruby Regexp.
16
+ # @option option [FalseClass] :verification specify false if skip to verify using ruby Regexp.
17
+ # @return [String] if able to generate matched string
18
+ def sample(option = {})
19
+ if option[:verification] != false
20
+ match_data(option).string
21
+ else
22
+ match_data(option)
23
+ end
24
+ end
25
+
26
+ # generate match-data object(s) of regexp
27
+ # @param [Hash] option option parameters for sampling
28
+ # @option option [Fixnum] :seed seed for randomization
29
+ # @option option [TrueClass] :verification specify true (or not speficy) if verified using ruby Regexp.
30
+ # @option option [FalseClass] :verification specify false if skip to verify using ruby Regexp.
31
+ # @return [MatchData] if able to generate matched data
32
+ def match_data(option = {})
33
+ regextest = Regextest.new(self, option)
34
+ result = regextest.generate
35
+ end
36
+
37
+ # parse regexp and return json data
38
+ # @return [String] return parsed json string
39
+ def to_json
40
+ regextest = Regextest.new(self, {})
41
+ regextest.to_json
42
+ end
43
+
44
+ end
@@ -0,0 +1,5 @@
1
+ # Copyright (C) 2016 Mikio Ikoma
2
+
3
+ class Regextest
4
+ VERSION = "0.1.2"
5
+ end
@@ -0,0 +1,159 @@
1
+ # encoding: utf-8
2
+
3
+ # Copyright (C) 2016 Mikio Ikoma
4
+
5
+ require 'regextest'
6
+ require 'kconv'
7
+ require 'timeout'
8
+ require 'pp'
9
+
10
+ class Regextest::Test
11
+ def initialize(min_test, max_test)
12
+ results = {
13
+ success: [],
14
+ bug: [],
15
+ failed: [],
16
+ impossible: [],
17
+ others: [],
18
+ not_scope: [],
19
+ timeout: [],
20
+ perl_syntax: [],
21
+ }
22
+ time_out = 1
23
+ do_test(results, min_test, max_test, time_out)
24
+ print_results(results)
25
+ end
26
+
27
+ def print_results(results)
28
+ puts ""
29
+ (results[:failed] + results[:bug]).each do | failed_hash |
30
+ regex = failed_hash[:test] || failed_hash[:result][:reg]
31
+ puts "======="
32
+ puts " type: #{failed_hash[:type] || failed_hash[:result][:result]}"
33
+ puts " test: #{regex}"
34
+ puts " info: #{failed_hash[:info] || failed_hash[:result][:reason]}"
35
+ puts " indx: #{failed_hash[:index]}"
36
+ pp failed_hash
37
+ end
38
+
39
+ puts "======"
40
+ puts "success: #{results[:success].size}"
41
+ puts "bug: #{results[:bug].size}"
42
+ puts "failed: #{results[:failed].size}"
43
+ puts "impossible: #{results[:impossible].size}"
44
+ puts "others: #{results[:others].size}"
45
+ puts "timeout: #{results[:timeout].size}"
46
+ puts "regexp error: #{results[:not_scope].size}"
47
+ puts "perl_syntax: #{results[:perl_syntax].size}"
48
+ end
49
+
50
+ def do_test(results, min_test, max_test, timeout_seconds)
51
+ get_lines(results).each_with_index do | line, i |
52
+ next if(i < min_test || i > max_test)
53
+ puts line
54
+ begin
55
+ rc = nil
56
+ timeout(timeout_seconds){
57
+ rc = eval(line)
58
+ }
59
+ if(rc[:result] == :ok)
60
+ results[:success].push({ md: rc[:md], reg: rc[:reg], index: i})
61
+ else
62
+ results[:failed].push({ result: rc, index: i })
63
+ end
64
+ rescue Timeout::Error => ex
65
+ warn "Timeout::Error #{ex}. \nline:#{line}"
66
+ results[:timeout].push({result: :timeout, message: ex, reg: line, index: i})
67
+ rescue RegexpError => ex
68
+ warn "RegexpError #{ex}. \nline:#{line}"
69
+ results[:not_scope].push({result: :regexp_error, message: ex, reg: line, index: i})
70
+ rescue ArgumentError => ex
71
+ warn "ArgumentError #{ex}. \nline: line"
72
+ results[:failed].push({type: :argument_error, info: ex, test: line, index: i})
73
+ #rescue Regextest::Common::RegextestTimeout => ex
74
+ # warn "RegextestTimeout #{ex}. \nline:#{line}"
75
+ # results[:failed].push({ type: :timeout, test: line, info: ex, index: i})
76
+ rescue Regextest::RegextestError => ex
77
+ warn "RegextestError #{ex}. \nline:#{line}"
78
+ results[:impossible].push({ type: Regextest::RegextestError, test: line, info: ex, index: i})
79
+ rescue Regextest::RegextestFailedToGenerate => ex
80
+ warn "RegextestFailedToGenerate #{ex}. \nline:#{line}"
81
+ results[:failed].push({ type: Regextest::RegextestFailedToGenerate, test: line, info: ex, index: i})
82
+ rescue RuntimeError => ex
83
+ warn "RuntimeError #{ex}. \nline:#{line}"
84
+ results[:bug].push({ type: RuntimeError, test: line, info: ex, index: i})
85
+ rescue SyntaxError => ex
86
+ warn "SyntaxError #{ex}. \nline:#{line}"
87
+ results[:failed].push({ type: SyntaxError, test: line, info: ex, index: i})
88
+ rescue NameError => ex
89
+ warn "NameError #{ex}. \nline:#{line}"
90
+ results[:failed].push({ type: NameError, test: line, info: ex, index: i})
91
+ rescue TypeError => ex
92
+ warn "TypeError #{ex}. \nline:#{line}"
93
+ results[:failed].push({ type: TypeError, test: line, info: ex, index: i})
94
+ rescue Encoding::CompatibilityError => ex
95
+ warn "Encoding::CompatibilityError #{ex}. \nline:#{line}"
96
+ results[:failed].push({ type: Encoding::CompatibilityError, test: line, info: ex, index: i})
97
+ end
98
+ end
99
+ end
100
+
101
+ def get_lines(results)
102
+ lines = []
103
+ # py_source = IO.read("../contrib/Onigmo/testpy.py")
104
+ File::open("../contrib/Onigmo/testpy.py") do |f|
105
+ f.each do |line|
106
+ line.force_encoding("utf-8")
107
+ if !line.match(/ONIG_SYNTAX_PERL/)
108
+ if(md = line.match(/^\s*(?:x|x2|n)\s*\(.+?$/u) rescue nil)
109
+ line.sub!(/,\s*\".+?$/, ")") rescue nil
110
+ lines.push line if line
111
+ end
112
+ else
113
+ warn "Perl syntax. \nline:#{line}"
114
+ results[:perl_syntax].push({ type: :perl_syntax, test: line, info: nil})
115
+ end
116
+ end
117
+ end
118
+ lines
119
+ end
120
+
121
+ def check_normal_test(reg)
122
+ result = nil
123
+ a_test = /#{reg}/
124
+ # puts a_test.source
125
+ obj = Regextest.new(a_test)
126
+ 10.times do | i |
127
+ md = obj.generate
128
+ if(md)
129
+ # print "OK md:#{md},"
130
+ result = {result: :ok, md: md, reg: a_test}
131
+ else
132
+ warn "Failed. reg='#{a_test}', reason=#{obj.reason}"
133
+ result = {result: :unmatched, reg: a_test, reason: obj.reason}
134
+ break
135
+ end
136
+ end
137
+ result
138
+ end
139
+
140
+ def x(reg, *params)
141
+ check_normal_test(reg)
142
+ end
143
+
144
+ def x2(reg, *params)
145
+ check_normal_test(reg)
146
+ end
147
+
148
+ def n(reg, *params)
149
+ check_normal_test(reg)
150
+ end
151
+
152
+ end
153
+
154
+ # Test suite (execute when this file is specified in command line)
155
+ if __FILE__ == $0
156
+ min_test = ARGV[1]?(ARGV[0].to_i):0
157
+ max_test = ARGV[1]?(ARGV[1].to_i):(ARGV[0]?(ARGV[0].to_i):99999999)
158
+ Regextest::Test.new(min_test, max_test)
159
+ end
@@ -0,0 +1,26 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'regextest/version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = "regextest"
8
+ spec.version = Regextest::VERSION
9
+ spec.authors = ["IKOMA, Mikio"]
10
+ spec.email = ["mikio.ikoma@gmail.com"]
11
+
12
+ spec.summary = %q{A ruby library for generating sample data of regular expression}
13
+ spec.description = %q{This library generates data matched with specified regular expression.}
14
+ spec.homepage = "https://bitbucket.org/ikomamik/regextest"
15
+ spec.license = "2-clause BSD license (see the file LICENSE.txt)"
16
+
17
+ spec.files = `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
18
+ spec.bindir = "exe"
19
+ spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
20
+ spec.require_paths = ["lib"]
21
+
22
+ spec.add_development_dependency "bundler", "~> 1.8"
23
+ spec.add_development_dependency "rake", "~> 10.0"
24
+ spec.add_development_dependency "yard", "~> 0.9.5"
25
+ spec.add_development_dependency "rspec"
26
+ end
metadata ADDED
@@ -0,0 +1,162 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: regextest
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.2
5
+ platform: ruby
6
+ authors:
7
+ - IKOMA, Mikio
8
+ autorequire:
9
+ bindir: exe
10
+ cert_chain: []
11
+ date: 2016-08-21 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: bundler
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ~>
18
+ - !ruby/object:Gem::Version
19
+ version: '1.8'
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ~>
25
+ - !ruby/object:Gem::Version
26
+ version: '1.8'
27
+ - !ruby/object:Gem::Dependency
28
+ name: rake
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ~>
32
+ - !ruby/object:Gem::Version
33
+ version: '10.0'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ~>
39
+ - !ruby/object:Gem::Version
40
+ version: '10.0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: yard
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ~>
46
+ - !ruby/object:Gem::Version
47
+ version: 0.9.5
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ~>
53
+ - !ruby/object:Gem::Version
54
+ version: 0.9.5
55
+ - !ruby/object:Gem::Dependency
56
+ name: rspec
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - '>='
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - '>='
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
69
+ description: This library generates data matched with specified regular expression.
70
+ email:
71
+ - mikio.ikoma@gmail.com
72
+ executables: []
73
+ extensions: []
74
+ extra_rdoc_files: []
75
+ files:
76
+ - .gitignore
77
+ - .rspec
78
+ - .travis.yml
79
+ - Gemfile
80
+ - LICENSE.txt
81
+ - README.md
82
+ - Rakefile
83
+ - bin/console
84
+ - bin/regextest
85
+ - bin/setup
86
+ - contrib/Onigmo/RE.txt
87
+ - contrib/Onigmo/UnicodeProps.txt
88
+ - contrib/Onigmo/testpy.py
89
+ - contrib/unicode/Blocks.txt
90
+ - contrib/unicode/CaseFolding.txt
91
+ - contrib/unicode/DerivedAge.txt
92
+ - contrib/unicode/DerivedCoreProperties.txt
93
+ - contrib/unicode/PropList.txt
94
+ - contrib/unicode/PropertyAliases.txt
95
+ - contrib/unicode/PropertyValueAliases.txt
96
+ - contrib/unicode/README.txt
97
+ - contrib/unicode/Scripts.txt
98
+ - contrib/unicode/UnicodeData.txt
99
+ - lib/pre-case-folding.rb
100
+ - lib/pre-posix-char-class.rb
101
+ - lib/pre-unicode.rb
102
+ - lib/regextest.rb
103
+ - lib/regextest/back.rb
104
+ - lib/regextest/back/element.rb
105
+ - lib/regextest/back/main.rb
106
+ - lib/regextest/back/result.rb
107
+ - lib/regextest/back/test-case.rb
108
+ - lib/regextest/back/work-thread.rb
109
+ - lib/regextest/common.rb
110
+ - lib/regextest/front.rb
111
+ - lib/regextest/front/anchor.rb
112
+ - lib/regextest/front/back-refer.rb
113
+ - lib/regextest/front/bracket-parser.rb
114
+ - lib/regextest/front/bracket-parser.y
115
+ - lib/regextest/front/bracket-scanner.rb
116
+ - lib/regextest/front/bracket.rb
117
+ - lib/regextest/front/builtin-functions.rb
118
+ - lib/regextest/front/case-folding.rb
119
+ - lib/regextest/front/char-class.rb
120
+ - lib/regextest/front/empty.rb
121
+ - lib/regextest/front/letter.rb
122
+ - lib/regextest/front/manage-parentheses.rb
123
+ - lib/regextest/front/parenthesis.rb
124
+ - lib/regextest/front/parser.rb
125
+ - lib/regextest/front/parser.y
126
+ - lib/regextest/front/range.rb
127
+ - lib/regextest/front/repeat.rb
128
+ - lib/regextest/front/repeatable.rb
129
+ - lib/regextest/front/scanner.rb
130
+ - lib/regextest/front/selectable.rb
131
+ - lib/regextest/front/sequence.rb
132
+ - lib/regextest/front/unicode.rb
133
+ - lib/regextest/regex-option.rb
134
+ - lib/regextest/regexp.rb
135
+ - lib/regextest/version.rb
136
+ - lib/tst-reg-test.rb
137
+ - regextest.gemspec
138
+ homepage: https://bitbucket.org/ikomamik/regextest
139
+ licenses:
140
+ - 2-clause BSD license (see the file LICENSE.txt)
141
+ metadata: {}
142
+ post_install_message:
143
+ rdoc_options: []
144
+ require_paths:
145
+ - lib
146
+ required_ruby_version: !ruby/object:Gem::Requirement
147
+ requirements:
148
+ - - '>='
149
+ - !ruby/object:Gem::Version
150
+ version: '0'
151
+ required_rubygems_version: !ruby/object:Gem::Requirement
152
+ requirements:
153
+ - - '>='
154
+ - !ruby/object:Gem::Version
155
+ version: '0'
156
+ requirements: []
157
+ rubyforge_project:
158
+ rubygems_version: 2.0.14
159
+ signing_key:
160
+ specification_version: 4
161
+ summary: A ruby library for generating sample data of regular expression
162
+ test_files: []