1c56e667b6e3e1c7db809ebbafefc62a54589dea3Georg Brandl"""Word completion for GNU readline.
22781fbe46c7f8d8e391c3f3f3e8692b451e6142fGuido van Rossum
3c56e667b6e3e1c7db809ebbafefc62a54589dea3Georg BrandlThe completer completes keywords, built-ins and globals in a selectable
4c56e667b6e3e1c7db809ebbafefc62a54589dea3Georg Brandlnamespace (which defaults to __main__); when completing NAME.NAME..., it
5c56e667b6e3e1c7db809ebbafefc62a54589dea3Georg Brandlevaluates (!) the expression up to the last dot and completes its attributes.
62781fbe46c7f8d8e391c3f3f3e8692b451e6142fGuido van Rossum
7c56e667b6e3e1c7db809ebbafefc62a54589dea3Georg BrandlIt's very cool to do "import sys" type "sys.", hit the completion key (twice),
8c56e667b6e3e1c7db809ebbafefc62a54589dea3Georg Brandland see the list of names defined by the sys module!
92781fbe46c7f8d8e391c3f3f3e8692b451e6142fGuido van Rossum
102781fbe46c7f8d8e391c3f3f3e8692b451e6142fGuido van RossumTip: to use the tab key as the completion key, call
112781fbe46c7f8d8e391c3f3f3e8692b451e6142fGuido van Rossum
122781fbe46c7f8d8e391c3f3f3e8692b451e6142fGuido van Rossum    readline.parse_and_bind("tab: complete")
132781fbe46c7f8d8e391c3f3f3e8692b451e6142fGuido van Rossum
142781fbe46c7f8d8e391c3f3f3e8692b451e6142fGuido van RossumNotes:
152781fbe46c7f8d8e391c3f3f3e8692b451e6142fGuido van Rossum
16c56e667b6e3e1c7db809ebbafefc62a54589dea3Georg Brandl- Exceptions raised by the completer function are *ignored* (and generally cause
17c56e667b6e3e1c7db809ebbafefc62a54589dea3Georg Brandl  the completion to fail).  This is a feature -- since readline sets the tty
18c56e667b6e3e1c7db809ebbafefc62a54589dea3Georg Brandl  device in raw (or cbreak) mode, printing a traceback wouldn't work well
19c56e667b6e3e1c7db809ebbafefc62a54589dea3Georg Brandl  without some complicated hoopla to save, reset and restore the tty state.
202781fbe46c7f8d8e391c3f3f3e8692b451e6142fGuido van Rossum
21c56e667b6e3e1c7db809ebbafefc62a54589dea3Georg Brandl- The evaluation of the NAME.NAME... form may cause arbitrary application
22c56e667b6e3e1c7db809ebbafefc62a54589dea3Georg Brandl  defined code to be executed if an object with a __getattr__ hook is found.
23c56e667b6e3e1c7db809ebbafefc62a54589dea3Georg Brandl  Since it is the responsibility of the application (or the user) to enable this
24c56e667b6e3e1c7db809ebbafefc62a54589dea3Georg Brandl  feature, I consider this an acceptable risk.  More complicated expressions
25c56e667b6e3e1c7db809ebbafefc62a54589dea3Georg Brandl  (e.g. function calls or indexing operations) are *not* evaluated.
262781fbe46c7f8d8e391c3f3f3e8692b451e6142fGuido van Rossum
272781fbe46c7f8d8e391c3f3f3e8692b451e6142fGuido van Rossum- GNU readline is also used by the built-in functions input() and
282781fbe46c7f8d8e391c3f3f3e8692b451e6142fGuido van Rossumraw_input(), and thus these also benefit/suffer from the completer
292781fbe46c7f8d8e391c3f3f3e8692b451e6142fGuido van Rossumfeatures.  Clearly an interactive application can benefit by
302781fbe46c7f8d8e391c3f3f3e8692b451e6142fGuido van Rossumspecifying its own completer function and using raw_input() for all
312781fbe46c7f8d8e391c3f3f3e8692b451e6142fGuido van Rossumits input.
322781fbe46c7f8d8e391c3f3f3e8692b451e6142fGuido van Rossum
332781fbe46c7f8d8e391c3f3f3e8692b451e6142fGuido van Rossum- When the original stdin is not a tty device, GNU readline is never
34c56e667b6e3e1c7db809ebbafefc62a54589dea3Georg Brandl  used, and this module (and the readline module) are silently inactive.
352781fbe46c7f8d8e391c3f3f3e8692b451e6142fGuido van Rossum
362781fbe46c7f8d8e391c3f3f3e8692b451e6142fGuido van Rossum"""
372781fbe46c7f8d8e391c3f3f3e8692b451e6142fGuido van Rossum
382781fbe46c7f8d8e391c3f3f3e8692b451e6142fGuido van Rossumimport __builtin__
392781fbe46c7f8d8e391c3f3f3e8692b451e6142fGuido van Rossumimport __main__
402781fbe46c7f8d8e391c3f3f3e8692b451e6142fGuido van Rossum
410de65807e6bdc5254f5a7e99b2f39adeea6b883bSkip Montanaro__all__ = ["Completer"]
420de65807e6bdc5254f5a7e99b2f39adeea6b883bSkip Montanaro
432781fbe46c7f8d8e391c3f3f3e8692b451e6142fGuido van Rossumclass Completer:
44dbab3e3178d8819a839ad08571f995376edcba00Neil Schemenauer    def __init__(self, namespace = None):
45dbab3e3178d8819a839ad08571f995376edcba00Neil Schemenauer        """Create a new completer for the command line.
46dbab3e3178d8819a839ad08571f995376edcba00Neil Schemenauer
47dbab3e3178d8819a839ad08571f995376edcba00Neil Schemenauer        Completer([namespace]) -> completer instance.
48dbab3e3178d8819a839ad08571f995376edcba00Neil Schemenauer
49dbab3e3178d8819a839ad08571f995376edcba00Neil Schemenauer        If unspecified, the default namespace where completions are performed
50dbab3e3178d8819a839ad08571f995376edcba00Neil Schemenauer        is __main__ (technically, __main__.__dict__). Namespaces should be
51dbab3e3178d8819a839ad08571f995376edcba00Neil Schemenauer        given as dictionaries.
52dbab3e3178d8819a839ad08571f995376edcba00Neil Schemenauer
53dbab3e3178d8819a839ad08571f995376edcba00Neil Schemenauer        Completer instances should be used as the completion mechanism of
54dbab3e3178d8819a839ad08571f995376edcba00Neil Schemenauer        readline via the set_completer() call:
55dbab3e3178d8819a839ad08571f995376edcba00Neil Schemenauer
56dbab3e3178d8819a839ad08571f995376edcba00Neil Schemenauer        readline.set_completer(Completer(my_namespace).complete)
57dbab3e3178d8819a839ad08571f995376edcba00Neil Schemenauer        """
58863ac44b74cd66f7d289748816d65c65808c149bTim Peters
59dbab3e3178d8819a839ad08571f995376edcba00Neil Schemenauer        if namespace and not isinstance(namespace, dict):
60dbab3e3178d8819a839ad08571f995376edcba00Neil Schemenauer            raise TypeError,'namespace must be a dictionary'
61dbab3e3178d8819a839ad08571f995376edcba00Neil Schemenauer
62dbab3e3178d8819a839ad08571f995376edcba00Neil Schemenauer        # Don't bind to namespace quite yet, but flag whether the user wants a
63dbab3e3178d8819a839ad08571f995376edcba00Neil Schemenauer        # specific namespace or to use __main__.__dict__. This will allow us
64dbab3e3178d8819a839ad08571f995376edcba00Neil Schemenauer        # to bind to __main__.__dict__ at completion time, not now.
65dbab3e3178d8819a839ad08571f995376edcba00Neil Schemenauer        if namespace is None:
66dbab3e3178d8819a839ad08571f995376edcba00Neil Schemenauer            self.use_main_ns = 1
67dbab3e3178d8819a839ad08571f995376edcba00Neil Schemenauer        else:
68dbab3e3178d8819a839ad08571f995376edcba00Neil Schemenauer            self.use_main_ns = 0
69dbab3e3178d8819a839ad08571f995376edcba00Neil Schemenauer            self.namespace = namespace
702781fbe46c7f8d8e391c3f3f3e8692b451e6142fGuido van Rossum
712781fbe46c7f8d8e391c3f3f3e8692b451e6142fGuido van Rossum    def complete(self, text, state):
7245e2fbc2e70ef28b1f0327207f33dab3a4e825c5Guido van Rossum        """Return the next possible completion for 'text'.
732781fbe46c7f8d8e391c3f3f3e8692b451e6142fGuido van Rossum
7445e2fbc2e70ef28b1f0327207f33dab3a4e825c5Guido van Rossum        This is called successively with state == 0, 1, 2, ... until it
7545e2fbc2e70ef28b1f0327207f33dab3a4e825c5Guido van Rossum        returns None.  The completion should begin with 'text'.
762781fbe46c7f8d8e391c3f3f3e8692b451e6142fGuido van Rossum
7745e2fbc2e70ef28b1f0327207f33dab3a4e825c5Guido van Rossum        """
78dbab3e3178d8819a839ad08571f995376edcba00Neil Schemenauer        if self.use_main_ns:
79dbab3e3178d8819a839ad08571f995376edcba00Neil Schemenauer            self.namespace = __main__.__dict__
80863ac44b74cd66f7d289748816d65c65808c149bTim Peters
8145e2fbc2e70ef28b1f0327207f33dab3a4e825c5Guido van Rossum        if state == 0:
8245e2fbc2e70ef28b1f0327207f33dab3a4e825c5Guido van Rossum            if "." in text:
8345e2fbc2e70ef28b1f0327207f33dab3a4e825c5Guido van Rossum                self.matches = self.attr_matches(text)
8445e2fbc2e70ef28b1f0327207f33dab3a4e825c5Guido van Rossum            else:
8545e2fbc2e70ef28b1f0327207f33dab3a4e825c5Guido van Rossum                self.matches = self.global_matches(text)
86d458faadc303cef6fd07b9e22bfa9e08456426cfGuido van Rossum        try:
87d458faadc303cef6fd07b9e22bfa9e08456426cfGuido van Rossum            return self.matches[state]
88d458faadc303cef6fd07b9e22bfa9e08456426cfGuido van Rossum        except IndexError:
89d458faadc303cef6fd07b9e22bfa9e08456426cfGuido van Rossum            return None
902781fbe46c7f8d8e391c3f3f3e8692b451e6142fGuido van Rossum
9166c527755d0f751e4239328558082bf22f52d361Facundo Batista    def _callable_postfix(self, val, word):
9252597be2a15130ced487240159392a076d1c7ccaBrett Cannon        if hasattr(val, '__call__'):
9366c527755d0f751e4239328558082bf22f52d361Facundo Batista            word = word + "("
9466c527755d0f751e4239328558082bf22f52d361Facundo Batista        return word
9566c527755d0f751e4239328558082bf22f52d361Facundo Batista
962781fbe46c7f8d8e391c3f3f3e8692b451e6142fGuido van Rossum    def global_matches(self, text):
9745e2fbc2e70ef28b1f0327207f33dab3a4e825c5Guido van Rossum        """Compute matches when text is a simple name.
9845e2fbc2e70ef28b1f0327207f33dab3a4e825c5Guido van Rossum
99dbab3e3178d8819a839ad08571f995376edcba00Neil Schemenauer        Return a list of all keywords, built-in functions and names currently
100dbab3e3178d8819a839ad08571f995376edcba00Neil Schemenauer        defined in self.namespace that match.
10145e2fbc2e70ef28b1f0327207f33dab3a4e825c5Guido van Rossum
10245e2fbc2e70ef28b1f0327207f33dab3a4e825c5Guido van Rossum        """
10345e2fbc2e70ef28b1f0327207f33dab3a4e825c5Guido van Rossum        import keyword
10445e2fbc2e70ef28b1f0327207f33dab3a4e825c5Guido van Rossum        matches = []
10596bc1757ce5eb25cb536c03aabb06fcbc42b6d27Martin Panter        seen = {"__builtins__"}
10645e2fbc2e70ef28b1f0327207f33dab3a4e825c5Guido van Rossum        n = len(text)
10766c527755d0f751e4239328558082bf22f52d361Facundo Batista        for word in keyword.kwlist:
10866c527755d0f751e4239328558082bf22f52d361Facundo Batista            if word[:n] == text:
10996bc1757ce5eb25cb536c03aabb06fcbc42b6d27Martin Panter                seen.add(word)
11066c527755d0f751e4239328558082bf22f52d361Facundo Batista                matches.append(word)
11196bc1757ce5eb25cb536c03aabb06fcbc42b6d27Martin Panter        for nspace in [self.namespace, __builtin__.__dict__]:
11266c527755d0f751e4239328558082bf22f52d361Facundo Batista            for word, val in nspace.items():
11396bc1757ce5eb25cb536c03aabb06fcbc42b6d27Martin Panter                if word[:n] == text and word not in seen:
11496bc1757ce5eb25cb536c03aabb06fcbc42b6d27Martin Panter                    seen.add(word)
11566c527755d0f751e4239328558082bf22f52d361Facundo Batista                    matches.append(self._callable_postfix(val, word))
11645e2fbc2e70ef28b1f0327207f33dab3a4e825c5Guido van Rossum        return matches
1172781fbe46c7f8d8e391c3f3f3e8692b451e6142fGuido van Rossum
1182781fbe46c7f8d8e391c3f3f3e8692b451e6142fGuido van Rossum    def attr_matches(self, text):
11945e2fbc2e70ef28b1f0327207f33dab3a4e825c5Guido van Rossum        """Compute matches when text contains a dot.
12045e2fbc2e70ef28b1f0327207f33dab3a4e825c5Guido van Rossum
12145e2fbc2e70ef28b1f0327207f33dab3a4e825c5Guido van Rossum        Assuming the text is of the form NAME.NAME....[NAME], and is
122f5469cff1f90381819291bcddcc70f5aaf2da141Ezio Melotti        evaluable in self.namespace, it will be evaluated and its attributes
123dbab3e3178d8819a839ad08571f995376edcba00Neil Schemenauer        (as revealed by dir()) are used as possible completions.  (For class
124f0dfc7ac5c2f76baaae0c3b45bc339281cfa2adcWalter Dörwald        instances, class members are also considered.)
12545e2fbc2e70ef28b1f0327207f33dab3a4e825c5Guido van Rossum
12645e2fbc2e70ef28b1f0327207f33dab3a4e825c5Guido van Rossum        WARNING: this can still invoke arbitrary C code, if an object
12745e2fbc2e70ef28b1f0327207f33dab3a4e825c5Guido van Rossum        with a __getattr__ hook is evaluated.
12845e2fbc2e70ef28b1f0327207f33dab3a4e825c5Guido van Rossum
12945e2fbc2e70ef28b1f0327207f33dab3a4e825c5Guido van Rossum        """
13045e2fbc2e70ef28b1f0327207f33dab3a4e825c5Guido van Rossum        import re
13145e2fbc2e70ef28b1f0327207f33dab3a4e825c5Guido van Rossum        m = re.match(r"(\w+(\.\w+)*)\.(\w*)", text)
13245e2fbc2e70ef28b1f0327207f33dab3a4e825c5Guido van Rossum        if not m:
1334286138e7b06e5dd2cb1e8ebf12f768d018be3c2Georg Brandl            return []
13445e2fbc2e70ef28b1f0327207f33dab3a4e825c5Guido van Rossum        expr, attr = m.group(1, 3)
135627a666db05a0a70ac54fe6456719ee0530b5df7Georg Brandl        try:
136f3f67599fe2c1935c33eadceceea85286086e294Facundo Batista            thisobject = eval(expr, self.namespace)
137627a666db05a0a70ac54fe6456719ee0530b5df7Georg Brandl        except Exception:
138627a666db05a0a70ac54fe6456719ee0530b5df7Georg Brandl            return []
139f3f67599fe2c1935c33eadceceea85286086e294Facundo Batista
140f3f67599fe2c1935c33eadceceea85286086e294Facundo Batista        # get the content of the object, except __builtins__
141ef2b2f437e7160ea68d8087df43c069fa6534fb0Martin Panter        words = set(dir(thisobject))
142ef2b2f437e7160ea68d8087df43c069fa6534fb0Martin Panter        words.discard("__builtins__")
143f3f67599fe2c1935c33eadceceea85286086e294Facundo Batista
144f3f67599fe2c1935c33eadceceea85286086e294Facundo Batista        if hasattr(thisobject, '__class__'):
145ef2b2f437e7160ea68d8087df43c069fa6534fb0Martin Panter            words.add('__class__')
146ef2b2f437e7160ea68d8087df43c069fa6534fb0Martin Panter            words.update(get_class_members(thisobject.__class__))
14745e2fbc2e70ef28b1f0327207f33dab3a4e825c5Guido van Rossum        matches = []
14845e2fbc2e70ef28b1f0327207f33dab3a4e825c5Guido van Rossum        n = len(attr)
14945e2fbc2e70ef28b1f0327207f33dab3a4e825c5Guido van Rossum        for word in words:
150ef2b2f437e7160ea68d8087df43c069fa6534fb0Martin Panter            if word[:n] == attr:
151ef2b2f437e7160ea68d8087df43c069fa6534fb0Martin Panter                try:
152ef2b2f437e7160ea68d8087df43c069fa6534fb0Martin Panter                    val = getattr(thisobject, word)
153ef2b2f437e7160ea68d8087df43c069fa6534fb0Martin Panter                except Exception:
154ef2b2f437e7160ea68d8087df43c069fa6534fb0Martin Panter                    continue  # Exclude properties that are not set
15566c527755d0f751e4239328558082bf22f52d361Facundo Batista                word = self._callable_postfix(val, "%s.%s" % (expr, word))
15666c527755d0f751e4239328558082bf22f52d361Facundo Batista                matches.append(word)
157ef2b2f437e7160ea68d8087df43c069fa6534fb0Martin Panter        matches.sort()
15845e2fbc2e70ef28b1f0327207f33dab3a4e825c5Guido van Rossum        return matches
1592781fbe46c7f8d8e391c3f3f3e8692b451e6142fGuido van Rossum
1604e20de59dd5a9058c0d99c10d773b9d0bcbbe07dGuido van Rossumdef get_class_members(klass):
1614e20de59dd5a9058c0d99c10d773b9d0bcbbe07dGuido van Rossum    ret = dir(klass)
1624e20de59dd5a9058c0d99c10d773b9d0bcbbe07dGuido van Rossum    if hasattr(klass,'__bases__'):
1634e20de59dd5a9058c0d99c10d773b9d0bcbbe07dGuido van Rossum        for base in klass.__bases__:
1644e20de59dd5a9058c0d99c10d773b9d0bcbbe07dGuido van Rossum            ret = ret + get_class_members(base)
1654e20de59dd5a9058c0d99c10d773b9d0bcbbe07dGuido van Rossum    return ret
1664e20de59dd5a9058c0d99c10d773b9d0bcbbe07dGuido van Rossum
1673583cff5a9d55b9c1bc17b5d82670e5e6b0fc10dGeorg Brandltry:
1683583cff5a9d55b9c1bc17b5d82670e5e6b0fc10dGeorg Brandl    import readline
1693583cff5a9d55b9c1bc17b5d82670e5e6b0fc10dGeorg Brandlexcept ImportError:
1703583cff5a9d55b9c1bc17b5d82670e5e6b0fc10dGeorg Brandl    pass
1713583cff5a9d55b9c1bc17b5d82670e5e6b0fc10dGeorg Brandlelse:
1723583cff5a9d55b9c1bc17b5d82670e5e6b0fc10dGeorg Brandl    readline.set_completer(Completer().complete)
173