Source code for okcupyd.attractiveness_finder

from .json_search import search
from .session import Session
from . import settings
from . import util


[docs]class _AttractivenessFinder(object): """Find the attractiveness of okcupid.com users. This class is typically wrapped in several different attractiveness finder decorators that allow for cacheing of results and rounding. """ def __init__(self, session=None): self._session = session or Session.login(settings.AF_USERNAME, settings.AF_PASSWORD)
[docs] def find_attractiveness(self, username, accuracy=1000, _lower=0, _higher=10000): """ :param username: The username to lookup attractiveness for. :param accuracy: The accuracy required to return a result. :param _lower: The lower bound of the search. :param _higher: The upper bound of the search. """ average = (_higher + _lower)//2 if _higher - _lower <= accuracy: return average results = search(self._session, count=9, gentation='everybody', keywords=username, attractiveness_min=average, attractiveness_max=_higher,) found_match = False if results: for profile in results: if profile.username.lower() == username: found_match = True break if found_match: return self.find_attractiveness(username, accuracy, average, _higher) else: return self.find_attractiveness(username, accuracy, _lower, average)
__call__ = find_attractiveness
[docs]class AttractivenessFinderDecorator(object): def __init__(self, attractiveness_finder=None): self._finder = attractiveness_finder or _AttractivenessFinder() def __getattr__(self, attr): return getattr(self._finder, attr) def __call__(self, *args, **kwargs): return self.find_attractiveness(*args, **kwargs)
[docs]class CheckForExistenceAttractivenessFinder(AttractivenessFinderDecorator): def _check_for_existence(self, username): return bool(search(self._session, gentation='everybody', keywords=username, count=1))
[docs] def find_attractiveness(self, username, *args, **kwargs): if self._check_for_existence(username): return self._finder(username, *args, **kwargs)
[docs]class RoundedAttractivenessFinder(AttractivenessFinderDecorator):
[docs] def find_attractiveness(self, *args, **kwargs): unrounded = self._finder.find_attractiveness(*args, **kwargs) if unrounded is not None: return int(round(float(unrounded)/1000, 0)*1000)
[docs]class CachedAttractivenessFinder(AttractivenessFinderDecorator): def __init__(self, attractiveness_finder=None): self._finder = attractiveness_finder or _AttractivenessFinder() self._cache = {}
[docs] def find_attractiveness(self, username, **kwargs): if username not in self._cache: self._cache[username] = self._finder(username, **kwargs) return self._cache[username]
AttractivenessFinder = util.compose(CachedAttractivenessFinder, RoundedAttractivenessFinder, CheckForExistenceAttractivenessFinder, _AttractivenessFinder)