diff options
| author | J08nY | 2022-09-25 19:06:10 +0200 |
|---|---|---|
| committer | J08nY | 2022-09-25 19:06:10 +0200 |
| commit | eb7a8c469734cda26f1e6949bd9931389cf50d4b (patch) | |
| tree | 91e134bbeeff63f4f49cb8aaa1fdd223d0502413 | |
| parent | cf15b66cb1b2b3e3abd199bf18ad85a633cb955c (diff) | |
| download | sec-certs-eb7a8c469734cda26f1e6949bd9931389cf50d4b.tar.gz sec-certs-eb7a8c469734cda26f1e6949bd9931389cf50d4b.tar.zst sec-certs-eb7a8c469734cda26f1e6949bd9931389cf50d4b.zip | |
Properly handle duplicates in dependency finder.
Do not assign references to duplicates other than the main one.
| -rw-r--r-- | sec_certs/model/dependency_finder.py | 39 |
1 files changed, 14 insertions, 25 deletions
diff --git a/sec_certs/model/dependency_finder.py b/sec_certs/model/dependency_finder.py index c28db350..8644b3dc 100644 --- a/sec_certs/model/dependency_finder.py +++ b/sec_certs/model/dependency_finder.py @@ -112,30 +112,16 @@ class DependencyFinder: return result if result else None def _build_referencing( - self, - certificates: Certificates, - id_func: IDLookupFunc, - referenced_by_direct: ReferencedByDirect, - referenced_by_indirect: ReferencedByIndirect, - ): - for dgst in certificates: - cert_id = id_func(certificates[dgst]) - self.dependencies[dgst] = {} - - if not cert_id: - continue - - self.dependencies[dgst]["directly_referenced_by"] = referenced_by_direct.get(cert_id, None) - - self.dependencies[dgst]["indirectly_referenced_by"] = referenced_by_indirect.get(cert_id, None) - - self.dependencies[dgst]["directly_referencing"] = self._get_reverse_dependencies( - cert_id, referenced_by_direct - ) - - self.dependencies[dgst]["indirectly_referencing"] = self._get_reverse_dependencies( - cert_id, referenced_by_indirect - ) + self, referenced_by_direct: ReferencedByDirect, referenced_by_indirect: ReferencedByIndirect + ) -> None: + for cert_id, cert_digests in self.id_mapping.items(): + cert_dgst = cert_digests[0] + self.dependencies[cert_dgst] = { + "directly_referenced_by": referenced_by_direct.get(cert_id, None), + "indirectly_referenced_by": referenced_by_indirect.get(cert_id, None), + "directly_referencing": self._get_reverse_dependencies(cert_id, referenced_by_direct), + "indirectly_referencing": self._get_reverse_dependencies(cert_id, referenced_by_indirect), + } def fit(self, certificates: Certificates, id_func: IDLookupFunc, ref_lookup_func: ReferenceLookupFunc) -> None: """ @@ -154,7 +140,7 @@ class DependencyFinder: referenced_by_direct, referenced_by_indirect = self._build_referenced_by(certificates, ref_lookup_func) # Build the referencing second (this actually writes into self.dependencies). - self._build_referencing(certificates, id_func, referenced_by_direct, referenced_by_indirect) + self._build_referencing(referenced_by_direct, referenced_by_indirect) self._fitted = True @property @@ -206,6 +192,9 @@ class DependencyFinder: res = filter(lambda cert_id: cert_id in self.id_mapping, res) return set(res) + if dgst not in self.dependencies: + return References() + return References( wrap(self.dependencies[dgst].get("directly_referenced_by", None)), wrap(self.dependencies[dgst].get("indirectly_referenced_by", None)), |
