8000 Merge pull request #454 from mdboom/xdg_config · matplotlib/matplotlib@3ac8144 · GitHub
[go: up one dir, main page]

Skip to content
8000

Commit 3ac8144

Browse files
committed
Merge pull request #454 from mdboom/xdg_config
Use a subdirectory of $XDG_CONFIG_HOME instead of ~/.matplotlibrc on Linux
1 parent 6588bb3 commit 3ac8144

File tree

9 files changed

+157
-106
lines changed

9 files changed

+157
-106
lines changed

doc/api/api_changes.rst

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,11 @@ For new features that were added to matplotlib, please see
1717
Changes in 1.3.x
1818
================
1919

20+
* On Linux, the user-specific `matplotlibrc` configuration file is now
21+
located in `~/.config/matplotlib/matplotlibrc` to conform to the
22+
`XDG Base Directory Specification
23+
<http://standards.freedesktop.org/basedir-spec/basedir-spec-latest.html>`_.
24+
2025
* The following items that were deprecated in version 1.2 or earlier
2126
have now been removed completely.
2227

doc/faq/troubleshooting_faq.rst

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -37,10 +37,10 @@ and printing the ``__file__`` attribute::
3737
:file:`.matplotlib` directory location
3838
======================================
3939

40-
Each user has a :file:`.matplotlib/` directory which may contain a
41-
:ref:`matplotlibrc <customizing-with-matplotlibrc-files>` file and various
42-
caches to improve matplotlib's performance. To locate your :file:`.matplotlib/`
43-
directory, use :func:`matplotlib.get_configdir`::
40+
Each user has a matplotlib configuration directory which may contain a
41+
:ref:`matplotlibrc <customizing-with-matplotlibrc-files>` file. To
42+
locate your :file:`.matplotlib/` directory, use
43+
:func:`matplotlib.get_configdir`::
4444

4545
>>> import matplotlib as mpl
4646
>>> mpl.get_configdir()

doc/users/customizing.rst

Lines changed: 19 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -18,21 +18,31 @@ locations, in the following order:
1818

1919
1. :file:`matplotlibrc` in the current working directory, usually used for
2020
specific customizations that you do not want to apply elsewhere.
21-
2. :file:`.matplotlib/matplotlibrc`, for the user's default customizations. See
22-
:ref:`locating-matplotlib-config-dir`.
23-
3. :file:`{INSTALL}/matplotlib/mpl-data/matplotlibrc`, where :file:`{INSTALL}`
24-
is something like :file:`/usr/lib/python2.5/site-packages` on Linux, and
25-
maybe :file:`C:\\Python25\\Lib\\site-packages` on Windows. Every time you
26-
install matplotlib, this file will be overwritten, so if you want your
27-
customizations to be saved, please move this file to your :file:`.matplotlib`
28-
directory.
21+
22+
2. It next looks in a user-specific place, depending on your platform:
23+
24+
- On Linux, it looks in :file:`.config/matplotlib/matplotlibrc` (or
25+
`$XDG_CONFIG_HOME/matplotlib/matplotlibrc` if you've customized
26+
your environment.
27+
28+
- On other platforms, it looks in :file:`.matplotlib/matplotlibrc`.
29+
30+
See :ref:`locating-matplotlib-config-dir`.
31+
32+
3. :file:`{INSTALL}/matplotlib/mpl-data/matplotlibrc`, where
33+
:file:`{INSTALL}` is something like
34+
:file:`/usr/lib/python2.5/site-packages` on Linux, and maybe
35+
:file:`C:\\Python25\\Lib\\site-packages` on Windows. Every time you
36+
install matplotlib, this file will be overwritten, so if you want
37+
your customizations to be saved, please move this file to your
38+
user-specific matplotlib directory.
2939

3040
To display where the currently active :file:`matplotlibrc` file was
3141
loaded from, one can do the following::
3242

3343
>>> import matplotlib
3444
>>> matplotlib.matplotlib_fname()
35-
'/home/foo/.matplotlib/matplotlibrc'
45+
'/home/foo/.config/matplotlib/matplotlibrc'
3646

3747
See below for a sample :ref:`matplotlibrc file<matplotlibrc-sample>`.
3848

doc/users/whats_new.rst

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,15 @@ animations as well as being fully interactive.
6666
Future versions of matplotlib will integrate this backend with the
6767
IPython notebook for a fully web browser based plotting frontend.
6868

69+
XDG base directory support
70+
--------------------------
71+
On Linux, matplotlib now uses the `XDG base directory specification
72+
<http://standards.freedesktop.org/basedir-spec/basedir-spec-latest.html>`
73+
to find the `matplotlibrc` configuration file. `matplotlibrc` should
74+
now be kept in `~/.config/matplotlib`, rather than `~/.matplotlib`. If
75+
your configuration is found in the old location, it will still be used,
76+
but a warning will be displayed.
77+
6978
Path effects on lines
7079
---------------------
7180
Thanks to Jae-Joon Lee, path effects now also work on plot lines.
@@ -1137,4 +1146,4 @@ Here are the 0.98.4 notes from the CHANGELOG::
11371146

11381147
Added support for arbitrary rasterization resolutions to the SVG
11391148
backend. - MW
1140-
1149+

lib/matplotlib/__init__.py

Lines changed: 102 additions & 75 deletions
Original file line numberDiff line numberDiff line change
@@ -146,19 +146,6 @@
146146
sys.argv = ['modpython']
147147

148148

149-
"""
150-
Manage user customizations through a rc file.
151-
152-
The default file location is given in the following order
153-
154-
- environment variable MATPLOTLIBRC
155-
156-
- HOME/.matplotlib/matplotlibrc if HOME is defined
157-
158-
- PATH/matplotlibrc where PATH is the return value of
159-
get_data_path()
160-
"""
161-
162149
import sys, os, tempfile
163150

164151
if sys.version_info[0] >= 3:
@@ -525,50 +512,91 @@ def _create_tmp_config_dir():
525512

526513
get_home = verbose.wrap('$HOME=%s', _get_home, always=False)
527514

528-
def _get_configdir():
515+
def _get_xdg_config_dir():
529516
"""
530-
Return the string representing the configuration directory.
517+
Returns the XDG configuration directory, according to the `XDG
518+
base directory spec
519+
<http://standards.freedesktop.org/basedir-spec/basedir-spec-latest.html>`_.
520+
"""
521+
return os.environ.get('XDG_CONFIG_HOME', os.path.join(get_home(), '.config'))
531522

532-
The directory is chosen as follows:
533523

534-
1. If the MPLCONFIGDIR environment variable is supplied, choose that. Else,
535-
choose the '.matplotlib' subdirectory of the user's home directory (and
536-
create it if necessary).
537-
2. If the chosen directory exists and is writable, use that as the
538-
configuration directory.
539-
3. If possible, create a temporary directory, and use it as the
540-
configuration directory.
541-
4. A writable directory could not be found or created; return None.
524+
def _get_xdg_cache_dir():
525+
"""
526+
Returns the XDG cache directory, according to the `XDG
527+
base directory spec
528+
<http://standards.freedesktop.org/basedir-spec/basedir-spec-latest.html>`_.
542529
"""
530+
return os.environ.get('XDG_CACHE_HOME', os.path.join(get_home(), '.cache'))
531+
532+
533+
def _get_config_or_cache_dir(xdg_base):
543534
from matplotlib.cbook import mkdirs
544535

545536
configdir = os.environ.get('MPLCONFIGDIR')
546537
if configdir is not None:
547538
if not os.path.exists(configdir):
548539
from matplotlib.cbook import mkdirs
549540
mkdirs(configdir)
541+
550542
if not _is_writable_dir(configdir):
551543
return _create_tmp_config_dir()
552544
return configdir
553545

554546
h = get_home()
555-
if h is not None:
556-
p = os.path.join(h, '.matplotlib')
547+
p = os.path.join(h, '.matplotlib')
548+
if (sys.platform.startswith('linux') and
549+
not os.path.exists(p)):
550+
p = _get_xdg_config_dir()
557551

558-
if os.path.exists(p):
559-
if not _is_writable_dir(p):
560-
return _create_tmp_config_dir()
561-
else:
562-
if not _is_writable_dir(h):
563-
return _create_tmp_config_dir()
564-
mkdirs(p)
552+
if os.path.exists(p):
553+
if not _is_writable_dir(p):
554+
return _create_tmp_config_dir()
555+
else:
556+
if not _is_writable_dir(h):
557+
return _create_tmp_config_dir()
558+
mkdirs(p)
559+
560+
return p
561+
562+
563+
def _get_configdir():
564+
"""
565+
Return the string representing the configuration directory.
565566
566-
return p
567+
The directory is chosen as follows:
568+
569+
1. If the MPLCONFIGDIR environment variable is supplied, choose that.
570+
571+
2a. On Linux, if `$HOME/.matplotlib` exists, choose that, but warn that
572+
that is the old location. Barring that, follow the XDG specification
573+
and look first in `$XDG_CONFIG_HOME`, if defined, or `$HOME/.config`.
574+
575+
2b. On other platforms, choose `$HOME/.matplotlib`.
576+
577+
3. If the chosen directory exists and is writable, use that as the
578+
configuration directory.
579+
4. If possible, create a temporary directory, and use it as the
580+
configuration directory.
581+
5. A writable directory could not be found or created; return None.
582+
"""
583+
return _get_config_or_cache_dir(_get_xdg_config_dir())
567584

568-
return _create_tmp_config_dir()
569585
get_configdir = verbose.wrap('CONFIGDIR=%s', _get_configdir, always=False)
570586

571587

588+
def _get_cachedir():
589+
"""
590+
Return the location of the cache directory.
591+
592+
The procedure used to find the directory is the same as for
593+
_get_config_dir, except using `$XDG_CONFIG_HOME`/`~/.cache` instead.
594+
"""
595+
return _get_config_or_cache_dir(_get_xdg_cache_dir())
596+
597+
get_cachedir = verbose.wrap('CACHEDIR=%s', _get_cachedir, always=False)
598+
599+
572600
def _get_data_path():
573601
'get the path to matplotlib data'
574602

@@ -643,50 +671,36 @@ def get_py2exe_datafiles():
643671

644672
def matplotlib_fname():
645673
"""
646-
Return the path to the rc file used by matplotlib.
674+
Get the location of the config file.
647675
648-
Search order:
676+
The file location is determined in the following order
649677
650-
* current working dir
651-
* environ var MATPLOTLIBRC
652-
* HOME/.matplotlib/matplotlibrc
653-
* MATPLOTLIBDATA/matplotlibrc
678+
- `$PWD/matplotlibrc`
654679
655-
"""
656-
oldname = os.path.join(os.getcwd(), '.matplotlibrc')
657-
if os.path.exists(oldname):
658-
try:
659-
shutil.move('.matplotlibrc', 'matplotlibrc')
660-
except IOError as e:
661-
warnings.warn('File could not be renamed: %s' % e)
662-
else:
663-
warnings.warn("""\
664-
Old rc filename ".matplotlibrc" found in working dir and and renamed to new
665-
default rc file name "matplotlibrc" (no leading ".").""")
666-
667-
home = get_home()
668-
configdir = get_configdir()
669-
if home:
670-
oldname = os.path.join(home, '.matplotlibrc')
671-
if os.path.exists(oldname):
672-
if configdir is not None:
673-
newname = os.path.join(configdir, 'matplotlibrc')
674-
675-
try:
676-
shutil.move(oldname, newname)
677-
except IOError as e:
678-
warnings.warn('File could not be renamed: %s' % e)
679-
else:
680-
warnings.warn("""\
681-
Old rc filename "%s" found and renamed to new default rc file name "%s"."""
682-
% (oldname, newname))
683-
else:
684-
warnings.warn("""\
685-
Could not rename old rc file "%s": a suitable configuration directory could not
686-
be found.""" % oldname)
680+
- environment variable `MATPLOTLIBRC`
681+
682+
- `$MPLCONFIGDIR/matplotlib`
683+
684+
- On Linux,
685+
686+
- `$HOME/.matplotlib/matplotlibrc`, if it exists
687687
688+
- or `$XDG_CONFIG_HOME/matplotlib/matplotlibrc` (if
689+
$XDG_CONFIG_HOME is defined)
690+
691+
- or `$HOME/.config/matplotlib/matplotlibrc` (if
692+
$XDG_CONFIG_HOME is not defined)
693+
694+
- On other platforms,
695+
696+
- `$HOME/.matplotlib/matplotlibrc` if `$HOME` is defined.
697+
698+
- Lastly, it looks in `$MATPLOTLIBDATA/matplotlibrc` for a
699+
system-defined copy.
700+
"""
688701
fname = os.path.join(os.getcwd(), 'matplotlibrc')
689-
if os.path.exists(fname): return fname
702+
if os.path.exists(fname):
703+
return fname
690704

691705
if 'MATPLOTLIBRC' in os.environ:
692706
path = os.environ['MATPLOTLIBRC']
@@ -695,15 +709,28 @@ def matplotlib_fname():
695709
if os.path.exists(fname):
696710
return fname
697711

712+
configdir = _get_configdir()
698713
if configdir is not None:
699714
fname = os.path.join(configdir, 'matplotlibrc')
700715
if os.path.exists(fname):
716+
if (sys.platform.startswith('linux') and
717+
fname == os.path.join(
718+
get_home(), '.matplotlib', 'matplotlibrc')):
719+
warnings.warn(
720+
"Found matplotlib configuration in ~/.matplotlib. "
721+
"To conform with the XDG base directory standard, "
722+
"this configuration location has been deprecated "
723+
"on Linux, and the new location is now %r. Please "
724+
"move your configuration there to ensure that "
725+
"matplotlib will continue to find it in the future." %
726+
_get_xdg_config_dir())
701727
return fname
702728

703-
path = get_data_path() # guaranteed to exist or raise
729+
path = get_data_path() # guaranteed to exist or raise
704730
fname = os.path.join(path, 'matplotlibrc')
705731
if not os.path.exists(fname):
706732
warnings.warn('Could not find matplotlibrc; using defaults')
733+
707734
return fname
708735

709736

lib/matplotlib/finance.py

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@
1717

1818
import numpy as np
1919

20-
from matplotlib import verbose, get_configdir
20+
from matplotlib import verbose, get_cachedir
2121
from matplotlib.dates import date2num
2222
from matplotlib.cbook import iterable, mkdirs
2323
from matplotlib.collections import LineCollection, PolyCollection
@@ -27,10 +27,10 @@
2727
from matplotlib.transforms import Affine2D
2828

2929

30-
configdir = get_configdir()
30+
cachedir = get_cachedir()
3131
# cachedir will be None if there is no writable directory.
32-
if configdir is not None:
33-
cachedir = os.path.join(configdir, 'finance.cache')
32+
if cachedir is not None:
33+
cachedir = os.path.join(cachedir, 'finance.cache')
3434
else:
3535
# Should only happen in a restricted environment (such as Google App
3636
# Engine). Deal with this gracefully by not caching finance data.
@@ -151,7 +151,7 @@ def fetch_historical_yahoo(ticker, date1, date2, cachename=None,dividends=False)
151151
cachename is the name of the local file cache. If None, will
152152
default to the md5 hash or the url (which incorporates the ticker
153153
and date range)
154-
154+
155155
set dividends=True to return dividends instead of price data. With
156156
this option set, parse functions will not work
157157

lib/matplotlib/font_manager.py

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@
5151
import matplotlib
5252
from matplotlib import afm
5353
from matplotlib import ft2font
54-
from matplotlib import rcParams, get_configdir
54+
from matplotlib import rcParams, get_cachedir
5555
from matplotlib.cbook import is_string_like
5656
import matplotlib.cbook as cbook
5757
from matplotlib.compat import subprocess
@@ -1323,12 +1323,12 @@ def findfont(prop, fontext='ttf'):
13231323
return result
13241324

13251325
else:
1326-
configdir = get_configdir()
1327-
if configdir is not None:
1326+
cachedir = get_cachedir()
1327+
if cachedir is not None:
13281328
if sys.version_info[0] >= 3:
1329-
_fmcache = os.path.join(configdir, 'fontList.py3k.cache')
1329+
_fmcache = os.path.join(cachedir, 'fontList.py3k.cache')
13301330
else:
1331-
_fmcache = os.path.join(configdir, 'fontList.cache')
1331+
_fmcache = os.path.join(cachedir, 'fontList.cache')
13321332
else:
13331333
# Should only happen in a restricted environment (such as Google App
13341334
# Engine). Deal with this gracefully by not caching fonts.

0 commit comments

Comments
 (0)
0