Решение на Четвърта задача от Стоян Найденов

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

Към профила на Стоян Найденов

Резултати

  • 4 точки от тестове
  • 0 бонус точки
  • 4 точки общо
  • 27 успешни тест(а)
  • 14 неуспешни тест(а)

Код

class PrivacyFilter
attr_accessor :preserve_phone_country_code, :preserve_email_hostname
attr_accessor :partially_preserve_email_username
def initialize(text)
@text = text
@preserve_phone_country_code = false
@preserve_email_hostname = false
@partially_preserve_email_username = false
end
def filtered
filter_emails filter_phones(@text)
end
def filter_emails(text)
return filter_emails_with_partially_preserved_username(text) if partially_preserve_email_username
if preserve_email_hostname
filter_emails_with_preserved_hostname text
else
text.gsub(/[0-9A-Za-z](\w|[+.-])*@([0-9A-Za-z][0-9A-Za-z-]{0,61}[0-9A-Za-z]?[.])+[a-zA-Z]{2,3}/,'[EMAIL]')
end
end
def filter_emails_with_preserved_hostname(text)
text.gsub(/[0-9A-Za-z](\w|[+.-])*@(?<hostname>([0-9A-Za-z][0-9A-Za-z-]{0,61}[0-9A-Za-z]?[.])+[a-zA-Z]{2,3})/,
'[FILTERED]@\k<hostname>')
end
def filter_emails_with_partially_preserved_username(text)
text = text.gsub(/(?<first_symbols>[0-9A-Za-z](\w|[+.-]){2})((\w|[+.-]){3,})@(?<hostname>([0-9A-Za-z]
[0-9A-Za-z-]{0,61}[0-9A-Za-z]?[.])+[a-zA-Z]{2,3})/x, '\k<first_symbols>[FILTERED]@\k<hostname>')
filter_emails_with_preserved_hostname text
end
def filter_phones(text)
if preserve_phone_country_code
filtered_with_code = text.gsub(/(?<code>(00|[+])[1-9]\d{0,2})[ -()]?(\d[ -()]{0,2}){5,10}\d/,
'\k<code> [FILTERED]').gsub(/0[ -()]?(\d[ -()]{0,2}){5,10}\d/,'[PHONE]')
else
text.gsub(/(0|(00|[+])[1-9]\d{0,2})[ -()]?(\d[ -()]{0,2}){5,10}\d/,'[PHONE]')
end
end
end
class Validations
def Validations.email?(value)
nil != (value =~ /\A[0-9A-Za-z](\w|[+.-])*@([0-9A-Za-z][0-9A-Za-z-]{0,61}[0-9A-Za-z]?[.])+[a-zA-Z]{2,3}\z/)
end
def Validations.hostname?(value)
nil != (value =~ /\A([0-9A-Za-z][0-9A-Za-z-]{0,61}[0-9A-Za-z]?[.])+[a-zA-Z]{2,3}\z/)
end
def Validations.phone?(value)
nil != (value =~ /\A(0|(00|[+])[1-9]\d{0,2})[ -()]?(\d[ -()]{0,2}){5,10}\d\z/)
end
def Validations.ip_address?(value)
nil != (value =~/\A((\d|[1-9][0-9]|[1]\d\d|[2]([0-4][0-9]|[5][0-5]))[.]){3}
(\d|[1-9][0-9]|[1]\d\d|[2]([0-4][0-9]|[5][0-5]))\z/x)
end
def Validations.number?(value)
nil != (value =~/\A-?(0|[1-9]\d+)([.]\d+)?\z/)
end
def Validations.integer?(value)
nil != (value =~/\A-?(0|[1-9]\d+)\z/)
end
def Validations.date?(value)
nil != (value =~/\A\d{4}-([0][0-9]|[1][0-2])-([012][0-9]|[3][0-1])\z/)
end
def Validations.time?(value)
nil != (value =~/\A([01][0-9]|2[0-4]):[0-5][0-9]:[0-5][0-9]\z/)
end
def Validations.date_time?(value)
nil !=(value =~/\A\d{4}-([0][0-9]|[1][0-2])-([012][0-9]|[3][0-1])
[ T:-]([01][0-9]|2[0-4]):[0-5][0-9]:[0-5][0-9]\z/x)
end
end

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

...F....FFFFFF.....F.F...F...F....F...FF.

Failures:

  1) PrivacyFilter does not filter invalid emails
     Failure/Error: filter(text_with_invalid_emails).should eq text_with_invalid_emails
       
       expected: "Contact me here: _invalid@email.com"
            got: "Contact me here: _[EMAIL]"
       
       (compared using ==)
     # /tmp/d20130203-23049-1fwr9eu/spec.rb:52:in `block (3 levels) in <top (required)>'
     # /tmp/d20130203-23049-1fwr9eu/spec.rb:46:in `each'
     # /tmp/d20130203-23049-1fwr9eu/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)>'

  2) PrivacyFilter filters more complex phone numbers
     Failure/Error: filter(text).should eq filtered
       
       expected: "[PHONE]"
            got: "[PHONE]-456"
       
       (compared using ==)
     # /tmp/d20130203-23049-1fwr9eu/spec.rb:85:in `block (3 levels) in <top (required)>'
     # /tmp/d20130203-23049-1fwr9eu/spec.rb:84:in `each'
     # /tmp/d20130203-23049-1fwr9eu/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)>'

  3) PrivacyFilter does not filter invalid phone numbers
     Failure/Error: filter(text).should eq filtered
       
       expected: "Reach me at: 0885123"
            got: "Reach me at: [PHONE]"
       
       (compared using ==)
     # /tmp/d20130203-23049-1fwr9eu/spec.rb:96:in `block (3 levels) in <top (required)>'
     # /tmp/d20130203-23049-1fwr9eu/spec.rb:95:in `each'
     # /tmp/d20130203-23049-1fwr9eu/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)>'

  4) PrivacyFilter preserves whitespace around phones
     Failure/Error: filter(' +359881212-12-1 2 or...').should eq ' [PHONE] or...'
       
       expected: " [PHONE] or..."
            got: " [PHONE]-12-1 2 or..."
       
       (compared using ==)
     # /tmp/d20130203-23049-1fwr9eu/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)>'

  5) PrivacyFilter filters more than one phone or email
     Failure/Error: filter(text).should eq filtered
       
       expected: "\n      Contacts\n\n      Phones: [PHONE] or [PHONE]\n      Email: [EMAIL] or [EMAIL]\n    "
            got: "\n      Contacts\n\n      Phones: +1 (555) 123-456-99 or [PHONE]\n      Email: [EMAIL] or [EMAIL]\n    "
       
       (compared using ==)
       
       Diff:
       @@ -1,7 +1,7 @@
        
              Contacts
        
       -      Phones: [PHONE] or [PHONE]
       +      Phones: +1 (555) 123-456-99 or [PHONE]
              Email: [EMAIL] or [EMAIL]
            
     # /tmp/d20130203-23049-1fwr9eu/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)>'

  6) PrivacyFilter allows country code to be preserved for internationally-formatted phone numbers
     Failure/Error: filter.filtered.should eq filtered
       
       expected: "Phone: +359 [FILTERED]"
            got: "Phone: +3 [FILTERED]-1212"
       
       (compared using ==)
     # /tmp/d20130203-23049-1fwr9eu/spec.rb:132:in `block (3 levels) in <top (required)>'
     # /tmp/d20130203-23049-1fwr9eu/spec.rb:129:in `each'
     # /tmp/d20130203-23049-1fwr9eu/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)>'

  7) PrivacyFilter separates preserved country code from filtered phone with a space
     Failure/Error: filter.filtered.should eq filtered
       
       expected: "Phone: 0025 [FILTERED]"
            got: "Phone: 002 [FILTERED]"
       
       (compared using ==)
     # /tmp/d20130203-23049-1fwr9eu/spec.rb:144:in `block (3 levels) in <top (required)>'
     # /tmp/d20130203-23049-1fwr9eu/spec.rb:141:in `each'
     # /tmp/d20130203-23049-1fwr9eu/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)>'

  8) Validations can validate more complex phone numbers
     Failure/Error: Validations.phone?(phone).should be(valid)
       
       expected #<TrueClass:2> => true
            got #<FalseClass:0> => false
       
       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-1fwr9eu/spec.rb:210:in `block (3 levels) in <top (required)>'
     # /tmp/d20130203-23049-1fwr9eu/spec.rb:209:in `each'
     # /tmp/d20130203-23049-1fwr9eu/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)>'

  9) Validations validates hostnames
     Failure/Error: Validations.hostname?('not-a-hostname-.com').should be_false
       expected: false value
            got: true
     # /tmp/d20130203-23049-1fwr9eu/spec.rb:227: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) Validations validates numbers
     Failure/Error: Validations.number?('9').should be_true
       expected: true value
            got: false
     # /tmp/d20130203-23049-1fwr9eu/spec.rb:254: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) Validations validates more complex integers
     Failure/Error: Validations.integer?('9').should be_true
       expected: true value
            got: false
     # /tmp/d20130203-23049-1fwr9eu/spec.rb:288: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) Validations does not allow zero months or days in dates
     Failure/Error: Validations.date?('1000-00-01').should be_false
       expected: false value
            got: true
     # /tmp/d20130203-23049-1fwr9eu/spec.rb:315: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) Validations does not allow invalid hours, minutes or seconds
     Failure/Error: Validations.time?('24:00:00').should be_false
       expected: false value
            got: true
     # /tmp/d20130203-23049-1fwr9eu/spec.rb:340: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) Validations validates datetime values
     Failure/Error: Validations.date_time?('2012-00-19T23:59:00').should be_false
       expected: false value
            got: true
     # /tmp/d20130203-23049-1fwr9eu/spec.rb:352: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.04908 seconds
41 examples, 14 failures

Failed examples:

rspec /tmp/d20130203-23049-1fwr9eu/spec.rb:44 # PrivacyFilter does not filter invalid emails
rspec /tmp/d20130203-23049-1fwr9eu/spec.rb:76 # PrivacyFilter filters more complex phone numbers
rspec /tmp/d20130203-23049-1fwr9eu/spec.rb:89 # PrivacyFilter does not filter invalid phone numbers
rspec /tmp/d20130203-23049-1fwr9eu/spec.rb:100 # PrivacyFilter preserves whitespace around phones
rspec /tmp/d20130203-23049-1fwr9eu/spec.rb:104 # PrivacyFilter filters more than one phone or email
rspec /tmp/d20130203-23049-1fwr9eu/spec.rb:122 # PrivacyFilter allows country code to be preserved for internationally-formatted phone numbers
rspec /tmp/d20130203-23049-1fwr9eu/spec.rb:136 # PrivacyFilter separates preserved country code from filtered phone with a space
rspec /tmp/d20130203-23049-1fwr9eu/spec.rb:184 # Validations can validate more complex phone numbers
rspec /tmp/d20130203-23049-1fwr9eu/spec.rb:218 # Validations validates hostnames
rspec /tmp/d20130203-23049-1fwr9eu/spec.rb:250 # Validations validates numbers
rspec /tmp/d20130203-23049-1fwr9eu/spec.rb:283 # Validations validates more complex integers
rspec /tmp/d20130203-23049-1fwr9eu/spec.rb:314 # Validations does not allow zero months or days in dates
rspec /tmp/d20130203-23049-1fwr9eu/spec.rb:339 # Validations does not allow invalid hours, minutes or seconds
rspec /tmp/d20130203-23049-1fwr9eu/spec.rb:347 # Validations validates datetime values

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

Стоян обнови решението на 28.11.2012 16:21 (преди над 11 години)

+class PrivacyFilter
+ attr_accessor :preserve_phone_country_code, :preserve_email_hostname
+ attr_accessor :partially_preserve_email_username
+
+ def initialize(text)
+ @text = text
+ @preserve_phone_country_code = false
+ @preserve_email_hostname = false
+ @partially_preserve_email_username = false
+ end
+
+ def filtered
+ filter_emails filter_phones(@text)
+ end
+
+ def filter_emails(text)
+ return filter_emails_with_partially_preserved_username(text) if partially_preserve_email_username
+ if preserve_email_hostname
+ filter_emails_with_preserved_hostname text
+ else
+ text.gsub(/[0-9A-Za-z](\w|[+.-])*@([0-9A-Za-z][0-9A-Za-z-]{0,61}[0-9A-Za-z]?[.])+[a-zA-Z]{2,3}/,'[EMAIL]')
+ end
+ end
+
+ def filter_emails_with_preserved_hostname(text)
+ text.gsub(/[0-9A-Za-z](\w|[+.-])*@(?<hostname>([0-9A-Za-z][0-9A-Za-z-]{0,61}[0-9A-Za-z]?[.])+[a-zA-Z]{2,3})/,
+ '[FILTERED]@\k<hostname>')
+ end
+
+ def filter_emails_with_partially_preserved_username(text)
+ text = text.gsub(/(?<first3>[0-9A-Za-z](\w|[+.-]){2})((\w|[+.-]){3,})@(?<hostname>([0-9A-Za-z]
+ [0-9A-Za-z-]{0,61}[0-9A-Za-z]?[.])+[a-zA-Z]{2,3})/x, '\k<first3>[FILTERED]@\k<hostname>')
+ filter_emails_with_preserved_hostname text
+ end
+
+ def filter_phones(text)
+ if preserve_phone_country_code
+ filtered_with_code = text.gsub(/(?<code>(00|[+])[1-9]\d{0,2})[ -()]?(\d[ -()]{0,2}){5,10}\d/,
+ '\k<code> [FILTERED]').gsub(/0[ -()]?(\d[ -()]{0,2}){5,10}\d/,'[PHONE]')
+ else
+ text.gsub(/(0|(00|[+])[1-9]\d{0,2})[ -()]?(\d[ -()]{0,2}){5,10}\d/,'[PHONE]')
+ end
+ end
+end
+
+class Validations
+ def Validations.email?(value)
+ nil != (value =~ /\A[0-9A-Za-z](\w|[+.-])*@([0-9A-Za-z][0-9A-Za-z-]{0,61}[0-9A-Za-z]?[.])+[a-zA-Z]{2,3}\z/)
+ end
+
+ def Validations.hostname?(value)
+ nil != (value =~ /\A([0-9A-Za-z][0-9A-Za-z-]{0,61}[0-9A-Za-z]?[.])+[a-zA-Z]{2,3}\z/)
+ end
+
+ def Validations.phone?(value)
+ nil != (value =~ /\A(0|(00|[+])[1-9]\d{0,2})[ -()]?(\d[ -()]{0,2}){5,10}\d\z/)
+ end
+
+ def Validations.ip_address?(value)
+ nil != (value =~/\A((\d|[1-9][0-9]|[1]\d\d|[2]([0-4][0-9]|[5][0-5]))[.]){3}
+ (\d|[1-9][0-9]|[1]\d\d|[2]([0-4][0-9]|[5][0-5]))\z/x)
+ end
+
+ def Validations.number?(value)
+ nil != (value =~/\A-?(0|[1-9]\d+)([.]\d+)?\z/)
+ end
+
+ def Validations.integer?(value)
+ nil != (value =~/\A-?(0|[1-9]\d+)\z/)
+ end
+
+ def Validations.date?(value)
+ nil != (value =~/\A\d{4}-([0][0-9]|[1][0-2])-([012][0-9]|[3][0-1])\z/)
+ end
+
+ def Validations.time?(value)
+ nil != (value =~/\A([01][0-9]|2[0-4]):[0-5][0-9]:[0-5][0-9]\z/)
+ end
+
+ def Validations.date_time?(value)
+ nil !=(value =~/\A\d{4}-([0][0-9]|[1][0-2])-([012][0-9]|[3][0-1])
+ [ T:-]([01][0-9]|2[0-4]):[0-5][0-9]:[0-5][0-9]\z/x)
+ end
+end

Стоян обнови решението на 28.11.2012 16:26 (преди над 11 години)

class PrivacyFilter
attr_accessor :preserve_phone_country_code, :preserve_email_hostname
attr_accessor :partially_preserve_email_username
def initialize(text)
@text = text
@preserve_phone_country_code = false
@preserve_email_hostname = false
@partially_preserve_email_username = false
end
def filtered
filter_emails filter_phones(@text)
end
def filter_emails(text)
return filter_emails_with_partially_preserved_username(text) if partially_preserve_email_username
if preserve_email_hostname
filter_emails_with_preserved_hostname text
else
text.gsub(/[0-9A-Za-z](\w|[+.-])*@([0-9A-Za-z][0-9A-Za-z-]{0,61}[0-9A-Za-z]?[.])+[a-zA-Z]{2,3}/,'[EMAIL]')
end
end
def filter_emails_with_preserved_hostname(text)
text.gsub(/[0-9A-Za-z](\w|[+.-])*@(?<hostname>([0-9A-Za-z][0-9A-Za-z-]{0,61}[0-9A-Za-z]?[.])+[a-zA-Z]{2,3})/,
'[FILTERED]@\k<hostname>')
end
def filter_emails_with_partially_preserved_username(text)
- text = text.gsub(/(?<first3>[0-9A-Za-z](\w|[+.-]){2})((\w|[+.-]){3,})@(?<hostname>([0-9A-Za-z]
- [0-9A-Za-z-]{0,61}[0-9A-Za-z]?[.])+[a-zA-Z]{2,3})/x, '\k<first3>[FILTERED]@\k<hostname>')
+ text = text.gsub(/(?<first_symbols>[0-9A-Za-z](\w|[+.-]){2})((\w|[+.-]){3,})@(?<hostname>([0-9A-Za-z]
+ [0-9A-Za-z-]{0,61}[0-9A-Za-z]?[.])+[a-zA-Z]{2,3})/x, '\k<first_symbols>[FILTERED]@\k<hostname>')
filter_emails_with_preserved_hostname text
end
def filter_phones(text)
if preserve_phone_country_code
filtered_with_code = text.gsub(/(?<code>(00|[+])[1-9]\d{0,2})[ -()]?(\d[ -()]{0,2}){5,10}\d/,
'\k<code> [FILTERED]').gsub(/0[ -()]?(\d[ -()]{0,2}){5,10}\d/,'[PHONE]')
else
text.gsub(/(0|(00|[+])[1-9]\d{0,2})[ -()]?(\d[ -()]{0,2}){5,10}\d/,'[PHONE]')
end
end
end
class Validations
def Validations.email?(value)
nil != (value =~ /\A[0-9A-Za-z](\w|[+.-])*@([0-9A-Za-z][0-9A-Za-z-]{0,61}[0-9A-Za-z]?[.])+[a-zA-Z]{2,3}\z/)
end
def Validations.hostname?(value)
nil != (value =~ /\A([0-9A-Za-z][0-9A-Za-z-]{0,61}[0-9A-Za-z]?[.])+[a-zA-Z]{2,3}\z/)
end
def Validations.phone?(value)
nil != (value =~ /\A(0|(00|[+])[1-9]\d{0,2})[ -()]?(\d[ -()]{0,2}){5,10}\d\z/)
end
def Validations.ip_address?(value)
nil != (value =~/\A((\d|[1-9][0-9]|[1]\d\d|[2]([0-4][0-9]|[5][0-5]))[.]){3}
(\d|[1-9][0-9]|[1]\d\d|[2]([0-4][0-9]|[5][0-5]))\z/x)
end
def Validations.number?(value)
nil != (value =~/\A-?(0|[1-9]\d+)([.]\d+)?\z/)
end
def Validations.integer?(value)
nil != (value =~/\A-?(0|[1-9]\d+)\z/)
end
def Validations.date?(value)
nil != (value =~/\A\d{4}-([0][0-9]|[1][0-2])-([012][0-9]|[3][0-1])\z/)
end
def Validations.time?(value)
nil != (value =~/\A([01][0-9]|2[0-4]):[0-5][0-9]:[0-5][0-9]\z/)
end
def Validations.date_time?(value)
nil !=(value =~/\A\d{4}-([0][0-9]|[1][0-2])-([012][0-9]|[3][0-1])
[ T:-]([01][0-9]|2[0-4]):[0-5][0-9]:[0-5][0-9]\z/x)
end
end