2323 unicode_literals )
2424
2525from matplotlib .externals import six
26- from matplotlib .externals .six .moves import cPickle as pickle
2726
2827"""
2928KNOWN ISSUES
4746 see license/LICENSE_TTFQUERY.
4847"""
4948
49+ import json
5050import os , sys , warnings
5151try :
5252 set
@@ -947,23 +947,43 @@ def ttfdict_to_fnames(d):
947947 fnames .append (fname )
948948 return fnames
949949
950- def pickle_dump (data , filename ):
951- """
952- Equivalent to pickle.dump(data, open(filename, 'w'))
953- but closes the file to prevent filehandle leakage.
954- """
955- with open (filename , 'wb' ) as fh :
956- pickle .dump (data , fh )
950+ class JSONEncoder (json .JSONEncoder ):
951+ def default (self , o ):
952+ if isinstance (o , FontManager ):
953+ return dict (o .__dict__ , _class = 'FontManager' )
954+ elif isinstance (o , FontEntry ):
955+ return dict (o .__dict__ , _class = 'FontEntry' )
956+ else :
957+ return super (JSONEncoder , self ).default (o )
958+
959+ def _json_decode (o ):
960+ cls = o .pop ('_class' , None )
961+ if cls is None :
962+ return o
963+ elif cls == 'FontManager' :
964+ r = FontManager .__new__ (FontManager )
965+ r .__dict__ .update (o )
966+ return r
967+ elif cls == 'FontEntry' :
968+ r = FontEntry .__new__ (FontEntry )
969+ r .__dict__ .update (o )
970+ return r
971+ else :
972+ raise ValueError ("don't know how to deserialize _class=%s" % cls )
957973
958- def pickle_load (filename ):
959- """
960- Equivalent to pickle.load(open(filename, 'r'))
961- but closes the file to prevent filehandle leakage.
962- """
963- with open (filename , 'rb' ) as fh :
964- data = pickle .load (fh )
965- return data
974+ def json_dump (data , filename ):
975+ """Dumps a data structure as JSON in the named file.
976+ Handles FontManager and its fields."""
977+
978+ with open (filename , 'w' ) as fh :
979+ json .dump (data , fh , cls = JSONEncoder , indent = 2 )
966980
981+ def json_load (filename ):
982+ """Loads a data structure as JSON from the named file.
983+ Handles FontManager and its fields."""
984+
985+ with open (filename , 'r' ) as fh :
986+ return json .load (fh , object_hook = _json_decode )
967987
968988class TempCache (object ):
969989 """
@@ -1388,10 +1408,7 @@ def findfont(prop, fontext='ttf'):
13881408 if not 'TRAVIS' in os .environ :
13891409 cachedir = get_cachedir ()
13901410 if cachedir is not None :
1391- if six .PY3 :
1392- _fmcache = os .path .join (cachedir , 'fontList.py3k.cache' )
1393- else :
1394- _fmcache = os .path .join (cachedir , 'fontList.cache' )
1411+ _fmcache = os .path .join (cachedir , 'fontList.json' )
13951412
13961413 fontManager = None
13971414
@@ -1404,12 +1421,12 @@ def _rebuild():
14041421 global fontManager
14051422 fontManager = FontManager ()
14061423 if _fmcache :
1407- pickle_dump (fontManager , _fmcache )
1424+ json_dump (fontManager , _fmcache )
14081425 verbose .report ("generated new fontManager" )
14091426
14101427 if _fmcache :
14111428 try :
1412- fontManager = pickle_load (_fmcache )
1429+ fontManager = json_load (_fmcache )
14131430 if (not hasattr (fontManager , '_version' ) or
14141431 fontManager ._version != FontManager .__version__ ):
14151432 _rebuild ()
0 commit comments