File: test_catalog.py

package info (click to toggle)
python-scipy 0.5.2-0.1
  • links: PTS
  • area: main
  • in suites: etch, etch-m68k
  • size: 33,888 kB
  • ctags: 44,231
  • sloc: ansic: 156,256; cpp: 90,347; python: 89,604; fortran: 73,083; sh: 1,318; objc: 424; makefile: 342
file content (334 lines) | stat: -rw-r--r-- 12,030 bytes parent folder | download
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
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
import sys, os


from numpy.testing import *
set_package_path()
from weave import catalog
restore_path()

set_local_path()
from weave_test_utils import *
restore_path()


class test_default_dir(ScipyTestCase):
    def check_is_writable(self):
        path = catalog.default_dir()
        name = os.path.join(path,'dummy_catalog')
        test_file = open(name,'w')
        try:
            test_file.write('making sure default location is writable\n')
        finally:
            test_file.close()
            os.remove(name)

class test_os_dependent_catalog_name(ScipyTestCase):
    pass

class test_catalog_path(ScipyTestCase):
    def check_default(self):
        in_path = catalog.default_dir()
        path = catalog.catalog_path(in_path)
        d,f = os.path.split(path)
        assert(d == in_path)
        assert(f == catalog.os_dependent_catalog_name())
    def check_current(self):
        in_path = '.'
        path = catalog.catalog_path(in_path)
        d,f = os.path.split(path)
        assert(d == os.path.abspath(in_path))
        assert(f == catalog.os_dependent_catalog_name())
    def check_user(path):
        if sys.platform != 'win32':
            in_path = '~'
            path = catalog.catalog_path(in_path)
            d,f = os.path.split(path)
            assert(d == os.path.expanduser(in_path))
            assert(f == catalog.os_dependent_catalog_name())
    def check_module(self):
        # hand it a module and see if it uses the parent directory
        # of the module.
        path = catalog.catalog_path(os.__file__)
        d,f = os.path.split(os.__file__)
        d2,f = os.path.split(path)
        assert (d2 == d)
    def check_path(self):
        # use os.__file__ to get a usable directory.
        in_path,f = os.path.split(os.__file__)
        path = catalog.catalog_path(in_path)
        d,f = os.path.split(path)
        assert (d == in_path)
    def check_bad_path(self):
        # stupid_path_name
        in_path = 'stupid_path_name'
        path = catalog.catalog_path(in_path)
        assert (path is None)

class test_get_catalog(ScipyTestCase):
    """ This only tests whether new catalogs are created correctly.
        And whether non-existent return None correctly with read mode.
        Putting catalogs in the right place is all tested with
        catalog_dir tests.
    """
    def get_test_dir(self,erase = 0):
        # make sure tempdir catalog doesn't exist
        import tempfile, glob
        #temp = tempfile.gettempdir()
        pardir = tempfile.mktemp(suffix='cat_test')
        if not os.path.exists(pardir):
            os.mkdir(pardir)
        cat_glob = os.path.join(pardir,catalog.os_dependent_catalog_name()+'.*')
        cat_files = glob.glob(cat_glob)
        if erase:
            for cat_file in cat_files:
                os.remove(cat_file)
        return pardir
    def remove_dir(self,d):
        import distutils.dir_util
        distutils.dir_util.remove_tree(d)

    def check_nonexistent_catalog_is_none(self):
        pardir = self.get_test_dir(erase=1)
        cat = catalog.get_catalog(pardir,'r')
        self.remove_dir(pardir)
        assert(cat is None)
    def check_create_catalog(self):
        pardir = self.get_test_dir(erase=1)
        cat = catalog.get_catalog(pardir,'c')
        self.remove_dir(pardir)
        assert(cat is not None)

class test_catalog(ScipyTestCase):

    def clear_environ(self):
        if os.environ.has_key('PYTHONCOMPILED'):
            self.old_PYTHONCOMPILED = os.environ['PYTHONCOMPILED']
            del os.environ['PYTHONCOMPILED']
        else:
            self.old_PYTHONCOMPILED = None
    def reset_environ(self):
        if self.old_PYTHONCOMPILED:
            os.environ['PYTHONCOMPILED'] = self.old_PYTHONCOMPILED
            self.old_PYTHONCOMPILED = None
    def setUp(self):
        self.clear_environ()
    def tearDown(self):
        self.reset_environ()

    def check_set_module_directory(self):
        q = catalog.catalog()
        q.set_module_directory('bob')
        r = q.get_module_directory()
        assert (r == 'bob')
    def check_clear_module_directory(self):
        q = catalog.catalog()
        r = q.get_module_directory()
        assert (r is None)
        q.set_module_directory('bob')
        r = q.clear_module_directory()
        assert (r is None)
    def check_get_environ_path(self):
        if sys.platform == 'win32': sep = ';'
        else: sep = ':'
        os.environ['PYTHONCOMPILED'] = sep.join(('path1','path2','path3'))
        q = catalog.catalog()
        path = q.get_environ_path()
        assert(path == ['path1','path2','path3'])
    def check_build_search_order1(self):
        """ MODULE in search path should be replaced by module_dir.
        """
        q = catalog.catalog(['first','MODULE','third'])
        q.set_module_directory('second')
        order = q.build_search_order()
        assert(order == ['first','second','third',catalog.default_dir()])
    def check_build_search_order2(self):
        """ MODULE in search path should be removed if module_dir==None.
        """
        q = catalog.catalog(['first','MODULE','third'])
        order = q.build_search_order()
        assert(order == ['first','third',catalog.default_dir()])
    def check_build_search_order3(self):
        """ If MODULE is absent, module_dir shouldn't be in search path.
        """
        q = catalog.catalog(['first','second'])
        q.set_module_directory('third')
        order = q.build_search_order()
        assert(order == ['first','second',catalog.default_dir()])
    def check_build_search_order4(self):
        """ Make sure environment variable is getting used.
        """
        q = catalog.catalog(['first','second'])
        if sys.platform == 'win32': sep = ';'
        else: sep = ':'
        os.environ['PYTHONCOMPILED'] = sep.join(('MODULE','fourth','fifth'))
        q.set_module_directory('third')
        order = q.build_search_order()
        assert(order == ['first','second','third','fourth','fifth',catalog.default_dir()])

    def check_catalog_files1(self):
        """ Be sure we get at least one file even without specifying the path.
        """
        q = catalog.catalog()
        files = q.get_catalog_files()
        assert(len(files) == 1)

    def check_catalog_files2(self):
        """ Ignore bad paths in the path.
        """
        q = catalog.catalog()
        os.environ['PYTHONCOMPILED'] = '_some_bad_path_'
        files = q.get_catalog_files()
        assert(len(files) == 1)

    def check_get_existing_files1(self):
        """ Shouldn't get any files when temp doesn't exist and no path set.
        """
        clear_temp_catalog()
        q = catalog.catalog()
        files = q.get_existing_files()
        restore_temp_catalog()
        assert(len(files) == 0)
    def check_get_existing_files2(self):
        """ Shouldn't get a single file from the temp dir.
        """
        clear_temp_catalog()
        q = catalog.catalog()
        # create a dummy file
        import os
        q.add_function('code', os.getpid)
        del q
        q = catalog.catalog()
        files = q.get_existing_files()
        restore_temp_catalog()
        assert(len(files) == 1)

    def check_access_writable_file(self):
        """ There should always be a writable file -- even if it is in temp
        """
        q = catalog.catalog()
        file = q.get_writable_file()
        try:
            f = open(file,'w')
            f.write('bob')
        finally:
            f.close()
            os.remove(file)
    def check_writable_with_bad_path(self):
        """ There should always be a writable file -- even if search paths contain
            bad values.
        """
        if sys.platform == 'win32': sep = ';'
        else: sep = ':'
        os.environ['PYTHONCOMPILED'] = sep.join(('_bad_path_name_'))
        q = catalog.catalog()
        file = q.get_writable_file()
        try:
            f = open(file,'w')
            f.write('bob')
        finally:
            f.close()
        os.remove(file)
    def check_writable_dir(self):
        """ Check that we can create a file in the writable directory
        """
        q = catalog.catalog()
        d = q.get_writable_dir()
        file = os.path.join(d,'some_silly_file')
        try:
            f = open(file,'w')
            f.write('bob')
        finally:
            f.close()
            os.remove(file)
    def check_unique_module_name(self):
        """ Check that we can create a file in the writable directory
        """
        q = catalog.catalog()
        file = q.unique_module_name('bob')
        cfile1 = file+'.cpp'
        assert(not os.path.exists(cfile1))
        #make sure it is writable
        try:
            f = open(cfile1,'w')
            f.write('bob')
        finally:
            f.close()
        # try again with same code fragment -- should get unique name
        file = q.unique_module_name('bob')
        cfile2 = file+'.cpp'
        assert(not os.path.exists(cfile2+'.cpp'))
        os.remove(cfile1)
    def check_add_function_persistent1(self):
        """ Test persisting a function in the default catalog
        """
        clear_temp_catalog()
        q = catalog.catalog()
        # just use some already available functions
        import string
        funcs = [string.upper, string.lower, string.find,string.replace]
        for i in funcs:
            q.add_function_persistent('code',i)
        pfuncs = q.get_cataloged_functions('code')
        # any way to clean modules???
        restore_temp_catalog()
        for i in funcs:
            assert(i in pfuncs)

    def check_add_function_ordered(self):
        clear_temp_catalog()
        q = catalog.catalog()
        import string

        q.add_function('f',string.upper)
        q.add_function('f',string.lower)
        q.add_function('ff',string.find)
        q.add_function('ff',string.replace)
        q.add_function('fff',string.atof)
        q.add_function('fff',string.atoi)
        del q

        # now we're gonna make a new catalog with same code
        # but different functions in a specified module directory
        env_dir = empty_temp_dir()
        r = catalog.catalog(env_dir)
        r.add_function('ff',os.abort)
        r.add_function('ff',os.chdir)
        r.add_function('fff',os.access)
        r.add_function('fff',os.open)
        del r
        # now we're gonna make a new catalog with same code
        # but different functions in a user specified directory
        user_dir = empty_temp_dir()
        s = catalog.catalog(user_dir)
        import re
        s.add_function('fff',re.match)
        s.add_function('fff',re.purge)
        del s

        # open new catalog and make sure it retreives the functions
        # from d catalog instead of the temp catalog (made by q)
        os.environ['PYTHONCOMPILED'] = env_dir
        t = catalog.catalog(user_dir)
        funcs1 = t.get_functions('f')
        funcs2 = t.get_functions('ff')
        funcs3 = t.get_functions('fff')
        restore_temp_catalog()
        # make sure everything is read back in the correct order
        # a little cheating... I'm ignoring any functions that might have
        # been read in from a prior catalog file (such as the defualt one).
        # the test should really be made so that these aren't read in, but
        # until I get this figured out...
        #assert(funcs1 == [string.lower,string.upper])
        #assert(funcs2 == [os.chdir,os.abort,string.replace,string.find])
        #assert(funcs3 == [re.purge,re.match,os.open,
        #                  os.access,string.atoi,string.atof])
        assert(funcs1[:2] == [string.lower,string.upper]),`funcs1`
        assert(funcs2[:4] == [os.chdir,os.abort,string.replace,string.find])
        assert(funcs3[:6] == [re.purge,re.match,os.open,
                          os.access,string.atoi,string.atof])
        cleanup_temp_dir(user_dir)
        cleanup_temp_dir(env_dir)


if __name__ == '__main__':
    ScipyTest('weave.catalog').run()