mirror of
https://salsa.debian.org/freeipa-team/freeipa.git
synced 2025-01-11 00:31:56 -06:00
Added CrudBackend abstract class defining generic CRUD API
This commit is contained in:
parent
39ad5ccffa
commit
225e2b0c93
@ -21,7 +21,7 @@
|
||||
Base classes for standard CRUD operations.
|
||||
"""
|
||||
|
||||
import frontend, errors
|
||||
import backend, frontend, errors
|
||||
|
||||
|
||||
class Add(frontend.Method):
|
||||
@ -63,3 +63,77 @@ class Find(frontend.Method):
|
||||
def get_options(self):
|
||||
for param in self.obj.params_minus_pk():
|
||||
yield param.__clone__(required=False)
|
||||
|
||||
|
||||
class CrudBackend(backend.Backend):
|
||||
"""
|
||||
Base class defining generic CRUD backend API.
|
||||
"""
|
||||
|
||||
def create(self, *kw):
|
||||
"""
|
||||
Create a new entry.
|
||||
|
||||
This method should take key word arguments representing the
|
||||
attributes the created entry will have.
|
||||
|
||||
If this methods constructs the primary_key internally, it should raise
|
||||
an exception if the primary_key was passed. Likewise, if this method
|
||||
requires the primary_key to be passed in from the caller, it should
|
||||
raise an exception if the primary key was *not* passed.
|
||||
|
||||
This method should return a dict of the exact entry as it was created
|
||||
in the backing store, including any automatically created attributes.
|
||||
"""
|
||||
raise NotImplementedError('%s.create()' % self.name)
|
||||
|
||||
def retrieve(self, primary_key):
|
||||
"""
|
||||
Retrieve an existing entry.
|
||||
|
||||
This method should take a single argument, the primary_key of the
|
||||
entry in question.
|
||||
|
||||
If such an entry exists, this method should return a dict
|
||||
representing that entry. If no such entry exists, this method
|
||||
should return None.
|
||||
"""
|
||||
raise NotImplementedError('%s.retrieve()' % self.name)
|
||||
|
||||
def update(self, primary_key, *kw):
|
||||
"""
|
||||
Update an existing entry.
|
||||
|
||||
This method should take one required argument, the primary_key of the
|
||||
entry to modify, plus optional keyword arguments for each of the
|
||||
attributes being updated.
|
||||
|
||||
This method should return a dict representing the entry as it now
|
||||
exists in the backing store. If no such entry exists, this method
|
||||
should return None.
|
||||
"""
|
||||
raise NotImplementedError('%s.update()' % self.name)
|
||||
|
||||
def delete(self, primary_key):
|
||||
"""
|
||||
Delete an existing entry.
|
||||
|
||||
This method should take one required argument, the primary_key of the
|
||||
entry to delete.
|
||||
"""
|
||||
raise NotImplementedError('%s.delete()' % self.name)
|
||||
|
||||
def search(self, **kw):
|
||||
"""
|
||||
Return entries matching specific criteria.
|
||||
|
||||
This method should take keyword arguments representing the search
|
||||
criteria. If a key is the name of an entry attribute, the value
|
||||
should be treated as a filter on that attribute. The meaning of
|
||||
keys outside this namespace is left to the implementation.
|
||||
|
||||
This method should return and iterable containing the matched
|
||||
entries, where each entry is a dict. If no entries are matched,
|
||||
this method should return an empty iterable.
|
||||
"""
|
||||
raise NotImplementedError('%s.search()' % self.name)
|
||||
|
@ -189,3 +189,54 @@ class test_Find(CrudChecker):
|
||||
['givenname', 'sn', 'initials']
|
||||
for param in api.Method.user_verb.options():
|
||||
assert param.required is False
|
||||
|
||||
|
||||
class test_CrudBackend(ClassChecker):
|
||||
"""
|
||||
Test the `ipalib.crud.CrudBackend` class.
|
||||
"""
|
||||
|
||||
_cls = crud.CrudBackend
|
||||
|
||||
def get_subcls(self):
|
||||
class ldap(self.cls):
|
||||
pass
|
||||
return ldap
|
||||
|
||||
def check_method(self, name, *args):
|
||||
o = self.cls()
|
||||
e = raises(NotImplementedError, getattr(o, name), *args)
|
||||
assert str(e) == 'CrudBackend.%s()' % name
|
||||
sub = self.subcls()
|
||||
e = raises(NotImplementedError, getattr(sub, name), *args)
|
||||
assert str(e) == 'ldap.%s()' % name
|
||||
|
||||
def test_create(self):
|
||||
"""
|
||||
Test the `ipalib.crud.CrudBackend.create` method.
|
||||
"""
|
||||
self.check_method('create')
|
||||
|
||||
def test_retrieve(self):
|
||||
"""
|
||||
Test the `ipalib.crud.CrudBackend.retrieve` method.
|
||||
"""
|
||||
self.check_method('retrieve', 'primary key')
|
||||
|
||||
def test_update(self):
|
||||
"""
|
||||
Test the `ipalib.crud.CrudBackend.update` method.
|
||||
"""
|
||||
self.check_method('update', 'primary key')
|
||||
|
||||
def test_delete(self):
|
||||
"""
|
||||
Test the `ipalib.crud.CrudBackend.delete` method.
|
||||
"""
|
||||
self.check_method('delete', 'primary key')
|
||||
|
||||
def test_search(self):
|
||||
"""
|
||||
Test the `ipalib.crud.CrudBackend.search` method.
|
||||
"""
|
||||
self.check_method('search')
|
||||
|
Loading…
Reference in New Issue
Block a user