code: def ipv4(value, allow_empty = False):
      
      if not value and allow_empty is False:
          raise errors.EmptyValueError('value (%s) was empty' % value)
      elif not value:
          return None
  
      try:
          components = value.split('.')
      except AttributeError:
          raise errors.InvalidIPAddressError('value (%s) is not a valid ipv4' % value)
  
      if len(components) != 4 or not all(x.isdigit() for x in components):
          raise errors.InvalidIPAddressError('value (%s) is not a valid ipv4' % value)
  
      for x in components:
          try:
              x = integer(x,
                          minimum = 0,
                          maximum = 255)
          except ValueError:
              raise errors.InvalidIPAddressError('value (%s) is not a valid ipv4' % value)
  
      return value
docs: Validate that ``value`` is a valid IP version 4 address.
  
      :param value: The value to validate.
  
      :param allow_empty: If ``True``, returns :obj:`None <python:None>` if
        ``value`` is empty. If ``False``, raises a
        :class:`EmptyValueError <validator_collection.errors.EmptyValueError>`
        if ``value`` is empty. Defaults to ``False``.
      :type allow_empty: :class:`bool <python:bool>`
  
      :returns: ``value`` / :obj:`None <python:None>`
  
      :raises EmptyValueError: if ``value`` is empty and ``allow_empty`` is ``False``
      :raises InvalidIPAddressError: if ``value`` is not a valid IP version 4 address or
        empty with ``allow_empty`` set to ``True``