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 |
|
|
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 = |
|
|
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 |
@@ -98,8 +98,12 b' def test_shist():' | |||
|
98 | 98 | yield nt.assert_equal,s.get(2),'world' |
|
99 | 99 | |
|
100 | 100 | shutil.rmtree(tfile) |
|
101 | ||
|
101 | 102 | |
|
102 | @dec.skipif_not_numpy | |
|
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 | return subprocess.call(self.call_args) | |
|
237 | try: | |
|
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 |
|
|
68 |
ipcdir = os.path.dirname( |
|
|
69 |
|
|
|
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 |
|
|
|
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 |
|
|
|
208 |
|
|
|
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( |
|
|
215 |
if not hasattr( |
|
|
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, |
|
|
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, |
|
|
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