##// END OF EJS Templates
fix missing '--' in 'ipython profile list' output
MinRK -
Show More
@@ -1,250 +1,250
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
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_profile_dirs(self):
119 def list_profile_dirs(self):
120 # Find the search paths
120 # Find the search paths
121 paths = [os.getcwdu(), self.ipython_dir]
121 paths = [os.getcwdu(), self.ipython_dir]
122
122
123 self.log.warn('Searching for IPython profiles in paths: %r' % paths)
123 self.log.warn('Searching for IPython profiles in paths: %r' % paths)
124 for path in paths:
124 for path in paths:
125 files = os.listdir(path)
125 files = os.listdir(path)
126 for f in files:
126 for f in files:
127 full_path = os.path.join(path, f)
127 full_path = os.path.join(path, f)
128 if os.path.isdir(full_path) and f.startswith('profile_'):
128 if os.path.isdir(full_path) and f.startswith('profile_'):
129 profile = f.split('_',1)[-1]
129 profile = f.split('_',1)[-1]
130 start_cmd = 'ipython profile=%s' % profile
130 start_cmd = 'ipython --profile=%s' % profile
131 print start_cmd + " ==> " + full_path
131 print start_cmd + " ==> " + full_path
132
132
133 def start(self):
133 def start(self):
134 self.list_profile_dirs()
134 self.list_profile_dirs()
135
135
136
136
137 create_flags = {}
137 create_flags = {}
138 create_flags.update(base_flags)
138 create_flags.update(base_flags)
139 # don't include '--init' flag, which implies running profile create in other apps
139 # don't include '--init' flag, which implies running profile create in other apps
140 create_flags.pop('init')
140 create_flags.pop('init')
141 create_flags['reset'] = ({'ProfileCreate': {'overwrite' : True}},
141 create_flags['reset'] = ({'ProfileCreate': {'overwrite' : True}},
142 "reset config files in this profile to the defaults.")
142 "reset config files in this profile to the defaults.")
143 create_flags['parallel'] = ({'ProfileCreate': {'parallel' : True}},
143 create_flags['parallel'] = ({'ProfileCreate': {'parallel' : True}},
144 "Include the config files for parallel "
144 "Include the config files for parallel "
145 "computing apps (ipengine, ipcontroller, etc.)")
145 "computing apps (ipengine, ipcontroller, etc.)")
146
146
147
147
148 class ProfileCreate(BaseIPythonApplication):
148 class ProfileCreate(BaseIPythonApplication):
149 name = u'ipython-profile'
149 name = u'ipython-profile'
150 description = create_help
150 description = create_help
151 examples = _create_examples
151 examples = _create_examples
152 auto_create = Bool(True, config=False)
152 auto_create = Bool(True, config=False)
153
153
154 def _copy_config_files_default(self):
154 def _copy_config_files_default(self):
155 return True
155 return True
156
156
157 parallel = Bool(False, config=True,
157 parallel = Bool(False, config=True,
158 help="whether to include parallel computing config files")
158 help="whether to include parallel computing config files")
159 def _parallel_changed(self, name, old, new):
159 def _parallel_changed(self, name, old, new):
160 parallel_files = [ 'ipcontroller_config.py',
160 parallel_files = [ 'ipcontroller_config.py',
161 'ipengine_config.py',
161 'ipengine_config.py',
162 'ipcluster_config.py'
162 'ipcluster_config.py'
163 ]
163 ]
164 if new:
164 if new:
165 for cf in parallel_files:
165 for cf in parallel_files:
166 self.config_files.append(cf)
166 self.config_files.append(cf)
167 else:
167 else:
168 for cf in parallel_files:
168 for cf in parallel_files:
169 if cf in self.config_files:
169 if cf in self.config_files:
170 self.config_files.remove(cf)
170 self.config_files.remove(cf)
171
171
172 def parse_command_line(self, argv):
172 def parse_command_line(self, argv):
173 super(ProfileCreate, self).parse_command_line(argv)
173 super(ProfileCreate, self).parse_command_line(argv)
174 # accept positional arg as profile name
174 # accept positional arg as profile name
175 if self.extra_args:
175 if self.extra_args:
176 self.profile = self.extra_args[0]
176 self.profile = self.extra_args[0]
177
177
178 flags = Dict(create_flags)
178 flags = Dict(create_flags)
179
179
180 classes = [ProfileDir]
180 classes = [ProfileDir]
181
181
182 def init_config_files(self):
182 def init_config_files(self):
183 super(ProfileCreate, self).init_config_files()
183 super(ProfileCreate, self).init_config_files()
184 # use local imports, since these classes may import from here
184 # use local imports, since these classes may import from here
185 from IPython.frontend.terminal.ipapp import TerminalIPythonApp
185 from IPython.frontend.terminal.ipapp import TerminalIPythonApp
186 apps = [TerminalIPythonApp]
186 apps = [TerminalIPythonApp]
187 try:
187 try:
188 from IPython.frontend.qt.console.qtconsoleapp import IPythonQtConsoleApp
188 from IPython.frontend.qt.console.qtconsoleapp import IPythonQtConsoleApp
189 except Exception:
189 except Exception:
190 # this should be ImportError, but under weird circumstances
190 # this should be ImportError, but under weird circumstances
191 # this might be an AttributeError, or possibly others
191 # this might be an AttributeError, or possibly others
192 # in any case, nothing should cause the profile creation to crash.
192 # in any case, nothing should cause the profile creation to crash.
193 pass
193 pass
194 else:
194 else:
195 apps.append(IPythonQtConsoleApp)
195 apps.append(IPythonQtConsoleApp)
196 try:
196 try:
197 from IPython.frontend.html.notebook.notebookapp import NotebookApp
197 from IPython.frontend.html.notebook.notebookapp import NotebookApp
198 except ImportError:
198 except ImportError:
199 pass
199 pass
200 except Exception:
200 except Exception:
201 self.log.debug('Unexpected error when importing NotebookApp',
201 self.log.debug('Unexpected error when importing NotebookApp',
202 exc_info=True
202 exc_info=True
203 )
203 )
204 else:
204 else:
205 apps.append(NotebookApp)
205 apps.append(NotebookApp)
206 if self.parallel:
206 if self.parallel:
207 from IPython.parallel.apps.ipcontrollerapp import IPControllerApp
207 from IPython.parallel.apps.ipcontrollerapp import IPControllerApp
208 from IPython.parallel.apps.ipengineapp import IPEngineApp
208 from IPython.parallel.apps.ipengineapp import IPEngineApp
209 from IPython.parallel.apps.ipclusterapp import IPClusterStart
209 from IPython.parallel.apps.ipclusterapp import IPClusterStart
210 from IPython.parallel.apps.iploggerapp import IPLoggerApp
210 from IPython.parallel.apps.iploggerapp import IPLoggerApp
211 apps.extend([
211 apps.extend([
212 IPControllerApp,
212 IPControllerApp,
213 IPEngineApp,
213 IPEngineApp,
214 IPClusterStart,
214 IPClusterStart,
215 IPLoggerApp,
215 IPLoggerApp,
216 ])
216 ])
217 for App in apps:
217 for App in apps:
218 app = App()
218 app = App()
219 app.config.update(self.config)
219 app.config.update(self.config)
220 app.log = self.log
220 app.log = self.log
221 app.overwrite = self.overwrite
221 app.overwrite = self.overwrite
222 app.copy_config_files=True
222 app.copy_config_files=True
223 app.profile = self.profile
223 app.profile = self.profile
224 app.init_profile_dir()
224 app.init_profile_dir()
225 app.init_config_files()
225 app.init_config_files()
226
226
227 def stage_default_config_file(self):
227 def stage_default_config_file(self):
228 pass
228 pass
229
229
230
230
231 class ProfileApp(Application):
231 class ProfileApp(Application):
232 name = u'ipython-profile'
232 name = u'ipython-profile'
233 description = profile_help
233 description = profile_help
234 examples = _main_examples
234 examples = _main_examples
235
235
236 subcommands = Dict(dict(
236 subcommands = Dict(dict(
237 create = (ProfileCreate, "Create a new profile dir with default config files"),
237 create = (ProfileCreate, "Create a new profile dir with default config files"),
238 list = (ProfileList, "List existing profiles")
238 list = (ProfileList, "List existing profiles")
239 ))
239 ))
240
240
241 def start(self):
241 def start(self):
242 if self.subapp is None:
242 if self.subapp is None:
243 print "No subcommand specified. Must specify one of: %s"%(self.subcommands.keys())
243 print "No subcommand specified. Must specify one of: %s"%(self.subcommands.keys())
244 print
244 print
245 self.print_description()
245 self.print_description()
246 self.print_subcommands()
246 self.print_subcommands()
247 self.exit(1)
247 self.exit(1)
248 else:
248 else:
249 return self.subapp.start()
249 return self.subapp.start()
250
250
General Comments 0
You need to be logged in to leave comments. Login now