Skip to content

Commit

Permalink
Adding IP validator
Browse files Browse the repository at this point in the history
  • Loading branch information
Dmitry Belyakov committed May 10, 2019
1 parent 07787b5 commit f288df5
Show file tree
Hide file tree
Showing 6 changed files with 92 additions and 3 deletions.
2 changes: 1 addition & 1 deletion setup.py
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@
# ----------------------------------------------------------------------------

# project version
version = '0.2.5'
version = '0.2.6'

# development status
# dev_status = '1 - Planning'
Expand Down
5 changes: 4 additions & 1 deletion shiftschema/translations/en.py
Original file line number Diff line number Diff line change
Expand Up @@ -31,5 +31,8 @@
'%cant_be_empty%': 'Can\'t be empty, at least one item required',

# url
'%url_invalid%': 'This URL is invalid'
'%url_invalid%': 'This URL is invalid',

# ip
'%invalid_ip%': 'This is not a valid IPv4 or IPv6 address',
}
5 changes: 4 additions & 1 deletion shiftschema/translations/ru.py
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,9 @@
'%cant_be_empty%': 'Не может быть пустым, необходим хотя бы один элемент',

# url
'%url_invalid%': 'Неверный адрес URL'
'%url_invalid%': 'Неверный адрес URL',

# ip
'%invalid_ip%': 'Некорректный адрес IPv4 или IPv6',
}

1 change: 1 addition & 0 deletions shiftschema/validators/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
from shiftschema.validators.required import Required
from shiftschema.validators.not_empty import NotEmpty
from shiftschema.validators.url import Url
from shiftschema.validators.ip import Ip



Expand Down
44 changes: 44 additions & 0 deletions shiftschema/validators/ip.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
from shiftschema.validators.abstract_validator import AbstractValidator
from shiftschema.result import Error
import ipaddress


class Ip(AbstractValidator):
"""
IP validator
Validates that passed in value is a valid IPv4 or IPv6 address
"""

invalid_ip = '%invalid_ip%'

def __init__(self, message=None):
"""
Initialize validator
Accepts an optional custom error message.
:param message: str, custom error message
:return: None
"""
if message is not None:
self.invalid_ip = message

def validate(self, value, model=None, context=None):
"""
Validate
Perform value validation and return result
:param value: value to check, cast to string
:param model: parent model being validated
:param context: object or None, validation context
:return: shiftschema.results.SimpleResult
"""

try:
ip = ipaddress.ip_address(value)
except ValueError:
return Error(self.invalid_ip)

# success otherwise
return Error()


38 changes: 38 additions & 0 deletions tests/validators_tests/ip_test.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
from unittest import TestCase, mock
from nose.plugins.attrib import attr

from shiftschema.validators import Ip
from shiftschema.exceptions import InvalidOption


@attr('validator', 'ip')
class IpTest(TestCase):

def test_create(self):
""" Can instantiate IP validator """
validator = Ip()
self.assertIsInstance(validator, Ip)


def test_valid_ip_v4_passes_validation(self):
""" Valid IPv4 address passes validation"""
ip = '217.150.99.254'
validator = Ip()
error = validator.validate(ip)
self.assertFalse(error)

def test_valid_ip_v6_passes_validation(self):
""" Valid IPv6 passes validation """
ip = '2001:0db8:85a3:0000:0000:8a2e:0370:7334'
validator = Ip()
error = validator.validate(ip)
self.assertFalse(error)

def test_invalid_ip_fails_validation(self):
""" Invalid IP fails validation"""
ip = 'not an ip'
validator = Ip(message='Bad ip')
error = validator.validate(ip)
self.assertTrue(error)


0 comments on commit f288df5

Please sign in to comment.