mirror of https://github.com/python/cpython
Extend the pwd & grp emulations to support accessing the pwd/grp
record tuple by name as well as index, to match the behaviour of the pwd/grp extension modules for Unix. These emulation modules now pass test_pwd & test_grp.
This commit is contained in:
parent
28df64ac47
commit
71d74e87cb
|
@ -2,7 +2,7 @@
|
|||
# extension module.
|
||||
|
||||
# written by Andrew MacIntyre, April 2001.
|
||||
# released into the public domain "as is", with NO WARRANTY
|
||||
# updated July 2003, adding field accessor support
|
||||
|
||||
# note that this implementation checks whether ":" or ";" as used as
|
||||
# the field separator character.
|
||||
|
@ -96,6 +96,40 @@ def __get_field_sep(record):
|
|||
else:
|
||||
raise KeyError, '>> group database fields not delimited <<'
|
||||
|
||||
# class to match the new record field name accessors.
|
||||
# the resulting object is intended to behave like a read-only tuple,
|
||||
# with each member also accessible by a field name.
|
||||
class Group:
|
||||
def __init__(self, name, passwd, gid, mem):
|
||||
self.__dict__['gr_name'] = name
|
||||
self.__dict__['gr_passwd'] = passwd
|
||||
self.__dict__['gr_gid'] = gid
|
||||
self.__dict__['gr_mem'] = mem
|
||||
self.__dict__['_record'] = (self.gr_name, self.gr_passwd,
|
||||
self.gr_gid, self.gr_mem)
|
||||
|
||||
def __len__(self):
|
||||
return 4
|
||||
|
||||
def __getitem__(self, key):
|
||||
return self._record[key]
|
||||
|
||||
def __setattr__(self, name, value):
|
||||
raise AttributeError('attribute read-only: %s' % name)
|
||||
|
||||
def __repr__(self):
|
||||
return str(self._record)
|
||||
|
||||
def __cmp__(self, other):
|
||||
this = str(self._record)
|
||||
if this == other:
|
||||
return 0
|
||||
elif this < other:
|
||||
return -1
|
||||
else:
|
||||
return 1
|
||||
|
||||
|
||||
# read the whole file, parsing each entry into tuple form
|
||||
# with dictionaries to speed recall by GID or group name
|
||||
def __read_group_file():
|
||||
|
@ -113,7 +147,8 @@ def __read_group_file():
|
|||
sep = __get_field_sep(entry)
|
||||
fields = entry.split(sep)
|
||||
fields[2] = int(fields[2])
|
||||
record = tuple(fields)
|
||||
fields[3] = [f.strip() for f in fields[3].split(',')]
|
||||
record = Group(*fields)
|
||||
if not gidx.has_key(fields[2]):
|
||||
gidx[fields[2]] = record
|
||||
if not namx.has_key(fields[0]):
|
||||
|
|
|
@ -2,7 +2,7 @@
|
|||
# extension module.
|
||||
|
||||
# written by Andrew MacIntyre, April 2001.
|
||||
# released into the public domain "as is", with NO WARRANTY
|
||||
# updated July 2003, adding field accessor support
|
||||
|
||||
# note that this implementation checks whether ":" or ";" as used as
|
||||
# the field separator character. Path conversions are are applied when
|
||||
|
@ -115,6 +115,45 @@ def __get_field_sep(record):
|
|||
else:
|
||||
raise KeyError, '>> passwd database fields not delimited <<'
|
||||
|
||||
# class to match the new record field name accessors.
|
||||
# the resulting object is intended to behave like a read-only tuple,
|
||||
# with each member also accessible by a field name.
|
||||
class Passwd:
|
||||
def __init__(self, name, passwd, uid, gid, gecos, dir, shell):
|
||||
self.__dict__['pw_name'] = name
|
||||
self.__dict__['pw_passwd'] = passwd
|
||||
self.__dict__['pw_uid'] = uid
|
||||
self.__dict__['pw_gid'] = gid
|
||||
self.__dict__['pw_gecos'] = gecos
|
||||
self.__dict__['pw_dir'] = dir
|
||||
self.__dict__['pw_shell'] = shell
|
||||
self.__dict__['_record'] = (self.pw_name, self.pw_passwd,
|
||||
self.pw_uid, self.pw_gid,
|
||||
self.pw_gecos, self.pw_dir,
|
||||
self.pw_shell)
|
||||
|
||||
def __len__(self):
|
||||
return 7
|
||||
|
||||
def __getitem__(self, key):
|
||||
return self._record[key]
|
||||
|
||||
def __setattr__(self, name, value):
|
||||
raise AttributeError('attribute read-only: %s' % name)
|
||||
|
||||
def __repr__(self):
|
||||
return str(self._record)
|
||||
|
||||
def __cmp__(self, other):
|
||||
this = str(self._record)
|
||||
if this == other:
|
||||
return 0
|
||||
elif this < other:
|
||||
return -1
|
||||
else:
|
||||
return 1
|
||||
|
||||
|
||||
# read the whole file, parsing each entry into tuple form
|
||||
# with dictionaries to speed recall by UID or passwd name
|
||||
def __read_passwd_file():
|
||||
|
@ -135,7 +174,7 @@ def __read_passwd_file():
|
|||
fields[i] = int(fields[i])
|
||||
for i in (5, 6):
|
||||
fields[i] = __field_sep[sep](fields[i])
|
||||
record = tuple(fields)
|
||||
record = Passwd(*fields)
|
||||
if not uidx.has_key(fields[2]):
|
||||
uidx[fields[2]] = record
|
||||
if not namx.has_key(fields[0]):
|
||||
|
|
Loading…
Reference in New Issue