Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

ofind finds non-unique cell magics #1906

Merged
merged 3 commits into from
Jun 11, 2012
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
2 changes: 1 addition & 1 deletion IPython/core/completer.py
Original file line number Diff line number Diff line change
Expand Up @@ -79,7 +79,7 @@

from IPython.config.configurable import Configurable
from IPython.core.error import TryNext
from IPython.core.prefilter import ESC_MAGIC
from IPython.core.inputsplitter import ESC_MAGIC
from IPython.utils import generics
from IPython.utils import io
from IPython.utils.dir2 import dir2
Expand Down
1 change: 1 addition & 0 deletions IPython/core/inputsplitter.py
Original file line number Diff line number Diff line change
Expand Up @@ -91,6 +91,7 @@
ESC_HELP = '?' # Find information about object
ESC_HELP2 = '??' # Find extra-detailed information about object
ESC_MAGIC = '%' # Call magic function
ESC_MAGIC2 = '%%' # Call cell-magic function
ESC_QUOTE = ',' # Split args on whitespace, quote each as string and call
ESC_QUOTE2 = ';' # Quote all args as a single string, call
ESC_PAREN = '/' # Call first argument with rest of line as arguments
Expand Down
23 changes: 16 additions & 7 deletions IPython/core/interactiveshell.py
Original file line number Diff line number Diff line change
Expand Up @@ -56,12 +56,12 @@
from IPython.core.fakemodule import FakeModule, init_fakemod_dict
from IPython.core.formatters import DisplayFormatter
from IPython.core.history import HistoryManager
from IPython.core.inputsplitter import IPythonInputSplitter
from IPython.core.inputsplitter import IPythonInputSplitter, ESC_MAGIC, ESC_MAGIC2
from IPython.core.logger import Logger
from IPython.core.macro import Macro
from IPython.core.payload import PayloadManager
from IPython.core.plugin import PluginManager
from IPython.core.prefilter import PrefilterManager, ESC_MAGIC
from IPython.core.prefilter import PrefilterManager
from IPython.core.profiledir import ProfileDir
from IPython.core.pylabtools import pylab_activate
from IPython.core.prompts import PromptManager
Expand Down Expand Up @@ -1348,7 +1348,9 @@ def _ofind(self, oname, namespaces=None):
"""
oname = oname.strip()
#print '1- oname: <%r>' % oname # dbg
if not py3compat.isidentifier(oname.lstrip(ESC_MAGIC), dotted=True):
if not oname.startswith(ESC_MAGIC) and \
not oname.startswith(ESC_MAGIC2) and \
not py3compat.isidentifier(oname, dotted=True):
return dict(found=False)

alias_ns = None
Expand Down Expand Up @@ -1406,11 +1408,18 @@ def _ofind(self, oname, namespaces=None):

# Try to see if it's magic
if not found:
if oname.startswith(ESC_MAGIC):
oname = oname.lstrip(ESC_MAGIC)
obj = self.find_line_magic(oname)
if obj is None:
obj = None
if oname.startswith(ESC_MAGIC2):
oname = oname.lstrip(ESC_MAGIC2)
obj = self.find_cell_magic(oname)
elif oname.startswith(ESC_MAGIC):
oname = oname.lstrip(ESC_MAGIC)
obj = self.find_line_magic(oname)
else:
# search without prefix, so run? will find %run?
obj = self.find_line_magic(oname)
if obj is None:
obj = self.find_cell_magic(oname)
if obj is not None:
found = True
ospace = 'IPython internal'
Expand Down
2 changes: 1 addition & 1 deletion IPython/core/magic.py
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@
from IPython.config.configurable import Configurable
from IPython.core import oinspect
from IPython.core.error import UsageError
from IPython.core.prefilter import ESC_MAGIC
from IPython.core.inputsplitter import ESC_MAGIC
from IPython.external.decorator import decorator
from IPython.utils.ipstruct import Struct
from IPython.utils.process import arg_split
Expand Down
2 changes: 1 addition & 1 deletion IPython/core/magics/basic.py
Original file line number Diff line number Diff line change
Expand Up @@ -20,8 +20,8 @@

# Our own packages
from IPython.core.error import UsageError
from IPython.core.inputsplitter import ESC_MAGIC
from IPython.core.magic import Magics, magics_class, line_magic
from IPython.core.prefilter import ESC_MAGIC
from IPython.utils.text import format_screen
from IPython.core import magic_arguments, page
from IPython.testing.skipdoctest import skip_doctest
Expand Down
20 changes: 10 additions & 10 deletions IPython/core/prefilter.py
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,16 @@
from IPython.core.alias import AliasManager
from IPython.core.autocall import IPyAutocall
from IPython.config.configurable import Configurable
from IPython.core.inputsplitter import (
ESC_SHELL,
ESC_SH_CAP,
ESC_HELP,
ESC_MAGIC,
ESC_MAGIC2,
ESC_QUOTE,
ESC_QUOTE2,
ESC_PAREN,
)
from IPython.core.macro import Macro
from IPython.core.splitinput import split_user_input, LineInfo
from IPython.core import page
Expand All @@ -44,16 +54,6 @@
# Global utilities, errors and constants
#-----------------------------------------------------------------------------

# Warning, these cannot be changed unless various regular expressions
# are updated in a number of places. Not great, but at least we told you.
ESC_SHELL = '!'
ESC_SH_CAP = '!!'
ESC_HELP = '?'
ESC_MAGIC = '%'
ESC_QUOTE = ','
ESC_QUOTE2 = ';'
ESC_PAREN = '/'


class PrefilterError(Exception):
pass
Expand Down
32 changes: 32 additions & 0 deletions IPython/core/tests/test_magic.py
Original file line number Diff line number Diff line change
Expand Up @@ -662,3 +662,35 @@ def test_script_defaults():
pass
else:
nt.assert_in(cmd, ip.magics_manager.magics['cell'])


@magics_class
class FooFoo(Magics):
"""class with both %foo and %%foo magics"""
@line_magic('foo')
def line_foo(self, line):
"I am line foo"
pass

@cell_magic("foo")
def cell_foo(self, line, cell):
"I am cell foo, not line foo"
pass

def test_line_cell_info():
"""%%foo and %foo magics are distinguishable to inspect"""
ip = get_ipython()
ip.magics_manager.register(FooFoo)
oinfo = ip.object_inspect('foo')
nt.assert_true(oinfo['found'])
nt.assert_true(oinfo['ismagic'])

oinfo = ip.object_inspect('%%foo')
nt.assert_true(oinfo['found'])
nt.assert_true(oinfo['ismagic'])
nt.assert_equals(oinfo['docstring'], FooFoo.cell_foo.__doc__)

oinfo = ip.object_inspect('%foo')
nt.assert_true(oinfo['found'])
nt.assert_true(oinfo['ismagic'])
nt.assert_equals(oinfo['docstring'], FooFoo.line_foo.__doc__)