cold_shoulder 1.1.0 → 1.2.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/cold_shoulder.rb +1 -71
- data/lib/validator.rb +102 -0
- data/locales/en.yml +2 -1
- metadata +2 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 6b5c1034d690bd1bf262b7d491ff281e44b9d714
|
4
|
+
data.tar.gz: 655709b9dc3d1678480f920784312fffac10a1ac
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: f5648f2978c4ac0a1eae514fc2d14d409a9897b0b1ba3b21869ec76bdc32000a8ad3004b7aa5523e8b03ef5609a92470b3c9af7f4aad97ce9790e8116e67a46d
|
7
|
+
data.tar.gz: 8aed809493caa45f827128278e383af6435201f75aaf202b706fc98d6da38824ee41fbce6160d11897c4ccfbd3874556139df23eba7d3e049fb3403a1f208209
|
data/lib/cold_shoulder.rb
CHANGED
@@ -1,8 +1,4 @@
|
|
1
|
-
require '
|
2
|
-
require 'active_model/validations'
|
3
|
-
|
4
|
-
require 'action_view'
|
5
|
-
require 'action_view/helpers'
|
1
|
+
require 'validator'
|
6
2
|
|
7
3
|
module ColdShoulder
|
8
4
|
if defined?(Rails)
|
@@ -12,70 +8,4 @@ module ColdShoulder
|
|
12
8
|
end
|
13
9
|
end
|
14
10
|
end
|
15
|
-
end
|
16
|
-
|
17
|
-
# The validations
|
18
|
-
# TODO require in another file? This was failing when actually deployed through rubygems
|
19
|
-
module ActiveModel
|
20
|
-
module Validations
|
21
|
-
|
22
|
-
# Extend the rails each validator so that this can be used like any Rails validator
|
23
|
-
class ColdShoulderValidator < EachValidator
|
24
|
-
include ActionView::Helpers::NumberHelper if defined?(Rails)
|
25
|
-
|
26
|
-
def validate_each(record, attr_name, value)
|
27
|
-
|
28
|
-
# These are somewhat simplistic
|
29
|
-
# Main problem being that all of them can be sidestepped by including commas
|
30
|
-
# TODO: Move this outside the validate_each method so we don't define it over and over
|
31
|
-
twitter_regex = /(@[A-Za-z0-9_]{1,15})/i
|
32
|
-
formatted_phone_regex = /((?:\+?(\d{1,3}))?[- (]*(\d{3})[- )]*(\d{3})[- ]*(\d{4})(?: *x(\d+))?\b)/i
|
33
|
-
email_regex = /(\b[^\s]+?\s*(@|at)\s*[^\s]+?\.[^\s]+?\b)/i # Very general so as to catch BS
|
34
|
-
|
35
|
-
# Remove spaces (the most basic way to avoid these detections)
|
36
|
-
globbed_value = value.gsub ' ', ''
|
37
|
-
bullshit_free_phone = value.gsub /[^0-9,]|\n/i, ''
|
38
|
-
|
39
|
-
# Look for matches
|
40
|
-
detected = {
|
41
|
-
twitter: globbed_value.scan(twitter_regex),
|
42
|
-
email: value.scan(email_regex),
|
43
|
-
phone: globbed_value.scan(formatted_phone_regex).concat(
|
44
|
-
bullshit_free_phone.scan(formatted_phone_regex)
|
45
|
-
).uniq
|
46
|
-
}
|
47
|
-
|
48
|
-
# Catchall for base
|
49
|
-
errors = false
|
50
|
-
|
51
|
-
[:twitter, :email, :phone].each do |type|
|
52
|
-
|
53
|
-
unless detected[type].empty? or options["ignore_#{type}".to_sym]
|
54
|
-
errors = true
|
55
|
-
next if options[:message]
|
56
|
-
|
57
|
-
record.errors.add(attr_name, "contains_#{type}".to_sym, options.merge(
|
58
|
-
detected: detected[type].map{ |p|
|
59
|
-
type == :phone && defined?(Rails) ? number_to_phone(p[0], area_code: true) : p[0]
|
60
|
-
}.join(', ')
|
61
|
-
))
|
62
|
-
end
|
63
|
-
|
64
|
-
end
|
65
|
-
|
66
|
-
# A base mesage might be used
|
67
|
-
if errors and options[:message]
|
68
|
-
record.errors.add(:base, options[:message])
|
69
|
-
end
|
70
|
-
|
71
|
-
end
|
72
|
-
|
73
|
-
module HelperMethods
|
74
|
-
def validates_with_cold_shouldr(*attr_names)
|
75
|
-
validates_with ColdShoulderValidator, _merge_attributes(attr_names)
|
76
|
-
end
|
77
|
-
end
|
78
|
-
|
79
|
-
end
|
80
|
-
end
|
81
11
|
end
|
data/lib/validator.rb
ADDED
@@ -0,0 +1,102 @@
|
|
1
|
+
# For monkeypatch
|
2
|
+
require 'active_model'
|
3
|
+
require 'active_model/validations'
|
4
|
+
|
5
|
+
# For formatting phone numbers in errors
|
6
|
+
require 'action_view'
|
7
|
+
require 'action_view/helpers'
|
8
|
+
|
9
|
+
# The validations
|
10
|
+
# TODO require in another file? This was failing when actually deployed through rubygems
|
11
|
+
module ActiveModel
|
12
|
+
module Validations
|
13
|
+
|
14
|
+
# Extend the rails each validator so that this can be used like any Rails validator
|
15
|
+
class ColdShoulderValidator < EachValidator
|
16
|
+
include ActionView::Helpers::NumberHelper if defined?(Rails)
|
17
|
+
|
18
|
+
# These are somewhat simplistic
|
19
|
+
# Main problem being that all of them can be sidestepped by including commas
|
20
|
+
TWITTER_REGEX = /(@[A-Za-z0-9_]{1,15})/i
|
21
|
+
PHONE_REGEX = /((?:\+?(\d{1,3}))?[- (]*(\d{3})[- )]*(\d{3})[- ]*(\d{4})(?: *x(\d+))?\b)/i
|
22
|
+
EMAIL_REGEX = /(\b[^\s]+?\s*(@|at)\s*[^\s]+?\.[^\s]+?\b)/i
|
23
|
+
URL_REGEX = /\b(\S+?\.\S+?)\b/i
|
24
|
+
|
25
|
+
def initialize(options)
|
26
|
+
options[:ignore_link] = true if options[:remove_links]
|
27
|
+
|
28
|
+
super
|
29
|
+
end
|
30
|
+
|
31
|
+
def validate_each(record, attr_name, value)
|
32
|
+
|
33
|
+
# Detect any contact methods in the value
|
34
|
+
detected = detect_contacts_in value
|
35
|
+
|
36
|
+
# Add errors for detected methods, If there is a message, skip adding errors
|
37
|
+
errors = add_errors_to_record(record, attr_name, detected, {skip: options[:message]})
|
38
|
+
|
39
|
+
# A base mesage might be used
|
40
|
+
if errors and options[:message]
|
41
|
+
record.errors.add(:base, options[:message])
|
42
|
+
end
|
43
|
+
|
44
|
+
# Strip URLs from the actual saved value
|
45
|
+
if options[:remove_links]
|
46
|
+
record[attr_name] = value.gsub URL_REGEX, ''
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
def detect_contacts_in value
|
51
|
+
# Remove spaces (the most basic way to avoid these detections)
|
52
|
+
globbed_value = value.gsub ' ', ''
|
53
|
+
# Remove any characters not numbers or commas (commas are for $1,000 formatted numbers
|
54
|
+
bullshit_free_phone = value.gsub /[^0-9,]|\n/i, ''
|
55
|
+
|
56
|
+
# Look for matches
|
57
|
+
detected = {
|
58
|
+
twitter: globbed_value.scan(TWITTER_REGEX),
|
59
|
+
email: value.scan(EMAIL_REGEX),
|
60
|
+
phone: globbed_value.scan(PHONE_REGEX).concat(
|
61
|
+
bullshit_free_phone.scan(PHONE_REGEX)
|
62
|
+
).uniq,
|
63
|
+
link: value.scan(URL_REGEX)
|
64
|
+
}
|
65
|
+
end
|
66
|
+
|
67
|
+
# Returns true or fase, if there were any errors at all
|
68
|
+
# ops[:skip] can be used to skip adding the actual errors to the record
|
69
|
+
# If we just want the boolean return value
|
70
|
+
def add_errors_to_record record, attr_name, detected, ops={}
|
71
|
+
# Catchall for base
|
72
|
+
errors = false
|
73
|
+
|
74
|
+
# Search for
|
75
|
+
[:twitter, :email, :phone, :link].each do |type|
|
76
|
+
|
77
|
+
# Were there any matches, or are we ignoring this type
|
78
|
+
unless detected[type].empty? or options["ignore_#{type}".to_sym]
|
79
|
+
errors = true
|
80
|
+
next if ops[:skip] # If a base message is set, don't add attr errors
|
81
|
+
|
82
|
+
record.errors.add(attr_name, "contains_#{type}".to_sym, options.merge(
|
83
|
+
detected: detected[type].map{ |p|
|
84
|
+
# If this is a phone it gets formatted, otherwise no
|
85
|
+
type == :phone && defined?(Rails) ? number_to_phone(p[0], area_code: true) : p[0]
|
86
|
+
}.join(', ')
|
87
|
+
))
|
88
|
+
end
|
89
|
+
|
90
|
+
end
|
91
|
+
return errors
|
92
|
+
end
|
93
|
+
|
94
|
+
module HelperMethods
|
95
|
+
def validates_with_cold_shouldr(*attr_names)
|
96
|
+
validates_with ColdShoulderValidator, _merge_attributes(attr_names)
|
97
|
+
end
|
98
|
+
end
|
99
|
+
|
100
|
+
end
|
101
|
+
end
|
102
|
+
end
|
data/locales/en.yml
CHANGED
@@ -3,4 +3,5 @@ en:
|
|
3
3
|
messages:
|
4
4
|
contains_twitter: "contains the twitter handle: %{detected}"
|
5
5
|
contains_phone: "contains the phone number: %{detected}"
|
6
|
-
contains_email: "contains the email address: %{detected}"
|
6
|
+
contains_email: "contains the email address: %{detected}"
|
7
|
+
contains_link: "contains the link: %{detected}"
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: cold_shoulder
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Dustin Hoffman
|
@@ -61,6 +61,7 @@ extensions: []
|
|
61
61
|
extra_rdoc_files: []
|
62
62
|
files:
|
63
63
|
- lib/cold_shoulder.rb
|
64
|
+
- lib/validator.rb
|
64
65
|
- locales/en.yml
|
65
66
|
homepage: https://github.com/Breefield/cold_shoulder
|
66
67
|
licenses:
|