##// END OF EJS Templates
Merge pull request #3212 from jusic/master...
Min RK -
r10270:e7a98b15 merge
parent child Browse files
Show More
@@ -1,226 +1,230 b''
1 1 # encoding: utf-8
2 2 """
3 3 An object for managing IPython profile directories.
4 4
5 5 Authors:
6 6
7 7 * Brian Granger
8 8 * Fernando Perez
9 9 * Min RK
10 10
11 11 """
12 12
13 13 #-----------------------------------------------------------------------------
14 14 # Copyright (C) 2008-2011 The IPython Development Team
15 15 #
16 16 # Distributed under the terms of the BSD License. The full license is in
17 17 # the file COPYING, distributed as part of this software.
18 18 #-----------------------------------------------------------------------------
19 19
20 20 #-----------------------------------------------------------------------------
21 21 # Imports
22 22 #-----------------------------------------------------------------------------
23 23
24 24 import os
25 25 import shutil
26 26
27 27 from IPython.config.configurable import LoggingConfigurable
28 28 from IPython.utils.path import get_ipython_package_dir, expand_path
29 29 from IPython.utils.traitlets import Unicode, Bool
30 30
31 31 #-----------------------------------------------------------------------------
32 32 # Classes and functions
33 33 #-----------------------------------------------------------------------------
34 34
35 35
36 36 #-----------------------------------------------------------------------------
37 37 # Module errors
38 38 #-----------------------------------------------------------------------------
39 39
40 40 class ProfileDirError(Exception):
41 41 pass
42 42
43 43
44 44 #-----------------------------------------------------------------------------
45 45 # Class for managing profile directories
46 46 #-----------------------------------------------------------------------------
47 47
48 48 class ProfileDir(LoggingConfigurable):
49 49 """An object to manage the profile directory and its resources.
50 50
51 51 The profile directory is used by all IPython applications, to manage
52 52 configuration, logging and security.
53 53
54 54 This object knows how to find, create and manage these directories. This
55 55 should be used by any code that wants to handle profiles.
56 56 """
57 57
58 58 security_dir_name = Unicode('security')
59 59 log_dir_name = Unicode('log')
60 60 startup_dir_name = Unicode('startup')
61 61 pid_dir_name = Unicode('pid')
62 62 security_dir = Unicode(u'')
63 63 log_dir = Unicode(u'')
64 64 startup_dir = Unicode(u'')
65 65 pid_dir = Unicode(u'')
66 66
67 67 location = Unicode(u'', config=True,
68 68 help="""Set the profile location directly. This overrides the logic used by the
69 69 `profile` option.""",
70 70 )
71 71
72 72 _location_isset = Bool(False) # flag for detecting multiply set location
73 73
74 74 def _location_changed(self, name, old, new):
75 75 if self._location_isset:
76 76 raise RuntimeError("Cannot set profile location more than once.")
77 77 self._location_isset = True
78 78 if not os.path.isdir(new):
79 79 os.makedirs(new)
80 80
81 81 # ensure config files exist:
82 82 self.security_dir = os.path.join(new, self.security_dir_name)
83 83 self.log_dir = os.path.join(new, self.log_dir_name)
84 84 self.startup_dir = os.path.join(new, self.startup_dir_name)
85 85 self.pid_dir = os.path.join(new, self.pid_dir_name)
86 86 self.check_dirs()
87 87
88 88 def _log_dir_changed(self, name, old, new):
89 89 self.check_log_dir()
90 90
91 91 def check_log_dir(self):
92 92 if not os.path.isdir(self.log_dir):
93 93 os.mkdir(self.log_dir)
94 94
95 95 def _startup_dir_changed(self, name, old, new):
96 96 self.check_startup_dir()
97 97
98 98 def check_startup_dir(self):
99 99 if not os.path.isdir(self.startup_dir):
100 100 os.mkdir(self.startup_dir)
101 101 readme = os.path.join(self.startup_dir, 'README')
102 102 src = os.path.join(get_ipython_package_dir(), u'config', u'profile', u'README_STARTUP')
103 if not os.path.exists(readme):
103
104 if not os.path.exists(src):
105 self.log.warn("Could not copy README_STARTUP to startup dir. Source file %s does not exist." % src)
106
107 if os.path.exists(src) and not os.path.exists(readme):
104 108 shutil.copy(src, readme)
105 109
106 110 def _security_dir_changed(self, name, old, new):
107 111 self.check_security_dir()
108 112
109 113 def check_security_dir(self):
110 114 if not os.path.isdir(self.security_dir):
111 115 os.mkdir(self.security_dir, 0o700)
112 116 else:
113 117 try:
114 118 os.chmod(self.security_dir, 0o700)
115 119 except OSError:
116 120 self.log.warn("Could not set security dir permissions to private.")
117 121
118 122 def _pid_dir_changed(self, name, old, new):
119 123 self.check_pid_dir()
120 124
121 125 def check_pid_dir(self):
122 126 if not os.path.isdir(self.pid_dir):
123 127 os.mkdir(self.pid_dir, 0o700)
124 128 else:
125 129 try:
126 130 os.chmod(self.pid_dir, 0o700)
127 131 except OSError:
128 132 self.log.warn("Could not set pid dir permissions to private.")
129 133
130 134 def check_dirs(self):
131 135 self.check_security_dir()
132 136 self.check_log_dir()
133 137 self.check_pid_dir()
134 138 self.check_startup_dir()
135 139
136 140 def copy_config_file(self, config_file, path=None, overwrite=False):
137 141 """Copy a default config file into the active profile directory.
138 142
139 143 Default configuration files are kept in :mod:`IPython.config.default`.
140 144 This function moves these from that location to the working profile
141 145 directory.
142 146 """
143 147 dst = os.path.join(self.location, config_file)
144 148 if os.path.isfile(dst) and not overwrite:
145 149 return False
146 150 if path is None:
147 151 path = os.path.join(get_ipython_package_dir(), u'config', u'profile', u'default')
148 152 src = os.path.join(path, config_file)
149 153 shutil.copy(src, dst)
150 154 return True
151 155
152 156 @classmethod
153 157 def create_profile_dir(cls, profile_dir, config=None):
154 158 """Create a new profile directory given a full path.
155 159
156 160 Parameters
157 161 ----------
158 162 profile_dir : str
159 163 The full path to the profile directory. If it does exist, it will
160 164 be used. If not, it will be created.
161 165 """
162 166 return cls(location=profile_dir, config=config)
163 167
164 168 @classmethod
165 169 def create_profile_dir_by_name(cls, path, name=u'default', config=None):
166 170 """Create a profile dir by profile name and path.
167 171
168 172 Parameters
169 173 ----------
170 174 path : unicode
171 175 The path (directory) to put the profile directory in.
172 176 name : unicode
173 177 The name of the profile. The name of the profile directory will
174 178 be "profile_<profile>".
175 179 """
176 180 if not os.path.isdir(path):
177 181 raise ProfileDirError('Directory not found: %s' % path)
178 182 profile_dir = os.path.join(path, u'profile_' + name)
179 183 return cls(location=profile_dir, config=config)
180 184
181 185 @classmethod
182 186 def find_profile_dir_by_name(cls, ipython_dir, name=u'default', config=None):
183 187 """Find an existing profile dir by profile name, return its ProfileDir.
184 188
185 189 This searches through a sequence of paths for a profile dir. If it
186 190 is not found, a :class:`ProfileDirError` exception will be raised.
187 191
188 192 The search path algorithm is:
189 193 1. ``os.getcwdu()``
190 194 2. ``ipython_dir``
191 195
192 196 Parameters
193 197 ----------
194 198 ipython_dir : unicode or str
195 199 The IPython directory to use.
196 200 name : unicode or str
197 201 The name of the profile. The name of the profile directory
198 202 will be "profile_<profile>".
199 203 """
200 204 dirname = u'profile_' + name
201 205 paths = [os.getcwdu(), ipython_dir]
202 206 for p in paths:
203 207 profile_dir = os.path.join(p, dirname)
204 208 if os.path.isdir(profile_dir):
205 209 return cls(location=profile_dir, config=config)
206 210 else:
207 211 raise ProfileDirError('Profile directory not found in paths: %s' % dirname)
208 212
209 213 @classmethod
210 214 def find_profile_dir(cls, profile_dir, config=None):
211 215 """Find/create a profile dir and return its ProfileDir.
212 216
213 217 This will create the profile directory if it doesn't exist.
214 218
215 219 Parameters
216 220 ----------
217 221 profile_dir : unicode or str
218 222 The path of the profile directory. This is expanded using
219 223 :func:`IPython.utils.genutils.expand_path`.
220 224 """
221 225 profile_dir = expand_path(profile_dir)
222 226 if not os.path.isdir(profile_dir):
223 227 raise ProfileDirError('Profile directory not found: %s' % profile_dir)
224 228 return cls(location=profile_dir, config=config)
225 229
226 230
General Comments 0
You need to be logged in to leave comments. Login now