##// END OF EJS Templates
Progress towards getting the test suite in shape again....
Fernando Perez -
Show More
@@ -47,7 +47,7 b" D.C.value = 'hi there'"
47 47 class TestPyFileCL(TestCase):
48 48
49 49 def test_basic(self):
50 fd, fname = mkstemp()
50 fd, fname = mkstemp('.py')
51 51 f = os.fdopen(fd, 'w')
52 52 f.write(pyfile)
53 53 f.close()
@@ -97,6 +97,7 b' class Application(object):'
97 97
98 98 # Private attributes
99 99 _exiting = False
100 _initialized = False
100 101
101 102 def __init__(self, argv=None):
102 103 self.argv = sys.argv[1:] if argv is None else argv
@@ -119,8 +120,12 b' class Application(object):'
119 120
120 121 log_level = property(_get_log_level, _set_log_level)
121 122
122 def start(self):
123 def initialize(self):
123 124 """Start the application."""
125
126 if self._initialized:
127 return
128
124 129 self.attempt(self.create_default_config)
125 130 self.log_default_config()
126 131 self.set_default_config_log_level()
@@ -143,6 +148,10 b' class Application(object):'
143 148 self.attempt(self.pre_construct)
144 149 self.attempt(self.construct)
145 150 self.attempt(self.post_construct)
151 self._initialized = True
152
153 def start(self):
154 self.initialize()
146 155 self.attempt(self.start_app)
147 156
148 157 #-------------------------------------------------------------------------
@@ -245,10 +245,11 b' class ShadowHist(object):'
245 245
246 246
247 247 def init_ipython(ip):
248 import ipy_completers
248 # XXX - ipy_completers are in quarantine, need to be updated to new apis
249 #import ipy_completers
249 250
250 251 ip.define_magic("rep",rep_f)
251 252 ip.define_magic("hist",magic_hist)
252 253 ip.define_magic("history",magic_history)
253 254
254 ipy_completers.quick_completer('%hist' ,'-g -t -r -n')
255 #ipy_completers.quick_completer('%hist' ,'-g -t -r -n')
@@ -252,7 +252,7 b' cl_args = ('
252 252 metavar='gui-mode')
253 253 ),
254 254
255 (('--pylab',), dict(
255 (('--pylab','-pylab'), dict(
256 256 type=str, dest='Global.pylab', default=NoConfigDefault,
257 257 nargs='?', const='auto', metavar='gui-mode',
258 258 help="Pre-load matplotlib and numpy for interactive use. "+
@@ -284,24 +284,6 b' class IPythonAppCLConfigLoader(BaseAppArgParseConfigLoader):'
284 284
285 285 arguments = cl_args
286 286
287 def load_config(self):
288 """Do actions just before loading the command line config."""
289
290 # Special hack: there are countless uses of 'ipython -pylab' (with one
291 # dash) in the wild, including in printed books. Since argparse does
292 # will interpret -pylab as '-p ylab', sending us in a search for a
293 # profile named 'ylab', instead we special-case here -pylab as the
294 # first or second option only (this is how old ipython used to work)
295 # and convert this use to --pylab. Ugly, but needed for this one
296 # very widely used case.
297 firstargs = sys.argv[:3]
298 try:
299 idx = firstargs.index('-pylab')
300 except ValueError:
301 pass
302 else:
303 sys.argv[idx] = '--pylab'
304 return super(IPythonAppCLConfigLoader, self).load_config()
305 287
306 288 default_config_file_name = u'ipython_config.py'
307 289
@@ -311,6 +293,22 b' class IPythonApp(Application):'
311 293 description = 'IPython: an enhanced interactive Python shell.'
312 294 config_file_name = default_config_file_name
313 295
296 def __init__(self, argv=None, **shell_params):
297 """Create a new IPythonApp.
298
299 Parameters
300 ----------
301 argv : optional, list
302 If given, used as the command-line argv environment to read arguments
303 from.
304
305 shell_params : optional, dict
306 All other keywords are passed to the :class:`iplib.InteractiveShell`
307 constructor.
308 """
309 super(IPythonApp, self).__init__(argv)
310 self.shell_params = shell_params
311
314 312 def create_default_config(self):
315 313 super(IPythonApp, self).create_default_config()
316 314 # Eliminate multiple lookups
@@ -349,7 +347,6 b' class IPythonApp(Application):'
349 347 version=release.version
350 348 )
351 349
352
353 350 def load_file_config(self):
354 351 if hasattr(self.command_line_config.Global, 'quick'):
355 352 if self.command_line_config.Global.quick:
@@ -404,10 +401,8 b' class IPythonApp(Application):'
404 401 sys.path.insert(0, '')
405 402
406 403 # Create an InteractiveShell instance
407 self.shell = InteractiveShell(
408 parent=None,
409 config=self.master_config
410 )
404 self.shell = InteractiveShell(None, self.master_config,
405 **self.shell_params )
411 406
412 407 def post_construct(self):
413 408 """Do actions after construct, but before starting the app."""
@@ -185,6 +185,57 b' class SeparateStr(Str):'
185 185 return super(SeparateStr, self).validate(obj, value)
186 186
187 187
188 def make_user_namespaces(user_ns=None, user_global_ns=None):
189 """Return a valid local and global user interactive namespaces.
190
191 This builds a dict with the minimal information needed to operate as a
192 valid IPython user namespace, which you can pass to the various
193 embedding classes in ipython. The default implementation returns the
194 same dict for both the locals and the globals to allow functions to
195 refer to variables in the namespace. Customized implementations can
196 return different dicts. The locals dictionary can actually be anything
197 following the basic mapping protocol of a dict, but the globals dict
198 must be a true dict, not even a subclass. It is recommended that any
199 custom object for the locals namespace synchronize with the globals
200 dict somehow.
201
202 Raises TypeError if the provided globals namespace is not a true dict.
203
204 Parameters
205 ----------
206 user_ns : dict-like, optional
207 The current user namespace. The items in this namespace should
208 be included in the output. If None, an appropriate blank
209 namespace should be created.
210 user_global_ns : dict, optional
211 The current user global namespace. The items in this namespace
212 should be included in the output. If None, an appropriate
213 blank namespace should be created.
214
215 Returns
216 -------
217 A pair of dictionary-like object to be used as the local namespace
218 of the interpreter and a dict to be used as the global namespace.
219 """
220
221 if user_ns is None:
222 # Set __name__ to __main__ to better match the behavior of the
223 # normal interpreter.
224 user_ns = {'__name__' :'__main__',
225 '__builtins__' : __builtin__,
226 }
227 else:
228 user_ns.setdefault('__name__','__main__')
229 user_ns.setdefault('__builtins__',__builtin__)
230
231 if user_global_ns is None:
232 user_global_ns = user_ns
233 if type(user_global_ns) is not dict:
234 raise TypeError("user_global_ns must be a true dict; got %r"
235 % type(user_global_ns))
236
237 return user_ns, user_global_ns
238
188 239 #-----------------------------------------------------------------------------
189 240 # Main IPython class
190 241 #-----------------------------------------------------------------------------
@@ -816,8 +867,7 b' class InteractiveShell(Component, Magic):'
816 867 # These routines return properly built dicts as needed by the rest of
817 868 # the code, and can also be used by extension writers to generate
818 869 # properly initialized namespaces.
819 user_ns, user_global_ns = self.make_user_namespaces(user_ns,
820 user_global_ns)
870 user_ns, user_global_ns = make_user_namespaces(user_ns, user_global_ns)
821 871
822 872 # Assign namespaces
823 873 # This is the namespace where all normal user variables live
@@ -902,55 +952,6 b' class InteractiveShell(Component, Magic):'
902 952 else:
903 953 sys.modules[main_name] = FakeModule(self.user_ns)
904 954
905 def make_user_namespaces(self, user_ns=None, user_global_ns=None):
906 """Return a valid local and global user interactive namespaces.
907
908 This builds a dict with the minimal information needed to operate as a
909 valid IPython user namespace, which you can pass to the various
910 embedding classes in ipython. The default implementation returns the
911 same dict for both the locals and the globals to allow functions to
912 refer to variables in the namespace. Customized implementations can
913 return different dicts. The locals dictionary can actually be anything
914 following the basic mapping protocol of a dict, but the globals dict
915 must be a true dict, not even a subclass. It is recommended that any
916 custom object for the locals namespace synchronize with the globals
917 dict somehow.
918
919 Raises TypeError if the provided globals namespace is not a true dict.
920
921 :Parameters:
922 user_ns : dict-like, optional
923 The current user namespace. The items in this namespace should
924 be included in the output. If None, an appropriate blank
925 namespace should be created.
926 user_global_ns : dict, optional
927 The current user global namespace. The items in this namespace
928 should be included in the output. If None, an appropriate
929 blank namespace should be created.
930
931 :Returns:
932 A tuple pair of dictionary-like object to be used as the local namespace
933 of the interpreter and a dict to be used as the global namespace.
934 """
935
936 if user_ns is None:
937 # Set __name__ to __main__ to better match the behavior of the
938 # normal interpreter.
939 user_ns = {'__name__' :'__main__',
940 '__builtins__' : __builtin__,
941 }
942 else:
943 user_ns.setdefault('__name__','__main__')
944 user_ns.setdefault('__builtins__',__builtin__)
945
946 if user_global_ns is None:
947 user_global_ns = user_ns
948 if type(user_global_ns) is not dict:
949 raise TypeError("user_global_ns must be a true dict; got %r"
950 % type(user_global_ns))
951
952 return user_ns, user_global_ns
953
954 955 def init_user_ns(self):
955 956 """Initialize all user-visible namespaces to their minimum defaults.
956 957
@@ -11,7 +11,7 b' from cStringIO import StringIO'
11 11
12 12 import nose.tools as nt
13 13
14 from IPython.core.iplib import get_ipython
14 #from IPython.core.iplib import get_ipython
15 15 from IPython.utils.platutils import find_cmd, get_long_path_name
16 16 from IPython.testing import decorators as dec
17 17 from IPython.testing import tools as tt
@@ -99,7 +99,11 b' def test_shist():'
99 99
100 100 shutil.rmtree(tfile)
101 101
102 @dec.skipif_not_numpy
102
103 # XXX failing for now, until we get clearcmd out of quarantine. But we should
104 # fix this and revert the skip to happen only if numpy is not around.
105 #@dec.skipif_not_numpy
106 @dec.skipknownfailure
103 107 def test_numpy_clear_array_undec():
104 108 from IPython.extensions import clearcmd
105 109
@@ -216,7 +220,7 b' class TestMagicRun(object):'
216 220
217 221 def setup(self):
218 222 """Make a valid python temp file."""
219 fname = tempfile.mkstemp()[1]
223 fname = tempfile.mkstemp('.py')[1]
220 224 f = open(fname,'w')
221 225 f.write('pass\n')
222 226 f.flush()
@@ -234,7 +234,12 b' class IPTester(object):'
234 234 else:
235 235 def run(self):
236 236 """Run the stored commands"""
237 try:
237 238 return subprocess.call(self.call_args)
239 except:
240 import traceback
241 traceback.print_exc()
242 return 1 # signal failure
238 243
239 244
240 245 def make_runners():
@@ -64,13 +64,11 b' def default_argv():'
64 64
65 65 # Get the install directory for the user configuration and tell ipython to
66 66 # use the default profile from there.
67 from IPython.config import userconfig
68 ipcdir = os.path.dirname(userconfig.__file__)
69 #ipconf = os.path.join(ipcdir,'ipy_user_conf.py')
70 ipconf = os.path.join(ipcdir,'ipythonrc')
67 from IPython.config import default
68 ipcdir = os.path.dirname(default.__file__)
69 ipconf = os.path.join(ipcdir,'ipython_config.py')
71 70 #print 'conf:',ipconf # dbg
72
73 return ['--colors=NoColor','--noterm_title','-rcfile=%s' % ipconf]
71 return ['--colors=NoColor','--no-term-title','--config-file=%s' % ipconf]
74 72
75 73
76 74 # Hack to modify the %run command so we can sync the user's namespace with the
@@ -164,7 +162,7 b' def start_ipython():'
164 162 import new
165 163
166 164 import IPython
167 from IPython.core import ipapi
165 from IPython.core import ipapp, iplib
168 166
169 167 def xsys(cmd):
170 168 """Execute a command and print its output.
@@ -184,7 +182,10 b' def start_ipython():'
184 182 argv = default_argv()
185 183
186 184 # Start IPython instance. We customize it to start with minimal frills.
187 IPython.shell.IPShell(argv,ipnsdict(),global_ns)
185 user_ns,global_ns = iplib.make_user_namespaces(ipnsdict(),{})
186 ip = ipapp.IPythonApp(argv, user_ns=user_ns, user_global_ns=global_ns)
187 ip.initialize()
188 ip.shell.builtin_trap.set()
188 189
189 190 # Deactivate the various python system hooks added by ipython for
190 191 # interactive convenience so we don't confuse the doctest system
@@ -194,25 +195,24 b' def start_ipython():'
194 195
195 196 # So that ipython magics and aliases can be doctested (they work by making
196 197 # a call into a global _ip object)
197 _ip = ipapi.get()
198 __builtin__._ip = _ip
198 __builtin__._ip = ip.shell
199 199
200 200 # Modify the IPython system call with one that uses getoutput, so that we
201 201 # can capture subcommands and print them to Python's stdout, otherwise the
202 202 # doctest machinery would miss them.
203 _ip.system = xsys
203 ip.shell.system = xsys
204 204
205 205 # Also patch our %run function in.
206 206 im = new.instancemethod(_run_ns_sync,_ip, _ip.__class__)
207 _ip.magic_run_ori = _ip.magic_run
208 _ip.magic_run = im
207 ip.shell.magic_run_ori = _ip.magic_run
208 ip.shell.magic_run = im
209 209
210 210 # XXX - For some very bizarre reason, the loading of %history by default is
211 211 # failing. This needs to be fixed later, but for now at least this ensures
212 212 # that tests that use %hist run to completion.
213 213 from IPython.core import history
214 history.init_ipython(_ip)
215 if not hasattr(_ip,'magic_history'):
214 history.init_ipython(ip.shell)
215 if not hasattr(ip.shell,'magic_history'):
216 216 raise RuntimeError("Can't load magics, aborting")
217 217
218 218
@@ -219,7 +219,7 b' def test_get_ipython_dir_1():'
219 219 """test_get_ipython_dir_1, Testcase to see if we can call get_ipython_dir without Exceptions."""
220 220 env['IPYTHONDIR'] = "someplace/.ipython"
221 221 ipdir = genutils.get_ipython_dir()
222 nt.assert_equal(ipdir, os.path.abspath("someplace/.ipython"))
222 nt.assert_equal(ipdir, "someplace/.ipython")
223 223
224 224
225 225 @with_enivronment
@@ -228,15 +228,8 b' def test_get_ipython_dir_2():'
228 228 genutils.get_home_dir = lambda : "someplace"
229 229 os.name = "posix"
230 230 ipdir = genutils.get_ipython_dir()
231 nt.assert_equal(ipdir, os.path.abspath(os.path.join("someplace", ".ipython")))
231 nt.assert_equal(ipdir, os.path.join("someplace", ".ipython"))
232 232
233 @with_enivronment
234 def test_get_ipython_dir_3():
235 """test_get_ipython_dir_3, Testcase to see if we can call get_ipython_dir without Exceptions."""
236 genutils.get_home_dir = lambda : "someplace"
237 os.name = "nt"
238 ipdir = genutils.get_ipython_dir()
239 nt.assert_equal(ipdir, os.path.abspath(os.path.join("someplace", "_ipython")))
240 233
241 234 #
242 235 # Tests for get_security_dir
General Comments 0
You need to be logged in to leave comments. Login now