File: test_pythonlib

package info (click to toggle)
decompyle 2.3.2-2
  • links: PTS
  • area: main
  • in suites: sarge
  • size: 2,320 kB
  • ctags: 66,234
  • sloc: python: 70,351; ansic: 2,312; makefile: 49; sh: 14
file content (115 lines) | stat: -rwxr-xr-x 3,524 bytes parent folder | download | duplicates (4)
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
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
#!/usr/bin/env python2
# emacs-mode: -*-python-*-
"""
test_pythonlib -- decompyle ans verify Python libraries

Usage-Examples:

  test_pythonlib --all		# decompyle all tests (suite + libs)
  test_pythonlib --all --verify	# decomyple all tests and verify results
  test_pythonlib --test		# decompyle only the testsuite
  test_pythonlib --2.2 --verify	# decompyle and verify python lib 2.2

Adding own test-trees:

Step 1) Edit this file and add a new entry to 'test_options', eg.
          test_options['mylib'] = ('/usr/lib/mylib', PYOC, 'mylib')
Step 2: Run the test:
	  test_pythonlib --mylib	  # decompyle 'mylib'
	  test_pythonlib --mylib --verify # decomyple verify 'mylib'
"""

import decompyle
import os, time, shutil
from fnmatch import fnmatch

#----- configure this for your needs

target_base = '/tmp/py-dis/'
lib_prefix = '/usr/lib'

PYC = ('*.pyc', )
PYO = ('*.pyo', )
PYOC = ('*.pyc', '*.pyo')

test_options = {
    # name: (src_basedir, pattern, output_base_suffix)
    'test': ('./test', PYOC, 'test'),
    '1.5': (os.path.join(lib_prefix, 'python1.5'), PYC, 'python-lib1.5'),
    '1.6': (os.path.join(lib_prefix, 'python1.6'), PYC, 'python-lib1.6'),
    '2.0': (os.path.join(lib_prefix, 'python2.0'), PYC, 'python-lib2.0'),
    '2.1': (os.path.join(lib_prefix, 'python2.1'), PYC, 'python-lib2.1'),
    '2.2': (os.path.join(lib_prefix, 'python2.2'), PYC, 'python-lib2.2'),
    }

#-----

def do_tests(src_dir, patterns, target_dir, start_with=None, do_verify=0):

    def visitor(files, dirname, names):
        files.extend(
            [os.path.normpath(os.path.join(dirname, n))
                 for n in names
                    for pat in patterns
                        if fnmatch(n, pat)])

    files = []
    cwd = os.getcwd()
    os.chdir(src_dir)
    os.path.walk(os.curdir, visitor, files)
    os.chdir(cwd)
    files.sort()

    if start_with:
        try:
            start_with = files.index(start_with)
            files = files[start_with:]
            print '>>> starting with file', files[0]
        except ValueError:
            pass

    print time.ctime()
    decompyle.main(src_dir, target_dir, files, do_verify=do_verify)
    print time.ctime()
    
if __name__ == '__main__':
    import getopt, sys

    do_verify = 0
    test_dirs = []
    start_with = None

    test_options_keys = test_options.keys(); test_options_keys.sort()
    opts, args = getopt.getopt(sys.argv[1:], '',
                               ['start-with=', 'verify', 'all', ] \
                               + test_options_keys )
    for opt, val in opts:
        if opt == '--verify':
            do_verify = 1
        elif opt == '--start-with':
            start_with = val
        elif opt[2:] in test_options_keys:
            test_dirs.append(test_options[opt[2:]])
        elif opt == '--all':
            for val in test_options_keys:
                test_dirs.append(test_options[val])

    for src_dir, pattern, target_dir in test_dirs:
        if os.path.exists(src_dir):
            target_dir = os.path.join(target_base, target_dir)
            if os.path.exists(target_dir):
                shutil.rmtree(target_dir, ignore_errors=1)
            do_tests(src_dir, pattern, target_dir, start_with, do_verify)
        else:
            print '### skipping', src_dir

# python 1.5:

# test/re_tests		memory error
# test/test_b1		memory error

# Verification notes:
# - xdrlib fails verification due the same lambda used twice
#   (verification is successfull when using original .pyo as
#   input)
#