Source code for gravify

"""Simple package to generate Gravatar URLs"""

from hashlib import md5

from six import PY3
from validate_email import validate_email

if PY3:
    from urllib.parse import urlencode
    from urllib.request import urlopen
else:
    from urllib import urlencode, urlopen  # pylint: disable=no-name-in-module

__version__ = '1.1.0'


[docs]class Gravatar: """A class to represent a Gravatar user Args: email (str): The user's email address verify_email (bool): Whether to verify that the email address is valid default_image (str): The default image code to use if the user isn't found (one of: 404, mp, identicon, monsterid, wavatar, retro, robohash, blank) size (int): A single dimension determining the size of the image (between 1 and 2048) force_default (bool): Whether to always force the default image max_rating (str): The maximum rating to be shown (one of: g, pg, r, x) Raises: ValueError: The email address is invalid """ def __init__( self, email, verify_email=True, default_image=None, size=None, force_default=False, max_rating=None, ): self.verify_email = verify_email self.email = email self.default_image = default_image self.size = size self.force_default = force_default self.max_rating = max_rating @property def email(self): return self._email @email.setter def email(self, value): """Validate and set string data type and value for email""" if isinstance(value, str): if self.verify_email and not validate_email(value): raise ValueError('Invalid email address') self._email = value.strip().lower() else: raise TypeError('email must be string') @property def verify_email(self): return self._verify_email @verify_email.setter def verify_email(self, value): """Validate and set boolean data type for verify_email""" if isinstance(value, bool): self._verify_email = value else: raise TypeError('verify_email must be boolean') @property def default_image(self): return self._default_image @default_image.setter def default_image(self, value): """Validate and set string data type and for default_image""" if value is None: self._default_image = value return if isinstance(value, str): possible_values = [ '404', 'mp', 'identicon', 'monsterid', 'wavatar', 'retro', 'robohash', 'blank', ] if value not in possible_values: raise ValueError( 'default_image must be one of: {0}'.format(possible_values) ) self._default_image = value else: raise TypeError('default_image must be string') @property def size(self): return self._size @size.setter def size(self, value): """Validate and set int data type and value for size""" if value is None: self._size = value return if isinstance(value, int): if not (1 <= value <= 2048): raise ValueError('size must be an integer between 1 and 2048') self._size = value else: raise TypeError('size must be integer') @property def force_default(self): return self._force_default @force_default.setter def force_default(self, value): """Validate and set boolean data type for force_default""" if isinstance(value, bool): self._force_default = value else: raise TypeError('force_default must be boolean') @property def max_rating(self): return self._max_rating @max_rating.setter def max_rating(self, value): """Validate and set string data type and value for max_rating""" if value is None: self._max_rating = value return if isinstance(value, str): possible_values = ['g', 'pg', 'r', 'x'] if value not in possible_values: raise ValueError( 'max_rating must be one of: {0}'.format(possible_values) ) self._max_rating = value else: raise TypeError('max_rating must be string') @property def url(self): """The generated secure (https) Gravatar URL Returns: str """ params = { 's': self.size, 'd': self.default_image, 'f': 'y' if self.force_default else None, 'r': self.max_rating if self.max_rating in ['g', 'pg', 'r', 'x'] else None, } url_params = urlencode( sorted({k: v for k, v in params.items() if v is not None}.items()) ) _url = 'https://www.gravatar.com/avatar/' + self.hash return _url + '?' + url_params if url_params else _url @property def unsecure_url(self): """The generated unsecure (http) Gravatar URL Returns: str """ return self.url.replace('https://', 'http://', 1) @property def hash(self): """The MD5-hashed email address Returns: str """ return md5(self.email.encode('utf-8')).hexdigest() @property def file(self): """The contents of the generated Gravatar URL Returns: str """ return urlopen(self.url)