##// END OF EJS Templates
Exclude __pycache__ from profiles list.
Thomas Kluyver -
Show More
@@ -1,293 +1,293 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-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 logging
25 25 import os
26 26
27 27 from IPython.config.application import Application, boolean_flag
28 28 from IPython.core.application import (
29 29 BaseIPythonApplication, base_flags, base_aliases
30 30 )
31 31 from IPython.core.profiledir import ProfileDir
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 89
90 90 #-----------------------------------------------------------------------------
91 91 # Profile Application Class (for `ipython profile` subcommand)
92 92 #-----------------------------------------------------------------------------
93 93
94 94
95 95 def list_profiles_in(path):
96 96 """list profiles in a given root directory"""
97 97 files = os.listdir(path)
98 98 profiles = []
99 99 for f in files:
100 100 full_path = os.path.join(path, f)
101 101 if os.path.isdir(full_path) and f.startswith('profile_'):
102 102 profiles.append(f.split('_',1)[-1])
103 103 return profiles
104 104
105 105
106 106 def list_bundled_profiles():
107 107 """list profiles that are bundled with IPython."""
108 108 path = os.path.join(get_ipython_package_dir(), u'config', u'profile')
109 109 files = os.listdir(path)
110 110 profiles = []
111 111 for profile in files:
112 112 full_path = os.path.join(path, profile)
113 if os.path.isdir(full_path):
113 if os.path.isdir(full_path) and profile != "__pycache__":
114 114 profiles.append(profile)
115 115 return profiles
116 116
117 117
118 118 class ProfileList(Application):
119 119 name = u'ipython-profile'
120 120 description = list_help
121 121 examples = _list_examples
122 122
123 123 aliases = Dict({
124 124 'ipython-dir' : 'ProfileList.ipython_dir',
125 125 'log-level' : 'Application.log_level',
126 126 })
127 127 flags = Dict(dict(
128 128 debug = ({'Application' : {'log_level' : 0}},
129 129 "Set Application.log_level to 0, maximizing log output."
130 130 )
131 131 ))
132 132
133 133 ipython_dir = Unicode(get_ipython_dir(), config=True,
134 134 help="""
135 135 The name of the IPython directory. This directory is used for logging
136 136 configuration (through profiles), history storage, etc. The default
137 137 is usually $HOME/.ipython. This options can also be specified through
138 138 the environment variable IPYTHON_DIR.
139 139 """
140 140 )
141 141
142 142
143 143 def _print_profiles(self, profiles):
144 144 """print list of profiles, indented."""
145 145 for profile in profiles:
146 146 print ' %s' % profile
147 147
148 148 def list_profile_dirs(self):
149 149 profiles = list_bundled_profiles()
150 150 if profiles:
151 151 print
152 152 print "Available profiles in IPython:"
153 153 self._print_profiles(profiles)
154 154 print
155 155 print " The first request for a bundled profile will copy it"
156 156 print " into your IPython directory (%s)," % self.ipython_dir
157 157 print " where you can customize it."
158 158
159 159 profiles = list_profiles_in(self.ipython_dir)
160 160 if profiles:
161 161 print
162 162 print "Available profiles in %s:" % self.ipython_dir
163 163 self._print_profiles(profiles)
164 164
165 165 profiles = list_profiles_in(os.getcwdu())
166 166 if profiles:
167 167 print
168 168 print "Available profiles in current directory (%s):" % os.getcwdu()
169 169 self._print_profiles(profiles)
170 170
171 171 print
172 172 print "To use any of the above profiles, start IPython with:"
173 173 print " ipython --profile=<name>"
174 174 print
175 175
176 176 def start(self):
177 177 self.list_profile_dirs()
178 178
179 179
180 180 create_flags = {}
181 181 create_flags.update(base_flags)
182 182 # don't include '--init' flag, which implies running profile create in other apps
183 183 create_flags.pop('init')
184 184 create_flags['reset'] = ({'ProfileCreate': {'overwrite' : True}},
185 185 "reset config files in this profile to the defaults.")
186 186 create_flags['parallel'] = ({'ProfileCreate': {'parallel' : True}},
187 187 "Include the config files for parallel "
188 188 "computing apps (ipengine, ipcontroller, etc.)")
189 189
190 190
191 191 class ProfileCreate(BaseIPythonApplication):
192 192 name = u'ipython-profile'
193 193 description = create_help
194 194 examples = _create_examples
195 195 auto_create = Bool(True, config=False)
196 196
197 197 def _copy_config_files_default(self):
198 198 return True
199 199
200 200 parallel = Bool(False, config=True,
201 201 help="whether to include parallel computing config files")
202 202 def _parallel_changed(self, name, old, new):
203 203 parallel_files = [ 'ipcontroller_config.py',
204 204 'ipengine_config.py',
205 205 'ipcluster_config.py'
206 206 ]
207 207 if new:
208 208 for cf in parallel_files:
209 209 self.config_files.append(cf)
210 210 else:
211 211 for cf in parallel_files:
212 212 if cf in self.config_files:
213 213 self.config_files.remove(cf)
214 214
215 215 def parse_command_line(self, argv):
216 216 super(ProfileCreate, self).parse_command_line(argv)
217 217 # accept positional arg as profile name
218 218 if self.extra_args:
219 219 self.profile = self.extra_args[0]
220 220
221 221 flags = Dict(create_flags)
222 222
223 223 classes = [ProfileDir]
224 224
225 225 def init_config_files(self):
226 226 super(ProfileCreate, self).init_config_files()
227 227 # use local imports, since these classes may import from here
228 228 from IPython.frontend.terminal.ipapp import TerminalIPythonApp
229 229 apps = [TerminalIPythonApp]
230 230 try:
231 231 from IPython.frontend.qt.console.qtconsoleapp import IPythonQtConsoleApp
232 232 except Exception:
233 233 # this should be ImportError, but under weird circumstances
234 234 # this might be an AttributeError, or possibly others
235 235 # in any case, nothing should cause the profile creation to crash.
236 236 pass
237 237 else:
238 238 apps.append(IPythonQtConsoleApp)
239 239 try:
240 240 from IPython.frontend.html.notebook.notebookapp import NotebookApp
241 241 except ImportError:
242 242 pass
243 243 except Exception:
244 244 self.log.debug('Unexpected error when importing NotebookApp',
245 245 exc_info=True
246 246 )
247 247 else:
248 248 apps.append(NotebookApp)
249 249 if self.parallel:
250 250 from IPython.parallel.apps.ipcontrollerapp import IPControllerApp
251 251 from IPython.parallel.apps.ipengineapp import IPEngineApp
252 252 from IPython.parallel.apps.ipclusterapp import IPClusterStart
253 253 from IPython.parallel.apps.iploggerapp import IPLoggerApp
254 254 apps.extend([
255 255 IPControllerApp,
256 256 IPEngineApp,
257 257 IPClusterStart,
258 258 IPLoggerApp,
259 259 ])
260 260 for App in apps:
261 261 app = App()
262 262 app.config.update(self.config)
263 263 app.log = self.log
264 264 app.overwrite = self.overwrite
265 265 app.copy_config_files=True
266 266 app.profile = self.profile
267 267 app.init_profile_dir()
268 268 app.init_config_files()
269 269
270 270 def stage_default_config_file(self):
271 271 pass
272 272
273 273
274 274 class ProfileApp(Application):
275 275 name = u'ipython-profile'
276 276 description = profile_help
277 277 examples = _main_examples
278 278
279 279 subcommands = Dict(dict(
280 280 create = (ProfileCreate, "Create a new profile dir with default config files"),
281 281 list = (ProfileList, "List existing profiles")
282 282 ))
283 283
284 284 def start(self):
285 285 if self.subapp is None:
286 286 print "No subcommand specified. Must specify one of: %s"%(self.subcommands.keys())
287 287 print
288 288 self.print_description()
289 289 self.print_subcommands()
290 290 self.exit(1)
291 291 else:
292 292 return self.subapp.start()
293 293
General Comments 0
You need to be logged in to leave comments. Login now