mirror of
https://salsa.debian.org/freeipa-team/freeipa.git
synced 2025-02-25 18:55:28 -06:00
Added CrudBackend abstract class defining generic CRUD API
This commit is contained in:
@@ -21,7 +21,7 @@
|
|||||||
Base classes for standard CRUD operations.
|
Base classes for standard CRUD operations.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
import frontend, errors
|
import backend, frontend, errors
|
||||||
|
|
||||||
|
|
||||||
class Add(frontend.Method):
|
class Add(frontend.Method):
|
||||||
@@ -63,3 +63,77 @@ class Find(frontend.Method):
|
|||||||
def get_options(self):
|
def get_options(self):
|
||||||
for param in self.obj.params_minus_pk():
|
for param in self.obj.params_minus_pk():
|
||||||
yield param.__clone__(required=False)
|
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']
|
['givenname', 'sn', 'initials']
|
||||||
for param in api.Method.user_verb.options():
|
for param in api.Method.user_verb.options():
|
||||||
assert param.required is False
|
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')
|
||||||
|
|||||||
Reference in New Issue
Block a user