I committed this API change (below) in the ctypes-python bindings.
Should I be revving these APIs in some way, to maintain backward
compatibility, or is this kind of fix considered fair game?

- Julian


On Thu, 2011-08-11 at 20:56 +0000, julianf...@apache.org wrote:
> 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()
> 
> 


Reply via email to