[pypy-commit] pypy default: More tests and small fixes in 'grp'.

arigo noreply at buildbot.pypy.org
Fri Jun 28 21:16:52 CEST 2013


Author: Armin Rigo <arigo at tunes.org>
Branch: 
Changeset: r65083:ae8a5b721a0d
Date: 2013-06-28 21:16 +0200
http://bitbucket.org/pypy/pypy/changeset/ae8a5b721a0d/

Log:	More tests and small fixes in 'grp'.

diff --git a/lib_pypy/grp.py b/lib_pypy/grp.py
--- a/lib_pypy/grp.py
+++ b/lib_pypy/grp.py
@@ -8,6 +8,7 @@
 
 from ctypes import Structure, c_char_p, c_int, POINTER
 from ctypes_support import standard_c_lib as libc
+import _structseq
 
 try: from __pypy__ import builtinify
 except ImportError: builtinify = lambda f: f
@@ -23,32 +24,13 @@
         ('gr_mem', POINTER(c_char_p)),
         )
 
-class Group(object):
-    def __init__(self, gr_name, gr_passwd, gr_gid, gr_mem):
-        self.gr_name = gr_name
-        self.gr_passwd = gr_passwd
-        self.gr_gid = gr_gid
-        self.gr_mem = gr_mem
+class struct_group:
+    __metaclass__ = _structseq.structseqtype
 
-    def __getitem__(self, item):
-        if item == 0:
-            return self.gr_name
-        elif item == 1:
-            return self.gr_passwd
-        elif item == 2:
-            return self.gr_gid
-        elif item == 3:
-            return self.gr_mem
-        else:
-            raise IndexError(item)
-
-    def __len__(self):
-        return 4
-
-    def __repr__(self):
-        return str((self.gr_name, self.gr_passwd, self.gr_gid, self.gr_mem))
-
-    # whatever else...
+    gr_name   = _structseq.structseqfield(0)
+    gr_passwd = _structseq.structseqfield(1)
+    gr_gid    = _structseq.structseqfield(2)
+    gr_mem    = _structseq.structseqfield(3)
 
 libc.getgrgid.argtypes = [gid_t]
 libc.getgrgid.restype = POINTER(GroupStruct)
@@ -71,8 +53,8 @@
     while res.contents.gr_mem[i]:
         mem.append(res.contents.gr_mem[i])
         i += 1
-    return Group(res.contents.gr_name, res.contents.gr_passwd,
-                 res.contents.gr_gid, mem)
+    return struct_group((res.contents.gr_name, res.contents.gr_passwd,
+                         res.contents.gr_gid, mem))
 
 @builtinify
 def getgrgid(gid):
diff --git a/pypy/module/test_lib_pypy/test_grp_extra.py b/pypy/module/test_lib_pypy/test_grp_extra.py
--- a/pypy/module/test_lib_pypy/test_grp_extra.py
+++ b/pypy/module/test_lib_pypy/test_grp_extra.py
@@ -5,6 +5,22 @@
 except ImportError:
     py.test.skip("No grp module on this platform")
 
+def test_basic():
+    g = grp.getgrnam("root")
+    assert g.gr_gid == 0
+    assert g.gr_mem == ['root']
+    assert g.gr_name == 'root'
+    assert isinstance(g.gr_passwd, str)    # usually just 'x', don't hope :-)
+
 def test_extra():
     py.test.raises(TypeError, grp.getgrnam, False)
     py.test.raises(TypeError, grp.getgrnam, None)
+
+def test_struct_group():
+    g = grp.struct_group((10, 20, 30, 40))
+    assert len(g) == 4
+    assert list(g) == [10, 20, 30, 40]
+    assert g.gr_name == 10
+    assert g.gr_passwd == 20
+    assert g.gr_gid == 30
+    assert g.gr_mem == 40


More information about the pypy-commit mailing list