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