Anton Shestakov <av6@dwimlabs.net>, Thu, 11 Aug 2016 20:48:36 +0800
requirements: add coverage plugin for pytest to dev-requirements.txt
Not strictly required, but will be used for pipelines.
poll-hgweb-queue.py
Permissions: -rwxr-xr-x
from argparse import ArgumentParser, FileType, SUPPRESS from tornado.gen import coroutine from tornado.httpclient import AsyncHTTPClient from tornado.ioloop import IOLoop, PeriodicCallback from tornado.web import Application from candolint.utils import lookup_option, timestamp class CandolintPoller(Application): def __init__(self, rconn, targets, interval, debug): super(CandolintPoller, self).__init__(handlers, debug=debug) IOLoop.instance().add_callback(self.setup) for target in self.targets: def routine(target=target): pc = PeriodicCallback(routine, self.interval * 1000) headers['If-None-Match'] = target['etag'] logging.debug('Fetching %s', url) response = yield http.fetch(url, raise_error=False, headers=headers) data = json.loads(response.body) hashes = set(branch['node'] for branch in data['branches']) new = hashes - target['hashes'] 'timestamp': timestamp(), 'source': target['source'] logging.info('Got %d new hash(es) from %s', len(new), url) logging.info('Got %d current hash(es) from %s', len(hashes), url) target['hashes'] = hashes target['etag'] = response.headers.get('ETag', None) elif response.code == 304: logging.debug('Not modified: %s', url) logging.error('Error %d fetching %s', response.code, url) def push(self, base, changes): logging.debug('Pushing %s', data) self.rconn.rpush('candolint:queue:changes', data) logging.info('Pushed a change for %s', item['repo']) parser = ArgumentParser(argument_default=SUPPRESS) '-c', '--config', type=FileType('r'), help='configuration file (YAML)') '-d', '--debug', action='store_true', default=False, help='enable debugging output') group = parser.add_argument_group( 'these options that can also be specified in the configuration file') group.add_argument('--redis-host', help='(default: 127.0.0.1)') group.add_argument('--redis-port', type=int, help='(default: 6379)') group.add_argument('--redis-password') group.add_argument('--interval', type=int, help='(default: 8 hours)') args = parser.parse_args() config = yaml.safe_load(args.config) if hasattr(args, 'config') else {} rhost = lookup_option('redis-host', args, config, default='127.0.0.1') rport = lookup_option('redis-port', args, config, default=6379) rpass = lookup_option('redis-password', args, config) interval = lookup_option('interval', args, config, default=8 * 60 * 60) level=logging.DEBUG if args.debug else logging.INFO, format='%(asctime)s %(levelname)-8s %(message)s') if config and 'targets' in config: targets = config['targets'] logging.warn('No targets defined.') logging.debug('Connecting to Redis server') rconn = redis.StrictRedis(host=rhost, port=rport, password=rpass, db=0) logging.info('Connected to Redis server') CandolintPoller(rconn, targets, interval, args.debug) IOLoop.instance().start() if __name__ == '__main__':