Source code for woob.tools.config.util

# Copyright(C) 2019-2021 Romain Bignon
#
# This file is part of woob.
#
# woob is free software: you can redistribute it and/or modify
# it under the terms of the GNU Lesser General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# woob is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU Lesser General Public License for more details.
#
# You should have received a copy of the GNU Lesser General Public License
# along with woob. If not, see <http://www.gnu.org/licenses/>.


import os
from datetime import datetime
from woob.tools.log import getLogger

__all__ = ['LOGGER', 'replace', 'time_buffer']


LOGGER = getLogger('woob.config')


try:
    from os import replace
except ImportError:
    def replace(src, dst, *args, **kwargs):
        if os.name != 'posix':
            try:
                os.remove(dst)
            except OSError:
                pass
        return os.rename(src, dst, *args, **kwargs)


[docs]def time_buffer(since_seconds=None, last_run=True, logger=False): def decorator_time_buffer(func): def wrapper_time_buffer(*args, **kwargs): since_seconds = kwargs.pop('since_seconds', None) if since_seconds is None: since_seconds = decorator_time_buffer.since_seconds if logger: logger.debug('Time buffer for %r of %s. Last run %s.' % (func, since_seconds, decorator_time_buffer.last_run)) if since_seconds and decorator_time_buffer.last_run: if (datetime.now() - decorator_time_buffer.last_run).seconds < since_seconds: if logger: logger.debug('Too soon to run %r, ignore.' % func) return if logger: logger.debug('Run %r and record' % func) res = func(*args, **kwargs) decorator_time_buffer.last_run = datetime.now() return res decorator_time_buffer.since_seconds = since_seconds decorator_time_buffer.last_run = datetime.now() if last_run is True else last_run return wrapper_time_buffer return decorator_time_buffer