import os
import json
import logging

from .vfiles import vopen


LOGGER = logging.getLogger(__name__)


class DictFile(dict):
    """A ``dict``, storable as a JSON file.
    """
    def __init__(self, file_path):
        super(DictFile, self).__init__()
        self.__file_path = file_path
        self.reload()

    def reload(self):
        if os.path.isfile(self.__file_path):
            LOGGER.debug('Loading %s', self.__file_path)
            self.update(json.load(vopen(self.__file_path)))

    def clear(self):
        """Force the dictionary to be empty.
        """
        if os.path.isfile(self.__file_path):
            os.unlink(self.__file_path)
            super(DictFile, self).clear()

    def save(self):
        LOGGER.debug('Writing %s', self.__file_path)
        # This will break if trying to call save() on a remote DictFile
        with open(self.__file_path, 'w') as f:
            json.dump(self, f, indent=4)

import os
import json
import logging


LOGGER = logging.getLogger(__name__)


class DictFile(dict):
    """A ``dict``, storable as a JSON file.
    """
    def __init__(self, file_path):
        super(DictFile, self).__init__()
        self.__file_path = file_path
        self.reload()

    def reload(self):
        if os.path.isfile(self.__file_path):
            LOGGER.debug('Loading %s', self.__file_path)
            with open(self.__file_path) as f:
                self.update(json.load(f))

    def clear(self):
        """Force the dictionary to be empty.
        """
        if os.path.isfile(self.__file_path):
            os.unlink(self.__file_path)
            super(DictFile, self).clear()

    def save(self):
        LOGGER.debug('Writing %s', self.__file_path)
        with open(self.__file_path, 'w') as f:
            json.dump(self, f, indent=4)

--- 
+++ 
@@ -1,6 +1,8 @@
 import os
 import json
 import logging
+
+from .vfiles import vopen
 
 
 LOGGER = logging.getLogger(__name__)
@@ -17,8 +19,7 @@
     def reload(self):
         if os.path.isfile(self.__file_path):
             LOGGER.debug('Loading %s', self.__file_path)
-            with open(self.__file_path) as f:
-                self.update(json.load(f))
+            self.update(json.load(vopen(self.__file_path)))
 
     def clear(self):
         """Force the dictionary to be empty.
@@ -29,5 +30,6 @@
 
     def save(self):
         LOGGER.debug('Writing %s', self.__file_path)
+        # This will break if trying to call save() on a remote DictFile
         with open(self.__file_path, 'w') as f:
             json.dump(self, f, indent=4)
Use vopen() to make DictFile works when reading remote repository meta data
