diff --git a/scapy/main.py b/scapy/main.py index 100fdcdc60874531eb76fc1314a5d4108b283d1f..1513eac89c482e6d832f60873b7175df95269eb7 100644 --- a/scapy/main.py +++ b/scapy/main.py @@ -480,16 +480,11 @@ def interact(mydict=None,argv=None,mybanner=None,loglevel=20): banner = the_banner + " using IPython %s\n" % IPython.__version__ from IPython.terminal.embed import InteractiveShellEmbed from IPython.terminal.prompts import Prompts, Token - from IPython.utils.generics import complete_object from traitlets.config.loader import Config from scapy.packet import Packet cfg = Config() - @complete_object.when_type(Packet) - def complete_packet(obj, prev_completions): - return prev_completions + [fld.name for fld in obj.fields_desc] - try: get_ipython except NameError: diff --git a/scapy/packet.py b/scapy/packet.py index 7bed20c801624f1bb6a5c1f3a431f964132a0d85..3064dd3f2124eb2c59a3936d9e0c2f1c2ff384bc 100644 --- a/scapy/packet.py +++ b/scapy/packet.py @@ -284,6 +284,25 @@ class Packet(six.with_metaclass(Packet_metaclass, BasePacket)): pass return object.__delattr__(self, attr) + def _superdir(self): + """ + Return a list of slots and methods, including those from subclasses. + """ + attrs = set() + cls = self.__class__ + if hasattr(cls, '__all_slots__'): + attrs.update(cls.__all_slots__) + for bcls in cls.__mro__: + if hasattr(bcls, '__dict__'): + attrs.update(bcls.__dict__) + return attrs + + def __dir__(self): + """ + Add fields to tab completion list. + """ + return sorted(itertools.chain(self._superdir(), self.default_fields)) + def __repr__(self): s = "" ct = conf.color_theme