Why Gemfury? Push, build, and install  RubyGems npm packages Python packages Maven artifacts PHP packages Go Modules Debian packages RPM packages NuGet packages

Repository URL to install this package:

Details    
duedil-python / duedil / search.py
Size: Mime:
from __future__ import unicode_literals

import json

import six

from .api import api_client


def _build_search_string(term_filters=None, range_filters=None,
                         order_by=None, limit=None, offset=None,
                         **kwargs):
    data = {
        'limit': limit or '',
        'offset': offset or 0,
        'orderBy': order_by or '',
    }

    filters = {}

    for arg, value in six.iteritems(kwargs):

        if term_filters and arg in term_filters:
            filters[arg] = six.text_type(value)

        elif range_filters and arg in range_filters:
            try:
                if not isinstance(value, (list, tuple)) or len(value) != 2:
                    raise ValueError

                for v in value:
                    if not isinstance(v, (float, six.integer_types)):
                        raise ValueError
                filters[arg] = value
            except ValueError:
                raise ValueError(
                    "Duedil range filter must be a list of 2 numeric values")
        else:
            raise TypeError(
                "{arg} is not available as a filter".format(arg=arg))

    data['filters'] = json.dumps(filters) if filters else ''

    return data


class SearchableModelMeta(type):
    term_filters = None
    range_filters = None
    search_path = None

    def search(klass, order_by=None, limit=None, offset=None, **kwargs):
        data = _build_search_string(term_filters=klass.term_filters,
                                    range_filters=klass.range_filters,
                                    order_by=order_by, limit=limit,
                                    offset=offset, **kwargs)
        results_raw = api_client.get(klass.search_path, data=data)
        results = []
        for r in results_raw['response']['data']:
            results.append(
                klass(**r)
            )
        return results