stringglob 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
data/.gitignore ADDED
@@ -0,0 +1,4 @@
1
+ *.gem
2
+ .bundle
3
+ Gemfile.lock
4
+ pkg/*
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source "http://rubygems.org"
2
+
3
+ # Specify your gem's dependencies in stringglob.gemspec
4
+ gemspec
data/Rakefile ADDED
@@ -0,0 +1,5 @@
1
+ require 'bundler/gem_tasks'
2
+ require 'rake/testtask'
3
+
4
+ Rake::TestTask.new
5
+
@@ -0,0 +1,3 @@
1
+ module StringGlob
2
+ VERSION = "0.0.1"
3
+ end
data/lib/stringglob.rb ADDED
@@ -0,0 +1,95 @@
1
+ ## Ruby StringGlob: Generate a Regexp object from a glob(3) pattern
2
+ ## (Port Text::Glob 0.08 from Perl to Ruby)
3
+ ## Copyright (c) 2002, 2003, 2006, 2007 Richard Clamp. All Rights Reserved.
4
+ ## Copyright (c) 2009-2011 SATOH Fumiyasu @ OSS Technology Inc.
5
+ ## <http://www.osstech.co.jp/>
6
+ ##
7
+ ## License: This module is free software; you can redistribute it and/or
8
+ ## modify it under the same terms as Ruby itself
9
+ ## Date: 2011-06-21, since 2009-07-15
10
+
11
+ require "stringglob/version"
12
+
13
+ module StringGlob
14
+ IGNORE_CASE = 1 << 0
15
+ NO_STRICT_LEADING_DOT = 1 << 1
16
+ NO_STRICT_WILDCARD_SLASH = 1 << 2
17
+
18
+ def regexp(glob, opt = 0, code = nil)
19
+ re = regexp_string(glob, opt)
20
+ return Regexp.new("\\A#{re}\\z", nil, code)
21
+ end
22
+ module_function :regexp
23
+
24
+ def regexp_string(glob, opt = 0)
25
+ re_str = ''
26
+ in_curlies = 0
27
+ escaping = false
28
+ first_byte = true
29
+ asterisk = false
30
+ strict_leading_dot = (opt & NO_STRICT_LEADING_DOT == 0)
31
+ strict_wildcard_slash = (opt & NO_STRICT_WILDCARD_SLASH == 0)
32
+ glob.scan(/./m) do |glob_c|
33
+ if first_byte
34
+ if strict_leading_dot
35
+ re_str += '(?=[^\.])' unless glob_c == '.'
36
+ end
37
+ first_byte = false
38
+ end
39
+ if asterisk && glob_c != '*'
40
+ re_str += strict_wildcard_slash ? '[^/]*' : '.*'
41
+ asterisk = false
42
+ end
43
+ if glob_c == '/'
44
+ first_byte = true
45
+ end
46
+ if (glob_c == '.' || glob_c == '(' || glob_c == ')' || glob_c == '|' ||
47
+ glob_c == '+' || glob_c == '^' || glob_c == '$' || glob_c == '@' || glob_c == '%' )
48
+ re_str += '\\' + glob_c
49
+ elsif glob_c == '*'
50
+ if escaping
51
+ re_str += '\\*'
52
+ elsif asterisk
53
+ re_str += '.*'
54
+ asterisk = false
55
+ else
56
+ asterisk = true
57
+ end
58
+ elsif glob_c == '?'
59
+ re_str += escaping ? '\\?' :
60
+ strict_wildcard_slash ? '[^/]' : '.'
61
+ elsif glob_c == '{'
62
+ re_str += escaping ? '\\{' : '('
63
+ in_curlies += 1 unless escaping
64
+ elsif glob_c == '}' && in_curlies > 0
65
+ re_str += escaping ? '}' : ')'
66
+ in_curlies -= 1 unless escaping
67
+ elsif glob_c == ',' && in_curlies > 0
68
+ re_str += escaping ? ',' : '|'
69
+ elsif glob_c == '\\'
70
+ if escaping
71
+ re_str += '\\\\'
72
+ escaping = false
73
+ else
74
+ escaping = true
75
+ end
76
+ next
77
+ else
78
+ ## Suppress warning: re_str has `}' without escape
79
+ re_str += '\\' if glob_c == '}'
80
+ re_str += glob_c
81
+ escaping = false
82
+ end
83
+ escaping = false
84
+ end
85
+ if asterisk
86
+ re_str += strict_wildcard_slash ? '[^/]*' : '.*'
87
+ end
88
+
89
+ re_str = "(?i:#{re_str})" if (opt & IGNORE_CASE != 0)
90
+
91
+ return re_str
92
+ end
93
+ module_function :regexp_string
94
+ end
95
+
@@ -0,0 +1,20 @@
1
+ # -*- encoding: utf-8 -*-
2
+ $:.push File.expand_path("../lib", __FILE__)
3
+ require "stringglob/version"
4
+
5
+ Gem::Specification.new do |s|
6
+ s.name = "stringglob"
7
+ s.version = StringGlob::VERSION
8
+ s.authors = ["SATOH Fumiyasu"]
9
+ s.email = ["fumiyas@osstech.co.jp"]
10
+ s.homepage = ""
11
+ s.summary = %q{Generate a Regexp object from a glob(3) pattern}
12
+ s.description = %q{Generate a Regexp object from a glob(3) pattern}
13
+
14
+ s.rubyforge_project = "stringglob"
15
+
16
+ s.files = `git ls-files`.split("\n")
17
+ s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
18
+ s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
19
+ s.require_paths = ["lib"]
20
+ end
@@ -0,0 +1,114 @@
1
+ require 'stringglob'
2
+ require 'test/unit'
3
+
4
+ SG = StringGlob
5
+
6
+ class StringGlobTest < Test::Unit::TestCase
7
+ def test_all
8
+ regexp = SG.regexp('foo')
9
+ assert_not_nil regexp.match('foo')
10
+ assert_nil regexp.match('foobar')
11
+
12
+ ## absolute string
13
+ assert_not_nil SG.regexp('foo').match('foo')
14
+ assert_nil SG.regexp('foo').match('foobar')
15
+
16
+ ## * wildcard
17
+ assert_not_nil SG.regexp('foo.*').match('foo.')
18
+ assert_not_nil SG.regexp('foo.*').match('foo.bar')
19
+ assert_nil SG.regexp('foo.*').match('gfoo.bar')
20
+
21
+ ## ? wildcard
22
+ assert_not_nil SG.regexp('foo.?p').match('foo.cp')
23
+ assert_nil SG.regexp('foo.?p').match('foo.cd')
24
+
25
+ ## .{alternation,or,something}
26
+ assert_not_nil SG.regexp('foo.{c,h}').match('foo.h')
27
+ assert_not_nil SG.regexp('foo.{c,h}').match('foo.c')
28
+ assert_nil SG.regexp('foo.{c,h}').match('foo.o')
29
+
30
+ ## \escaping
31
+ assert_not_nil SG.regexp('foo.\\{c,h}\\*').match('foo.{c,h}*')
32
+ assert_nil SG.regexp('foo.\\{c,h}\\*').match('foo.\\c')
33
+
34
+ ## escape ()
35
+ assert_not_nil SG.regexp('foo.(bar)').match('foo.(bar)')
36
+
37
+ ## strict . rule fail
38
+ assert_nil SG.regexp('*.foo').match('.file.foo')
39
+ ## strict . rule match
40
+ assert_not_nil SG.regexp('.*.foo').match('.file.foo')
41
+ ## relaxed . rule
42
+ assert_not_nil SG.regexp('*.foo', SG::NO_STRICT_LEADING_DOT).match('.file.foo')
43
+
44
+ ## strict wildcard / fail
45
+ assert_nil SG.regexp('*.fo?').match('foo/file.fob')
46
+ ## strict wildcard / match
47
+ assert_not_nil SG.regexp('*/*.fo?').match('foo/file.fob')
48
+ ## relaxed wildcard /
49
+ assert_not_nil SG.regexp('*.fo?', SG::NO_STRICT_WILDCARD_SLASH).match('foo/file.fob')
50
+
51
+ ## more strict wildcard / fail
52
+ assert_nil SG.regexp('foo/*.foo').match('foo/.foo')
53
+ ## more strict wildcard / match
54
+ assert_not_nil SG.regexp('foo/.f*').match('foo/.foo')
55
+ ## relaxed wildcard /
56
+ assert_not_nil SG.regexp('*.foo', SG::NO_STRICT_WILDCARD_SLASH).match('foo/.foo')
57
+
58
+ ## properly escape +
59
+ assert_not_nil SG.regexp('f+.foo').match('f+.foo')
60
+ assert_nil SG.regexp('f+.foo').match('ffff.foo')
61
+
62
+ ## handle embedded \\n
63
+ assert_not_nil SG.regexp("foo\nbar").match("foo\nbar")
64
+ assert_nil SG.regexp("foo\nbar").match("foobar")
65
+
66
+ ## [abc]
67
+ assert_not_nil SG.regexp('test[abc]').match('testa')
68
+ assert_not_nil SG.regexp('test[abc]').match('testb')
69
+ assert_not_nil SG.regexp('test[abc]').match('testc')
70
+ assert_nil SG.regexp('test[abc]').match('testd')
71
+
72
+ ## escaping \$
73
+ assert_not_nil SG.regexp('foo$bar.*').match('foo$bar.c')
74
+
75
+ ## escaping ^
76
+ assert_not_nil SG.regexp('foo^bar.*').match('foo^bar.c')
77
+
78
+ ## escaping |
79
+ assert_not_nil SG.regexp('foo|bar.*').match('foo|bar.c')
80
+
81
+
82
+ ## {foo,{bar,baz}}
83
+ assert_not_nil SG.regexp('{foo,{bar,baz}}').match('foo')
84
+ assert_not_nil SG.regexp('{foo,{bar,baz}}').match('bar')
85
+ assert_not_nil SG.regexp('{foo,{bar,baz}}').match('baz')
86
+ assert_nil SG.regexp('{foo,{bar,baz}}').match('foz')
87
+
88
+ ## @ character
89
+ assert_not_nil SG.regexp('foo@bar').match('foo@bar')
90
+ ## $ character
91
+ assert_not_nil SG.regexp('foo$bar').match('foo$bar')
92
+ ## % character
93
+ assert_not_nil SG.regexp('foo%bar').match('foo%bar')
94
+
95
+ ## ** wildcard and path components
96
+ assert_not_nil SG.regexp('foo/*/baz').match('foo/bar/baz')
97
+ assert_nil SG.regexp('foo/*/baz').match('foo/bar/bar/baz')
98
+ assert_nil SG.regexp('foo/**/baz').match('foo/baz')
99
+ assert_not_nil SG.regexp('foo/**/baz').match('foo/bar/baz')
100
+ assert_not_nil SG.regexp('foo/**/baz').match('foo/bar/bar/baz')
101
+ assert_nil SG.regexp('foo/**').match('foo')
102
+ assert_not_nil SG.regexp('foo/**').match('foo/bar')
103
+ assert_not_nil SG.regexp('foo/**').match('foo/bar/baz')
104
+ assert_nil SG.regexp('**/foo').match('foo')
105
+ assert_not_nil SG.regexp('**/foo').match('bar/foo')
106
+ assert_not_nil SG.regexp('**/foo').match('baz/bar/foo')
107
+ ## escaping ** wildcard
108
+ assert_nil SG.regexp('foo/\\**/baz').match('foo/bar/baz')
109
+ assert_not_nil SG.regexp('foo/\\**/baz').match('foo/*bar/baz')
110
+ assert_nil SG.regexp('foo/*\\*/baz').match('foo/bar/baz')
111
+ assert_not_nil SG.regexp('foo/*\\*/baz').match('foo/bar*/baz')
112
+ end
113
+ end
114
+
metadata ADDED
@@ -0,0 +1,72 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: stringglob
3
+ version: !ruby/object:Gem::Version
4
+ hash: 29
5
+ prerelease:
6
+ segments:
7
+ - 0
8
+ - 0
9
+ - 1
10
+ version: 0.0.1
11
+ platform: ruby
12
+ authors:
13
+ - SATOH Fumiyasu
14
+ autorequire:
15
+ bindir: bin
16
+ cert_chain: []
17
+
18
+ date: 2011-09-26 00:00:00 Z
19
+ dependencies: []
20
+
21
+ description: Generate a Regexp object from a glob(3) pattern
22
+ email:
23
+ - fumiyas@osstech.co.jp
24
+ executables: []
25
+
26
+ extensions: []
27
+
28
+ extra_rdoc_files: []
29
+
30
+ files:
31
+ - .gitignore
32
+ - Gemfile
33
+ - Rakefile
34
+ - lib/stringglob.rb
35
+ - lib/stringglob/version.rb
36
+ - stringglob.gemspec
37
+ - test/test_stringglob.rb
38
+ homepage: ""
39
+ licenses: []
40
+
41
+ post_install_message:
42
+ rdoc_options: []
43
+
44
+ require_paths:
45
+ - lib
46
+ required_ruby_version: !ruby/object:Gem::Requirement
47
+ none: false
48
+ requirements:
49
+ - - ">="
50
+ - !ruby/object:Gem::Version
51
+ hash: 3
52
+ segments:
53
+ - 0
54
+ version: "0"
55
+ required_rubygems_version: !ruby/object:Gem::Requirement
56
+ none: false
57
+ requirements:
58
+ - - ">="
59
+ - !ruby/object:Gem::Version
60
+ hash: 3
61
+ segments:
62
+ - 0
63
+ version: "0"
64
+ requirements: []
65
+
66
+ rubyforge_project: stringglob
67
+ rubygems_version: 1.7.2
68
+ signing_key:
69
+ specification_version: 3
70
+ summary: Generate a Regexp object from a glob(3) pattern
71
+ test_files:
72
+ - test/test_stringglob.rb