def async_parser(base, objconf, skip=False, **kwargs): """ Asynchronously parses the pipe content Args: base (str): The base currency (exchanging from) objconf (obj): The pipe configuration (an Objectify instance) skip (bool): Don't parse the content kwargs (dict): Keyword arguments Kwargs: assign (str): Attribute to assign parsed content (default: exchangerate) stream (dict): The original item Returns: Deferred: twisted.internet.defer.Deferred item Examples: >>> from riko import get_path >>> from riko.bado import react >>> from riko.bado.mock import FakeReactor >>> from meza.fntools import Objectify >>> >>> def run(reactor): ... url = get_path('quote.json') ... conf = { ... 'url': url, 'currency': 'USD', 'delay': 0, 'precision': 6} ... item = {'content': 'GBP'} ... objconf = Objectify(conf) ... kwargs = {'stream': item, 'assign': 'content'} ... d = async_parser(item['content'], objconf, **kwargs) ... return d.addCallbacks(print, logger.error) >>> >>> try: ... react(run, _reactor=FakeReactor()) ... except SystemExit: ... pass ... 1.545801 """ same_currency = base == objconf.currency if skip: rate = kwargs['stream'] elif same_currency: rate = Decimal(1) elif objconf.url.startswith('http'): r = yield treq.get(objconf.url, params=objconf.params) json = yield treq.json(r) else: url = get_abspath(objconf.url) content = yield io.async_url_read(url, delay=objconf.delay) json = loads(decode(content)) if not (skip or same_currency): places = Decimal(10) ** -objconf.precision rates = parse_response(json) rate = calc_rate(base, objconf.currency, rates, places=places) return_value(rate)
def async_parser(base, objconf, skip=False, **kwargs): """ Asynchronously parses the pipe content Args: base (str): The base currency (exchanging from) objconf (obj): The pipe configuration (an Objectify instance) skip (bool): Don't parse the content kwargs (dict): Keyword arguments Kwargs: assign (str): Attribute to assign parsed content (default: exchangerate) stream (dict): The original item Returns: Deferred: twisted.internet.defer.Deferred item Examples: >>> from riko import get_path >>> from riko.bado import react >>> from riko.bado.mock import FakeReactor >>> from meza.fntools import Objectify >>> >>> def run(reactor): ... url = get_path('quote.json') ... conf = { ... 'url': url, 'currency': 'USD', 'delay': 0, 'precision': 6} ... item = {'content': 'GBP'} ... objconf = Objectify(conf) ... kwargs = {'stream': item, 'assign': 'content'} ... d = async_parser(item['content'], objconf, **kwargs) ... return d.addCallbacks(print, logger.error) >>> >>> try: ... react(run, _reactor=FakeReactor()) ... except SystemExit: ... pass ... 1.275201 """ same_currency = base == objconf.currency if skip: rate = kwargs['stream'] elif same_currency: rate = Decimal(1) elif objconf.url.startswith('http'): r = yield treq.get(objconf.url, params=objconf.params) json = yield treq.json(r) else: url = get_abspath(objconf.url) content = yield io.async_url_read(url, delay=objconf.delay) json = loads(decode(content)) if not (skip or same_currency): places = Decimal(10) ** -objconf.precision rates = parse_response(json) rate = calc_rate(base, objconf.currency, rates, places=places) return_value(rate)
def async_parser(_, objconf, skip, **kwargs): """ Asynchronously parses the pipe content Args: _ (None): Ignored objconf (obj): The pipe configuration (an Objectify instance) skip (bool): Don't parse the content kwargs (dict): Keyword arguments Kwargs: assign (str): Attribute to assign parsed content (default: content) stream (dict): The original item Returns: Deferred: twisted.internet.defer.Deferred Tuple of (stream, skip) Examples: >>> from six.moves.urllib.request import urlopen >>> from riko import get_path >>> from riko.bado import react >>> from riko.bado.mock import FakeReactor >>> from riko.lib.utils import Objectify, get_abspath >>> >>> feed = 'http://feeds.feedburner.com/TechCrunch/' >>> url = 'http://query.yahooapis.com/v1/public/yql' >>> query = "select * from feed where url='%s'" % feed >>> f = urlopen(get_abspath(get_path('yql.xml'))) >>> >>> def run(reactor): ... callback = lambda x: print(next(x[0])['title']) ... conf = {'query': query, 'url': url, 'debug': False} ... objconf = Objectify(conf) ... kwargs = {'stream': {}, 'response': f} ... d = async_parser(None, objconf, False, **kwargs) ... d.addCallbacks(callback, logger.error) ... d.addCallback(lambda _: f.close()) ... return d >>> >>> try: ... react(run, _reactor=FakeReactor()) ... except SystemExit: ... pass ... Bring pizza home """ if skip: stream = kwargs['stream'] else: f = kwargs.get('response') if not f: params = {'q': objconf.query, 'diagnostics': objconf.debug} r = yield treq.get(objconf.url, params=params) f = yield treq.content(r) tree = yield util.xml2etree(f) results = next(tree.getElementsByTagName('results')) stream = map(util.etree2dict, results.childNodes) result = (stream, skip) return_value(result)
def async_parser(_, objconf, skip=False, **kwargs): """ Asynchronously parses the pipe content Args: _ (None): Ignored objconf (obj): The pipe configuration (an Objectify instance) skip (bool): Don't parse the content kwargs (dict): Keyword arguments Kwargs: assign (str): Attribute to assign parsed content (default: content) stream (dict): The original item Returns: Deferred: twisted.internet.defer.Deferred stream Examples: >>> from six.moves.urllib.request import urlopen >>> from riko import get_path >>> from riko.bado import react >>> from riko.bado.mock import FakeReactor >>> from riko.utils import get_abspath >>> from meza.fntools import Objectify >>> >>> feed = 'http://feeds.feedburner.com/TechCrunch/' >>> url = 'http://query.yahooapis.com/v1/public/yql' >>> query = "select * from feed where url='%s'" % feed >>> f = urlopen(get_abspath(get_path('yql.xml'))) >>> >>> def run(reactor): ... callback = lambda x: print(next(x)['title']) ... conf = {'query': query, 'url': url, 'debug': False} ... objconf = Objectify(conf) ... kwargs = {'stream': {}, 'response': f} ... d = async_parser(None, objconf, **kwargs) ... d.addCallbacks(callback, logger.error) ... d.addCallback(lambda _: f.close()) ... return d >>> >>> try: ... react(run, _reactor=FakeReactor()) ... except SystemExit: ... pass ... finally: ... f.close() Bring pizza home """ if skip: stream = kwargs['stream'] else: f = kwargs.get('response') if not f: params = {'q': objconf.query, 'diagnostics': objconf.debug} r = yield treq.get(objconf.url, params=params) f = yield treq.content(r) tree = yield util.xml2etree(f) results = next(tree.getElementsByTagName('results')) stream = map(util.etree2dict, results.childNodes) return_value(stream)