def get_all_snaps(launchpad, logger): """ Return all the snaps in Launchpad created by the user build.snapcraft.io """ page = 1 logger.debug(f"Getting Snaps from Launchpad - Page {page}") response = launchpad.request( "https://api.launchpad.net/devel/+snaps", params={ "ws.op": "findByOwner", "owner": "/~build.snapcraft.io" }, ).json() snaps = response["entries"] logaugment.add(logger, total_snaps=len(snaps)) while "next_collection_link" in response: page += 1 logger.debug(f"Getting Snaps from Launchpad - Page {page}") response = launchpad.request(response["next_collection_link"]).json() snaps.extend(response["entries"]) logaugment.add(logger, total_snaps=len(snaps)) logger.debug(f"Total snaps received: {len(snaps)}") return snaps
def test_augment_with_callable(self): def my_callable(record): return {'custom_key': record.filename} logaugment.add(self.logger, my_callable) self.logger.info('message') self.assertEqual(self.stream.getvalue(), "This is the message: test_logaugment.py\n")
def test_remove_all_logaugment_adds(self): logaugment.add(self.logger, custom_key='custom-value-1') self.logger.info('message') self.assertEqual(self.stream.getvalue(), "This is the message: custom-value-1\n") self.assertEqual(len(self.logger.filters), 1) logaugment.reset(self.logger) self.assertEqual(self.logger.filters, [])
def initializeLogger(logLevel): if(logLevel): logger = logging.getLogger() handler = logging.StreamHandler() formatter = logging.Formatter("%(levelname)s %(time_since_last)s: %(message)s") handler.setFormatter(formatter) logger.addHandler(handler) logger.setLevel(getattr(logging, logLevel)) logaugment.add(logger, process_record)
def test_augment_with_callable_dictionary(self): class MyDictionary(dict): def __call__(self, *args, **kwargs): return {'custom_key': 'called_value'} my_dict = MyDictionary() my_dict['custom_key'] = 'stored_value' logaugment.add(self.logger, my_dict) self.logger.info('message') self.assertEqual(self.stream.getvalue(), "This is the message: called_value\n")
def get_logger(level): logger = logging.getLogger("script.output") handler = logging.StreamHandler() formatter = logging.Formatter( "%(asctime)s - %(levelname)s - %(current_snap)s/%(total_snaps)s" " - %(message)s", "%Y-%m-%d %H:%M:%S", ) handler.setFormatter(formatter) logger.addHandler(handler) logger.setLevel(level) logaugment.add(logger, current_snap=0, total_snaps=0) return logger
def test_augment_with_mapping(self): class MyMapping(collections.Mapping): def __init__(self, *args, **kwargs): super(MyMapping, self).__init__() self._data = {} self._data.update(kwargs) def __getitem__(self, key): return self._data[key] def __iter__(self): return iter(self._data) def __len__(self): return len(self._data) logaugment.add(self.logger, MyMapping(custom_key='new-value')) self.logger.info('message') self.assertEqual(self.stream.getvalue(), "This is the message: new-value\n")
def test_augment_with_kwargs(self): logaugment.add(self.logger, custom_key='new-value') self.logger.info('message') self.assertEqual(self.stream.getvalue(), "This is the message: new-value\n")
def test_latest_set_value_takes_priority(self): logaugment.set(self.logger, custom_key='custom-value-2') logaugment.add(self.logger, custom_key='custom-value-1') self.logger.info('message') self.assertEqual(self.stream.getvalue(), "This is the message: custom-value-1\n")
def test_none_is_a_valid_value(self): logaugment.add(self.logger, custom_key=None) self.logger.info('message') self.assertEqual(self.stream.getvalue(), "This is the message: None\n")
def test_augment_with_dictionary_and_extra(self): logaugment.add(self.logger, {'custom_key': 'new-value'}) self.logger.info('message', extra={'custom_key': 'extra-value'}) self.assertEqual(self.stream.getvalue(), "This is the message: extra-value\n")
def test_at_least_one_custom_key_needed(self): with self.assertRaises(ValueError): logaugment.add(self.logger) with self.assertRaises(ValueError): logaugment.set(self.logger)
def test_most_recent_value_is_used(self): logaugment.add(self.logger, custom_key='custom-value-1') logaugment.add(self.logger, custom_key='custom-value-2') self.logger.info('message') self.assertEqual(self.stream.getvalue(), "This is the message: custom-value-2\n")
def test_set_combines_add_and_remove(self): logaugment.add(self.logger, custom_key='custom-value-1') logaugment.set(self.logger, custom_key='custom-value-2') self.logger.info('message') self.assertEqual(self.stream.getvalue(), "This is the message: custom-value-2\n")
logging_level = logging.DEBUG logger = helper.get_logger(logging_level) snaps = helper.get_all_snaps(launchpad, logger) current_snap = 0 # Stats skipped_snaps = 0 built_snaps = 0 total_snaps = len(snaps) error_snaps = 0 for snap in snaps: current_snap += 1 logaugment.add(logger, current_snap=current_snap) try: if needs_building(snap, logger): logger.debug(f"Snap {snap['store_name']} needs building") if launchpad.is_snap_building(snap["store_name"]): logger.debug( f"Snap {snap['store_name']} is already being build") else: logger.warning(f"BUILD {snap['store_name']}") launchpad.build_snap(snap["store_name"]) built_snaps += 1 else: skipped_snaps += 1 except GitHubRateLimit as e:
*args, **kwargs) return wrapper for level, color in zip(("info", "warn", "error", "debug"), (45, GREY, RED, ORANGE)): setattr(logger, level, add_color(getattr(logger, level), color)) # logger.addHandler(handler) # noinspection PyUnusedLocal def process_record(record): """ :param record: Previous log. :return: Time since last log. """ now = datetime.datetime.utcnow() try: delta = now - process_record.now except AttributeError: delta = 0 process_record.now = now return {'time_since_last': delta} logaugment.add(logger, process_record)