123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106 |
- import difflib
- import glob
- import gzip
- import os
- import tempfile
- import Cython.Build.Dependencies
- import Cython.Utils
- from Cython.TestUtils import CythonTest
- class TestCyCache(CythonTest):
- def setUp(self):
- CythonTest.setUp(self)
- self.temp_dir = tempfile.mkdtemp(
- prefix='cycache-test',
- dir='TEST_TMP' if os.path.isdir('TEST_TMP') else None)
- self.src_dir = tempfile.mkdtemp(prefix='src', dir=self.temp_dir)
- self.cache_dir = tempfile.mkdtemp(prefix='cache', dir=self.temp_dir)
- def cache_files(self, file_glob):
- return glob.glob(os.path.join(self.cache_dir, file_glob))
- def fresh_cythonize(self, *args, **kwargs):
- Cython.Utils.clear_function_caches()
- Cython.Build.Dependencies._dep_tree = None # discard method caches
- Cython.Build.Dependencies.cythonize(*args, **kwargs)
- def test_cycache_switch(self):
- content1 = 'value = 1\n'
- content2 = 'value = 2\n'
- a_pyx = os.path.join(self.src_dir, 'a.pyx')
- a_c = a_pyx[:-4] + '.c'
- open(a_pyx, 'w').write(content1)
- self.fresh_cythonize(a_pyx, cache=self.cache_dir)
- self.fresh_cythonize(a_pyx, cache=self.cache_dir)
- self.assertEqual(1, len(self.cache_files('a.c*')))
- a_contents1 = open(a_c).read()
- os.unlink(a_c)
- open(a_pyx, 'w').write(content2)
- self.fresh_cythonize(a_pyx, cache=self.cache_dir)
- a_contents2 = open(a_c).read()
- os.unlink(a_c)
- self.assertNotEqual(a_contents1, a_contents2, 'C file not changed!')
- self.assertEqual(2, len(self.cache_files('a.c*')))
- open(a_pyx, 'w').write(content1)
- self.fresh_cythonize(a_pyx, cache=self.cache_dir)
- self.assertEqual(2, len(self.cache_files('a.c*')))
- a_contents = open(a_c).read()
- self.assertEqual(
- a_contents, a_contents1,
- msg='\n'.join(list(difflib.unified_diff(
- a_contents.split('\n'), a_contents1.split('\n')))[:10]))
- def test_cycache_uses_cache(self):
- a_pyx = os.path.join(self.src_dir, 'a.pyx')
- a_c = a_pyx[:-4] + '.c'
- open(a_pyx, 'w').write('pass')
- self.fresh_cythonize(a_pyx, cache=self.cache_dir)
- a_cache = os.path.join(self.cache_dir, os.listdir(self.cache_dir)[0])
- gzip.GzipFile(a_cache, 'wb').write('fake stuff'.encode('ascii'))
- os.unlink(a_c)
- self.fresh_cythonize(a_pyx, cache=self.cache_dir)
- a_contents = open(a_c).read()
- self.assertEqual(a_contents, 'fake stuff',
- 'Unexpected contents: %s...' % a_contents[:100])
- def test_multi_file_output(self):
- a_pyx = os.path.join(self.src_dir, 'a.pyx')
- a_c = a_pyx[:-4] + '.c'
- a_h = a_pyx[:-4] + '.h'
- a_api_h = a_pyx[:-4] + '_api.h'
- open(a_pyx, 'w').write('cdef public api int foo(int x): return x\n')
- self.fresh_cythonize(a_pyx, cache=self.cache_dir)
- expected = [a_c, a_h, a_api_h]
- for output in expected:
- self.assertTrue(os.path.exists(output), output)
- os.unlink(output)
- self.fresh_cythonize(a_pyx, cache=self.cache_dir)
- for output in expected:
- self.assertTrue(os.path.exists(output), output)
- def test_options_invalidation(self):
- hash_pyx = os.path.join(self.src_dir, 'options.pyx')
- hash_c = hash_pyx[:-len('.pyx')] + '.c'
- open(hash_pyx, 'w').write('pass')
- self.fresh_cythonize(hash_pyx, cache=self.cache_dir, cplus=False)
- self.assertEqual(1, len(self.cache_files('options.c*')))
- os.unlink(hash_c)
- self.fresh_cythonize(hash_pyx, cache=self.cache_dir, cplus=True)
- self.assertEqual(2, len(self.cache_files('options.c*')))
- os.unlink(hash_c)
- self.fresh_cythonize(hash_pyx, cache=self.cache_dir, cplus=False, show_version=False)
- self.assertEqual(2, len(self.cache_files('options.c*')))
- os.unlink(hash_c)
- self.fresh_cythonize(hash_pyx, cache=self.cache_dir, cplus=False, show_version=True)
- self.assertEqual(2, len(self.cache_files('options.c*')))
|