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