Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit e550c14

Browse files
committed
Make user_setup a top-level function in iplib and add better tests.
This function has grown way too big and it needs a refactoring, but at least now it's a standalone thing (it didn't need to be a method) and can be called in a non-interactive fashion.
1 parent 95950b3 commit e550c14

2 files changed

Lines changed: 244 additions & 162 deletions

File tree

IPython/iplib.py

Lines changed: 196 additions & 155 deletions
Original file line numberDiff line numberDiff line change
@@ -108,6 +108,197 @@ def softspace(file, newvalue):
108108
return oldvalue
109109

110110

111+
def user_setup(ipythondir,rc_suffix,mode='install',interactive=True):
112+
"""Install or upgrade the user configuration directory.
113+
114+
Can be called when running for the first time or to upgrade the user's
115+
.ipython/ directory.
116+
117+
Parameters
118+
----------
119+
ipythondir : path
120+
The directory to be used for installation/upgrade. In 'install' mode,
121+
if this path already exists, the function exits immediately.
122+
123+
rc_suffix : str
124+
Extension for the config files. On *nix platforms it is typically the
125+
empty string, while Windows normally uses '.ini'.
126+
127+
mode : str, optional
128+
Valid modes are 'install' and 'upgrade'.
129+
130+
interactive : bool, optional
131+
If False, do not wait for user input on any errors. Normally after
132+
printing its status information, this function waits for the user to
133+
hit Return before proceeding. This is because the default use case is
134+
when first installing the IPython configuration, so we want the user to
135+
acknowledge the initial message, which contains some useful
136+
information.
137+
"""
138+
139+
# For automatic use, deactivate all i/o
140+
if interactive:
141+
def wait():
142+
try:
143+
raw_input("Please press <RETURN> to start IPython.")
144+
except EOFError:
145+
print >> Term.cout
146+
print '*'*70
147+
148+
def printf(s):
149+
print s
150+
else:
151+
wait = lambda : None
152+
printf = lambda s : None
153+
154+
# Install mode should be re-entrant: if the install dir already exists,
155+
# bail out cleanly
156+
if mode == 'install' and os.path.isdir(ipythondir):
157+
return
158+
159+
cwd = os.getcwd() # remember where we started
160+
glb = glob.glob
161+
162+
printf('*'*70)
163+
if mode == 'install':
164+
printf(
165+
"""Welcome to IPython. I will try to create a personal configuration directory
166+
where you can customize many aspects of IPython's functionality in:\n""")
167+
else:
168+
printf('I am going to upgrade your configuration in:')
169+
170+
printf(ipythondir)
171+
172+
rcdirend = os.path.join('IPython','UserConfig')
173+
cfg = lambda d: os.path.join(d,rcdirend)
174+
try:
175+
rcdir = filter(os.path.isdir,map(cfg,sys.path))[0]
176+
printf("Initializing from configuration: %s" % rcdir)
177+
except IndexError:
178+
warning = """
179+
Installation error. IPython's directory was not found.
180+
181+
Check the following:
182+
183+
The ipython/IPython directory should be in a directory belonging to your
184+
PYTHONPATH environment variable (that is, it should be in a directory
185+
belonging to sys.path). You can copy it explicitly there or just link to it.
186+
187+
IPython will create a minimal default configuration for you.
188+
189+
"""
190+
warn(warning)
191+
wait()
192+
193+
if sys.platform =='win32':
194+
inif = 'ipythonrc.ini'
195+
else:
196+
inif = 'ipythonrc'
197+
minimal_setup = {'ipy_user_conf.py' : 'import ipy_defaults',
198+
inif : '# intentionally left blank' }
199+
os.makedirs(ipythondir, mode = 0777)
200+
for f, cont in minimal_setup.items():
201+
# In 2.5, this can be more cleanly done using 'with'
202+
fobj = file(ipythondir + '/' + f,'w')
203+
fobj.write(cont)
204+
fobj.close()
205+
206+
return
207+
208+
if mode == 'install':
209+
try:
210+
shutil.copytree(rcdir,ipythondir)
211+
os.chdir(ipythondir)
212+
rc_files = glb("ipythonrc*")
213+
for rc_file in rc_files:
214+
os.rename(rc_file,rc_file+rc_suffix)
215+
except:
216+
warning = """
217+
218+
There was a problem with the installation:
219+
%s
220+
Try to correct it or contact the developers if you think it's a bug.
221+
IPython will proceed with builtin defaults.""" % sys.exc_info()[1]
222+
warn(warning)
223+
wait()
224+
return
225+
226+
elif mode == 'upgrade':
227+
try:
228+
os.chdir(ipythondir)
229+
except:
230+
printf("""
231+
Can not upgrade: changing to directory %s failed. Details:
232+
%s
233+
""" % (ipythondir,sys.exc_info()[1]) )
234+
wait()
235+
return
236+
else:
237+
sources = glb(os.path.join(rcdir,'[A-Za-z]*'))
238+
for new_full_path in sources:
239+
new_filename = os.path.basename(new_full_path)
240+
if new_filename.startswith('ipythonrc'):
241+
new_filename = new_filename + rc_suffix
242+
# The config directory should only contain files, skip any
243+
# directories which may be there (like CVS)
244+
if os.path.isdir(new_full_path):
245+
continue
246+
if os.path.exists(new_filename):
247+
old_file = new_filename+'.old'
248+
if os.path.exists(old_file):
249+
os.remove(old_file)
250+
os.rename(new_filename,old_file)
251+
shutil.copy(new_full_path,new_filename)
252+
else:
253+
raise ValueError('unrecognized mode for install: %r' % mode)
254+
255+
# Fix line-endings to those native to each platform in the config
256+
# directory.
257+
try:
258+
os.chdir(ipythondir)
259+
except:
260+
printf("""
261+
Problem: changing to directory %s failed.
262+
Details:
263+
%s
264+
265+
Some configuration files may have incorrect line endings. This should not
266+
cause any problems during execution. """ % (ipythondir,sys.exc_info()[1]) )
267+
wait()
268+
else:
269+
for fname in glb('ipythonrc*'):
270+
try:
271+
native_line_ends(fname,backup=0)
272+
except IOError:
273+
pass
274+
275+
if mode == 'install':
276+
printf("""
277+
Successful installation!
278+
279+
Please read the sections 'Initial Configuration' and 'Quick Tips' in the
280+
IPython manual (there are both HTML and PDF versions supplied with the
281+
distribution) to make sure that your system environment is properly configured
282+
to take advantage of IPython's features.
283+
284+
Important note: the configuration system has changed! The old system is
285+
still in place, but its setting may be partly overridden by the settings in
286+
"~/.ipython/ipy_user_conf.py" config file. Please take a look at the file
287+
if some of the new settings bother you.
288+
289+
""")
290+
else:
291+
printf("""
292+
Successful upgrade!
293+
294+
All files in your directory:
295+
%(ipythondir)s
296+
which would have been overwritten by the upgrade were backed up with a .old
297+
extension. If you had made particular customizations in those files you may
298+
want to merge them back into the new files.""" % locals() )
299+
wait()
300+
os.chdir(cwd)
301+
111302
#****************************************************************************
112303
# Local use exceptions
113304
class SpaceInInput(exceptions.Exception): pass
@@ -1114,161 +1305,11 @@ def rc_set_toggle(self,rc_field,value=None):
11141305
def user_setup(self,ipythondir,rc_suffix,mode='install'):
11151306
"""Install the user configuration directory.
11161307
1117-
Can be called when running for the first time or to upgrade the user's
1118-
.ipython/ directory with the mode parameter. Valid modes are 'install'
1119-
and 'upgrade'."""
1120-
1121-
def wait():
1122-
try:
1123-
raw_input("Please press <RETURN> to start IPython.")
1124-
except EOFError:
1125-
print >> Term.cout
1126-
print '*'*70
1127-
1128-
# Install mode should be re-entrant: if the install dir already exists,
1129-
# bail out cleanly
1130-
if mode == 'install' and os.path.isdir(ipythondir):
1131-
return
1132-
1133-
cwd = os.getcwd() # remember where we started
1134-
glb = glob.glob
1135-
print '*'*70
1136-
if mode == 'install':
1137-
print \
1138-
"""Welcome to IPython. I will try to create a personal configuration directory
1139-
where you can customize many aspects of IPython's functionality in:\n"""
1140-
else:
1141-
print 'I am going to upgrade your configuration in:'
1142-
1143-
print ipythondir
1144-
1145-
rcdirend = os.path.join('IPython','UserConfig')
1146-
cfg = lambda d: os.path.join(d,rcdirend)
1147-
try:
1148-
rcdir = filter(os.path.isdir,map(cfg,sys.path))[0]
1149-
print "Initializing from configuration",rcdir
1150-
except IndexError:
1151-
warning = """
1152-
Installation error. IPython's directory was not found.
1153-
1154-
Check the following:
1155-
1156-
The ipython/IPython directory should be in a directory belonging to your
1157-
PYTHONPATH environment variable (that is, it should be in a directory
1158-
belonging to sys.path). You can copy it explicitly there or just link to it.
1159-
1160-
IPython will create a minimal default configuration for you.
1161-
1162-
"""
1163-
warn(warning)
1164-
wait()
1165-
1166-
if sys.platform =='win32':
1167-
inif = 'ipythonrc.ini'
1168-
else:
1169-
inif = 'ipythonrc'
1170-
minimal_setup = {'ipy_user_conf.py' : 'import ipy_defaults',
1171-
inif : '# intentionally left blank' }
1172-
os.makedirs(ipythondir, mode = 0777)
1173-
for f, cont in minimal_setup.items():
1174-
open(ipythondir + '/' + f,'w').write(cont)
1175-
1176-
return
1177-
1178-
if mode == 'install':
1179-
try:
1180-
shutil.copytree(rcdir,ipythondir)
1181-
os.chdir(ipythondir)
1182-
rc_files = glb("ipythonrc*")
1183-
for rc_file in rc_files:
1184-
os.rename(rc_file,rc_file+rc_suffix)
1185-
except:
1186-
warning = """
1187-
1188-
There was a problem with the installation:
1189-
%s
1190-
Try to correct it or contact the developers if you think it's a bug.
1191-
IPython will proceed with builtin defaults.""" % sys.exc_info()[1]
1192-
warn(warning)
1193-
wait()
1194-
return
1195-
1196-
elif mode == 'upgrade':
1197-
try:
1198-
os.chdir(ipythondir)
1199-
except:
1200-
print """
1201-
Can not upgrade: changing to directory %s failed. Details:
1202-
%s
1203-
""" % (ipythondir,sys.exc_info()[1])
1204-
wait()
1205-
return
1206-
else:
1207-
sources = glb(os.path.join(rcdir,'[A-Za-z]*'))
1208-
for new_full_path in sources:
1209-
new_filename = os.path.basename(new_full_path)
1210-
if new_filename.startswith('ipythonrc'):
1211-
new_filename = new_filename + rc_suffix
1212-
# The config directory should only contain files, skip any
1213-
# directories which may be there (like CVS)
1214-
if os.path.isdir(new_full_path):
1215-
continue
1216-
if os.path.exists(new_filename):
1217-
old_file = new_filename+'.old'
1218-
if os.path.exists(old_file):
1219-
os.remove(old_file)
1220-
os.rename(new_filename,old_file)
1221-
shutil.copy(new_full_path,new_filename)
1222-
else:
1223-
raise ValueError,'unrecognized mode for install:',`mode`
1224-
1225-
# Fix line-endings to those native to each platform in the config
1226-
# directory.
1227-
try:
1228-
os.chdir(ipythondir)
1229-
except:
1230-
print """
1231-
Problem: changing to directory %s failed.
1232-
Details:
1233-
%s
1234-
1235-
Some configuration files may have incorrect line endings. This should not
1236-
cause any problems during execution. """ % (ipythondir,sys.exc_info()[1])
1237-
wait()
1238-
else:
1239-
for fname in glb('ipythonrc*'):
1240-
try:
1241-
native_line_ends(fname,backup=0)
1242-
except IOError:
1243-
pass
1244-
1245-
if mode == 'install':
1246-
print """
1247-
Successful installation!
1248-
1249-
Please read the sections 'Initial Configuration' and 'Quick Tips' in the
1250-
IPython manual (there are both HTML and PDF versions supplied with the
1251-
distribution) to make sure that your system environment is properly configured
1252-
to take advantage of IPython's features.
1253-
1254-
Important note: the configuration system has changed! The old system is
1255-
still in place, but its setting may be partly overridden by the settings in
1256-
"~/.ipython/ipy_user_conf.py" config file. Please take a look at the file
1257-
if some of the new settings bother you.
1258-
1259-
"""
1260-
else:
1261-
print """
1262-
Successful upgrade!
1263-
1264-
All files in your directory:
1265-
%(ipythondir)s
1266-
which would have been overwritten by the upgrade were backed up with a .old
1267-
extension. If you had made particular customizations in those files you may
1268-
want to merge them back into the new files.""" % locals()
1269-
wait()
1270-
os.chdir(cwd)
1271-
# end user_setup()
1308+
Note
1309+
----
1310+
DEPRECATED: use the top-level user_setup() function instead.
1311+
"""
1312+
return user_setup(ipythondir,rc_suffix,mode)
12721313

12731314
def atexit_operations(self):
12741315
"""This will be executed at the time of exit.

0 commit comments

Comments
 (0)