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