Решение на Четвърта задача от Николай Димитров

Обратно към всички решения

Към профила на Николай Димитров

Резултати

  • 2 точки от тестове
  • 0 бонус точки
  • 2 точки общо
  • 17 успешни тест(а)
  • 24 неуспешни тест(а)

Код

class PrivacyFilter
attr_accessor :preserve_phone_country_code, :preserve_email_hostname, :partially_preserve_email_username
def initialize(text)
@preserve_phone_country_code = false
@preserve_email_hostname = false
@partially_preserve_email_username = false
@text = text
end
def filtered
result = self.clone
result.send(:text=, filter_email)
result.filter_phone
end
private
attr_accessor :text
def filter_phone
if preserve_phone_country_code
@text.gsub(/(?<country_code>(00|\+)[1-9]\d{,2})(?<phone>([ \(\)-]{,2}\d){6,11})/,'\k<country_code> [FILTERED]').
gsub(/(?<prefix>0)(?<phone>([ \(\)-]{,2}\d){6,11})/, '[PHONE]')
else
@text.gsub(/(?<prefix>(0|(00|\+)[1-9]\d{,2}))(?<phone>([ \(\)-]{,2}\d){6,11})/, '[PHONE]')
end
end
def filter_email
result = filter_email_partially_preserving_email_username if partially_preserve_email_username
result ||= filter_email_preserving_hostname if preserve_email_hostname
result ||= filter_whole_email
end
def filter_whole_email
hostname = /(?<name>([a-zA-Z0-9][a-zA-Z0-9-]{,60}[a-zA-Z0-9]\.)*)(?<tld>[a-zA-z]{2,3}(\.[a-zA-z]{2})?)/
whole_email = /(?<username>[a-zA-Z0-9][\w+\.-]{,200})@(?<hostname>#{hostname})/
@text.gsub(whole_email, '[EMAIL]')
end
def filter_email_preserving_hostname
hostname = /(?<name>([a-zA-Z0-9][a-zA-Z0-9-]{,60}[a-zA-Z0-9]\.)*)(?<tld>[a-zA-z]{2,3}(\.[a-zA-z]{2})?)/
whole_email = /(?<username>[a-zA-Z0-9][\w+\.-]{,200})@(?<hostname>#{hostname})/
@text.gsub(whole_email, '[FILTERED]@\k<hostname>')
end
def filter_email_partially_preserving_email_username
hostname = /(?<name>([a-zA-Z0-9][a-zA-Z0-9-]{,60}[a-zA-Z0-9]\.)*)(?<tld>[a-zA-z]{2,3}(\.[a-zA-z]{2})?)/
@text.gsub(/\b(?<short_username>[a-zA-Z0-9][\w+\.-]{,4})@(?<hostname>#{hostname})/, '[FILTERED]@\k<hostname>').
gsub(/(?<_>[a-zA-Z0-9][\w+\.-]{2})[\w+\.-]{,197}@(?<hostname>#{hostname})/, '\k<_>[FILTERED]@\k<hostname>')
end
end
class Validations
def self.email?(value)
/^(?<username>[a-zA-Z0-9][\w+\.-]{,200})@(?<hostname>.*)$/ =~ value
self.hostname?(hostname) ? true : false
end
def self.hostname?(value)
/^(?<name>([a-zA-Z0-9][a-zA-Z0-9-]{,60}[a-zA-Z0-9]\.)*)(?<tld>[a-zA-z]{2,3}(\.[a-zA-z]{2})?)$/ =~ value ?
true : false
end
def self.phone?(value)
/^(?<prefix>(0|(00|\+)[1-9]\d{,2}))(?<phone>([ \(\)-]{,2}\d){6,11})$/ =~ value ? true : false
end
def self.ip_address?(value)
(/^(?<ip>\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})$/ =~ value and
ip.split('.').all? { |byte| byte.to_i.between?(0, 255) }) ? true : false
end
def self.number?(value)
/^(?<number>-?(0|[1-9][0-9]*)(\.[0-9]+)?)$/ =~ value ? true : false
end
def self.integer?(value)
/^(?<integer>-?(0|[1-9][0-9]*))$/ =~ value ? true : false
end
def self.date?(value)
(/^(?<year>[0-9]{4})-(?<month>[0-9]{2})-(?<day>[0-9]{2})$/ =~ value and
month.to_i.to_i.between?(1, 12) and day.to_i.between?(1, 31)) ? true : false
end
def self.time?(value)
(/^(?<hours>[0-9]{2}):(?<minutes>[0-9]{2}):(?<seconds>[0-9]{2})$/ =~ value and
hours.to_i.between?(0, 23) and minutes.to_i.between?(0, 59) and seconds.to_i.between?(0, 59)) ? true : false
end
def self.date_time?(value)
(/^(?<date>.*)( |T)(?<time>.*)$/ =~ value and self.date?(date) and self.time?(time)) ? true : false
end
end

Лог от изпълнението

FFFFFFFFFFFFFF...F.FFFF.F..F..F.....F...F

Failures:

  1) PrivacyFilter works with blank or whitespace strings and preserves whitespace
     Failure/Error: PrivacyFilter.new(text).filtered
     NoMethodError:
       private method `filter_phone' called for #<PrivacyFilter:0x95a5920>
     # /tmp/d20130203-23049-11jqkyr/solution.rb:14:in `filtered'
     # /tmp/d20130203-23049-11jqkyr/spec.rb:5:in `filter'
     # /tmp/d20130203-23049-11jqkyr/spec.rb:21:in `block (2 levels) in <top (required)>'
     # ./lib/homework/run_with_timeout.rb:5:in `block (3 levels) in <top (required)>'
     # ./lib/homework/run_with_timeout.rb:5:in `block (2 levels) in <top (required)>'

  2) PrivacyFilter obfuscates simple emails
     Failure/Error: PrivacyFilter.new(text).filtered
     NoMethodError:
       private method `filter_phone' called for #<PrivacyFilter:0x95a8288>
     # /tmp/d20130203-23049-11jqkyr/solution.rb:14:in `filtered'
     # /tmp/d20130203-23049-11jqkyr/spec.rb:5:in `filter'
     # /tmp/d20130203-23049-11jqkyr/spec.rb:27:in `block (2 levels) in <top (required)>'
     # ./lib/homework/run_with_timeout.rb:5:in `block (3 levels) in <top (required)>'
     # ./lib/homework/run_with_timeout.rb:5:in `block (2 levels) in <top (required)>'

  3) PrivacyFilter obfuscates more complicated emails
     Failure/Error: PrivacyFilter.new(text).filtered
     NoMethodError:
       private method `filter_phone' called for #<PrivacyFilter:0x95ab8e8>
     # /tmp/d20130203-23049-11jqkyr/solution.rb:14:in `filtered'
     # /tmp/d20130203-23049-11jqkyr/spec.rb:5:in `filter'
     # /tmp/d20130203-23049-11jqkyr/spec.rb:40:in `block (3 levels) in <top (required)>'
     # /tmp/d20130203-23049-11jqkyr/spec.rb:39:in `each'
     # /tmp/d20130203-23049-11jqkyr/spec.rb:39:in `block (2 levels) in <top (required)>'
     # ./lib/homework/run_with_timeout.rb:5:in `block (3 levels) in <top (required)>'
     # ./lib/homework/run_with_timeout.rb:5:in `block (2 levels) in <top (required)>'

  4) PrivacyFilter does not filter invalid emails
     Failure/Error: PrivacyFilter.new(text).filtered
     NoMethodError:
       private method `filter_phone' called for #<PrivacyFilter:0x95b03e8>
     # /tmp/d20130203-23049-11jqkyr/solution.rb:14:in `filtered'
     # /tmp/d20130203-23049-11jqkyr/spec.rb:5:in `filter'
     # /tmp/d20130203-23049-11jqkyr/spec.rb:52:in `block (3 levels) in <top (required)>'
     # /tmp/d20130203-23049-11jqkyr/spec.rb:46:in `each'
     # /tmp/d20130203-23049-11jqkyr/spec.rb:46:in `block (2 levels) in <top (required)>'
     # ./lib/homework/run_with_timeout.rb:5:in `block (3 levels) in <top (required)>'
     # ./lib/homework/run_with_timeout.rb:5:in `block (2 levels) in <top (required)>'

  5) PrivacyFilter allows email hostname to be preserved
     Failure/Error: filter.filtered
     NoMethodError:
       private method `filter_phone' called for #<PrivacyFilter:0x95b3dcc>
     # /tmp/d20130203-23049-11jqkyr/solution.rb:14:in `filtered'
     # /tmp/d20130203-23049-11jqkyr/spec.rb:11:in `filter_email_usernames'
     # /tmp/d20130203-23049-11jqkyr/spec.rb:60:in `block (2 levels) in <top (required)>'
     # ./lib/homework/run_with_timeout.rb:5:in `block (3 levels) in <top (required)>'
     # ./lib/homework/run_with_timeout.rb:5:in `block (2 levels) in <top (required)>'

  6) PrivacyFilter allows email usernames to be partially preserved
     Failure/Error: filter.filtered
     NoMethodError:
       private method `filter_phone' called for #<PrivacyFilter:0x95b70e4>
     # /tmp/d20130203-23049-11jqkyr/solution.rb:14:in `filtered'
     # /tmp/d20130203-23049-11jqkyr/spec.rb:17:in `partially_filter_email_usernames'
     # /tmp/d20130203-23049-11jqkyr/spec.rb:65:in `block (2 levels) in <top (required)>'
     # ./lib/homework/run_with_timeout.rb:5:in `block (3 levels) in <top (required)>'
     # ./lib/homework/run_with_timeout.rb:5:in `block (2 levels) in <top (required)>'

  7) PrivacyFilter filters whole email usernames if too short
     Failure/Error: filter.filtered
     NoMethodError:
       private method `filter_phone' called for #<PrivacyFilter:0x95c6b34>
     # /tmp/d20130203-23049-11jqkyr/solution.rb:14:in `filtered'
     # /tmp/d20130203-23049-11jqkyr/spec.rb:17:in `partially_filter_email_usernames'
     # /tmp/d20130203-23049-11jqkyr/spec.rb:69:in `block (2 levels) in <top (required)>'
     # ./lib/homework/run_with_timeout.rb:5:in `block (3 levels) in <top (required)>'
     # ./lib/homework/run_with_timeout.rb:5:in `block (2 levels) in <top (required)>'

  8) PrivacyFilter does not brake with unicode
     Failure/Error: filter.filtered
     NoMethodError:
       private method `filter_phone' called for #<PrivacyFilter:0x97f9b04>
     # /tmp/d20130203-23049-11jqkyr/solution.rb:14:in `filtered'
     # /tmp/d20130203-23049-11jqkyr/spec.rb:17:in `partially_filter_email_usernames'
     # /tmp/d20130203-23049-11jqkyr/spec.rb:73:in `block (2 levels) in <top (required)>'
     # ./lib/homework/run_with_timeout.rb:5:in `block (3 levels) in <top (required)>'
     # ./lib/homework/run_with_timeout.rb:5:in `block (2 levels) in <top (required)>'

  9) PrivacyFilter filters more complex phone numbers
     Failure/Error: PrivacyFilter.new(text).filtered
     NoMethodError:
       private method `filter_phone' called for #<PrivacyFilter:0x97f8740>
     # /tmp/d20130203-23049-11jqkyr/solution.rb:14:in `filtered'
     # /tmp/d20130203-23049-11jqkyr/spec.rb:5:in `filter'
     # /tmp/d20130203-23049-11jqkyr/spec.rb:85:in `block (3 levels) in <top (required)>'
     # /tmp/d20130203-23049-11jqkyr/spec.rb:84:in `each'
     # /tmp/d20130203-23049-11jqkyr/spec.rb:84:in `block (2 levels) in <top (required)>'
     # ./lib/homework/run_with_timeout.rb:5:in `block (3 levels) in <top (required)>'
     # ./lib/homework/run_with_timeout.rb:5:in `block (2 levels) in <top (required)>'

  10) PrivacyFilter does not filter invalid phone numbers
     Failure/Error: PrivacyFilter.new(text).filtered
     NoMethodError:
       private method `filter_phone' called for #<PrivacyFilter:0x97f7070>
     # /tmp/d20130203-23049-11jqkyr/solution.rb:14:in `filtered'
     # /tmp/d20130203-23049-11jqkyr/spec.rb:5:in `filter'
     # /tmp/d20130203-23049-11jqkyr/spec.rb:96:in `block (3 levels) in <top (required)>'
     # /tmp/d20130203-23049-11jqkyr/spec.rb:95:in `each'
     # /tmp/d20130203-23049-11jqkyr/spec.rb:95:in `block (2 levels) in <top (required)>'
     # ./lib/homework/run_with_timeout.rb:5:in `block (3 levels) in <top (required)>'
     # ./lib/homework/run_with_timeout.rb:5:in `block (2 levels) in <top (required)>'

  11) PrivacyFilter preserves whitespace around phones
     Failure/Error: PrivacyFilter.new(text).filtered
     NoMethodError:
       private method `filter_phone' called for #<PrivacyFilter:0x9deeb54>
     # /tmp/d20130203-23049-11jqkyr/solution.rb:14:in `filtered'
     # /tmp/d20130203-23049-11jqkyr/spec.rb:5:in `filter'
     # /tmp/d20130203-23049-11jqkyr/spec.rb:101:in `block (2 levels) in <top (required)>'
     # ./lib/homework/run_with_timeout.rb:5:in `block (3 levels) in <top (required)>'
     # ./lib/homework/run_with_timeout.rb:5:in `block (2 levels) in <top (required)>'

  12) PrivacyFilter filters more than one phone or email
     Failure/Error: PrivacyFilter.new(text).filtered
     NoMethodError:
       private method `filter_phone' called for #<PrivacyFilter:0x9deca0c>
     # /tmp/d20130203-23049-11jqkyr/solution.rb:14:in `filtered'
     # /tmp/d20130203-23049-11jqkyr/spec.rb:5:in `filter'
     # /tmp/d20130203-23049-11jqkyr/spec.rb:119:in `block (2 levels) in <top (required)>'
     # ./lib/homework/run_with_timeout.rb:5:in `block (3 levels) in <top (required)>'
     # ./lib/homework/run_with_timeout.rb:5:in `block (2 levels) in <top (required)>'

  13) PrivacyFilter allows country code to be preserved for internationally-formatted phone numbers
     Failure/Error: filter.filtered.should eq filtered
     NoMethodError:
       private method `filter_phone' called for #<PrivacyFilter:0x9df2574>
     # /tmp/d20130203-23049-11jqkyr/solution.rb:14:in `filtered'
     # /tmp/d20130203-23049-11jqkyr/spec.rb:132:in `block (3 levels) in <top (required)>'
     # /tmp/d20130203-23049-11jqkyr/spec.rb:129:in `each'
     # /tmp/d20130203-23049-11jqkyr/spec.rb:129:in `block (2 levels) in <top (required)>'
     # ./lib/homework/run_with_timeout.rb:5:in `block (3 levels) in <top (required)>'
     # ./lib/homework/run_with_timeout.rb:5:in `block (2 levels) in <top (required)>'

  14) PrivacyFilter separates preserved country code from filtered phone with a space
     Failure/Error: filter.filtered.should eq filtered
     NoMethodError:
       private method `filter_phone' called for #<PrivacyFilter:0x9df1278>
     # /tmp/d20130203-23049-11jqkyr/solution.rb:14:in `filtered'
     # /tmp/d20130203-23049-11jqkyr/spec.rb:144:in `block (3 levels) in <top (required)>'
     # /tmp/d20130203-23049-11jqkyr/spec.rb:141:in `each'
     # /tmp/d20130203-23049-11jqkyr/spec.rb:141:in `block (2 levels) in <top (required)>'
     # ./lib/homework/run_with_timeout.rb:5:in `block (3 levels) in <top (required)>'
     # ./lib/homework/run_with_timeout.rb:5:in `block (2 levels) in <top (required)>'

  15) Validations does not break on emails in multiline strings
     Failure/Error: Validations.email?("foo@bar.com\nwat?").should be_false
       expected: false value
            got: true
     # /tmp/d20130203-23049-11jqkyr/spec.rb:176:in `block (2 levels) in <top (required)>'
     # ./lib/homework/run_with_timeout.rb:5:in `block (3 levels) in <top (required)>'
     # ./lib/homework/run_with_timeout.rb:5:in `block (2 levels) in <top (required)>'

  16) Validations can validate more complex phone numbers
     Failure/Error: Validations.phone?(phone).should be(valid)
       
       expected #<FalseClass:0> => false
            got #<TrueClass:2> => true
       
       Compared using equal?, which compares object identity,
       but expected and actual are not the same object. Use
       'actual.should eq(expected)' if you don't care about
       object identity in this example.
     # /tmp/d20130203-23049-11jqkyr/spec.rb:210:in `block (3 levels) in <top (required)>'
     # /tmp/d20130203-23049-11jqkyr/spec.rb:209:in `each'
     # /tmp/d20130203-23049-11jqkyr/spec.rb:209:in `block (2 levels) in <top (required)>'
     # ./lib/homework/run_with_timeout.rb:5:in `block (3 levels) in <top (required)>'
     # ./lib/homework/run_with_timeout.rb:5:in `block (2 levels) in <top (required)>'

  17) Validations does not break on phones in multiline strings
     Failure/Error: Validations.phone?("0885123123\nwat?").should be_false
       expected: false value
            got: true
     # /tmp/d20130203-23049-11jqkyr/spec.rb:215:in `block (2 levels) in <top (required)>'
     # ./lib/homework/run_with_timeout.rb:5:in `block (3 levels) in <top (required)>'
     # ./lib/homework/run_with_timeout.rb:5:in `block (2 levels) in <top (required)>'

  18) Validations validates hostnames
     Failure/Error: Validations.hostname?('1.2.3.4.xip.io').should be_true
       expected: true value
            got: false
     # /tmp/d20130203-23049-11jqkyr/spec.rb:222:in `block (2 levels) in <top (required)>'
     # ./lib/homework/run_with_timeout.rb:5:in `block (3 levels) in <top (required)>'
     # ./lib/homework/run_with_timeout.rb:5:in `block (2 levels) in <top (required)>'

  19) Validations handles multiline strings in hostname validation properly
     Failure/Error: Validations.hostname?("foo.com\n").should be_false
       expected: false value
            got: true
     # /tmp/d20130203-23049-11jqkyr/spec.rb:233:in `block (2 levels) in <top (required)>'
     # ./lib/homework/run_with_timeout.rb:5:in `block (3 levels) in <top (required)>'
     # ./lib/homework/run_with_timeout.rb:5:in `block (2 levels) in <top (required)>'

  20) Validations handles multiline strings in IP validation properly
     Failure/Error: Validations.ip_address?("8.8.8.8\n").should be_false
       expected: false value
            got: true
     # /tmp/d20130203-23049-11jqkyr/spec.rb:245:in `block (2 levels) in <top (required)>'
     # ./lib/homework/run_with_timeout.rb:5:in `block (3 levels) in <top (required)>'
     # ./lib/homework/run_with_timeout.rb:5:in `block (2 levels) in <top (required)>'

  21) Validations handles multiline strings in numbers validation properly
     Failure/Error: Validations.number?("42\n24").should be_false
       expected: false value
            got: true
     # /tmp/d20130203-23049-11jqkyr/spec.rb:274:in `block (2 levels) in <top (required)>'
     # ./lib/homework/run_with_timeout.rb:5:in `block (3 levels) in <top (required)>'
     # ./lib/homework/run_with_timeout.rb:5:in `block (2 levels) in <top (required)>'

  22) Validations handles multiline strings in integer validation properly
     Failure/Error: Validations.number?("42\n24").should be_false
       expected: false value
            got: true
     # /tmp/d20130203-23049-11jqkyr/spec.rb:295:in `block (2 levels) in <top (required)>'
     # ./lib/homework/run_with_timeout.rb:5:in `block (3 levels) in <top (required)>'
     # ./lib/homework/run_with_timeout.rb:5:in `block (2 levels) in <top (required)>'

  23) Validations handles newlines in date validation
     Failure/Error: Validations.date?("2012-11-19\n").should be_false
       expected: false value
            got: true
     # /tmp/d20130203-23049-11jqkyr/spec.rb:327:in `block (2 levels) in <top (required)>'
     # ./lib/homework/run_with_timeout.rb:5:in `block (3 levels) in <top (required)>'
     # ./lib/homework/run_with_timeout.rb:5:in `block (2 levels) in <top (required)>'

  24) Validations handles newlines in time and datetime validation
     Failure/Error: Validations.time?("12:01:01\n").should be_false
       expected: false value
            got: true
     # /tmp/d20130203-23049-11jqkyr/spec.rb:360:in `block (2 levels) in <top (required)>'
     # ./lib/homework/run_with_timeout.rb:5:in `block (3 levels) in <top (required)>'
     # ./lib/homework/run_with_timeout.rb:5:in `block (2 levels) in <top (required)>'

Finished in 0.05022 seconds
41 examples, 24 failures

Failed examples:

rspec /tmp/d20130203-23049-11jqkyr/spec.rb:20 # PrivacyFilter works with blank or whitespace strings and preserves whitespace
rspec /tmp/d20130203-23049-11jqkyr/spec.rb:26 # PrivacyFilter obfuscates simple emails
rspec /tmp/d20130203-23049-11jqkyr/spec.rb:30 # PrivacyFilter obfuscates more complicated emails
rspec /tmp/d20130203-23049-11jqkyr/spec.rb:44 # PrivacyFilter does not filter invalid emails
rspec /tmp/d20130203-23049-11jqkyr/spec.rb:59 # PrivacyFilter allows email hostname to be preserved
rspec /tmp/d20130203-23049-11jqkyr/spec.rb:64 # PrivacyFilter allows email usernames to be partially preserved
rspec /tmp/d20130203-23049-11jqkyr/spec.rb:68 # PrivacyFilter filters whole email usernames if too short
rspec /tmp/d20130203-23049-11jqkyr/spec.rb:72 # PrivacyFilter does not brake with unicode
rspec /tmp/d20130203-23049-11jqkyr/spec.rb:76 # PrivacyFilter filters more complex phone numbers
rspec /tmp/d20130203-23049-11jqkyr/spec.rb:89 # PrivacyFilter does not filter invalid phone numbers
rspec /tmp/d20130203-23049-11jqkyr/spec.rb:100 # PrivacyFilter preserves whitespace around phones
rspec /tmp/d20130203-23049-11jqkyr/spec.rb:104 # PrivacyFilter filters more than one phone or email
rspec /tmp/d20130203-23049-11jqkyr/spec.rb:122 # PrivacyFilter allows country code to be preserved for internationally-formatted phone numbers
rspec /tmp/d20130203-23049-11jqkyr/spec.rb:136 # PrivacyFilter separates preserved country code from filtered phone with a space
rspec /tmp/d20130203-23049-11jqkyr/spec.rb:175 # Validations does not break on emails in multiline strings
rspec /tmp/d20130203-23049-11jqkyr/spec.rb:184 # Validations can validate more complex phone numbers
rspec /tmp/d20130203-23049-11jqkyr/spec.rb:214 # Validations does not break on phones in multiline strings
rspec /tmp/d20130203-23049-11jqkyr/spec.rb:218 # Validations validates hostnames
rspec /tmp/d20130203-23049-11jqkyr/spec.rb:232 # Validations handles multiline strings in hostname validation properly
rspec /tmp/d20130203-23049-11jqkyr/spec.rb:244 # Validations handles multiline strings in IP validation properly
rspec /tmp/d20130203-23049-11jqkyr/spec.rb:273 # Validations handles multiline strings in numbers validation properly
rspec /tmp/d20130203-23049-11jqkyr/spec.rb:294 # Validations handles multiline strings in integer validation properly
rspec /tmp/d20130203-23049-11jqkyr/spec.rb:326 # Validations handles newlines in date validation
rspec /tmp/d20130203-23049-11jqkyr/spec.rb:359 # Validations handles newlines in time and datetime validation

История (4 версии и 0 коментара)

Николай обнови решението на 25.11.2012 00:19 (преди почти 12 години)

+class PrivacyFilter
+ attr_accessor :preserve_phone_country_code, :preserve_email_hostname, :partially_preserve_email_username
+
+ def initialize(text)
+ @preserve_phone_country_code = false
+ @preserve_email_hostname = false
+ @partially_preserve_email_username = false
+ @text = text
+ end
+
+ def filtered
+ emails_filtered = PrivacyFilter.new(filter_email)
+ emails_filtered.filter_phone
+ end
+
+ def filter_phone
+ if preserve_phone_country_code
+ filter_phone_preserving_country_code
+ else
+ filter_whole_phone
+ end
+ end
+
+ def filter_email
+ result = filter_email_partially_preserving_email_username if partially_preserve_email_username
+ result ||= filter_email_preserving_hostname if preserve_email_hostname
+ result ||= filter_whole_email
+ end
+
+ def filter_whole_email
+ hostname = /(?<name>([a-zA-Z0-9][a-zA-Z0-9-]{,60}[a-zA-Z0-9]\.)*)(?<tld>[a-zA-z]{2,3}(\.[a-zA-z]{2})?)/
+ whole_email = /(?<username>[a-zA-Z0-9][\w+\.-]{,200})@(?<hostname>#{hostname})/
+ @text.gsub(whole_email, '[EMAIL]')
+ end
+
+ def filter_whole_phone
+ @text.gsub(/(?<prefix>(0|(00|\+)[1-9]\d{,2}))(?<phone>([ \(\)-]{,2}\d){6,11})/, '[PHONE]')
+ end
+
+ def filter_phone_preserving_country_code
+ @text.gsub(/(?<country_code>(00|\+)[1-9]\d{,2})(?<phone>([ \(\)-]{,2}\d){6,9})/,'\k<country_code> [PHONE]').
+ gsub(/(?<prefix>0)(?<phone>([ \(\)-]{,2}\d){6,11})/, '[PHONE]')
+ end
+
+ def filter_email_preserving_hostname
+ hostname = /(?<name>([a-zA-Z0-9][a-zA-Z0-9-]{,60}[a-zA-Z0-9]\.)*)(?<tld>[a-zA-z]{2,3}(\.[a-zA-z]{2})?)/
+ whole_email = /(?<username>[a-zA-Z0-9][\w+\.-]{,200})@(?<hostname>#{hostname})/
+ @text.gsub(whole_email, '[EMAIL]@\k<hostname>')
+ end
+
+ def filter_email_partially_preserving_email_username
+ hostname = /(?<name>([a-zA-Z0-9][a-zA-Z0-9-]{,60}[a-zA-Z0-9]\.)*)(?<tld>[a-zA-z]{2,3}(\.[a-zA-z]{2})?)/
+ @text.gsub(/\b(?<short_username>[a-zA-Z0-9][\w+\.-]{,4})@(?<hostname>#{hostname})/, '[EMAIL]@\k<hostname>').
+ gsub(/(?<three>[a-zA-Z0-9][\w+\.-]{2})([\w+\.-]{,197})@(?<hostname>#{hostname})/, '\k<three>[EMAIL]@\k<hostname>')
+ end
+
+end
+
+class Validations
+ def self.email?(value)
+ /(?<username>^[a-zA-Z0-9][\w+\.-]{,200})@(?<hostname>.*)$/ =~ value
+ if self.hostname?(hostname)
+ true
+ else
+ false
+ end
+ end
+
+ def self.hostname?(value)
+ if /(?<name>^([a-zA-Z0-9][a-zA-Z0-9-]{,60}[a-zA-Z0-9]\.)*)(?<tld>[a-zA-z]{2,3}(\.[a-zA-z]{2})?)$/ =~ value
+ true
+ else
+ false
+ end
+ end
+
+ def self.phone?(value)
+ if /^(?<prefix>(0|(00|\+)[1-9]\d{,2}))(?<phone>([ \(\)-]{,2}\d){6,11})$/ =~ value
+ true
+ else
+ false
+ end
+ end
+
+ def self.ip_address?(value)
+ if /^(?<ip>\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})$/ =~ value and
+ ip.split('.').all? { |byte| byte.to_i.between?(0, 255) }
+ true
+ else
+ false
+ end
+ end
+
+ def self.number?(value)
+ if /^(?<number>-?(0|[1-9][0-9]*)(\.[0-9]+)?)$/ =~ value
+ true
+ else
+ false
+ end
+ end
+
+ def self.integer?(value)
+ if /^(?<integer>-?(0|[1-9][0-9]*))$/ =~ value
+ true
+ else
+ false
+ end
+ end
+
+ def self.date?(value)
+ if /^(?<year>[0-9]{4})-(?<month>[0-9]{2})-(?<day>[0-9]{2})$/ =~ value and
+ month.to_i.to_i.between?(1, 12) and day.to_i.between?(1, 31)
+ true
+ else
+ false
+ end
+ end
+
+ def self.time?(value)
+ if /^(?<hours>[0-9]{2}):(?<minutes>[0-9]{2}):(?<seconds>[0-9]{2})$/ =~ value and
+ hours.to_i.between?(0, 23) and minutes.to_i.between?(0, 59) and seconds.to_i.between?(0, 59)
+ true
+ else
+ false
+ end
+ end
+
+ def self.date_time?(value)
+ if /^(?<date>.*)( |T)(?<time>.*)$/ =~ value and
+ self.date?(date) and self.time?(time)
+ true
+ else
+ false
+ end
+ end
+end

Николай обнови решението на 25.11.2012 14:53 (преди почти 12 години)

class PrivacyFilter
- attr_accessor :preserve_phone_country_code, :preserve_email_hostname, :partially_preserve_email_username
+ attr_accessor :text, :preserve_phone_country_code, :preserve_email_hostname, :partially_preserve_email_username
def initialize(text)
@preserve_phone_country_code = false
@preserve_email_hostname = false
@partially_preserve_email_username = false
@text = text
end
def filtered
- emails_filtered = PrivacyFilter.new(filter_email)
- emails_filtered.filter_phone
+ result = self.clone
+ result.text = filter_email
+ result.filter_phone
end
def filter_phone
if preserve_phone_country_code
filter_phone_preserving_country_code
else
filter_whole_phone
end
end
def filter_email
result = filter_email_partially_preserving_email_username if partially_preserve_email_username
result ||= filter_email_preserving_hostname if preserve_email_hostname
result ||= filter_whole_email
end
def filter_whole_email
hostname = /(?<name>([a-zA-Z0-9][a-zA-Z0-9-]{,60}[a-zA-Z0-9]\.)*)(?<tld>[a-zA-z]{2,3}(\.[a-zA-z]{2})?)/
whole_email = /(?<username>[a-zA-Z0-9][\w+\.-]{,200})@(?<hostname>#{hostname})/
@text.gsub(whole_email, '[EMAIL]')
end
def filter_whole_phone
@text.gsub(/(?<prefix>(0|(00|\+)[1-9]\d{,2}))(?<phone>([ \(\)-]{,2}\d){6,11})/, '[PHONE]')
end
def filter_phone_preserving_country_code
- @text.gsub(/(?<country_code>(00|\+)[1-9]\d{,2})(?<phone>([ \(\)-]{,2}\d){6,9})/,'\k<country_code> [PHONE]').
+ @text.gsub(/(?<country_code>(00|\+)[1-9]\d{,2})(?<phone>([ \(\)-]{,2}\d){6,11})/,'\k<country_code> [FILTERED]').
gsub(/(?<prefix>0)(?<phone>([ \(\)-]{,2}\d){6,11})/, '[PHONE]')
end
def filter_email_preserving_hostname
hostname = /(?<name>([a-zA-Z0-9][a-zA-Z0-9-]{,60}[a-zA-Z0-9]\.)*)(?<tld>[a-zA-z]{2,3}(\.[a-zA-z]{2})?)/
whole_email = /(?<username>[a-zA-Z0-9][\w+\.-]{,200})@(?<hostname>#{hostname})/
- @text.gsub(whole_email, '[EMAIL]@\k<hostname>')
+ @text.gsub(whole_email, '[FILTERED]@\k<hostname>')
end
def filter_email_partially_preserving_email_username
hostname = /(?<name>([a-zA-Z0-9][a-zA-Z0-9-]{,60}[a-zA-Z0-9]\.)*)(?<tld>[a-zA-z]{2,3}(\.[a-zA-z]{2})?)/
- @text.gsub(/\b(?<short_username>[a-zA-Z0-9][\w+\.-]{,4})@(?<hostname>#{hostname})/, '[EMAIL]@\k<hostname>').
- gsub(/(?<three>[a-zA-Z0-9][\w+\.-]{2})([\w+\.-]{,197})@(?<hostname>#{hostname})/, '\k<three>[EMAIL]@\k<hostname>')
+ @text.gsub(/\b(?<short_username>[a-zA-Z0-9][\w+\.-]{,4})@(?<hostname>#{hostname})/, '[FILTERED]@\k<hostname>').
+ gsub(/(?<three>[a-zA-Z0-9][\w+\.-]{2})[\w+\.-]{,197}@(?<hostname>#{hostname})/, '\k<three>[FILTERED]@\k<hostname>')
end
end
class Validations
def self.email?(value)
/(?<username>^[a-zA-Z0-9][\w+\.-]{,200})@(?<hostname>.*)$/ =~ value
if self.hostname?(hostname)
true
else
false
end
end
def self.hostname?(value)
if /(?<name>^([a-zA-Z0-9][a-zA-Z0-9-]{,60}[a-zA-Z0-9]\.)*)(?<tld>[a-zA-z]{2,3}(\.[a-zA-z]{2})?)$/ =~ value
true
else
false
end
end
def self.phone?(value)
if /^(?<prefix>(0|(00|\+)[1-9]\d{,2}))(?<phone>([ \(\)-]{,2}\d){6,11})$/ =~ value
true
else
false
end
end
def self.ip_address?(value)
if /^(?<ip>\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})$/ =~ value and
ip.split('.').all? { |byte| byte.to_i.between?(0, 255) }
true
else
false
end
end
def self.number?(value)
if /^(?<number>-?(0|[1-9][0-9]*)(\.[0-9]+)?)$/ =~ value
true
else
false
end
end
def self.integer?(value)
if /^(?<integer>-?(0|[1-9][0-9]*))$/ =~ value
true
else
false
end
end
def self.date?(value)
if /^(?<year>[0-9]{4})-(?<month>[0-9]{2})-(?<day>[0-9]{2})$/ =~ value and
month.to_i.to_i.between?(1, 12) and day.to_i.between?(1, 31)
true
else
false
end
end
def self.time?(value)
if /^(?<hours>[0-9]{2}):(?<minutes>[0-9]{2}):(?<seconds>[0-9]{2})$/ =~ value and
hours.to_i.between?(0, 23) and minutes.to_i.between?(0, 59) and seconds.to_i.between?(0, 59)
true
else
false
end
end
def self.date_time?(value)
if /^(?<date>.*)( |T)(?<time>.*)$/ =~ value and
self.date?(date) and self.time?(time)
true
else
false
end
end
end

Николай обнови решението на 26.11.2012 11:53 (преди почти 12 години)

class PrivacyFilter
- attr_accessor :text, :preserve_phone_country_code, :preserve_email_hostname, :partially_preserve_email_username
+ attr_accessor :preserve_phone_country_code, :preserve_email_hostname, :partially_preserve_email_username
def initialize(text)
@preserve_phone_country_code = false
@preserve_email_hostname = false
@partially_preserve_email_username = false
@text = text
end
def filtered
result = self.clone
- result.text = filter_email
+ result.send(:text=, filter_email)
result.filter_phone
end
+private
+ attr_accessor :text
+
def filter_phone
if preserve_phone_country_code
- filter_phone_preserving_country_code
+ @text.gsub(/(?<country_code>(00|\+)[1-9]\d{,2})(?<phone>([ \(\)-]{,2}\d){6,11})/,'\k<country_code> [FILTERED]').
+ gsub(/(?<prefix>0)(?<phone>([ \(\)-]{,2}\d){6,11})/, '[PHONE]')
else
- filter_whole_phone
+ @text.gsub(/(?<prefix>(0|(00|\+)[1-9]\d{,2}))(?<phone>([ \(\)-]{,2}\d){6,11})/, '[PHONE]')
end
end
def filter_email
result = filter_email_partially_preserving_email_username if partially_preserve_email_username
result ||= filter_email_preserving_hostname if preserve_email_hostname
result ||= filter_whole_email
end
def filter_whole_email
hostname = /(?<name>([a-zA-Z0-9][a-zA-Z0-9-]{,60}[a-zA-Z0-9]\.)*)(?<tld>[a-zA-z]{2,3}(\.[a-zA-z]{2})?)/
whole_email = /(?<username>[a-zA-Z0-9][\w+\.-]{,200})@(?<hostname>#{hostname})/
@text.gsub(whole_email, '[EMAIL]')
end
- def filter_whole_phone
- @text.gsub(/(?<prefix>(0|(00|\+)[1-9]\d{,2}))(?<phone>([ \(\)-]{,2}\d){6,11})/, '[PHONE]')
- end
-
- def filter_phone_preserving_country_code
- @text.gsub(/(?<country_code>(00|\+)[1-9]\d{,2})(?<phone>([ \(\)-]{,2}\d){6,11})/,'\k<country_code> [FILTERED]').
- gsub(/(?<prefix>0)(?<phone>([ \(\)-]{,2}\d){6,11})/, '[PHONE]')
- end
-
def filter_email_preserving_hostname
hostname = /(?<name>([a-zA-Z0-9][a-zA-Z0-9-]{,60}[a-zA-Z0-9]\.)*)(?<tld>[a-zA-z]{2,3}(\.[a-zA-z]{2})?)/
whole_email = /(?<username>[a-zA-Z0-9][\w+\.-]{,200})@(?<hostname>#{hostname})/
@text.gsub(whole_email, '[FILTERED]@\k<hostname>')
end
def filter_email_partially_preserving_email_username
hostname = /(?<name>([a-zA-Z0-9][a-zA-Z0-9-]{,60}[a-zA-Z0-9]\.)*)(?<tld>[a-zA-z]{2,3}(\.[a-zA-z]{2})?)/
@text.gsub(/\b(?<short_username>[a-zA-Z0-9][\w+\.-]{,4})@(?<hostname>#{hostname})/, '[FILTERED]@\k<hostname>').
- gsub(/(?<three>[a-zA-Z0-9][\w+\.-]{2})[\w+\.-]{,197}@(?<hostname>#{hostname})/, '\k<three>[FILTERED]@\k<hostname>')
+ gsub(/(?<_>[a-zA-Z0-9][\w+\.-]{2})[\w+\.-]{,197}@(?<hostname>#{hostname})/, '\k<_>[FILTERED]@\k<hostname>')
end
end
class Validations
def self.email?(value)
- /(?<username>^[a-zA-Z0-9][\w+\.-]{,200})@(?<hostname>.*)$/ =~ value
- if self.hostname?(hostname)
- true
- else
- false
- end
+ /^(?<username>[a-zA-Z0-9][\w+\.-]{,200})@(?<hostname>.*)$/ =~ value
+ self.hostname?(hostname) ? true : false
end
def self.hostname?(value)
- if /(?<name>^([a-zA-Z0-9][a-zA-Z0-9-]{,60}[a-zA-Z0-9]\.)*)(?<tld>[a-zA-z]{2,3}(\.[a-zA-z]{2})?)$/ =~ value
- true
- else
- false
- end
+ /^(?<name>([a-zA-Z0-9][a-zA-Z0-9-]{,60}[a-zA-Z0-9]\.)*)(?<tld>[a-zA-z]{2,3}(\.[a-zA-z]{2})?)$/ =~ value ?
+ true : false
end
def self.phone?(value)
- if /^(?<prefix>(0|(00|\+)[1-9]\d{,2}))(?<phone>([ \(\)-]{,2}\d){6,11})$/ =~ value
- true
- else
- false
- end
+ /^(?<prefix>(0|(00|\+)[1-9]\d{,2}))(?<phone>([ \(\)-]{,2}\d){6,11})$/ =~ value ? true : false
end
def self.ip_address?(value)
- if /^(?<ip>\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})$/ =~ value and
- ip.split('.').all? { |byte| byte.to_i.between?(0, 255) }
- true
- else
- false
- end
+ (/^(?<ip>\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})$/ =~ value and
+ ip.split('.').all? { |byte| byte.to_i.between?(0, 255) }) ? true : false
end
def self.number?(value)
- if /^(?<number>-?(0|[1-9][0-9]*)(\.[0-9]+)?)$/ =~ value
- true
- else
- false
- end
+ /^(?<number>-?(0|[1-9][0-9]*)(\.[0-9]+)?)$/ =~ value ? true : false
end
def self.integer?(value)
- if /^(?<integer>-?(0|[1-9][0-9]*))$/ =~ value
- true
- else
- false
- end
+ /^(?<integer>-?(0|[1-9][0-9]*))$/ =~ value ? true : false
end
def self.date?(value)
- if /^(?<year>[0-9]{4})-(?<month>[0-9]{2})-(?<day>[0-9]{2})$/ =~ value and
- month.to_i.to_i.between?(1, 12) and day.to_i.between?(1, 31)
- true
- else
- false
- end
+ (/^(?<year>[0-9]{4})-(?<month>[0-9]{2})-(?<day>[0-9]{2})$/ =~ value and
+ month.to_i.to_i.between?(1, 12) and day.to_i.between?(1, 31)) ? true : false
end
def self.time?(value)
- if /^(?<hours>[0-9]{2}):(?<minutes>[0-9]{2}):(?<seconds>[0-9]{2})$/ =~ value and
- hours.to_i.between?(0, 23) and minutes.to_i.between?(0, 59) and seconds.to_i.between?(0, 59)
- true
- else
- false
- end
+ (/^(?<hours>[0-9]{2}):(?<minutes>[0-9]{2}):(?<seconds>[0-9]{2})$/ =~ value and
+ hours.to_i.between?(0, 23) and minutes.to_i.between?(0, 59) and seconds.to_i.between?(0, 59)) ? true : false
end
def self.date_time?(value)
- if /^(?<date>.*)( |T)(?<time>.*)$/ =~ value and
- self.date?(date) and self.time?(time)
- true
- else
- false
- end
+ (/^(?<date>.*)( |T)(?<time>.*)$/ =~ value and self.date?(date) and self.time?(time)) ? true : false
end
end

Николай обнови решението на 26.11.2012 11:54 (преди почти 12 години)

class PrivacyFilter
attr_accessor :preserve_phone_country_code, :preserve_email_hostname, :partially_preserve_email_username
def initialize(text)
@preserve_phone_country_code = false
@preserve_email_hostname = false
@partially_preserve_email_username = false
@text = text
end
def filtered
result = self.clone
result.send(:text=, filter_email)
result.filter_phone
end
private
attr_accessor :text
def filter_phone
if preserve_phone_country_code
@text.gsub(/(?<country_code>(00|\+)[1-9]\d{,2})(?<phone>([ \(\)-]{,2}\d){6,11})/,'\k<country_code> [FILTERED]').
gsub(/(?<prefix>0)(?<phone>([ \(\)-]{,2}\d){6,11})/, '[PHONE]')
else
@text.gsub(/(?<prefix>(0|(00|\+)[1-9]\d{,2}))(?<phone>([ \(\)-]{,2}\d){6,11})/, '[PHONE]')
end
end
def filter_email
result = filter_email_partially_preserving_email_username if partially_preserve_email_username
result ||= filter_email_preserving_hostname if preserve_email_hostname
result ||= filter_whole_email
end
def filter_whole_email
hostname = /(?<name>([a-zA-Z0-9][a-zA-Z0-9-]{,60}[a-zA-Z0-9]\.)*)(?<tld>[a-zA-z]{2,3}(\.[a-zA-z]{2})?)/
whole_email = /(?<username>[a-zA-Z0-9][\w+\.-]{,200})@(?<hostname>#{hostname})/
@text.gsub(whole_email, '[EMAIL]')
end
def filter_email_preserving_hostname
hostname = /(?<name>([a-zA-Z0-9][a-zA-Z0-9-]{,60}[a-zA-Z0-9]\.)*)(?<tld>[a-zA-z]{2,3}(\.[a-zA-z]{2})?)/
whole_email = /(?<username>[a-zA-Z0-9][\w+\.-]{,200})@(?<hostname>#{hostname})/
@text.gsub(whole_email, '[FILTERED]@\k<hostname>')
end
def filter_email_partially_preserving_email_username
hostname = /(?<name>([a-zA-Z0-9][a-zA-Z0-9-]{,60}[a-zA-Z0-9]\.)*)(?<tld>[a-zA-z]{2,3}(\.[a-zA-z]{2})?)/
@text.gsub(/\b(?<short_username>[a-zA-Z0-9][\w+\.-]{,4})@(?<hostname>#{hostname})/, '[FILTERED]@\k<hostname>').
gsub(/(?<_>[a-zA-Z0-9][\w+\.-]{2})[\w+\.-]{,197}@(?<hostname>#{hostname})/, '\k<_>[FILTERED]@\k<hostname>')
end
-
end
class Validations
def self.email?(value)
/^(?<username>[a-zA-Z0-9][\w+\.-]{,200})@(?<hostname>.*)$/ =~ value
self.hostname?(hostname) ? true : false
end
def self.hostname?(value)
/^(?<name>([a-zA-Z0-9][a-zA-Z0-9-]{,60}[a-zA-Z0-9]\.)*)(?<tld>[a-zA-z]{2,3}(\.[a-zA-z]{2})?)$/ =~ value ?
true : false
end
def self.phone?(value)
/^(?<prefix>(0|(00|\+)[1-9]\d{,2}))(?<phone>([ \(\)-]{,2}\d){6,11})$/ =~ value ? true : false
end
def self.ip_address?(value)
(/^(?<ip>\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})$/ =~ value and
ip.split('.').all? { |byte| byte.to_i.between?(0, 255) }) ? true : false
end
def self.number?(value)
/^(?<number>-?(0|[1-9][0-9]*)(\.[0-9]+)?)$/ =~ value ? true : false
end
def self.integer?(value)
/^(?<integer>-?(0|[1-9][0-9]*))$/ =~ value ? true : false
end
def self.date?(value)
(/^(?<year>[0-9]{4})-(?<month>[0-9]{2})-(?<day>[0-9]{2})$/ =~ value and
month.to_i.to_i.between?(1, 12) and day.to_i.between?(1, 31)) ? true : false
end
def self.time?(value)
(/^(?<hours>[0-9]{2}):(?<minutes>[0-9]{2}):(?<seconds>[0-9]{2})$/ =~ value and
hours.to_i.between?(0, 23) and minutes.to_i.between?(0, 59) and seconds.to_i.between?(0, 59)) ? true : false
end
def self.date_time?(value)
(/^(?<date>.*)( |T)(?<time>.*)$/ =~ value and self.date?(date) and self.time?(time)) ? true : false
end
end