File: module_lister.py

package info (click to toggle)
pypy3 7.0.0%2Bdfsg-3
  • links: PTS, VCS
  • area: main
  • in suites: buster
  • size: 111,848 kB
  • sloc: python: 1,291,746; ansic: 74,281; asm: 5,187; cpp: 3,017; sh: 2,533; makefile: 544; xml: 243; lisp: 45; csh: 21; awk: 4
file content (61 lines) | stat: -rw-r--r-- 2,256 bytes parent folder | download | duplicates (3)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
#   Copyright 2000-2004 Michael Hudson-Doyle <micahel@gmail.com>
#
#                        All Rights Reserved
#
#
# Permission to use, copy, modify, and distribute this software and
# its documentation for any purpose is hereby granted without fee,
# provided that the above copyright notice appear in all copies and
# that both that copyright notice and this permission notice appear in
# supporting documentation.
#
# THE AUTHOR MICHAEL HUDSON DISCLAIMS ALL WARRANTIES WITH REGARD TO
# THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
# AND FITNESS, IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL,
# INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER
# RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF
# CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
# CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.

import os, sys

# for the completion support.
# this is all quite nastily written.
_packages = {}

def _make_module_list_dir(dir, suffs, prefix=''):
    l = []
    for fname in os.listdir(dir):
        file = os.path.join(dir, fname)
        if os.path.isfile(file):
            for suff in suffs:
                if fname.endswith(suff):
                    l.append( prefix + fname[:-len(suff)] )
                    break
        elif os.path.isdir(file) \
             and os.path.exists(os.path.join(file, "__init__.py")):
            l.append( prefix + fname )
            _packages[prefix + fname] = _make_module_list_dir(
                file, suffs, prefix + fname + '.' )
    return sorted(set(l))

def _make_module_list():
    import importlib.machinery
    suffs = [x for x in importlib.machinery.all_suffixes() if x != '.pyc']
    suffs.sort(reverse=True)
    _packages[''] = list(sys.builtin_module_names)
    for dir in sys.path:
        if dir == '':
            dir = '.'
        if os.path.isdir(dir):
            _packages[''] += _make_module_list_dir(dir, suffs)
    _packages[''].sort()

def find_modules(stem):
    l = stem.split('.')
    pack = '.'.join(l[:-1])
    try:
        mods = _packages[pack]
    except KeyError:
        raise ImportError("can't find \"%s\" package" % pack)
    return [mod for mod in mods if mod.startswith(stem)]