diff --git a/knowledge/README.txt b/knowledge/README.txt index 0b98e36..b03af6d 100644 --- a/knowledge/README.txt +++ b/knowledge/README.txt @@ -49,7 +49,11 @@ programming with Python: Now we can ask what knowledge john is lacking if he would like to take the position offered: - >>> john.getMissingKnowledge(pos01) == (ooProg, pyOo,) + >>> missing = john.getMissingKnowledge(pos01) + >>> missing + (<...KnowledgeElement...>, <...KnowledgeElement...>) + + >>> missing == (ooProg, pyOo,) True Luckily there are a few elearning content objects out there that @@ -65,6 +69,10 @@ provide some of the knowledge needed: So that we are now able to find out what john has to study in order to fulfill the position offered: - >>> list(john.getProvidersNeeded(pos01)) + >>> prov = list(john.getProvidersNeeded(pos01)) + >>> len(prov) + 2 + >>> [d[0] for k, d in prov] == [doc01, doc02] + True diff --git a/knowledge/interfaces.py b/knowledge/interfaces.py index 531ab4b..ec0c340 100644 --- a/knowledge/interfaces.py +++ b/knowledge/interfaces.py @@ -90,10 +90,10 @@ class IKnowing(Interface): """ def getProvidersNeeded(position): - """ Return two tuples: first a tuple of knowledge providers that - provide knowledge needed for fulfilling the position given, - second a tuple with the requirements that could not - be met by the available knowledge providers. + """ Return a tuple of tuples: Each tuple has as its first element + a requirement of the position, the second element is a tuple + of the knowledge providers providing this knowledge + ((requirement, (provider, ...,)), ...). """ diff --git a/knowledge/knowing.py b/knowledge/knowing.py index 8ef0877..1e21b6e 100644 --- a/knowledge/knowing.py +++ b/knowledge/knowing.py @@ -45,8 +45,20 @@ class Knowing(object): del obj._knowers[self] def getMissingKnowledge(self, position): - # to be done - return tuple(position.getRequirements()) + knowledge = self.getKnowledge() + missing = [] + toCheck = [k for k in position.getRequirements() if k not in knowledge] + while toCheck: + k = toCheck.pop() + missing.insert(0, k) + for d in k.getDependencies(): + if d in knowledge or k in toCheck: + continue + if d in missing: + # TODO: rearrange missing, but care for cycles... + continue + toCheck.append(d) + return tuple(missing) def getProvidersNeeded(self, position): return ((k, k.getProviders())