class BlockCache:
    filename_unblock = "lookup-cache-unblock.json"
    filename_block = "lookup-cache-block.json"

    def __init__(self,
                 cache_dir,
                 cache_size_unblock=4096,
                 cache_size_block=8192):
        """Cache for block test result.

        Two caches for block/unblock are used, so we can set different
        cache size for blocked or unblocked url cache.
        """
        self.save_trigger = 64
        self.cache_dir = cache_dir
        self.cache_filename_unblock = os.path.join(cache_dir,
                                                   self.filename_unblock)
        self.cache_filename_block = os.path.join(cache_dir,
                                                 self.filename_block)

        from lrucache import LRUCache
        self.cache_unblock = LRUCache(cache_size_unblock)
        self.cache_block = LRUCache(cache_size_block)

    def load(self):
        self.cache_unblock.load(self.cache_filename_unblock)
        self.cache_block.load(self.cache_filename_block)

    def make_key(self, url, *args):
        key = url + json.dumps(
            args, sort_keys=True, indent=None, separators=(',', ':'))
        return key

    def save(self, force=False):
        trigger = 0 if force == True else self.save_trigger
        if self.cache_unblock.insert_count > trigger:
            self.cache_unblock.save(self.cache_filename_unblock)
            self.cache_unblock.reset_insert_count()
        if self.cache_block.insert_count > trigger:
            self.cache_block.save(self.cache_filename_block)
            self.cache_unblock.reset_insert_count()

    def __getitem__(self, key):
        if key in self.cache_unblock:
            ret = self.cache_unblock[key]
        else:
            ret = self.cache_block[key]
        return ret

    def __setitem__(self, key, value):
        if value:
            self.cache_block[key] = value
        else:
            self.cache_unblock[key] = value

    def __contains__(self, key):
        return key in self.cache_block or key in self.cache_unblock
class BlockCache:
    filename_unblock = "lookup-cache-unblock.json"
    filename_block = "lookup-cache-block.json"
    def __init__(self, cache_dir,
            cache_size_unblock=4096, cache_size_block=8192):
        """Cache for block test result.

        Two caches for block/unblock are used, so we can set different
        cache size for blocked or unblocked url cache.
        """
        self.save_trigger = 64
        self.cache_dir = cache_dir
        self.cache_filename_unblock = os.path.join(cache_dir,
                self.filename_unblock)
        self.cache_filename_block = os.path.join(cache_dir, self.filename_block)

        from lrucache import LRUCache
        self.cache_unblock = LRUCache(cache_size_unblock)
        self.cache_block = LRUCache(cache_size_block)

    def load(self):
        self.cache_unblock.load(self.cache_filename_unblock)
        self.cache_block.load(self.cache_filename_block)

    def make_key(self, url, *args):
        key = url + json.dumps(args, sort_keys=True, indent=None,
                separators= (',', ':'))
        return key

    def save(self, force=False):
        trigger = 0 if force == True else self.save_trigger
        if self.cache_unblock.insert_count > trigger:
            self.cache_unblock.save(self.cache_filename_unblock)
            self.cache_unblock.reset_insert_count()
        if self.cache_block.insert_count > trigger:
            self.cache_block.save(self.cache_filename_block)
            self.cache_unblock.reset_insert_count()

    def __getitem__(self, key):
        if key in self.cache_unblock:
            ret = self.cache_unblock[key]
        else:
            ret = self.cache_block[key]
        return ret

    def __setitem__(self, key, value):
        if value:
            self.cache_block[key] = value
        else:
            self.cache_unblock[key] = value

    def __contains__(self, key):
        return key in self.cache_block or key in self.cache_unblock