##// END OF EJS Templates
Restored ipython profile locate dir and fixed typo. (Fixes #3708).
Katie Silverio -
Show More
@@ -1,313 +1,313 b''
1 1 # encoding: utf-8
2 2 """
3 3 An application for managing IPython profiles.
4 4
5 5 To be invoked as the `ipython profile` subcommand.
6 6
7 7 Authors:
8 8
9 9 * Min RK
10 10
11 11 """
12 12
13 13 #-----------------------------------------------------------------------------
14 14 # Copyright (C) 2008 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
26 26 from IPython.config.application import Application
27 27 from IPython.core.application import (
28 28 BaseIPythonApplication, base_flags
29 29 )
30 30 from IPython.core.profiledir import ProfileDir
31 31 from IPython.utils.importstring import import_item
32 32 from IPython.utils.path import get_ipython_dir, get_ipython_package_dir
33 33 from IPython.utils.traitlets import Unicode, Bool, Dict
34 34
35 35 #-----------------------------------------------------------------------------
36 36 # Constants
37 37 #-----------------------------------------------------------------------------
38 38
39 39 create_help = """Create an IPython profile by name
40 40
41 41 Create an ipython profile directory by its name or
42 42 profile directory path. Profile directories contain
43 43 configuration, log and security related files and are named
44 44 using the convention 'profile_<name>'. By default they are
45 45 located in your ipython directory. Once created, you will
46 46 can edit the configuration files in the profile
47 47 directory to configure IPython. Most users will create a
48 48 profile directory by name,
49 49 `ipython profile create myprofile`, which will put the directory
50 50 in `<ipython_dir>/profile_myprofile`.
51 51 """
52 52 list_help = """List available IPython profiles
53 53
54 54 List all available profiles, by profile location, that can
55 55 be found in the current working directly or in the ipython
56 56 directory. Profile directories are named using the convention
57 57 'profile_<profile>'.
58 58 """
59 59 profile_help = """Manage IPython profiles
60 60
61 61 Profile directories contain
62 62 configuration, log and security related files and are named
63 63 using the convention 'profile_<name>'. By default they are
64 64 located in your ipython directory. You can create profiles
65 65 with `ipython profile create <name>`, or see the profiles you
66 66 already have with `ipython profile list`
67 67
68 68 To get started configuring IPython, simply do:
69 69
70 70 $> ipython profile create
71 71
72 72 and IPython will create the default profile in <ipython_dir>/profile_default,
73 73 where you can edit ipython_config.py to start configuring IPython.
74 74
75 75 """
76 76
77 77 _list_examples = "ipython profile list # list all profiles"
78 78
79 79 _create_examples = """
80 80 ipython profile create foo # create profile foo w/ default config files
81 81 ipython profile create foo --reset # restage default config files over current
82 82 ipython profile create foo --parallel # also stage parallel config files
83 83 """
84 84
85 85 _main_examples = """
86 86 ipython profile create -h # show the help string for the create subcommand
87 87 ipython profile list -h # show the help string for the list subcommand
88 88
89 ipython locate profile foo # print the path to the directory for profile 'foo'
89 ipython profile locate foo # print the path to the directory for profile 'foo'
90 90 """
91 91
92 92 #-----------------------------------------------------------------------------
93 93 # Profile Application Class (for `ipython profile` subcommand)
94 94 #-----------------------------------------------------------------------------
95 95
96 96
97 97 def list_profiles_in(path):
98 98 """list profiles in a given root directory"""
99 99 files = os.listdir(path)
100 100 profiles = []
101 101 for f in files:
102 102 try:
103 103 full_path = os.path.join(path, f)
104 104 except UnicodeError:
105 105 continue
106 106 if os.path.isdir(full_path) and f.startswith('profile_'):
107 107 profiles.append(f.split('_',1)[-1])
108 108 return profiles
109 109
110 110
111 111 def list_bundled_profiles():
112 112 """list profiles that are bundled with IPython."""
113 113 path = os.path.join(get_ipython_package_dir(), u'config', u'profile')
114 114 files = os.listdir(path)
115 115 profiles = []
116 116 for profile in files:
117 117 full_path = os.path.join(path, profile)
118 118 if os.path.isdir(full_path) and profile != "__pycache__":
119 119 profiles.append(profile)
120 120 return profiles
121 121
122 122
123 123 class ProfileLocate(BaseIPythonApplication):
124 description = """print the path an IPython profile dir"""
124 description = """print the path to an IPython profile dir"""
125 125
126 126 def parse_command_line(self, argv=None):
127 127 super(ProfileLocate, self).parse_command_line(argv)
128 128 if self.extra_args:
129 129 self.profile = self.extra_args[0]
130 130
131 131 def start(self):
132 132 print self.profile_dir.location
133 133
134 134
135 135 class ProfileList(Application):
136 136 name = u'ipython-profile'
137 137 description = list_help
138 138 examples = _list_examples
139 139
140 140 aliases = Dict({
141 141 'ipython-dir' : 'ProfileList.ipython_dir',
142 142 'log-level' : 'Application.log_level',
143 143 })
144 144 flags = Dict(dict(
145 145 debug = ({'Application' : {'log_level' : 0}},
146 146 "Set Application.log_level to 0, maximizing log output."
147 147 )
148 148 ))
149 149
150 150 ipython_dir = Unicode(get_ipython_dir(), config=True,
151 151 help="""
152 152 The name of the IPython directory. This directory is used for logging
153 153 configuration (through profiles), history storage, etc. The default
154 154 is usually $HOME/.ipython. This options can also be specified through
155 155 the environment variable IPYTHONDIR.
156 156 """
157 157 )
158 158
159 159
160 160 def _print_profiles(self, profiles):
161 161 """print list of profiles, indented."""
162 162 for profile in profiles:
163 163 print ' %s' % profile
164 164
165 165 def list_profile_dirs(self):
166 166 profiles = list_bundled_profiles()
167 167 if profiles:
168 168 print
169 169 print "Available profiles in IPython:"
170 170 self._print_profiles(profiles)
171 171 print
172 172 print " The first request for a bundled profile will copy it"
173 173 print " into your IPython directory (%s)," % self.ipython_dir
174 174 print " where you can customize it."
175 175
176 176 profiles = list_profiles_in(self.ipython_dir)
177 177 if profiles:
178 178 print
179 179 print "Available profiles in %s:" % self.ipython_dir
180 180 self._print_profiles(profiles)
181 181
182 182 profiles = list_profiles_in(os.getcwdu())
183 183 if profiles:
184 184 print
185 185 print "Available profiles in current directory (%s):" % os.getcwdu()
186 186 self._print_profiles(profiles)
187 187
188 188 print
189 189 print "To use any of the above profiles, start IPython with:"
190 190 print " ipython --profile=<name>"
191 191 print
192 192
193 193 def start(self):
194 194 self.list_profile_dirs()
195 195
196 196
197 197 create_flags = {}
198 198 create_flags.update(base_flags)
199 199 # don't include '--init' flag, which implies running profile create in other apps
200 200 create_flags.pop('init')
201 201 create_flags['reset'] = ({'ProfileCreate': {'overwrite' : True}},
202 202 "reset config files in this profile to the defaults.")
203 203 create_flags['parallel'] = ({'ProfileCreate': {'parallel' : True}},
204 204 "Include the config files for parallel "
205 205 "computing apps (ipengine, ipcontroller, etc.)")
206 206
207 207
208 208 class ProfileCreate(BaseIPythonApplication):
209 209 name = u'ipython-profile'
210 210 description = create_help
211 211 examples = _create_examples
212 212 auto_create = Bool(True, config=False)
213 213 def _log_format_default(self):
214 214 return "[%(name)s] %(message)s"
215 215
216 216 def _copy_config_files_default(self):
217 217 return True
218 218
219 219 parallel = Bool(False, config=True,
220 220 help="whether to include parallel computing config files")
221 221 def _parallel_changed(self, name, old, new):
222 222 parallel_files = [ 'ipcontroller_config.py',
223 223 'ipengine_config.py',
224 224 'ipcluster_config.py'
225 225 ]
226 226 if new:
227 227 for cf in parallel_files:
228 228 self.config_files.append(cf)
229 229 else:
230 230 for cf in parallel_files:
231 231 if cf in self.config_files:
232 232 self.config_files.remove(cf)
233 233
234 234 def parse_command_line(self, argv):
235 235 super(ProfileCreate, self).parse_command_line(argv)
236 236 # accept positional arg as profile name
237 237 if self.extra_args:
238 238 self.profile = self.extra_args[0]
239 239
240 240 flags = Dict(create_flags)
241 241
242 242 classes = [ProfileDir]
243 243
244 244 def _import_app(self, app_path):
245 245 """import an app class"""
246 246 app = None
247 247 name = app_path.rsplit('.', 1)[-1]
248 248 try:
249 249 app = import_item(app_path)
250 250 except ImportError as e:
251 251 self.log.info("Couldn't import %s, config file will be excluded", name)
252 252 except Exception:
253 253 self.log.warn('Unexpected error importing %s', name, exc_info=True)
254 254 return app
255 255
256 256 def init_config_files(self):
257 257 super(ProfileCreate, self).init_config_files()
258 258 # use local imports, since these classes may import from here
259 259 from IPython.terminal.ipapp import TerminalIPythonApp
260 260 apps = [TerminalIPythonApp]
261 261 for app_path in (
262 262 'IPython.qt.console.qtconsoleapp.IPythonQtConsoleApp',
263 263 'IPython.html.notebookapp.NotebookApp',
264 264 'IPython.nbconvert.nbconvertapp.NbConvertApp',
265 265 ):
266 266 app = self._import_app(app_path)
267 267 if app is not None:
268 268 apps.append(app)
269 269 if self.parallel:
270 270 from IPython.parallel.apps.ipcontrollerapp import IPControllerApp
271 271 from IPython.parallel.apps.ipengineapp import IPEngineApp
272 272 from IPython.parallel.apps.ipclusterapp import IPClusterStart
273 273 from IPython.parallel.apps.iploggerapp import IPLoggerApp
274 274 apps.extend([
275 275 IPControllerApp,
276 276 IPEngineApp,
277 277 IPClusterStart,
278 278 IPLoggerApp,
279 279 ])
280 280 for App in apps:
281 281 app = App()
282 282 app.config.update(self.config)
283 283 app.log = self.log
284 284 app.overwrite = self.overwrite
285 285 app.copy_config_files=True
286 286 app.profile = self.profile
287 287 app.init_profile_dir()
288 288 app.init_config_files()
289 289
290 290 def stage_default_config_file(self):
291 291 pass
292 292
293 293
294 294 class ProfileApp(Application):
295 295 name = u'ipython-profile'
296 296 description = profile_help
297 297 examples = _main_examples
298 298
299 299 subcommands = Dict(dict(
300 300 create = (ProfileCreate, ProfileCreate.description.splitlines()[0]),
301 301 list = (ProfileList, ProfileList.description.splitlines()[0]),
302 locate = (ProfileLocate, ProfileLocate.description.splitlines()[0]),
302 303 ))
303 304
304 305 def start(self):
305 306 if self.subapp is None:
306 307 print "No subcommand specified. Must specify one of: %s"%(self.subcommands.keys())
307 308 print
308 309 self.print_description()
309 310 self.print_subcommands()
310 311 self.exit(1)
311 312 else:
312 313 return self.subapp.start()
313
General Comments 0
You need to be logged in to leave comments. Login now