mirror of
https://salsa.debian.org/freeipa-team/freeipa.git
synced 2024-12-23 07:33:27 -06:00
8: Experimental work on more OO definition of what gets pluged into API.commands
This commit is contained in:
parent
26c9f4c881
commit
e76160b01d
@ -101,7 +101,7 @@ class NameSpace(object):
|
||||
|
||||
__locked = False # Whether __setattr__ has been locked
|
||||
|
||||
def __init__(self, kw):
|
||||
def __init__(self, kw, order=None):
|
||||
"""
|
||||
The single constructor argument `kw` is a dict of the (key, value)
|
||||
pairs to be in this NameSpace instance.
|
||||
@ -111,7 +111,11 @@ class NameSpace(object):
|
||||
for (key, value) in self.__kw.items():
|
||||
assert not key.startswith('_')
|
||||
setattr(self, key, value)
|
||||
if order is None:
|
||||
self.__keys = sorted(self.__kw)
|
||||
else:
|
||||
self.__keys = list(order)
|
||||
assert set(self.__keys) == set(self.__kw)
|
||||
self.__locked = True
|
||||
|
||||
def __setattr__(self, name, value):
|
||||
|
83
ipalib/crud.py
Normal file
83
ipalib/crud.py
Normal file
@ -0,0 +1,83 @@
|
||||
# Authors:
|
||||
# Jason Gerard DeRose <jderose@redhat.com>
|
||||
#
|
||||
# Copyright (C) 2008 Red Hat
|
||||
# see file 'COPYING' for use and warranty information
|
||||
#
|
||||
# This program is free software; you can redistribute it and/or
|
||||
# modify it under the terms of the GNU General Public License as
|
||||
# published by the Free Software Foundation; version 2 only
|
||||
#
|
||||
# This program is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
# GNU General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU General Public License
|
||||
# along with this program; if not, write to the Free Software
|
||||
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
|
||||
"""
|
||||
|
||||
"""
|
||||
|
||||
from base import NameSpace
|
||||
|
||||
class Named(object):
|
||||
def __get_name(self):
|
||||
return self.__class__.__name__
|
||||
name = property(__get_name)
|
||||
|
||||
class ObjectMember(Named):
|
||||
def __init__(self, obj):
|
||||
self.__obj = obj
|
||||
|
||||
def __get_obj(self):
|
||||
return self.__obj
|
||||
obj = property(__get_obj)
|
||||
|
||||
|
||||
class Command(ObjectMember):
|
||||
def __get_full_name(self):
|
||||
return '%s_%s' % (self.name, self.obj.name)
|
||||
full_name = property(__get_full_name)
|
||||
|
||||
class Attribute(ObjectMember):
|
||||
def __get_full_name(self):
|
||||
return '%s_%s' % (self.obj.name, self.name)
|
||||
full_name = property(__get_full_name)
|
||||
|
||||
|
||||
class Object(Named):
|
||||
def __init__(self):
|
||||
self.__commands = self.__build_ns(self.get_commands)
|
||||
self.__attributes = self.__build_ns(self.get_attributes, True)
|
||||
|
||||
def __get_commands(self):
|
||||
return self.__commands
|
||||
commands = property(__get_commands)
|
||||
|
||||
def __get_attributes(self):
|
||||
return self.__attributes
|
||||
attributes = property(__get_attributes)
|
||||
|
||||
def __build_ns(self, callback, preserve=False):
|
||||
d = {}
|
||||
o = []
|
||||
for cls in callback():
|
||||
i = cls(self)
|
||||
assert i.name not in d
|
||||
d[i.name] = i
|
||||
o.append(i.name)
|
||||
if preserve:
|
||||
return NameSpace(d, order=o)
|
||||
return NameSpace(d)
|
||||
|
||||
def __get_commands(self):
|
||||
return
|
||||
|
||||
def get_commands(self):
|
||||
raise NotImplementedError
|
||||
|
||||
def get_attributes(self):
|
||||
raise NotImplementedError
|
54
ipalib/identity.py
Normal file
54
ipalib/identity.py
Normal file
@ -0,0 +1,54 @@
|
||||
# hidden
|
||||
# read only
|
||||
# editable
|
||||
|
||||
|
||||
|
||||
|
||||
def get_label(self, _):
|
||||
return _('Title') # Enum?
|
||||
|
||||
def get_label(self, _):
|
||||
return _('First Name')
|
||||
|
||||
def get_label(self, _):
|
||||
return _('Last Name')
|
||||
|
||||
def get_label(self, _):
|
||||
return _('Full Name') # Autofill
|
||||
|
||||
def get_label(self, _):
|
||||
return _('Display Name') # Autofill
|
||||
|
||||
def get_label(self, _):
|
||||
return _('Initials') # generated/ro?
|
||||
|
||||
def get_label(self, _):
|
||||
return _('Account Status') # Enum (active, inactive)
|
||||
|
||||
def get_label(self, _):
|
||||
return _('Login')
|
||||
|
||||
def get_label(self, _):
|
||||
return _('Password')
|
||||
|
||||
def get_label(self, _): # Same field as above, special interface
|
||||
return _('Confirm Password')
|
||||
|
||||
def get_label(self, _):
|
||||
return _('UID') #ro
|
||||
|
||||
def get_label(self, _):
|
||||
return _('GID') #ro
|
||||
|
||||
def get_label(self, _):
|
||||
return _('Home Directory') #ro
|
||||
|
||||
def get_label(self, _):
|
||||
return _('Login Shell')
|
||||
|
||||
def get_label(self, _):
|
||||
return _('GECOS')
|
||||
|
||||
def get_label(self, _):
|
||||
return _('')
|
111
ipalib/tests/test_crud.py
Normal file
111
ipalib/tests/test_crud.py
Normal file
@ -0,0 +1,111 @@
|
||||
# Authors:
|
||||
# Jason Gerard DeRose <jderose@redhat.com>
|
||||
#
|
||||
# Copyright (C) 2008 Red Hat
|
||||
# see file 'COPYING' for use and warranty information
|
||||
#
|
||||
# This program is free software; you can redistribute it and/or
|
||||
# modify it under the terms of the GNU General Public License as
|
||||
# published by the Free Software Foundation; version 2 only
|
||||
#
|
||||
# This program is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
# GNU General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU General Public License
|
||||
# along with this program; if not, write to the Free Software
|
||||
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
|
||||
"""
|
||||
Unit tests for `ipalib.crud` module.
|
||||
"""
|
||||
|
||||
from ipalib import crud, base, exceptions
|
||||
|
||||
class create(crud.Command):
|
||||
pass
|
||||
|
||||
class retrieve(crud.Command):
|
||||
pass
|
||||
|
||||
class update(crud.Command):
|
||||
pass
|
||||
|
||||
class delete(crud.Command):
|
||||
pass
|
||||
|
||||
class givenName(crud.Attribute):
|
||||
pass
|
||||
|
||||
class sn(crud.Attribute):
|
||||
pass
|
||||
|
||||
class login(crud.Attribute):
|
||||
pass
|
||||
|
||||
|
||||
class user(crud.Object):
|
||||
def get_commands(self):
|
||||
return [
|
||||
create,
|
||||
retrieve,
|
||||
update,
|
||||
delete,
|
||||
]
|
||||
|
||||
def get_attributes(self):
|
||||
return [
|
||||
givenName,
|
||||
sn,
|
||||
login,
|
||||
]
|
||||
|
||||
|
||||
def test_Named():
|
||||
class named_class(crud.Named):
|
||||
pass
|
||||
|
||||
n = named_class()
|
||||
assert n.name == 'named_class'
|
||||
|
||||
|
||||
def test_Command():
|
||||
class user(object):
|
||||
name = 'user'
|
||||
class add(crud.Command):
|
||||
pass
|
||||
i = add(user())
|
||||
assert i.name == 'add'
|
||||
assert i.full_name == 'add_user'
|
||||
|
||||
|
||||
def test_Object():
|
||||
i = user()
|
||||
assert i.name == 'user'
|
||||
|
||||
# Test commands:
|
||||
commands = i.commands
|
||||
assert isinstance(commands, base.NameSpace)
|
||||
assert list(commands) == ['create', 'delete', 'retrieve', 'update']
|
||||
assert len(commands) == 4
|
||||
for name in commands:
|
||||
cls = globals()[name]
|
||||
cmd = commands[name]
|
||||
assert type(cmd) is cls
|
||||
assert getattr(commands, name) is cmd
|
||||
assert cmd.name == name
|
||||
assert cmd.full_name == ('%s_user' % name)
|
||||
|
||||
# Test attributes:
|
||||
attributes = i.attributes
|
||||
assert isinstance(attributes, base.NameSpace)
|
||||
assert list(attributes) == ['givenName', 'sn', 'login']
|
||||
assert len(attributes) == 3
|
||||
for name in attributes:
|
||||
cls = globals()[name]
|
||||
attr = attributes[name]
|
||||
assert type(attr) is cls
|
||||
assert getattr(attributes, name) is attr
|
||||
assert attr.name == name
|
||||
assert attr.full_name == ('user_%s' % name)
|
Loading…
Reference in New Issue
Block a user