##// END OF EJS Templates
exclude log-level from ProfileCreate output
MinRK -
Show More
@@ -1,308 +1,310 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 The IPython Development Team
14 # Copyright (C) 2008 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 os
24 import os
25
25
26 from IPython.config.application import Application
26 from IPython.config.application import Application
27 from IPython.core.application import (
27 from IPython.core.application import (
28 BaseIPythonApplication, base_flags
28 BaseIPythonApplication, base_flags
29 )
29 )
30 from IPython.core.profiledir import ProfileDir
30 from IPython.core.profiledir import ProfileDir
31 from IPython.utils.importstring import import_item
31 from IPython.utils.importstring import import_item
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 locate profile 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 def _log_format_default(self):
211 return "[%(name)s] %(message)s"
210
212
211 def _copy_config_files_default(self):
213 def _copy_config_files_default(self):
212 return True
214 return True
213
215
214 parallel = Bool(False, config=True,
216 parallel = Bool(False, config=True,
215 help="whether to include parallel computing config files")
217 help="whether to include parallel computing config files")
216 def _parallel_changed(self, name, old, new):
218 def _parallel_changed(self, name, old, new):
217 parallel_files = [ 'ipcontroller_config.py',
219 parallel_files = [ 'ipcontroller_config.py',
218 'ipengine_config.py',
220 'ipengine_config.py',
219 'ipcluster_config.py'
221 'ipcluster_config.py'
220 ]
222 ]
221 if new:
223 if new:
222 for cf in parallel_files:
224 for cf in parallel_files:
223 self.config_files.append(cf)
225 self.config_files.append(cf)
224 else:
226 else:
225 for cf in parallel_files:
227 for cf in parallel_files:
226 if cf in self.config_files:
228 if cf in self.config_files:
227 self.config_files.remove(cf)
229 self.config_files.remove(cf)
228
230
229 def parse_command_line(self, argv):
231 def parse_command_line(self, argv):
230 super(ProfileCreate, self).parse_command_line(argv)
232 super(ProfileCreate, self).parse_command_line(argv)
231 # accept positional arg as profile name
233 # accept positional arg as profile name
232 if self.extra_args:
234 if self.extra_args:
233 self.profile = self.extra_args[0]
235 self.profile = self.extra_args[0]
234
236
235 flags = Dict(create_flags)
237 flags = Dict(create_flags)
236
238
237 classes = [ProfileDir]
239 classes = [ProfileDir]
238
240
239 def _import_app(self, app_path):
241 def _import_app(self, app_path):
240 """import an app class"""
242 """import an app class"""
241 app = None
243 app = None
242 name = app_path.rsplit('.', 1)[-1]
244 name = app_path.rsplit('.', 1)[-1]
243 try:
245 try:
244 app = import_item(app_path)
246 app = import_item(app_path)
245 except ImportError as e:
247 except ImportError as e:
246 self.log.info("Couldn't import %s, config file will be excluded", name)
248 self.log.info("Couldn't import %s, config file will be excluded", name)
247 except Exception:
249 except Exception:
248 self.log.warn('Unexpected error importing %s', name, exc_info=True)
250 self.log.warn('Unexpected error importing %s', name, exc_info=True)
249 return app
251 return app
250
252
251 def init_config_files(self):
253 def init_config_files(self):
252 super(ProfileCreate, self).init_config_files()
254 super(ProfileCreate, self).init_config_files()
253 # use local imports, since these classes may import from here
255 # use local imports, since these classes may import from here
254 from IPython.terminal.ipapp import TerminalIPythonApp
256 from IPython.terminal.ipapp import TerminalIPythonApp
255 apps = [TerminalIPythonApp]
257 apps = [TerminalIPythonApp]
256 for app_path in (
258 for app_path in (
257 'IPython.qt.console.qtconsoleapp.IPythonQtConsoleApp',
259 'IPython.qt.console.qtconsoleapp.IPythonQtConsoleApp',
258 'IPython.html.notebookapp.NotebookApp',
260 'IPython.html.notebookapp.NotebookApp',
259 'IPython.nbconvert.nbconvertapp.NbConvertApp',
261 'IPython.nbconvert.nbconvertapp.NbConvertApp',
260 ):
262 ):
261 app = self._import_app(app_path)
263 app = self._import_app(app_path)
262 if app is not None:
264 if app is not None:
263 apps.append(app)
265 apps.append(app)
264 if self.parallel:
266 if self.parallel:
265 from IPython.parallel.apps.ipcontrollerapp import IPControllerApp
267 from IPython.parallel.apps.ipcontrollerapp import IPControllerApp
266 from IPython.parallel.apps.ipengineapp import IPEngineApp
268 from IPython.parallel.apps.ipengineapp import IPEngineApp
267 from IPython.parallel.apps.ipclusterapp import IPClusterStart
269 from IPython.parallel.apps.ipclusterapp import IPClusterStart
268 from IPython.parallel.apps.iploggerapp import IPLoggerApp
270 from IPython.parallel.apps.iploggerapp import IPLoggerApp
269 apps.extend([
271 apps.extend([
270 IPControllerApp,
272 IPControllerApp,
271 IPEngineApp,
273 IPEngineApp,
272 IPClusterStart,
274 IPClusterStart,
273 IPLoggerApp,
275 IPLoggerApp,
274 ])
276 ])
275 for App in apps:
277 for App in apps:
276 app = App()
278 app = App()
277 app.config.update(self.config)
279 app.config.update(self.config)
278 app.log = self.log
280 app.log = self.log
279 app.overwrite = self.overwrite
281 app.overwrite = self.overwrite
280 app.copy_config_files=True
282 app.copy_config_files=True
281 app.profile = self.profile
283 app.profile = self.profile
282 app.init_profile_dir()
284 app.init_profile_dir()
283 app.init_config_files()
285 app.init_config_files()
284
286
285 def stage_default_config_file(self):
287 def stage_default_config_file(self):
286 pass
288 pass
287
289
288
290
289 class ProfileApp(Application):
291 class ProfileApp(Application):
290 name = u'ipython-profile'
292 name = u'ipython-profile'
291 description = profile_help
293 description = profile_help
292 examples = _main_examples
294 examples = _main_examples
293
295
294 subcommands = Dict(dict(
296 subcommands = Dict(dict(
295 create = (ProfileCreate, ProfileCreate.description.splitlines()[0]),
297 create = (ProfileCreate, ProfileCreate.description.splitlines()[0]),
296 list = (ProfileList, ProfileList.description.splitlines()[0]),
298 list = (ProfileList, ProfileList.description.splitlines()[0]),
297 ))
299 ))
298
300
299 def start(self):
301 def start(self):
300 if self.subapp is None:
302 if self.subapp is None:
301 print "No subcommand specified. Must specify one of: %s"%(self.subcommands.keys())
303 print "No subcommand specified. Must specify one of: %s"%(self.subcommands.keys())
302 print
304 print
303 self.print_description()
305 self.print_description()
304 self.print_subcommands()
306 self.print_subcommands()
305 self.exit(1)
307 self.exit(1)
306 else:
308 else:
307 return self.subapp.start()
309 return self.subapp.start()
308
310
General Comments 0
You need to be logged in to leave comments. Login now