2323import asyncio
2424import re
2525from itertools import chain
26- from typing import Optional , Mapping
26+ from typing import Optional
27+ from typing import Mapping
28+ from typing import List
2729from typing import Set
2830from typing import Tuple
2931from urllib .error import HTTPError
@@ -104,22 +106,22 @@ def _load_advisory(self, path: str) -> Optional[Advisory]:
104106
105107 # FIXME: Avoid wildcard version ranges for now.
106108 # See https://github.com/RustSec/advisory-db/discussions/831
107- affected_ranges = {
109+ affected_ranges = [
108110 VersionSpecifier .from_scheme_version_spec_string ("semver" , r )
109111 for r in chain .from_iterable (record .get ("affected" , {}).get ("functions" , {}).values ())
110112 if r != "*"
111- }
113+ ]
112114
113- unaffected_ranges = {
115+ unaffected_ranges = [
114116 VersionSpecifier .from_scheme_version_spec_string ("semver" , r )
115117 for r in record .get ("versions" , {}).get ("unaffected" , [])
116118 if r != "*"
117- }
118- resolved_ranges = {
119+ ]
120+ resolved_ranges = [
119121 VersionSpecifier .from_scheme_version_spec_string ("semver" , r )
120122 for r in record .get ("versions" , {}).get ("patched" , [])
121123 if r != "*"
122- }
124+ ]
123125
124126 unaffected , affected = categorize_versions (
125127 all_versions , unaffected_ranges , affected_ranges , resolved_ranges
@@ -153,9 +155,9 @@ def _load_advisory(self, path: str) -> Optional[Advisory]:
153155
154156def categorize_versions (
155157 all_versions : Set [str ],
156- unaffected_versions : Set [VersionSpecifier ],
157- affected_versions : Set [VersionSpecifier ],
158- resolved_versions : Set [VersionSpecifier ],
158+ unaffected_version_ranges : List [VersionSpecifier ],
159+ affected_version_ranges : List [VersionSpecifier ],
160+ resolved_version_ranges : List [VersionSpecifier ],
159161) -> Tuple [Set [str ], Set [str ]]:
160162 """
161163 Categorize all versions of a crate according to the given version ranges.
@@ -165,24 +167,30 @@ def categorize_versions(
165167
166168 unaffected , affected = set (), set ()
167169
168- if not any (unaffected_versions .union (affected_versions ).union (resolved_versions )):
170+ if (
171+ not unaffected_version_ranges
172+ and not affected_version_ranges
173+ and not resolved_version_ranges
174+ ):
169175 return unaffected , affected
170176
171177 # TODO: This is probably wrong
172178 for version in all_versions :
173179 version_obj = SemverVersion (version )
174- if affected_versions and all ([version_obj in av for av in affected_versions ]):
180+ if affected_version_ranges and all ([version_obj in av for av in affected_version_ranges ]):
175181 affected .add (version )
176- elif unaffected_versions and all ([version_obj in av for av in unaffected_versions ]):
182+ elif unaffected_version_ranges and all (
183+ [version_obj in av for av in unaffected_version_ranges ]
184+ ):
177185 unaffected .add (version )
178- elif resolved_versions and all ([version_obj in av for av in resolved_versions ]):
186+ elif resolved_version_ranges and all ([version_obj in av for av in resolved_version_ranges ]):
179187 unaffected .add (version )
180188
181189 # If some versions were not classified above, one or more of the given ranges might be empty, so
182190 # the remaining versions default to either affected or unaffected.
183191 uncategorized_versions = all_versions - unaffected .union (affected )
184192 if uncategorized_versions :
185- if not affected_versions :
193+ if not affected_version_ranges :
186194 affected .update (uncategorized_versions )
187195 else :
188196 unaffected .update (uncategorized_versions )
0 commit comments