regularity 0.1.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 +7 -0
- data/lib/regularity.rb +128 -0
- data/lib/regularity/version.rb +3 -0
- metadata +60 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 22344c2dea3e06de87e19734043692518fd889d0
|
4
|
+
data.tar.gz: 4399ef19020b4f183a5d989270eece627dd35835
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 7fff9de17ab25f58f59293c038e232bf2625e70f6df3bb529f782b8219ce3bd2e0aaa41c412511b900cad0e981b8555c58478f04754d74cbe2d0b0e239f8ddc1
|
7
|
+
data.tar.gz: c1ececc9d8080212871bd642d4e0d9c64b95419d556790bc344956addff1c4b00f61a58cab961b0e8bb575a3a2b9dab71ee1246937c75de67c4dce9d706a1f37
|
data/lib/regularity.rb
ADDED
@@ -0,0 +1,128 @@
|
|
1
|
+
class Regularity
|
2
|
+
|
3
|
+
class Error < StandardError; end
|
4
|
+
|
5
|
+
PATTERNS = {
|
6
|
+
'digit' => '[0-9]',
|
7
|
+
'lowercase' => '[a-z]',
|
8
|
+
'uppercase' => '[A-Z]',
|
9
|
+
'letter' => '[A-Za-z]',
|
10
|
+
'alphanumeric' => '[A-Za-z0-9]',
|
11
|
+
'whitespace' => '\s',
|
12
|
+
'space' => ' ',
|
13
|
+
'tab' => '\t'
|
14
|
+
}
|
15
|
+
|
16
|
+
ESCAPED_CHARS = %w(
|
17
|
+
* . ? ^ + $ | ( ) [ ] { }
|
18
|
+
)
|
19
|
+
|
20
|
+
def initialize
|
21
|
+
@str = ''
|
22
|
+
end
|
23
|
+
|
24
|
+
def start_with(*args)
|
25
|
+
raise Regularity::Error.new('#start_with? called multiple times') unless @str.empty?
|
26
|
+
write '^%s' % interpret(*args)
|
27
|
+
end
|
28
|
+
|
29
|
+
def append(*args)
|
30
|
+
write interpret(*args)
|
31
|
+
end
|
32
|
+
alias_method :then, :append
|
33
|
+
|
34
|
+
def end_with(*args)
|
35
|
+
write '%s$' % interpret(*args)
|
36
|
+
end
|
37
|
+
|
38
|
+
def maybe(*args)
|
39
|
+
write '%s?' % interpret(*args)
|
40
|
+
end
|
41
|
+
|
42
|
+
def one_of(ary)
|
43
|
+
write '[%s]' % ary.map { |c| escape(c) }.join('|')
|
44
|
+
end
|
45
|
+
|
46
|
+
def between(range, pattern)
|
47
|
+
raise Regularity:Error.new('must provide an array of 2 integers') unless range.length == 2
|
48
|
+
write '%s{%s,%s}' % [interpret(pattern), range[0], range[1]]
|
49
|
+
end
|
50
|
+
|
51
|
+
def regex
|
52
|
+
Regexp.new(@str)
|
53
|
+
end
|
54
|
+
alias_method :get, :regex
|
55
|
+
|
56
|
+
def =~(other)
|
57
|
+
regex.=~(other)
|
58
|
+
end
|
59
|
+
|
60
|
+
def method_missing(meth, *args, &block)
|
61
|
+
regex.send(meth, *args, &block)
|
62
|
+
end
|
63
|
+
|
64
|
+
def respond_to?(meth)
|
65
|
+
regex.respond_to?(meth) || super
|
66
|
+
end
|
67
|
+
|
68
|
+
def to_s
|
69
|
+
"#<Regularity:#{object_id} regex=/#{@str}/>"
|
70
|
+
end
|
71
|
+
|
72
|
+
def inspect
|
73
|
+
to_s
|
74
|
+
end
|
75
|
+
|
76
|
+
private
|
77
|
+
|
78
|
+
def write(str)
|
79
|
+
@str << str
|
80
|
+
self
|
81
|
+
end
|
82
|
+
|
83
|
+
# Translate/escape characters etc and return regex-ready string
|
84
|
+
def interpret(*args)
|
85
|
+
case args.length
|
86
|
+
when 2 then numbered_constraint(*args)
|
87
|
+
when 1 then patterned_constraint(*args)
|
88
|
+
else raise ArgumentError
|
89
|
+
end
|
90
|
+
end
|
91
|
+
|
92
|
+
# Ex: (2, 'x') or (3, :digits)
|
93
|
+
def numbered_constraint(count, type)
|
94
|
+
pattern = patterned_constraint(type)
|
95
|
+
raise Regularity::Error.new('Unrecognized pattern') if pattern.nil? || pattern.empty?
|
96
|
+
'%s{%s}' % [pattern, count]
|
97
|
+
end
|
98
|
+
|
99
|
+
# Ex: ('aa') or ('$')
|
100
|
+
def patterned_constraint(pattern)
|
101
|
+
escape translate(pattern)
|
102
|
+
end
|
103
|
+
|
104
|
+
# Remove a trailing 's', if there is one
|
105
|
+
def singularize(word)
|
106
|
+
str = word.to_s
|
107
|
+
str.end_with?('s') ? str[0..-2] : str
|
108
|
+
end
|
109
|
+
|
110
|
+
# Escape special regex characters in a string
|
111
|
+
#
|
112
|
+
# Ex:
|
113
|
+
# escape("one.two")
|
114
|
+
# # => "one\.two"
|
115
|
+
#
|
116
|
+
def escape(pattern)
|
117
|
+
pattern.to_s.gsub(/.+/) do |char|
|
118
|
+
ESCAPED_CHARS.include?(char) ? "\\#{char}" : char
|
119
|
+
end
|
120
|
+
end
|
121
|
+
|
122
|
+
# Translate an identifier such as :digits to [0-9], etc
|
123
|
+
# Returns the original identifier if no character class found
|
124
|
+
def translate(pattern)
|
125
|
+
PATTERNS[singularize(pattern)] || pattern
|
126
|
+
end
|
127
|
+
|
128
|
+
end
|
metadata
ADDED
@@ -0,0 +1,60 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: regularity
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.1.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Andrew Berls
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2013-09-13 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: rspec
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - '>='
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '0'
|
20
|
+
type: :development
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - '>='
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '0'
|
27
|
+
description: ' Regularity provides a flexible syntax for constructing regular expressions
|
28
|
+
by chaining Ruby method calls instead of deciphering cryptic syntax. '
|
29
|
+
email: andrew.berls@gmail.com
|
30
|
+
executables: []
|
31
|
+
extensions: []
|
32
|
+
extra_rdoc_files: []
|
33
|
+
files:
|
34
|
+
- lib/regularity/version.rb
|
35
|
+
- lib/regularity.rb
|
36
|
+
homepage: https://github.com/andrewberls/regularity
|
37
|
+
licenses:
|
38
|
+
- MIT
|
39
|
+
metadata: {}
|
40
|
+
post_install_message:
|
41
|
+
rdoc_options: []
|
42
|
+
require_paths:
|
43
|
+
- lib
|
44
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
45
|
+
requirements:
|
46
|
+
- - '>='
|
47
|
+
- !ruby/object:Gem::Version
|
48
|
+
version: '0'
|
49
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
50
|
+
requirements:
|
51
|
+
- - '>='
|
52
|
+
- !ruby/object:Gem::Version
|
53
|
+
version: '0'
|
54
|
+
requirements: []
|
55
|
+
rubyforge_project:
|
56
|
+
rubygems_version: 2.0.7
|
57
|
+
signing_key:
|
58
|
+
specification_version: 4
|
59
|
+
summary: A friendly regular expression builder for Ruby
|
60
|
+
test_files: []
|