valid8ors 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,5 @@
1
+ *.gem
2
+ .bundle
3
+ Gemfile.lock
4
+ pkg/*
5
+ .rvmrc
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source "http://rubygems.org"
2
+
3
+ # Specify your gem's dependencies in valid8ors.gemspec
4
+ gemspec
data/LICENSE ADDED
@@ -0,0 +1,20 @@
1
+ Copyright (c) 2011 Official.fm
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining
4
+ a copy of this software and associated documentation files (the
5
+ "Software"), to deal in the Software without restriction, including
6
+ without limitation the rights to use, copy, modify, merge, publish,
7
+ distribute, sublicense, and/or sell copies of the Software, and to
8
+ permit persons to whom the Software is furnished to do so, subject to
9
+ the following conditions:
10
+
11
+ The above copyright notice and this permission notice shall be
12
+ included in all copies or substantial portions of the Software.
13
+
14
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
18
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
19
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,75 @@
1
+ # Valid8ors
2
+
3
+ Valid8ors brings you a nice set of custom validators for Rails 3.
4
+
5
+ ## Installation
6
+
7
+ Add this line to your Gemfile:
8
+
9
+ gem 'valid8ors'
10
+
11
+ Then run:
12
+
13
+ bundle install
14
+
15
+ ## Blacklist Validator
16
+
17
+ ### Usage
18
+
19
+ Add the following to one of your models:
20
+
21
+ validates :name, blacklist: true
22
+
23
+ You can also modify the default message ("is blacklisted") if validation fails:
24
+
25
+ validates :name, blacklist: { message: "is not part of the whitelist" }
26
+
27
+ ### Blacklist file
28
+
29
+ You can create a blacklist.yml file in the config directory of your Rails application if you need to overload the one used by this gem.
30
+
31
+ ### I18n
32
+
33
+ If you use I18n, the default key to translate is :blacklisted. So if you add to your User model:
34
+
35
+ validates :name, blacklist: true
36
+
37
+ You can translate (or overload) the default message via for e.g. using activerecord (in english): "en.activerecord.errors.models.user.attributes.name.blacklisted"
38
+
39
+ ### Tests
40
+
41
+ cd test
42
+ ruby blacklist_validator_test.rb
43
+
44
+ ## Email Format Validator
45
+
46
+ ### Usage
47
+
48
+ Add the following to one of your models:
49
+
50
+ validates :email, email_format: true
51
+
52
+ You can also modify the default message ("is improperly formatted") if validation fails:
53
+
54
+ validates :email, email_format: { message: "is not well formatted" }
55
+
56
+ ### I18n
57
+
58
+ If you use I18n, the default key to translate is :improperly_formatted. So if you add to your User model:
59
+
60
+ validates :email, email_format: true
61
+
62
+ You can translate (or overload) the default message via for e.g. (in english): "en.activerecord.errors.models.user.attributes.email.improperly_formatted"
63
+
64
+ ### Tests
65
+
66
+ cd test
67
+ ruby email_format_validator_test.rb
68
+
69
+ ### Credits
70
+
71
+ Regular Expression tests based on [Comparing E-mail Address Validating Regular Expressions](http://fightingforalostcause.net/misc/2006/compare-email-regex.php)
72
+
73
+ ## Compatibility
74
+
75
+ Ruby 1.8 is not supported.
data/Rakefile ADDED
@@ -0,0 +1 @@
1
+ require "bundler/gem_tasks"
@@ -0,0 +1,264 @@
1
+ ---
2
+ - 4r5e
3
+ - 5h1t
4
+ - 5hit
5
+ - a55
6
+ - anal
7
+ - anus
8
+ - ar5e
9
+ - arrse
10
+ - arse
11
+ - ass
12
+ - ass-fucker
13
+ - asshole
14
+ - asswhole
15
+ - a_s_s
16
+ - b!tch
17
+ - b00bs
18
+ - b17ch
19
+ - b1tch
20
+ - ballbag
21
+ - balls
22
+ - ballsack
23
+ - bastard
24
+ - beastial
25
+ - beastiality
26
+ - bellend
27
+ - bestial
28
+ - bestiality
29
+ - bi+ch
30
+ - biatch
31
+ - bitch
32
+ - bloody
33
+ - blow job
34
+ - blowjob
35
+ - boiolas
36
+ - bollock
37
+ - bollok
38
+ - boner
39
+ - boob
40
+ - booobs
41
+ - boooobs
42
+ - booooobs
43
+ - booooooobs
44
+ - breasts
45
+ - buceta
46
+ - bugger
47
+ - bum
48
+ - bunny fucker
49
+ - butt
50
+ - c0ck
51
+ - carpet muncher
52
+ - cawk
53
+ - chink
54
+ - cipa
55
+ - cl1t
56
+ - clit
57
+ - clitoris
58
+ - clits
59
+ - cnut
60
+ - cock
61
+ - cock-sucker
62
+ - cok
63
+ - coon
64
+ - cox
65
+ - crap
66
+ - cum
67
+ - cunilingus
68
+ - cunillingus
69
+ - cunnilingus
70
+ - cunt
71
+ - cyalis
72
+ - cyberfuc
73
+ - cyberfuck
74
+ - d1ck
75
+ - damn
76
+ - dick
77
+ - dildo
78
+ - dink
79
+ - dirsa
80
+ - dlck
81
+ - dog-fucker
82
+ - doggin
83
+ - donkeyribber
84
+ - doosh
85
+ - duche
86
+ - dyke
87
+ - ejaculate
88
+ - ejaculating
89
+ - ejaculation
90
+ - ejakulate
91
+ - f u c k
92
+ - f u c k e r
93
+ - f4nny
94
+ - fag
95
+ - fanny
96
+ - fanyy
97
+ - fatass
98
+ - fcuk
99
+ - feck
100
+ - felching
101
+ - fellate
102
+ - fellatio
103
+ - fingerfuck
104
+ - fistfuck
105
+ - flange
106
+ - fook
107
+ - fuck
108
+ - fudge packer
109
+ - fudgepacker
110
+ - fuk
111
+ - fux
112
+ - fux0r
113
+ - f_u_c_k
114
+ - gangbang
115
+ - gaylord
116
+ - gaysex
117
+ - goatse
118
+ - God
119
+ - god-dam
120
+ - god-damned
121
+ - goddamn
122
+ - goddamned
123
+ - hardcoresex
124
+ - hell
125
+ - heshe
126
+ - hoar
127
+ - hoare
128
+ - hoer
129
+ - homo
130
+ - hore
131
+ - horniest
132
+ - horny
133
+ - hotsex
134
+ - jack-off
135
+ - jackoff
136
+ - jap
137
+ - jerk-off
138
+ - jism
139
+ - jiz
140
+ - kawk
141
+ - knob
142
+ - kock
143
+ - kondum
144
+ - kum
145
+ - kummer
146
+ - kunilingus
147
+ - l3i+ch
148
+ - l3itch
149
+ - labia
150
+ - lmfao
151
+ - lust
152
+ - m0f0
153
+ - m0fo
154
+ - m45terbate
155
+ - ma5terb8
156
+ - ma5terbate
157
+ - masochist
158
+ - master-bate
159
+ - masterb8
160
+ - masterbat
161
+ - mo-fo
162
+ - mof0
163
+ - mofo
164
+ - mothafuck
165
+ - motherfuck
166
+ - motherfuckka
167
+ - muff
168
+ - mutha
169
+ - muthafecker
170
+ - muthafuckker
171
+ - muther
172
+ - mutherfucker
173
+ - n1gga
174
+ - n1gger
175
+ - nazi
176
+ - nigg3r
177
+ - nigg4h
178
+ - nigga
179
+ - nigger
180
+ - nob
181
+ - numbnuts
182
+ - nutsack
183
+ - orgasim
184
+ - orgasm
185
+ - p0rn
186
+ - pawn
187
+ - pecker
188
+ - penis
189
+ - phonesex
190
+ - phuck
191
+ - phuk
192
+ - phuq
193
+ - pigfucker
194
+ - pimpis
195
+ - piss
196
+ - poop
197
+ - porn
198
+ - prick
199
+ - pron
200
+ - pube
201
+ - pusse
202
+ - pussi
203
+ - pussy
204
+ - rectum
205
+ - retard
206
+ - rimjaw
207
+ - rimming
208
+ - s hit
209
+ - s.o.b.
210
+ - sadist
211
+ - schlong
212
+ - screwing
213
+ - scroat
214
+ - scrote
215
+ - scrotum
216
+ - semen
217
+ - sex
218
+ - sh!+
219
+ - sh!t
220
+ - sh1t
221
+ - shag
222
+ - shagger
223
+ - shaggin
224
+ - shagging
225
+ - shemale
226
+ - shi+
227
+ - shit
228
+ - skank
229
+ - slut
230
+ - smegma
231
+ - smut
232
+ - snatch
233
+ - son-of-a-bitch
234
+ - spac
235
+ - spunk
236
+ - s_h_i_t
237
+ - t1tt1e5
238
+ - t1tties
239
+ - teets
240
+ - teez
241
+ - testical
242
+ - testicle
243
+ - tit
244
+ - tosser
245
+ - turd
246
+ - tw4t
247
+ - twat
248
+ - twunt
249
+ - v14gra
250
+ - v1gra
251
+ - vagina
252
+ - viagra
253
+ - vulva
254
+ - w00se
255
+ - wang
256
+ - wank
257
+ - wanker
258
+ - wanky
259
+ - whoar
260
+ - whore
261
+ - willies
262
+ - willy
263
+ - xrated
264
+ - xxx
@@ -0,0 +1,37 @@
1
+ # -*- encoding: utf-8 -*-
2
+
3
+ class BlacklistValidator < ActiveModel::EachValidator
4
+
5
+ def validate_each(record, attribute, value)
6
+ record.errors.add(attribute, options[:message] || invalid_message(record, attribute)) if blacklisted?(value)
7
+ end
8
+
9
+ # Lazy load and transform directly words to patterns instead of creating regexps at each matching tests
10
+ def blacklist
11
+ @blacklist ||= YAML.load_file(blacklist_file).map { |word| /(#{word})+/i }
12
+ end
13
+
14
+ #######################
15
+ ### Private methods ###
16
+ #######################
17
+
18
+ private
19
+
20
+ def invalid_message(record, attribute)
21
+ I18n.t :blacklisted,
22
+ scope: "#{record.class.i18n_scope}.errors.models.#{record.class.model_name.i18n_key}.attributes.#{attribute}",
23
+ default: "is blacklisted"
24
+ end
25
+
26
+ def blacklisted?(str)
27
+ blacklist.any? { |pattern| str =~ pattern }
28
+ end
29
+
30
+ def blacklist_file
31
+ if defined?(Rails.root) && (blacklist_file_path = Rails.root.join("config", "blacklist.yml")).exist?
32
+ return blacklist_file_path
33
+ end
34
+ File.join(File.dirname(__FILE__), "../config/blacklist.yml")
35
+ end
36
+
37
+ end
@@ -0,0 +1,25 @@
1
+ # -*- encoding: utf-8 -*-
2
+
3
+ class EmailFormatValidator < ActiveModel::EachValidator
4
+
5
+ EMAIL_PATTERN = /\A[\w\-_\.]+@((?:[\w\-\.]+\.)+[a-z]{2,})\Z/i
6
+
7
+ def validate_each(record, attribute, value)
8
+ unless value =~ EMAIL_PATTERN
9
+ record.errors.add(attribute, options[:message] || invalid_message(record, attribute))
10
+ end
11
+ end
12
+
13
+ #######################
14
+ ### Private methods ###
15
+ #######################
16
+
17
+ private
18
+
19
+ def invalid_message(record, attribute)
20
+ I18n.t :improperly_formatted,
21
+ scope: "#{record.class.i18n_scope}.errors.models.#{record.class.model_name.i18n_key}.attributes.#{attribute}",
22
+ default: "is improperly formatted"
23
+ end
24
+
25
+ end
@@ -0,0 +1,53 @@
1
+ # -*- encoding: utf-8 -*-
2
+
3
+ require_relative 'test_helper'
4
+
5
+ class TestUser < TestModel
6
+ validates :name, blacklist: true
7
+ end
8
+
9
+ class TestUserWithMessage < TestModel
10
+ validates :name, blacklist: { message: 'is not part of the whitelist' }
11
+ end
12
+
13
+ class TestBlacklistValidator < MiniTest::Unit::TestCase
14
+
15
+ def test_some_blacklisted_words
16
+ names_that_should_be_blacklisted.each do |name|
17
+ test_user = TestUser.new(name: name)
18
+ refute test_user.valid?
19
+ assert test_user.errors[:name]
20
+ end
21
+ end
22
+
23
+ def test_some_whitelisted_words
24
+ names_that_should_be_whitelisted.each { |name| assert TestUser.new(name: name).valid? }
25
+ end
26
+
27
+ def test_default_message_on_error
28
+ test_user = TestUser.new(name: "Get up, fuck up")
29
+ refute test_user.valid?
30
+ assert test_user.errors[:name].include?("is blacklisted")
31
+ end
32
+
33
+ def test_custom_message_on_error
34
+ test_user = TestUserWithMessage.new(name: "Fuck it up")
35
+ refute test_user.valid?
36
+ assert test_user.errors[:name].include?("is not part of the whitelist")
37
+ end
38
+
39
+ #######################
40
+ ### Private methods ###
41
+ #######################
42
+
43
+ private
44
+
45
+ def names_that_should_be_blacklisted
46
+ ["Fucking gay", "I have a boner", "Show me your ass"]
47
+ end
48
+
49
+ def names_that_should_be_whitelisted
50
+ ["Alice in wonderland", "The Doors", "This is a simple name"]
51
+ end
52
+
53
+ end
@@ -0,0 +1,126 @@
1
+ # -*- encoding: utf-8 -*-
2
+
3
+ require_relative 'test_helper'
4
+
5
+ class TestUser < TestModel
6
+ validates :email, email_format: true
7
+ end
8
+
9
+ class TestUserAllowsNilToTrue < TestModel
10
+ validates :email, email_format: { allow_nil: true }
11
+ end
12
+
13
+ class TestUserAllowsNilToFalse < TestModel
14
+ validates :email, email_format: { allow_nil: false }
15
+ end
16
+
17
+ class TestUserWithMessage < TestModel
18
+ validates :email, email_format: { message: 'is not well formatted' }
19
+ end
20
+
21
+ class TestEmailFormatValidator < MiniTest::Unit::TestCase
22
+
23
+ def test_valid_emails
24
+ valid_emails.each { |email| assert TestUser.new(email: email).valid? }
25
+ end
26
+
27
+ def test_invalid_emails
28
+ invalid_emails.each { |email| refute TestUser.new(email: email).valid? }
29
+ end
30
+
31
+ def test_default_message_on_error
32
+ test_user = TestUser.new(email: "invalid_email@")
33
+ refute test_user.valid?
34
+ assert test_user.errors[:email].include?("is improperly formatted")
35
+ end
36
+
37
+ def test_custom_message_on_error
38
+ test_user = TestUserWithMessage.new(email: "invalid_email@")
39
+ refute test_user.valid?
40
+ assert test_user.errors[:email].include?("is not well formatted")
41
+ end
42
+
43
+ def test_nil_email_when_allow_nil_option_is_not_set
44
+ refute TestUser.new(email: nil).valid?
45
+ end
46
+
47
+ def test_nil_email_when_allow_nil_option_is_set_to_true
48
+ assert TestUserAllowsNilToTrue.new(email: nil).valid?
49
+ end
50
+
51
+ def test_nil_email_when_allow_nil_option_is_set_to_false
52
+ refute TestUserAllowsNilToFalse.new(email: nil).valid?
53
+ end
54
+
55
+ #######################
56
+ ### Private methods ###
57
+ #######################
58
+
59
+ private
60
+
61
+ def valid_emails
62
+ [
63
+ 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ@letters-in-local.org',
64
+ '01234567890@numbers-in-local.net',
65
+ # '&\'*+-./=?^_{}~@other-valid-characters-in-local.net',
66
+ # 'mixed-1234-in-{+^}-local@sld.net',
67
+ 'a@single-character-in-local.org',
68
+ # '"quoted"@sld.com',
69
+ # '"\e\s\c\a\p\e\d"@sld.com',
70
+ # '"quoted-at-sign@sld.org"@sld.com',
71
+ # '"escaped\"quote"@sld.com',
72
+ # '"back\slash"@sld.com',
73
+ 'one-character-third-level@a.example.com',
74
+ 'single-character-in-sld@x.org',
75
+ 'local@dash-in-sld.com',
76
+ 'letters-in-sld@123.com',
77
+ 'one-letter-sld@x.org',
78
+ 'uncommon-tld@sld.museum',
79
+ 'uncommon-tld@sld.travel',
80
+ 'uncommon-tld@sld.mobi',
81
+ 'country-code-tld@sld.uk',
82
+ 'country-code-tld@sld.rw',
83
+ 'local@sld.newTLD',
84
+ # 'punycode-numbers-in-tld@sld.xn--3e0b707e',
85
+ 'the-total-length@of-an-entire-address-cannot-be-longer-than-two-hundred-and-fifty-four-characters' +
86
+ '-and-this-address-is-254-characters-exactly-so-it-should-be-valid-and-im-going-to-add-some-more' +
87
+ '-words-here-to-increase-the-lenght-blah-blah-blah-blah-bla.org',
88
+ # 'bracketed-IP-instead-of-domain@[127.0.0.1]',
89
+ 'local@sub.domains.com'
90
+ ]
91
+ end
92
+
93
+ def invalid_emails
94
+ [
95
+ '',
96
+ 'foo@bar',
97
+ 'foo@bar.c',
98
+ 'foo@bar.com@bar.com',
99
+ 'foo@',
100
+ '@missing-local.org',
101
+ '! #$%`|@invalid-characters-in-local.org',
102
+ '(),:;`|@more-invalid-characters-in-local.org',
103
+ '<>@[]\`|@even-more-invalid-characters-in-local.org',
104
+ # '.local-starts-with-dot@sld.com',
105
+ # 'local-ends-with-dot.@sld.com',
106
+ # 'two..consecutive-dots@sld.com',
107
+ 'partially."quoted"@sld.com',
108
+ # 'the-local-part-is-invalid-if-it-is-longer-than-sixty-four-characters@sld.net',
109
+ 'missing-sld@.com',
110
+ # 'sld-starts-with-dashsh@-sld.com',
111
+ # 'sld-ends-with-dash@sld-.com',
112
+ 'invalid-characters-in-sld@! "#$%(),/;<>_[]`|.org',
113
+ 'missing-dot-before-tld@com',
114
+ 'missing-tld@sld.',
115
+ # 'the-total-length@of-an-entire-address-cannot-be-longer-than-two-hundred-and-fifty-four-characters-and' +
116
+ # '-this-address-is-255-characters-exactly-so-it-should-be-invalid-and-im-going-to-add-some-more-words' +
117
+ # '-here-to-increase-the-lenght-blah-blah-blah-blah-bl.org',
118
+ 'missing-at-sign.net',
119
+ 'unbracketed-IP@127.0.0.1',
120
+ 'invalid-ip@127.0.0.1.26',
121
+ 'another-invalid-ip@127.0.0.256',
122
+ 'IP-and-port@127.0.0.1:25'
123
+ ]
124
+ end
125
+
126
+ end
@@ -0,0 +1,23 @@
1
+ # -*- encoding: utf-8 -*-
2
+
3
+ require 'rubygems'
4
+ require 'active_model'
5
+ require 'minitest/autorun'
6
+
7
+ $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
8
+ $LOAD_PATH.unshift(File.dirname(__FILE__))
9
+
10
+ require 'blacklist_validator'
11
+ require 'email_format_validator'
12
+
13
+ class TestModel
14
+ include ActiveModel::Validations
15
+
16
+ def initialize(attributes = {})
17
+ @attributes = attributes
18
+ end
19
+
20
+ def read_attribute_for_validation(key)
21
+ @attributes[key]
22
+ end
23
+ end
data/valid8ors.gemspec ADDED
@@ -0,0 +1,18 @@
1
+ # -*- encoding: utf-8 -*-
2
+ $:.push File.expand_path("../lib", __FILE__)
3
+
4
+ Gem::Specification.new do |s|
5
+ s.name = "valid8ors"
6
+ s.version = "0.0.1"
7
+ s.authors = ["Axel Vergult"]
8
+ s.email = ["axel@official.fm"]
9
+ s.homepage = ""
10
+ s.summary = %q{Rails 3 awesome custom validators}
11
+ s.description = %q{Rails 3 awesome custom validators}
12
+
13
+ s.files = `git ls-files`.split("\n")
14
+ s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
15
+ s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
16
+ s.require_paths = ["lib"]
17
+ s.add_dependency("activemodel", ">= 0")
18
+ end
metadata ADDED
@@ -0,0 +1,71 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: valid8ors
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Axel Vergult
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2011-11-17 00:00:00.000000000Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: activemodel
16
+ requirement: &70162532387340 !ruby/object:Gem::Requirement
17
+ none: false
18
+ requirements:
19
+ - - ! '>='
20
+ - !ruby/object:Gem::Version
21
+ version: '0'
22
+ type: :runtime
23
+ prerelease: false
24
+ version_requirements: *70162532387340
25
+ description: Rails 3 awesome custom validators
26
+ email:
27
+ - axel@official.fm
28
+ executables: []
29
+ extensions: []
30
+ extra_rdoc_files: []
31
+ files:
32
+ - .gitignore
33
+ - Gemfile
34
+ - LICENSE
35
+ - README.md
36
+ - Rakefile
37
+ - config/blacklist.yml
38
+ - lib/blacklist_validator.rb
39
+ - lib/email_format_validator.rb
40
+ - test/blacklist_validator_test.rb
41
+ - test/email_format_validator_test.rb
42
+ - test/test_helper.rb
43
+ - valid8ors.gemspec
44
+ homepage: ''
45
+ licenses: []
46
+ post_install_message:
47
+ rdoc_options: []
48
+ require_paths:
49
+ - lib
50
+ required_ruby_version: !ruby/object:Gem::Requirement
51
+ none: false
52
+ requirements:
53
+ - - ! '>='
54
+ - !ruby/object:Gem::Version
55
+ version: '0'
56
+ required_rubygems_version: !ruby/object:Gem::Requirement
57
+ none: false
58
+ requirements:
59
+ - - ! '>='
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ requirements: []
63
+ rubyforge_project:
64
+ rubygems_version: 1.8.10
65
+ signing_key:
66
+ specification_version: 3
67
+ summary: Rails 3 awesome custom validators
68
+ test_files:
69
+ - test/blacklist_validator_test.rb
70
+ - test/email_format_validator_test.rb
71
+ - test/test_helper.rb