Author: julianfoad Date: Thu Aug 11 20:56:26 2011 New Revision: 1156826 URL: http://svn.apache.org/viewvc?rev=1156826&view=rev Log: In the ctypes-python bindings: fix two RemoteRepository methods to return the Python types they claim to return, and add tests for these and other methods that had no tests.
This is an API change in the ctypes-python bindings. * subversion/bindings/ctypes-python/csvn/repos.py (RemoteRepository.list): Create and return a Python dictionary of svn_dirent_t objects instead of the Hash of pointer objects. (RemoteRepository.info): Dereference the pointer object and so return a svn_dirent_t object. * subversion/bindings/ctypes-python/test/remoterepos.py (RemoteRepositoryTestCase): Add tests for the list, info, proplist, propget and log methods. (The remaining untested method is 'cat', for which I have not yet been able to write a test that does not crash.) Modified: subversion/trunk/subversion/bindings/ctypes-python/csvn/repos.py subversion/trunk/subversion/bindings/ctypes-python/test/remoterepos.py Modified: subversion/trunk/subversion/bindings/ctypes-python/csvn/repos.py URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/bindings/ctypes-python/csvn/repos.py?rev=1156826&r1=1156825&r2=1156826&view=diff ============================================================================== --- subversion/trunk/subversion/bindings/ctypes-python/csvn/repos.py (original) +++ subversion/trunk/subversion/bindings/ctypes-python/csvn/repos.py Thu Aug 11 20:56:26 2011 @@ -154,7 +154,12 @@ class RemoteRepository(object): svn_ra_get_dir2(self, dirents.byref(), NULL, NULL, path, rev, fields, dirents.pool) self.iterpool.clear() - return dirents + # Create a Python dict of svn_dirent_t objects from this Hash of + # pointers to svn_dirent_t. + result = {} + for path, dirent_p in dirents.items(): + result[path] = dirent_p[0] + return result def cat(self, buffer, path, rev = SVN_INVALID_REVNUM): """Get PATH@REV and save it to BUFFER. BUFFER must be a Python file @@ -178,7 +183,7 @@ class RemoteRepository(object): rev = self.latest_revnum() svn_ra_stat(self, path, rev, byref(dirent), dirent.pool) self.iterpool.clear() - return dirent + return dirent[0] def proplist(self, path, rev = SVN_INVALID_REVNUM): """Return a dictionary containing the properties on PATH@REV Modified: subversion/trunk/subversion/bindings/ctypes-python/test/remoterepos.py URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/bindings/ctypes-python/test/remoterepos.py?rev=1156826&r1=1156825&r2=1156826&view=diff ============================================================================== --- subversion/trunk/subversion/bindings/ctypes-python/test/remoterepos.py (original) +++ subversion/trunk/subversion/bindings/ctypes-python/test/remoterepos.py Thu Aug 11 20:56:26 2011 @@ -27,6 +27,13 @@ from csvn.core import * from urllib import pathname2url from csvn.repos import LocalRepository, RemoteRepository from stat import * +from sys import version_info # For Python version check +if version_info[0] >= 3: + # Python >=3.0 + from io import StringIO +else: + # Python <3.0 + from StringIO import StringIO repos_location = os.path.join(tempfile.gettempdir(), "svn_test_repos") repos_url = pathname2url(repos_location) @@ -64,6 +71,15 @@ class RemoteRepositoryTestCase(unittest. if os.path.exists(repos_location): svn_repos_delete(repos_location, Pool()) + def svn_dirent_t_assert_equal(self, a, b): + """Assert that two svn_dirent_t's are equal, ignoring their 'time' + fields.""" + self.assertEqual(a.kind, b.kind) + self.assertEqual(a.size, b.size) + self.assertEqual(a.has_props, b.has_props) + self.assertEqual(a.created_rev, b.created_rev) + self.assertEqual(a.last_author, b.last_author) + def test_remote_latest_revnum(self): self.assertEqual(9, self.repos.latest_revnum()) @@ -77,6 +93,50 @@ class RemoteRepositoryTestCase(unittest. self.assertEqual(svn_node_none, self.repos.check_path("does_not_compute")) + def test_list(self): + expected = { + 'README.txt': + svn_dirent_t(kind=svn_node_file, size=159, has_props=True, + created_rev=9, last_author=String('bruce')), + 'ANOTHERREADME.txt': + svn_dirent_t(kind=svn_node_file, size=66, has_props=False, + created_rev=4, last_author=String('clark')) } + found = self.repos.list("trunk") + self.assertEqual(sorted(found.keys()), sorted(expected.keys())) + for path in found: + self.svn_dirent_t_assert_equal(found[path], expected[path]) + + def test_info(self): + e = svn_dirent_t(kind=svn_node_file, size=159, has_props=True, + created_rev=9, last_author=String('bruce')) + f = self.repos.info("trunk/README.txt") + self.svn_dirent_t_assert_equal(f, e) + + def test_proplist(self): + expected = { 'Awesome': 'Yes', + 'svn:entry:last-author': 'bruce', + 'svn:entry:committed-rev': '9' } + found = self.repos.proplist("trunk/README.txt") + # Check results, ignoring some entry-props + del found['svn:entry:committed-date'] + del found['svn:entry:uuid'] + self.assertEqual(sorted(found.keys()), sorted(expected.keys())) + for pname in found: + self.assertEqual(found[pname], expected[pname]) + + def test_propget(self): + found = self.repos.propget("Awesome", "trunk/README.txt") + self.assertEqual(found, "Yes") + + def test_log(self): + expected = [ (8, 'clark'), + (9, 'bruce') ] + for found in self.repos.log(7, 9, ["trunk/README.txt"]): + (e_rev, e_author) = expected[0] + self.assertEqual(found.revision, e_rev) + self.assertEqual(found.author, e_author) + expected = expected[1:] + def test_revprop_list(self): # Test argument-free case props = self.repos.revprop_list()