SYMBOL INDEX (841 symbols across 122 files) FILE: src/common/cli_args.py class _VerboseCountAction (line 17) | class _VerboseCountAction(argparse.Action): method __init__ (line 20) | def __init__(self, option_strings, dest, nargs=0, **kwargs): method __call__ (line 25) | def __call__(self, _parser, namespace, _values, _option_string=None): function check_positive (line 31) | def check_positive(val): function _is_integer (line 39) | def _is_integer(value): function _normalize_verbose_args (line 48) | def _normalize_verbose_args(args): function _finalize_verbose_namespace (line 72) | def _finalize_verbose_namespace(namespace): function _wrap_verbose_parser (line 79) | def _wrap_verbose_parser(parser): function add_verbose_argument (line 97) | def add_verbose_argument(parser, default=0, max_level=3, root_parser=None): function add_version_argument (line 124) | def add_version_argument(parser, package="sbomnix"): FILE: src/common/df.py function df_to_csv_file (line 19) | def df_to_csv_file(df, name, loglevel=logging.INFO): function df_from_csv_file (line 28) | def df_from_csv_file(name, exit_on_error: Literal[True] = True) -> pd.Da... function df_from_csv_file (line 32) | def df_from_csv_file( function df_from_csv_file (line 38) | def df_from_csv_file(name, exit_on_error=True): function df_regex_filter (line 57) | def df_regex_filter(df: pd.DataFrame, column: str, regex: str) -> pd.Dat... function df_log (line 63) | def df_log(df, loglevel, tablefmt="presto"): FILE: src/common/errors.py class SbomnixError (line 11) | class SbomnixError(RuntimeError): class FlakeRefResolutionError (line 15) | class FlakeRefResolutionError(SbomnixError): method __init__ (line 18) | def __init__(self, flakeref, stderr="", action="evaluating"): class FlakeRefRealisationError (line 28) | class FlakeRefRealisationError(FlakeRefResolutionError): method __init__ (line 31) | def __init__(self, flakeref, stderr=""): class CsvLoadError (line 35) | class CsvLoadError(SbomnixError): method __init__ (line 38) | def __init__(self, name, error): class CommandNotFoundError (line 44) | class CommandNotFoundError(SbomnixError): method __init__ (line 47) | def __init__(self, name): class NixCommandError (line 52) | class NixCommandError(SbomnixError): method __init__ (line 55) | def __init__(self, command, stderr="", stdout=""): class InvalidNixArtifactError (line 66) | class InvalidNixArtifactError(SbomnixError): method __init__ (line 69) | def __init__(self, path): class InvalidNixJsonError (line 74) | class InvalidNixJsonError(SbomnixError): method __init__ (line 77) | def __init__(self, command, detail): class MissingNixDeriverError (line 86) | class MissingNixDeriverError(SbomnixError): method __init__ (line 89) | def __init__(self, path): class MissingNixDerivationMetadataError (line 94) | class MissingNixDerivationMetadataError(SbomnixError): method __init__ (line 97) | def __init__(self, path): class MissingNixOutPathError (line 102) | class MissingNixOutPathError(SbomnixError): method __init__ (line 105) | def __init__(self, path): class InvalidCpeDictionaryError (line 110) | class InvalidCpeDictionaryError(SbomnixError): method __init__ (line 113) | def __init__(self, required_cols): class WhitelistApplicationError (line 120) | class WhitelistApplicationError(SbomnixError): method __init__ (line 123) | def __init__(self, message): class InvalidSbomError (line 127) | class InvalidSbomError(SbomnixError): method __init__ (line 130) | def __init__(self, path): function _format_command (line 135) | def _format_command(command): FILE: src/common/flakeref.py function try_resolve_flakeref (line 30) | def try_resolve_flakeref( # noqa: PLR0913 function _first_output_path (line 107) | def _first_output_path(stdout: str) -> str: function parse_nixos_configuration_ref (line 112) | def parse_nixos_configuration_ref( function quote_nix_attr_segment (line 135) | def quote_nix_attr_segment(name: str) -> str: function _consume_nix_attr_segment (line 161) | def _consume_nix_attr_segment(value: str) -> tuple[str, str] | None: function _decode_nix_quoted_attr_segment (line 180) | def _decode_nix_quoted_attr_segment(value: str) -> str | None: function _find_quoted_attr_end (line 209) | def _find_quoted_attr_end(value: str) -> int | None: function _looks_like_flakeref (line 223) | def _looks_like_flakeref(flakeref: str) -> bool: FILE: src/common/http.py class CachedLimiterSession (line 19) | class CachedLimiterSession(CacheMixin, LimiterMixin, Session): # pyrigh... function mount_retries (line 26) | def mount_retries( function create_cached_limited_session (line 49) | def create_cached_limited_session( FILE: src/common/log.py class SbomnixLogger (line 19) | class SbomnixLogger(logging.Logger): method verbose (line 22) | def verbose(self, msg: object, *args: object, **kwargs: Any) -> None: method spam (line 28) | def spam(self, msg: object, *args: object, **kwargs: Any) -> None: method trace (line 34) | def trace(self, msg: object, *args: object, **kwargs: Any) -> None: function set_log_verbosity (line 58) | def set_log_verbosity(verbosity=0): function _init_logging (line 64) | def _init_logging(verbosity=0): function is_debug_enabled (line 97) | def is_debug_enabled(): FILE: src/common/nix_utils.py function get_nix_store_dir (line 19) | def get_nix_store_dir(path=None, default: str | None = "/nix/store") -> ... function normalize_nix_store_path (line 28) | def normalize_nix_store_path(path, store_dir="/nix/store"): function _iter_nix_store_dir_candidates (line 37) | def _iter_nix_store_dir_candidates(value): function _infer_nix_store_dir (line 49) | def _infer_nix_store_dir(drv_info, default="/nix/store"): function _normalize_nix_derivation_info (line 66) | def _normalize_nix_derivation_info(drv_info, store_dir): function load_nix_json (line 112) | def load_nix_json(stdout, command): function parse_nix_derivation_show (line 120) | def parse_nix_derivation_show(stdout, store_path_hint=None): function _validate_derivation_entry (line 149) | def _validate_derivation_entry(drv_path, drv_info): function _validate_optional_mapping (line 166) | def _validate_optional_mapping(record, field, owner): function _validate_derivation_outputs (line 175) | def _validate_derivation_outputs(drv_path, drv_info): function _check_optional_derivation_inputs (line 205) | def _check_optional_derivation_inputs(drv_path, drv_info): function _reject_legacy_derivation_inputs (line 230) | def _reject_legacy_derivation_inputs(drv_path, drv_info): function nix_derivation_input_drv_paths (line 239) | def nix_derivation_input_drv_paths(drv_path, drv_info): function nix_derivation_input_src_paths (line 260) | def nix_derivation_input_src_paths(drv_path, drv_info): function _require_derivation_inputs (line 281) | def _require_derivation_inputs(drv_path, drv_info): function normalize_nix_path_info (line 310) | def normalize_nix_path_info(path_info, *, command=NIX_PATH_INFO_JSON): function nix_path_info_references (line 351) | def nix_path_info_references(info, path, *, command=NIX_PATH_INFO_JSON): function nix_path_info_deriver (line 374) | def nix_path_info_deriver(info, path, *, command=NIX_PATH_INFO_JSON): function nix_path_info_nar_hash (line 387) | def nix_path_info_nar_hash(info, path, *, command=NIX_PATH_INFO_JSON): function _validated_path_keys (line 398) | def _validated_path_keys(paths, owner, command): function _validated_path_values (line 410) | def _validated_path_values(paths, owner, command): FILE: src/common/package_names.py function nix_to_repology_pkg_name (line 12) | def nix_to_repology_pkg_name(nix_pkg_name): FILE: src/common/pkgmeta.py function get_py_pkg_version (line 14) | def get_py_pkg_version(package="sbomnix"): function _dev_version (line 22) | def _dev_version(): FILE: src/common/proc.py function exec_cmd (line 24) | def exec_cmd( function exec_cmd (line 34) | def exec_cmd( function exec_cmd (line 44) | def exec_cmd( function exec_cmd (line 53) | def exec_cmd( function exit_unless_command_exists (line 92) | def exit_unless_command_exists( function exit_unless_nix_artifact (line 104) | def exit_unless_nix_artifact( function nix_cmd (line 129) | def nix_cmd(*args: str, impure: bool = False) -> list[str]: FILE: src/common/regex.py function regex_match (line 10) | def regex_match(regex, string): FILE: src/common/spdx.py function _spdx_licensing (line 13) | def _spdx_licensing(): function canonicalize_spdx_license_id (line 17) | def canonicalize_spdx_license_id(identifier): FILE: src/common/versioning.py function number_distance (line 14) | def number_distance(n1: object, n2: object) -> float: function version_distance (line 38) | def version_distance(v1: object, v2: object) -> float: function parse_version (line 65) | def parse_version(ver_str: object) -> packaging.version.Version | None: FILE: src/nixgraph/graph.py class LoadedDependencies (line 23) | class LoadedDependencies: function load_dependencies (line 31) | def load_dependencies(nix_path, buildtime=False): function draw_dependencies (line 56) | def draw_dependencies(loaded, args): FILE: src/nixgraph/main.py function getargs (line 20) | def getargs(args=None): function main (line 80) | def main(): function _run (line 91) | def _run(args): FILE: src/nixgraph/render.py class NixDependencyGraph (line 26) | class NixDependencyGraph: method __init__ (line 29) | def __init__(self, df_dependencies): method draw (line 39) | def draw(self, start_path, args): method _walk_rows (line 75) | def _walk_rows(self, start_path): method _walked_rows_to_dataframe (line 96) | def _walked_rows_to_dataframe(self, walked_rows): method _draw_row (line 102) | def _draw_row(self, row, depth): method _init_df_out (line 111) | def _init_df_out(self, args): method _render (line 122) | def _render(self, filename): method _warn_if_large_graphviz_render (line 136) | def _warn_if_large_graphviz_render(self, filename, edge_count): method _matches_until (line 148) | def _matches_until(self, row): method _add_edge (line 151) | def _add_edge(self, row): method _add_node (line 158) | def _add_node(self, path, pname): method _dbg_print_row (line 179) | def _dbg_print_row(self, row: dict[str, Any], depth): FILE: src/nixmeta/flake_metadata.py function get_flake_metadata (line 15) | def get_flake_metadata(flakeref, *, exec_cmd_fn=exec_cmd, nix_cmd_fn=nix... function is_nixpkgs_metadata (line 30) | def is_nixpkgs_metadata(meta_json): function _locked_obj_is_nixpkgs (line 51) | def _locked_obj_is_nixpkgs(node_name, locked_obj): function _input_node_names (line 62) | def _input_node_names(value): function _get_flake_nixpkgs_obj (line 71) | def _get_flake_nixpkgs_obj(meta_json): function _get_flake_nixpkgs_val (line 98) | def _get_flake_nixpkgs_val(meta_json, key): function _get_nixpkgs_flakeref_github (line 108) | def _get_nixpkgs_flakeref_github(meta_json, *, log=LOG): function _get_nixpkgs_flakeref_git (line 121) | def _get_nixpkgs_flakeref_git(meta_json, *, log=LOG): function _get_nixpkgs_flakeref_path (line 131) | def _get_nixpkgs_flakeref_path(meta_json, *, log=LOG): function _get_nixpkgs_flakeref_tarball (line 139) | def _get_nixpkgs_flakeref_tarball(meta_json, *, log=LOG): function get_nixpkgs_flakeref (line 147) | def get_nixpkgs_flakeref(meta_json, *, log=LOG): function nixref_to_nixpkgs_path (line 162) | def nixref_to_nixpkgs_path( FILE: src/nixmeta/main.py function _getargs (line 20) | def _getargs(args=None): function main (line 72) | def main(): function _run (line 83) | def _run(args): FILE: src/nixmeta/metadata_json.py function parse_meta_entry (line 15) | def parse_meta_entry(meta, key): function parse_json_metadata (line 27) | def parse_json_metadata(json_filename, *, log=LOG): FILE: src/nixmeta/scanner.py function _run_nix_env_metadata (line 23) | def _run_nix_env_metadata(cmd, stdout): class NixMetaScanner (line 36) | class NixMetaScanner: method __init__ (line 39) | def __init__(self): method scan (line 42) | def scan(self, nixref): method scan_path (line 71) | def scan_path(self, nixpkgs_path): method scan_expression (line 80) | def scan_expression(self, expression, *, impure=False): method to_csv (line 99) | def to_csv(self, csv_path, append=False): method to_df (line 112) | def to_df(self): method _read_nixpkgs_meta (line 116) | def _read_nixpkgs_meta( method _drop_duplicates (line 146) | def _drop_duplicates(self): FILE: src/nixupdate/nix_outdated.py function getargs (line 32) | def getargs(args=None): function _query_repology (line 80) | def _query_repology(sbompath): function _run_nix_visualize (line 84) | def _run_nix_visualize(target_path): function _nix_visualize_csv_to_df (line 93) | def _nix_visualize_csv_to_df(csvpath): function _generate_report_df (line 98) | def _generate_report_df(df_nv, df_repo): function _drop_newest_dups (line 102) | def _drop_newest_dups(df_con, df_cmp): function _report (line 106) | def _report(df, args): function _console_out_table (line 110) | def _console_out_table(table, local=False, buildtime=False): function main (line 117) | def main(): function _run (line 128) | def _run(args): FILE: src/nixupdate/nix_visualize.py function run_nix_visualize (line 17) | def run_nix_visualize( function nix_visualize_csv_to_df (line 36) | def nix_visualize_csv_to_df(csvpath): FILE: src/nixupdate/pipeline.py class OutdatedScanData (line 23) | class OutdatedScanData: function query_repology (line 30) | def query_repology(sbompath, *, adapter=None, log=LOG): class OutdatedScanHooks (line 44) | class OutdatedScanHooks: function collect_outdated_scan_data (line 53) | def collect_outdated_scan_data( FILE: src/nixupdate/report.py function generate_report_df (line 16) | def generate_report_df(df_nix_visualize, df_repology, *, log=LOG, log_sp... function drop_newest_duplicates (line 38) | def drop_newest_duplicates(df_console, df_compare, *, log=LOG): function console_out_table (line 53) | def console_out_table(table, *, local=False, buildtime=False, log=LOG): function write_report (line 72) | def write_report(df, args, *, log=LOG): FILE: src/provenance/dependencies.py class DependencyHooks (line 28) | class DependencyHooks: function derivation_outputs_by_path (line 40) | def derivation_outputs_by_path(infos, hooks=None): function dependency_paths (line 58) | def dependency_paths(drv_path, recursive=False, outputs_by_path=None, ho... function dependency_package (line 84) | def dependency_package(drv, output_hash, infos, outputs_by_path, hooks=N... function get_dependencies (line 111) | def get_dependencies(drv_path, recursive=False, hooks=None): FILE: src/provenance/digests.py function canonical_hash_algo (line 22) | def canonical_hash_algo(hash_algo): function hash_size_bytes (line 29) | def hash_size_bytes(hash_algo): function decode_nix32 (line 37) | def decode_nix32(hash_value, size_bytes): function decode_hash_bytes (line 54) | def decode_hash_bytes(hash_value, hash_algo): function split_hash_value (line 78) | def split_hash_value(hash_value, hash_algo=None): function normalize_digest (line 102) | def normalize_digest(hash_value, hash_algo=None): function output_digest (line 120) | def output_digest(data, *, normalize_digest_fn=normalize_digest): FILE: src/provenance/main.py class BuildMeta (line 32) | class BuildMeta: function get_env_metadata (line 44) | def get_env_metadata(): function provenance (line 67) | def provenance(target: str, metadata: BuildMeta, recursive: bool = False... function getargs (line 108) | def getargs(args=None): function main (line 136) | def main(): FILE: src/provenance/nix_commands.py function exec_required_nix_command (line 12) | def exec_required_nix_command(cmd, exec_cmd_fn): FILE: src/provenance/path_info.py function query_path_info (line 20) | def query_path_info( function query_path_hashes (line 52) | def query_path_hashes(paths, *, exec_cmd_fn=exec_cmd): function nar_hash_for_path (line 75) | def nar_hash_for_path(path_infos, path): FILE: src/provenance/schema.py class ProvenanceMetadata (line 25) | class ProvenanceMetadata(Protocol): function get_external_parameters (line 37) | def get_external_parameters(metadata: ProvenanceMetadata) -> JsonDict: function get_internal_parameters (line 43) | def get_internal_parameters(metadata: ProvenanceMetadata) -> JsonDict: function timestamp (line 49) | def timestamp(unix_time: str) -> str: class SchemaHooks (line 63) | class SchemaHooks: function provenance_document (line 77) | def provenance_document( FILE: src/provenance/subjects.py function output_path (line 24) | def output_path( class SubjectHooks (line 37) | class SubjectHooks: function get_subjects (line 47) | def get_subjects( FILE: src/repology/adapter.py class RepologyQuery (line 37) | class RepologyQuery: method __post_init__ (line 49) | def __post_init__(self): function repo_row_classify (line 66) | def repo_row_classify(row): class RepologyAdapter (line 73) | class RepologyAdapter: method __init__ (line 76) | def __init__(self, session=None, request_timeout=REPOLOGY_REQUEST_TIME... method _reset_state (line 82) | def _reset_state(self): method _packages_to_df (line 89) | def _packages_to_df(self, query, re_pkg_internal=None): method _append_package_rows (line 114) | def _append_package_rows(self, package_rows): method _get_resp (line 119) | def _get_resp(self, url): method query_cves (line 129) | def query_cves(self, pkg_name, pkg_version): method _query_pkg_search (line 143) | def _query_pkg_search(self, pkg_search, repository, stop_pkg=None): method _query_pkg_exact (line 170) | def _query_pkg_exact(self, pkg_name, repository): method _query_sbom_cdx (line 173) | def _query_sbom_cdx(self, query): method query (line 231) | def query(self, query): FILE: src/repology/cves.py function is_affected (line 19) | def is_affected(version, affected_ver_str, *, log=LOG, log_spam=LOG_SPAM): function parse_cve_html (line 71) | def parse_cve_html(html_text, pkg_name, pkg_version, *, log=LOG, log_spa... FILE: src/repology/exceptions.py class RepologyError (line 8) | class RepologyError(Exception): class RepologyNoMatchingPackages (line 14) | class RepologyNoMatchingPackages(RepologyError): class RepologyUnexpectedResponse (line 20) | class RepologyUnexpectedResponse(RepologyError): FILE: src/repology/projects_parser.py class ParsedProjectsPage (line 18) | class ParsedProjectsPage: function parse_projects_search_html (line 26) | def parse_projects_search_html( # noqa: PLR0912, PLR0914, PLR0915 FILE: src/repology/repology_cli.py function _pkg_str (line 22) | def _pkg_str(str_obj): function getargs (line 28) | def getargs(args=None): function _query_from_args (line 86) | def _query_from_args(args): class Repology (line 99) | class Repology: method __init__ (line 102) | def __init__(self, adapter=None): method query (line 108) | def query(self, args, stdout_report=True, file_report=True): function main (line 129) | def main(): FILE: src/repology/repology_cve.py function _pkg_str (line 22) | def _pkg_str(str_obj): function getargs (line 28) | def getargs(args=None): function query_cve (line 51) | def query_cve( function main (line 65) | def main(): FILE: src/repology/reporting.py function _stats_sbom (line 14) | def _stats_sbom(df, *, log=LOG): # noqa: PLR0914 function _stats_repology (line 58) | def _stats_repology(df, *, log=LOG): # noqa: PLR0914 function report_cves (line 104) | def report_cves(df, *, log=LOG): function write_query_report (line 120) | def write_query_report( # noqa: PLR0913 FILE: src/repology/sbom.py function parse_cdx_sbom (line 34) | def parse_cdx_sbom(path): function is_ignored_sbom_package (line 58) | def is_ignored_sbom_package(package_name): function make_sbom_status_row (line 63) | def make_sbom_status_row(repository, package, version, status): function merge_sbom_fields (line 75) | def merge_sbom_fields(df_sbom, df_repo): function sbom_row_classify (line 90) | def sbom_row_classify(row): FILE: src/repology/session.py function create_repology_session (line 14) | def create_repology_session(): FILE: src/sbomnix/builder.py class StructuredClosure (line 53) | class StructuredClosure: function _runtime_output_paths_by_load_path (line 61) | def _runtime_output_paths_by_load_path(output_paths_by_drv): function _mapped_runtime_output_paths (line 72) | def _mapped_runtime_output_paths(output_paths_by_load_path): class SbomBuilder (line 78) | class SbomBuilder: method __init__ (line 81) | def __init__( # noqa: PLR0913, PLR0917 method _resolve_target_deriver (line 138) | def _resolve_target_deriver(self, nix_path): method _load_structured_closure (line 153) | def _load_structured_closure(self, nix_path): method _init_dependencies (line 161) | def _init_dependencies(self, closure): method _load_recursive_buildtime_closure (line 169) | def _load_recursive_buildtime_closure(self): method _load_runtime_path_info_closure (line 186) | def _load_runtime_path_info_closure(self, nix_path): method _init_runtime_components (line 215) | def _init_runtime_components(self, paths): method _filter_dependencies_to_depth (line 227) | def _filter_dependencies_to_depth( method _init_components (line 238) | def _init_components(self, include_meta): method _sbom_component_paths (line 263) | def _sbom_component_paths(self): method _resolve_target_component_ref (line 274) | def _resolve_target_component_ref(self) -> str: method _init_dependency_index (line 299) | def _init_dependency_index(self): method _join_meta (line 308) | def _join_meta(self): method lookup_dependencies (line 346) | def lookup_dependencies(self, drv, uid=cols.STORE_PATH): method to_cdx_data (line 353) | def to_cdx_data(self): method enrich_cdx_with_vulnerabilities (line 357) | def enrich_cdx_with_vulnerabilities(self, cdx): method to_spdx_data (line 361) | def to_spdx_data(self): method write_json (line 365) | def write_json(self, pathname, data, printinfo=False): method to_cdx (line 369) | def to_cdx(self, cdx_path, printinfo=True): method to_spdx (line 374) | def to_spdx(self, spdx_path, printinfo=True): method to_csv (line 379) | def to_csv(self, csv_path, loglevel=logging.INFO): FILE: src/sbomnix/cdx.py function _drv_to_cdx_licenses_entry (line 17) | def _drv_to_cdx_licenses_entry(drv, column_name, cdx_license_type): function _cdx_component_add_licenses (line 44) | def _cdx_component_add_licenses(component, drv): function _cdx_component_add_patches (line 60) | def _cdx_component_add_patches(component, drv): function _drv_to_cdx_component (line 88) | def _drv_to_cdx_component(drv, uid=cols.STORE_PATH): function _drv_to_cdx_dependency (line 142) | def _drv_to_cdx_dependency(drv, deps_list, uid=cols.STORE_PATH): function _vuln_to_cdx_vuln (line 151) | def _vuln_to_cdx_vuln(vuln): FILE: src/sbomnix/cli_utils.py class ResolvedNixTarget (line 28) | class ResolvedNixTarget: class GeneratedSbom (line 37) | class GeneratedSbom: method cleanup (line 43) | def cleanup(self): function resolve_nix_target (line 50) | def resolve_nix_target(nixref, buildtime=False, impure=False): function _realise_derivation_output (line 75) | def _realise_derivation_output(path): function _normalize_nixos_configuration_ref (line 96) | def _normalize_nixos_configuration_ref(nixref): function generate_temp_sbom (line 105) | def generate_temp_sbom( FILE: src/sbomnix/closure.py class DependencyWalkRow (line 29) | class DependencyWalkRow: function dependency_paths (line 36) | def dependency_paths(df_deps): function dependencies_to_depth (line 45) | def dependencies_to_depth(df_deps, start_path, depth, columns=DEPENDENCY... function walk_dependency_rows (line 53) | def walk_dependency_rows( function _dependency_rows_by_path (line 95) | def _dependency_rows_by_path(df_deps, match_column): function derivation_dependencies_df (line 103) | def derivation_dependencies_df(drv_infos): function dependency_rows_to_dataframe (line 119) | def dependency_rows_to_dataframe(rows, columns=DEPENDENCY_COLUMNS): function store_path_label (line 131) | def store_path_label(path): function _iter_input_paths (line 138) | def _iter_input_paths(drv_info, target_path=None): FILE: src/sbomnix/components.py function recursive_derivations_to_dataframe (line 16) | def recursive_derivations_to_dataframe(paths, derivations, include_cpe=T... function runtime_derivations_to_dataframe (line 28) | def runtime_derivations_to_dataframe( function derivations_to_dataframe (line 44) | def derivations_to_dataframe(derivations, include_cpe=True): function filter_runtime_outputs_by_load_path (line 54) | def filter_runtime_outputs_by_load_path(paths, output_paths_by_load_path): FILE: src/sbomnix/cpe.py class CPE (line 24) | class CPE: method __init__ (line 27) | def __init__( method _init_product_vendor_index (line 59) | def _init_product_vendor_index(self): method _cpedict_vendor (line 75) | def _cpedict_vendor(self, product): method _candidate_vendor (line 99) | def _candidate_vendor(self, product): method generate (line 121) | def generate(self, name, version): FILE: src/sbomnix/dependency_index.py function _sorted_unique (line 16) | def _sorted_unique(values): function _normalize_outputs (line 20) | def _normalize_outputs(outputs): function _group_dependency_rows (line 28) | def _group_dependency_rows(df, dep_col): class DependencyIndex (line 38) | class DependencyIndex: method lookup (line 45) | def lookup(self, drv, uid=cols.STORE_PATH): method _get_uid_map (line 67) | def _get_uid_map(self, uid): function build_dependency_index (line 82) | def build_dependency_index(df_deps, df_sbomdb, df_sbomdb_outputs_explode... FILE: src/sbomnix/derivation.py function _batched (line 24) | def _batched(iterable, size): function load (line 30) | def load(path, outpath): function load_many (line 54) | def load_many(paths, output_paths_by_drv=None, batch_size=200, ignore_mi... function _load_derivation_infos (line 105) | def _load_derivation_infos(paths, store_path_hint=None, ignore_missing=F... function _query_paths_to_derivations (line 132) | def _query_paths_to_derivations(query_paths, drv_infos): function _derivation_output_paths (line 149) | def _derivation_output_paths(drv_info): function load_recursive (line 175) | def load_recursive(path): function _exec_required_nix_command (line 196) | def _exec_required_nix_command(cmd): function destructure (line 207) | def destructure(env): class Derive (line 214) | class Derive: method __init__ (line 217) | def __init__( method from_nix_derivation_info (line 268) | def from_nix_derivation_info(cls, path, drv_info, outpath=None): method init (line 293) | def init(self, path, outpath): method __repr__ (line 302) | def __repr__(self): method set_cpe (line 305) | def set_cpe(self, cpe_generator): method add_output_path (line 310) | def add_output_path(self, path): method _refresh_purl (line 316) | def _refresh_purl(self): method to_dict (line 323) | def to_dict(self): function _derivation_output_path (line 331) | def _derivation_output_path(outputs, output_name): function _coerce_derivation_string (line 340) | def _coerce_derivation_string(value): function _set_derivation_output_paths (line 346) | def _set_derivation_output_paths(drv, outputs, env_vars): FILE: src/sbomnix/derivers.py function is_loadable_deriver_path (line 17) | def is_loadable_deriver_path(path): function find_deriver (line 27) | def find_deriver(path): function require_deriver (line 59) | def require_deriver(path, *, find_deriver_fn=find_deriver, log=LOG): FILE: src/sbomnix/dfcache.py class LockedDfCache (line 23) | class LockedDfCache: method __init__ (line 26) | def __init__(self): method __getattr__ (line 29) | def __getattr__(self, name): FILE: src/sbomnix/exporters.py function write_json (line 29) | def write_json(pathname, data, printinfo=False): function _nixpkgs_meta_source_properties (line 38) | def _nixpkgs_meta_source_properties(sbomdb): function _spdx_nixpkgs_meta_source_comment (line 51) | def _spdx_nixpkgs_meta_source_comment(sbomdb): function build_cdx_document (line 66) | def build_cdx_document(sbomdb): function _str_to_spdxid (line 106) | def _str_to_spdxid(strval): function _drv_to_spdx_license_list (line 116) | def _drv_to_spdx_license_list(drv): function _drv_to_spdx_extrefs (line 133) | def _drv_to_spdx_extrefs(drv): function _drv_to_spdx_package (line 150) | def _drv_to_spdx_package(drv, uid=cols.STORE_PATH): function _drv_to_spdx_relationships (line 176) | def _drv_to_spdx_relationships(drv, deps_list, uid=cols.STORE_PATH): function build_spdx_document (line 192) | def build_spdx_document(sbomdb): FILE: src/sbomnix/main.py function getargs (line 20) | def getargs(args=None): function main (line 80) | def main(): function _run (line 91) | def _run(args): FILE: src/sbomnix/meta.py class Meta (line 44) | class Meta: method __init__ (line 47) | def __init__(self): method get_nixpkgs_meta (line 52) | def get_nixpkgs_meta(self, nixref=None): method get_nixpkgs_meta_with_source (line 61) | def get_nixpkgs_meta_with_source( method _resolve_source (line 80) | def _resolve_source( method _scan_source (line 108) | def _scan_source(self, source): method _scan_source_with_source (line 112) | def _scan_source_with_source(self, source): method _scan_expression (line 138) | def _scan_expression(self, expression, *, cache_key=None, impure=False): method _try_scan_expression (line 162) | def _try_scan_expression(expression, *, impure=False): method _scan (line 171) | def _scan(self, nixpkgs_path): FILE: src/sbomnix/meta_source.py class NixpkgsMetaSource (line 34) | class NixpkgsMetaSource: function classify_meta_nixpkgs (line 48) | def classify_meta_nixpkgs(value): function read_nixpkgs_version (line 55) | def read_nixpkgs_version(nixpkgs_path): function is_nix_store_path (line 67) | def is_nix_store_path(path): function nixpkgs_meta_source_with_path (line 72) | def nixpkgs_meta_source_with_path(source): class NixpkgsMetaSourceResolver (line 79) | class NixpkgsMetaSourceResolver: method path_target_without_source (line 83) | def path_target_without_source(target_path=None, original_ref=None): method resolve_meta_nixpkgs_option (line 99) | def resolve_meta_nixpkgs_option(self, meta_nixpkgs, *, target_path=None): method resolve_flakeref_target_source (line 113) | def resolve_flakeref_target_source(self, flakeref, *, impure=False): method _nixos_toplevel_without_source (line 146) | def _nixos_toplevel_without_source(): method _parse_nixos_toplevel_flakeref (line 157) | def _parse_nixos_toplevel_flakeref(flakeref): method _nixos_pkgs_expression (line 164) | def _nixos_pkgs_expression(flake, name): method _flake_ref_for_expression (line 174) | def _flake_ref_for_expression(self, flake, *, impure=False): method _flake_ref_has_stable_lock (line 184) | def _flake_ref_has_stable_lock(flake): method _should_lock_flake_ref_for_expression (line 188) | def _should_lock_flake_ref_for_expression(cls, flake): method _is_existing_local_flake_ref (line 196) | def _is_existing_local_flake_ref(flake): method _locked_flake_ref_from_metadata (line 205) | def _locked_flake_ref_from_metadata(flake, *, impure=False): method _nix_flake_metadata (line 227) | def _nix_flake_metadata(flake, *, impure=False): method _normalize_local_flake_ref_for_expression (line 245) | def _normalize_local_flake_ref_for_expression(flake): method _nixos_pkgs_expression_cache_key (line 260) | def _nixos_pkgs_expression_cache_key(cls, flake, name, *, impure=False): method _stable_flake_ref_for_expression_cache (line 270) | def _stable_flake_ref_for_expression_cache(flake): method _nix_eval_raw (line 280) | def _nix_eval_raw(flakeref, *, impure=False): method resolve_explicit_source (line 295) | def resolve_explicit_source(self, meta_nixpkgs): method _try_normalize_mutable_path (line 339) | def _try_normalize_mutable_path(path): method resolve_flakeref_lock_source (line 353) | def resolve_flakeref_lock_source(self, nixref): method resolve_default_source (line 368) | def resolve_default_source(self, nixref=None): method resolve_nix_path_source (line 376) | def resolve_nix_path_source(self, *, message=None, required=False): FILE: src/sbomnix/runtime.py class RuntimeClosure (line 31) | class RuntimeClosure: function load_runtime_closure (line 38) | def load_runtime_closure(path): function runtime_closure_from_path_info (line 59) | def runtime_closure_from_path_info(path_info): FILE: src/sbomnix/vuln_enrichment.py function enrich_cdx_with_vulnerabilities (line 18) | def enrich_cdx_with_vulnerabilities(sbomdb, cdx): function _vulnix_target_path (line 69) | def _vulnix_target_path(sbomdb): FILE: src/vulnxscan/github_prs.py function append_search_results (line 21) | def append_search_results(prs, result, max_results=5): class GitHubPrLookup (line 36) | class GitHubPrLookup: method __init__ (line 39) | def __init__( method query (line 58) | def query(self, query_str, delay=60): method find_nixpkgs_prs (line 78) | def find_nixpkgs_prs(self, row): FILE: src/vulnxscan/osv.py function getargs (line 22) | def getargs(args=None): function _run (line 41) | def _run(args): function main (line 51) | def main(): FILE: src/vulnxscan/osv_client.py function create_osv_session (line 21) | def create_osv_session(): class OSV (line 31) | class OSV: method __init__ (line 34) | def __init__(self, session=None, request_timeout=OSV_REQUEST_TIMEOUT): method _parse_vulns (line 39) | def _parse_vulns(self, package, vulns): method _parse_batch_response (line 47) | def _parse_batch_response(self, query, results): method _post_batch_query (line 58) | def _post_batch_query(self, query): method _parse_sbom (line 72) | def _parse_sbom(self, path): method query_vulns (line 93) | def query_vulns(self, sbom_path, ecosystems=None): method to_dataframe (line 122) | def to_dataframe(self): FILE: src/vulnxscan/parsers.py function _severity_from_cache (line 18) | def _severity_from_cache(cvss_cache, vuln_id): function parse_vulnix_json (line 24) | def parse_vulnix_json(json_str, *, cvss_cache=None, log=LOG): function parse_grype_json (line 50) | def parse_grype_json(json_str, *, cvss_cache=None, log=LOG, log_spam=LOG... function normalize_osv_dataframe (line 87) | def normalize_osv_dataframe(df_osv, *, cvss_cache=None, log=LOG, log_spa... FILE: src/vulnxscan/repology_lookup.py function select_newest (line 23) | def select_newest(df): function _add_triage_item (line 37) | def _add_triage_item(out_dict, vuln, whitelist_cols, df_repo=None): function _version_similarity (line 75) | def _version_similarity(row): class RepologyVulnerabilityLookup (line 87) | class RepologyVulnerabilityLookup: method __init__ (line 90) | def __init__(self, adapter=None, cve_query=None): method is_vulnerable (line 96) | def is_vulnerable(self, repo_pkg_name, pkg_version, cve_id=None): method query_repology (line 116) | def query_repology(self, pname, match_type="pkg_exact"): method query_repology_versions (line 155) | def query_repology_versions(self, df_vuln_pkgs): FILE: src/vulnxscan/reporting.py function build_report_dataframe (line 22) | def build_report_dataframe(df_vulnix, df_grype, df_osv, *, log=LOG): function filter_patched_report (line 68) | def filter_patched_report(df_report, sbom_csv, *, log=LOG): function apply_whitelist_annotations (line 86) | def apply_whitelist_annotations(df_report, whitelist_csv): function render_console_report (line 96) | def render_console_report(df_report, *, df_triaged=None, log=LOG): function write_reports (line 128) | def write_reports(df_report, out_path, *, df_triaged=None): FILE: src/vulnxscan/scanners.py function run_vulnix_scan (line 14) | def run_vulnix_scan(target_path, buildtime=False, *, exec_cmd_fn=exec_cm... function run_grype_scan (line 29) | def run_grype_scan(sbom_path, *, exec_cmd_fn=exec_cmd, log=LOG): function run_osv_scan (line 36) | def run_osv_scan(sbom_path, *, osv_factory=OSV, log=LOG): FILE: src/vulnxscan/triage.py function _get_default_repology_lookup (line 20) | def _get_default_repology_lookup(): function _get_default_github_lookup (line 27) | def _get_default_github_lookup(): function classify_vulnerability (line 34) | def classify_vulnerability(row, repology_lookup=None): # noqa: PLR0911 function triage_vulnerabilities (line 65) | def triage_vulnerabilities( FILE: src/vulnxscan/utils.py function _reformat_scanner (line 19) | def _reformat_scanner(val): function _vuln_sortcol (line 25) | def _vuln_sortcol(row): function _vuln_url (line 39) | def _vuln_url(row): function _vuln_source (line 49) | def _vuln_source(row): function _is_patched (line 57) | def _is_patched(row): function _is_json (line 66) | def _is_json(path): FILE: src/vulnxscan/vulnscan.py class VulnScan (line 25) | class VulnScan: method __init__ (line 28) | def __init__(self): method _parse_vulnix (line 37) | def _parse_vulnix(self, json_str): method scan_vulnix (line 47) | def scan_vulnix(self, target_path, buildtime=False): method _parse_grype (line 63) | def _parse_grype(self, json_str): method scan_grype (line 74) | def scan_grype(self, sbom_path): method _parse_osv (line 84) | def _parse_osv(self, df_osv): method scan_osv (line 95) | def scan_osv(self, sbom_path): method _generate_report (line 100) | def _generate_report(self): method _filter_patched (line 126) | def _filter_patched(self, sbom_csv): method _apply_whitelist (line 133) | def _apply_whitelist(self, whitelist_csv): method _console_report (line 136) | def _console_report(self): method report (line 143) | def report(self, args, sbom_csv): FILE: src/vulnxscan/vulnxscan_cli.py function getargs (line 27) | def getargs(args=None): function main (line 95) | def main(): function _run (line 106) | def _run(args): FILE: src/vulnxscan/whitelist.py function load_whitelist (line 21) | def load_whitelist(whitelist_csv_path): function df_apply_whitelist (line 45) | def df_apply_whitelist(df_whitelist, df_vulns): function df_drop_whitelisted (line 93) | def df_drop_whitelisted(df): FILE: tests/compare_deps.py function getargs (line 25) | def getargs(): function _parse_sbom (line 44) | def _parse_sbom(path): function _parse_graph (line 101) | def _parse_graph(path): function _filter_set (line 111) | def _filter_set(re_filter_out_list, target_set): function sbom_internal_checks (line 124) | def sbom_internal_checks(df_sbom): function compare_dependencies (line 144) | def compare_dependencies(df_sbom, df_graph, sbom_type, graph_type): function main (line 256) | def main(): FILE: tests/compare_sboms.py function getargs (line 24) | def getargs(): function _sbom_df_from_dict (line 48) | def _sbom_df_from_dict(dict_obj): function _parse_sbom_cdx (line 57) | def _parse_sbom_cdx(json_dict): function _parse_sbom_spdx (line 68) | def _parse_sbom_spdx(json_dict): function _parse_sbom (line 79) | def _parse_sbom(path): function _log_rows (line 93) | def _log_rows(df, name): function _compare_sboms (line 98) | def _compare_sboms(args, df1, df2): function main (line 160) | def main(): FILE: tests/conftest.py function _output_mentions_repology_host (line 27) | def _output_mentions_repology_host(output): function _pythonpath_with_repo_root (line 36) | def _pythonpath_with_repo_root(env): function _warm_grype_db (line 49) | def _warm_grype_db(request, tmp_path_factory): function _configure_test_vulnix (line 79) | def _configure_test_vulnix(request, tmp_path_factory): function fixture_test_work_dir (line 115) | def fixture_test_work_dir(tmp_path): function fixture_test_nix_drv (line 121) | def fixture_test_nix_drv(): function fixture_test_nix_result (line 136) | def fixture_test_nix_result(test_nix_drv, tmp_path_factory): function fixture_test_cdx_sbom (line 147) | def fixture_test_cdx_sbom(): function fixture_run_python_script (line 155) | def fixture_run_python_script(test_work_dir, _warm_grype_db, _configure_... function fixture_run_python_script_retry_on_repology_network_error (line 176) | def fixture_run_python_script_retry_on_repology_network_error(_run_pytho... function pytest_collection_modifyitems (line 216) | def pytest_collection_modifyitems(items): FILE: tests/integration/test_nixgraph_cli.py function _write_nixgraph_test_flake (line 17) | def _write_nixgraph_test_flake(flake_dir): function test_nixgraph_help (line 70) | def test_nixgraph_help(_run_python_script): function test_nixgraph_png (line 75) | def test_nixgraph_png(_run_python_script, test_nix_result, test_work_dir): function test_nixgraph_csv (line 82) | def test_nixgraph_csv(_run_python_script, test_nix_result, test_work_dir): function test_nixgraph_csv_runtime_drv (line 91) | def test_nixgraph_csv_runtime_drv(_run_python_script, test_nix_drv, test... function test_nixgraph_csv_buildtime (line 104) | def test_nixgraph_csv_buildtime(_run_python_script, test_nix_drv, test_w... function test_nixgraph_dot_includes_edges_labels_and_style (line 113) | def test_nixgraph_dot_includes_edges_labels_and_style( function test_nixgraph_depth_and_until_limit_traversal (line 139) | def test_nixgraph_depth_and_until_limit_traversal( function test_nixgraph_csv_runtime_flakeref (line 174) | def test_nixgraph_csv_runtime_flakeref(_run_python_script, test_work_dir): function test_nixgraph_csv_buildtime_flakeref (line 187) | def test_nixgraph_csv_buildtime_flakeref(_run_python_script, test_work_d... function test_nixgraph_csv_graph_inverse (line 202) | def test_nixgraph_csv_graph_inverse(_run_python_script, test_nix_result,... function test_compare_deps_runtime (line 239) | def test_compare_deps_runtime(_run_python_script, test_nix_result, test_... function test_compare_deps_buildtime (line 276) | def test_compare_deps_buildtime(_run_python_script, test_nix_drv, test_w... FILE: tests/integration/test_nixmeta_cli.py function test_nixmeta_help (line 14) | def test_nixmeta_help(_run_python_script): function test_nixmeta_sbomnix_flakeref (line 20) | def test_nixmeta_sbomnix_flakeref(_run_python_script, test_work_dir): FILE: tests/integration/test_nixupdate_cli.py function test_nix_outdated_help (line 13) | def test_nix_outdated_help(_run_python_script): function test_nix_outdated_result (line 20) | def test_nix_outdated_result( FILE: tests/integration/test_provenance_cli.py function test_provenance_help (line 12) | def test_provenance_help(_run_python_script): function test_provenance_schema (line 17) | def test_provenance_schema(_run_python_script, test_nix_drv, test_work_d... function test_provenance_schema_recursive (line 34) | def test_provenance_schema_recursive(_run_python_script, test_nix_drv, t... FILE: tests/integration/test_repology_cli.py function test_repology_cli_help (line 13) | def test_repology_cli_help(_run_python_script): function test_repology_cli_sbom (line 20) | def test_repology_cli_sbom( FILE: tests/integration/test_sbomnix_cli.py function test_sbomnix_help (line 15) | def test_sbomnix_help(_run_python_script): function test_sbomnix_type_runtime (line 20) | def test_sbomnix_type_runtime(_run_python_script, test_nix_result, test_... function test_sbomnix_type_buildtime (line 47) | def test_sbomnix_type_buildtime(_run_python_script, test_nix_drv, test_w... function test_sbomnix_depth (line 75) | def test_sbomnix_depth(_run_python_script, test_nix_drv, test_work_dir): function test_compare_subsequent_cdx_sboms (line 114) | def test_compare_subsequent_cdx_sboms(_run_python_script, test_nix_drv, ... function test_compare_subsequent_spdx_sboms (line 144) | def test_compare_subsequent_spdx_sboms(_run_python_script, test_nix_drv,... function test_compare_spdx_and_cdx_sboms (line 174) | def test_compare_spdx_and_cdx_sboms(_run_python_script, test_nix_drv, te... FILE: tests/integration/test_vulnxscan_cli.py function test_vulnxscan_help (line 18) | def test_vulnxscan_help(_run_python_script): function test_vulnxscan_scan_nix_result (line 25) | def test_vulnxscan_scan_nix_result(_run_python_script, test_nix_result, ... function test_vulnxscan_scan_sbom (line 45) | def test_vulnxscan_scan_sbom(_run_python_script, test_cdx_sbom, test_wor... function test_vulnxscan_triage (line 61) | def test_vulnxscan_triage(_run_python_script, test_nix_result, test_work... function test_vulnxscan_triage_whitelist (line 81) | def test_vulnxscan_triage_whitelist(_run_python_script, test_nix_result,... FILE: tests/resources/make_grype_test_db.py function build (line 95) | def build(db_path: Path) -> None: function main (line 130) | def main() -> None: FILE: tests/test_builder_runtime.py function _builder_double (line 23) | def _builder_double(): function _runtime_closure (line 36) | def _runtime_closure(output_paths_by_drv, rows=None): function test_runtime_path_info_dependencies_accepts_existing_derivers (line 43) | def test_runtime_path_info_dependencies_accepts_existing_derivers(monkey... function test_runtime_components_propagate_derivation_loading_failures (line 66) | def test_runtime_components_propagate_derivation_loading_failures(monkey... function test_runtime_components_reject_missing_derivation_metadata (line 85) | def test_runtime_components_reject_missing_derivation_metadata(monkeypat... function test_runtime_deriver_lookup_preserves_typed_errors (line 99) | def test_runtime_deriver_lookup_preserves_typed_errors(monkeypatch): function test_runtime_path_info_dependencies_uses_output_queries_for_unloadable_derivers (line 119) | def test_runtime_path_info_dependencies_uses_output_queries_for_unloadab... function test_runtime_path_info_dependencies_accepts_graph_only_references (line 145) | def test_runtime_path_info_dependencies_accepts_graph_only_references(mo... function test_runtime_path_info_dependencies_supports_targets_without_derivers (line 176) | def test_runtime_path_info_dependencies_supports_targets_without_derivers( function test_target_component_ref_uses_runtime_output_when_deriver_is_unavailable (line 196) | def test_target_component_ref_uses_runtime_output_when_deriver_is_unavai... function test_target_component_ref_skips_missing_outputs_when_deriver_is_unavailable (line 211) | def test_target_component_ref_skips_missing_outputs_when_deriver_is_unav... function test_target_component_ref_handles_non_identifier_output_column (line 230) | def test_target_component_ref_handles_non_identifier_output_column(monke... function test_target_component_ref_rejects_missing_runtime_target_metadata (line 246) | def test_target_component_ref_rejects_missing_runtime_target_metadata(): FILE: tests/test_buildtime_closure.py function test_recursive_buildtime_dependencies_df_reads_new_derivation_inputs (line 14) | def test_recursive_buildtime_dependencies_df_reads_new_derivation_inputs(): function test_recursive_buildtime_dependencies_df_rejects_legacy_input_drvs (line 58) | def test_recursive_buildtime_dependencies_df_rejects_legacy_input_drvs(): function test_recursive_buildtime_dependencies_df_rejects_missing_input_schema (line 71) | def test_recursive_buildtime_dependencies_df_rejects_missing_input_schem... function test_recursive_buildtime_dependencies_df_accepts_empty_modern_inputs (line 82) | def test_recursive_buildtime_dependencies_df_accepts_empty_modern_inputs(): function test_recursive_buildtime_dependencies_df_rejects_missing_source_inputs (line 103) | def test_recursive_buildtime_dependencies_df_rejects_missing_source_inpu... function test_recursive_buildtime_dependencies_df_rejects_missing_derivation_inputs (line 116) | def test_recursive_buildtime_dependencies_df_rejects_missing_derivation_... FILE: tests/test_cli_conventions.py function _stringify (line 25) | def _stringify(value): function test_cli_version_flags_exit_zero (line 61) | def test_cli_version_flags_exit_zero(getargs, capsys): function test_cli_verbose_default_is_normal_info (line 73) | def test_cli_verbose_default_is_normal_info(getargs, base_argv): function test_cli_verbose_level_one_forms_match (line 89) | def test_cli_verbose_level_one_forms_match(getargs, base_argv, verbose_a... function test_cli_verbose_level_two_forms_match (line 107) | def test_cli_verbose_level_two_forms_match(getargs, base_argv, verbose_a... function test_single_output_clis_accept_short_o_alias (line 143) | def test_single_output_clis_accept_short_o_alias(getargs, argv, expected... function test_dev_version_format_matches_nix_package_format (line 153) | def test_dev_version_format_matches_nix_package_format(): function test_dev_version_parity_with_nix_package_version (line 197) | def test_dev_version_parity_with_nix_package_version(): function test_repology_cli_uses_uppercase_v_for_version_filter (line 246) | def test_repology_cli_uses_uppercase_v_for_version_filter(): FILE: tests/test_cli_error_boundaries.py function test_vulnxscan_invalid_sbom_exits_nonzero (line 21) | def test_vulnxscan_invalid_sbom_exits_nonzero(tmp_path, monkeypatch): function test_osv_invalid_sbom_exits_nonzero (line 47) | def test_osv_invalid_sbom_exits_nonzero(tmp_path, monkeypatch): function test_cli_translates_sbomnix_errors_to_exit_code_1 (line 140) | def test_cli_translates_sbomnix_errors_to_exit_code_1( FILE: tests/test_cli_smoke.py function test_repology_cve_main_writes_output_csv (line 17) | def test_repology_cve_main_writes_output_csv(tmp_path, monkeypatch): function test_osv_main_writes_output_csv_with_requested_ecosystems (line 63) | def test_osv_main_writes_output_csv_with_requested_ecosystems(tmp_path, ... FILE: tests/test_common_log.py function test_set_log_verbosity_maps_cli_levels_to_logging_levels (line 26) | def test_set_log_verbosity_maps_cli_levels_to_logging_levels(verbosity, ... function test_custom_log_level_names_are_registered (line 34) | def test_custom_log_level_names_are_registered(): function test_verbose_level_is_between_info_and_debug (line 40) | def test_verbose_level_is_between_info_and_debug(): FILE: tests/test_common_versioning.py function test_number_distance_documents_edge_cases (line 36) | def test_number_distance_documents_edge_cases(left, right, expected): function test_number_distance_is_symmetric_for_non_negative_numbers (line 43) | def test_number_distance_is_symmetric_for_non_negative_numbers(left, rig... function test_number_distance_is_bounded_for_non_negative_numbers (line 50) | def test_number_distance_is_bounded_for_non_negative_numbers(left, right): function test_number_distance_identity_for_non_negative_numbers (line 58) | def test_number_distance_identity_for_non_negative_numbers(value): function test_number_distance_returns_zero_for_negative_arguments (line 63) | def test_number_distance_returns_zero_for_negative_arguments(negative, v... function test_parse_version_normalizes_suffixes (line 68) | def test_parse_version_normalizes_suffixes(): function test_parse_version_never_raises_for_text (line 75) | def test_parse_version_never_raises_for_text(value): function test_parse_version_is_idempotent_after_string_roundtrip (line 80) | def test_parse_version_is_idempotent_after_string_roundtrip(value): function test_version_distance_handles_identical_and_invalid_versions (line 87) | def test_version_distance_handles_identical_and_invalid_versions(): function test_version_distance_is_bounded_for_text (line 93) | def test_version_distance_is_bounded_for_text(left, right): function test_nix_to_repology_pkg_name_handles_prefixes_and_special_cases (line 99) | def test_nix_to_repology_pkg_name_handles_prefixes_and_special_cases(): FILE: tests/test_compare_deps.py function test_compare_dependencies_filters_darwin_buildtime_source_paths (line 13) | def test_compare_dependencies_filters_darwin_buildtime_source_paths(): FILE: tests/test_components.py class FakeDrv (line 11) | class FakeDrv: method __init__ (line 14) | def __init__(self, store_path, name): method set_cpe (line 20) | def set_cpe(self, _generator): method to_dict (line 23) | def to_dict(self): function test_recursive_derivations_to_dataframe_skips_missing_paths (line 32) | def test_recursive_derivations_to_dataframe_skips_missing_paths(): function test_runtime_derivations_to_dataframe_filters_outputs_before_loading (line 65) | def test_runtime_derivations_to_dataframe_filters_outputs_before_loading... FILE: tests/test_cpe.py class FakeCache (line 13) | class FakeCache: method __init__ (line 14) | def __init__(self, df): method get (line 17) | def get(self, _url): method set (line 20) | def set(self, *_args, **_kwargs): function test_cpe_uses_indexed_unique_product_vendor (line 24) | def test_cpe_uses_indexed_unique_product_vendor(monkeypatch): function test_cpe_ambiguous_product_falls_back_to_product_name (line 43) | def test_cpe_ambiguous_product_falls_back_to_product_name(monkeypatch): FILE: tests/test_dependency_index.py function test_build_dependency_index_combines_runtime_and_buildtime_edges (line 13) | def test_build_dependency_index_combines_runtime_and_buildtime_edges(): function test_build_dependency_index_returns_none_without_dependencies (line 61) | def test_build_dependency_index_returns_none_without_dependencies(): FILE: tests/test_derivation_hardening.py function test_load_derivation_uses_nix_derivation_show (line 18) | def test_load_derivation_uses_nix_derivation_show(monkeypatch): function test_canonicalize_spdx_license_id_canonicalizes_aliases (line 73) | def test_canonicalize_spdx_license_id_canonicalizes_aliases(): function test_cdx_and_spdx_license_exporters_use_canonical_spdx_ids (line 91) | def test_cdx_and_spdx_license_exporters_use_canonical_spdx_ids(): function test_cdx_falls_back_to_license_short_name_when_spdx_id_is_invalid (line 151) | def test_cdx_falls_back_to_license_short_name_when_spdx_id_is_invalid(): FILE: tests/test_flakeref_resolution.py class CapturingLogger (line 24) | class CapturingLogger: method __init__ (line 25) | def __init__(self): method info (line 28) | def info(self, msg, *args): method log (line 31) | def log(self, level, msg, *args): method debug (line 34) | def debug(self, msg, *args): function test_nixos_configuration_attr_segments_use_nix_string_escaping (line 65) | def test_nixos_configuration_attr_segments_use_nix_string_escaping(name,... function test_nixos_configuration_parser_rejects_unescaped_interpolation (line 73) | def test_nixos_configuration_parser_rejects_unescaped_interpolation(): function test_try_resolve_flakeref_uses_argv_lists (line 77) | def test_try_resolve_flakeref_uses_argv_lists(): function test_try_resolve_flakeref_can_return_derivation_path (line 111) | def test_try_resolve_flakeref_can_return_derivation_path(): function test_try_resolve_flakeref_logs_flake_progress_at_info (line 152) | def test_try_resolve_flakeref_logs_flake_progress_at_info(): function test_try_resolve_flakeref_keeps_plain_path_probe_verbose (line 177) | def test_try_resolve_flakeref_keeps_plain_path_probe_verbose(): function test_try_resolve_flakeref_raises_on_failed_force_realise (line 199) | def test_try_resolve_flakeref_raises_on_failed_force_realise(): function test_try_resolve_flakeref_raises_when_force_realise_prints_no_path (line 211) | def test_try_resolve_flakeref_raises_when_force_realise_prints_no_path(): function test_try_resolve_flakeref_raises_on_failed_eval_for_flakeref (line 223) | def test_try_resolve_flakeref_raises_on_failed_eval_for_flakeref(): function test_try_resolve_flakeref_returns_none_for_non_flake_path (line 231) | def test_try_resolve_flakeref_returns_none_for_non_flake_path(): function test_try_resolve_flakeref_returns_none_for_generated_plain_paths (line 248) | def test_try_resolve_flakeref_returns_none_for_generated_plain_paths(path): function test_try_resolve_flakeref_returns_none_for_missing_relative_paths (line 258) | def test_try_resolve_flakeref_returns_none_for_missing_relative_paths(pa... function test_try_resolve_flakeref_returns_none_for_existing_fragment_path_when_eval_fails (line 267) | def test_try_resolve_flakeref_returns_none_for_existing_fragment_path_wh... function test_try_resolve_flakeref_raises_for_generated_flakeref_failures (line 289) | def test_try_resolve_flakeref_raises_for_generated_flakeref_failures(fla... function test_try_resolve_flakeref_strips_generated_eval_output (line 308) | def test_try_resolve_flakeref_strips_generated_eval_output(flakeref): function test_flakeref_realisation_error_accepts_none_stderr (line 320) | def test_flakeref_realisation_error_accepts_none_stderr(): function test_flake_ref_resolution_error_preserves_stderr_verbatim (line 327) | def test_flake_ref_resolution_error_preserves_stderr_verbatim(): FILE: tests/test_library_exceptions.py function test_df_from_csv_file_raises_csv_load_error (line 31) | def test_df_from_csv_file_raises_csv_load_error(monkeypatch): function test_df_log_ignores_none (line 41) | def test_df_log_ignores_none(): function test_exit_unless_command_exists_raises_typed_error (line 45) | def test_exit_unless_command_exists_raises_typed_error(): function test_exit_unless_nix_artifact_raises_typed_error (line 50) | def test_exit_unless_nix_artifact_raises_typed_error(): function test_exit_unless_nix_artifact_uses_modern_nix_commands (line 61) | def test_exit_unless_nix_artifact_uses_modern_nix_commands(): function test_find_deriver_raises_typed_error (line 97) | def test_find_deriver_raises_typed_error(): function test_require_deriver_wraps_lookup_runtime_errors (line 102) | def test_require_deriver_wraps_lookup_runtime_errors(): function test_require_deriver_preserves_typed_lookup_errors (line 113) | def test_require_deriver_preserves_typed_lookup_errors(): function test_cpe_raises_typed_error_when_required_columns_are_missing (line 121) | def test_cpe_raises_typed_error_when_required_columns_are_missing(monkey... function test_df_apply_whitelist_raises_typed_error_without_vuln_id_column (line 135) | def test_df_apply_whitelist_raises_typed_error_without_vuln_id_column(): function test_repology_cve_report_returns_false_on_empty_results (line 146) | def test_repology_cve_report_returns_false_on_empty_results(): FILE: tests/test_nix_cli_argv.py function test_exec_cmd_rejects_string_commands (line 20) | def test_exec_cmd_rejects_string_commands(): function test_find_deriver_uses_argv_list (line 28) | def test_find_deriver_uses_argv_list(monkeypatch): function test_find_deriver_supports_nix_2_33_wrapped_json (line 72) | def test_find_deriver_supports_nix_2_33_wrapped_json(monkeypatch): function test_find_deriver_rejects_unloadable_structured_deriver (line 98) | def test_find_deriver_rejects_unloadable_structured_deriver(monkeypatch): function test_get_flake_metadata_uses_argv_list (line 141) | def test_get_flake_metadata_uses_argv_list(): function test_get_flake_metadata_strips_nixpkgs_prefix_without_splitting_spaces (line 173) | def test_get_flake_metadata_strips_nixpkgs_prefix_without_splitting_spac... function test_run_nix_visualize_uses_argv_list (line 189) | def test_run_nix_visualize_uses_argv_list(tmp_path, monkeypatch): function test_meta_reads_nix_path_entry_with_spaces (line 231) | def test_meta_reads_nix_path_entry_with_spaces(monkeypatch): FILE: tests/test_nix_outdated_pipeline.py class FakeSbomArtifact (line 19) | class FakeSbomArtifact: method __init__ (line 20) | def __init__(self, cdx_path): method cleanup (line 24) | def cleanup(self): function _repology_df (line 28) | def _repology_df(): function _log_verbosity (line 45) | def _log_verbosity(verbosity): function test_collect_outdated_scan_data_runtime_uses_hooks_and_cleans_outputs (line 57) | def test_collect_outdated_scan_data_runtime_uses_hooks_and_cleans_output... function test_collect_outdated_scan_data_buildtime_skips_nix_visualize (line 120) | def test_collect_outdated_scan_data_buildtime_skips_nix_visualize(tmp_pa... function test_collect_outdated_scan_data_buildtime_debug_keeps_nix_visualize_optional (line 146) | def test_collect_outdated_scan_data_buildtime_debug_keeps_nix_visualize_... function test_generate_report_df_buildtime_adds_default_priority_and_renames_version (line 174) | def test_generate_report_df_buildtime_adds_default_priority_and_renames_... function test_write_report_defaults_to_nixpkgs_updates_and_drops_newest_duplicates (line 182) | def test_write_report_defaults_to_nixpkgs_updates_and_drops_newest_dupli... function test_write_report_local_buildtime_outputs_local_updates_without_priority (line 250) | def test_write_report_local_buildtime_outputs_local_updates_without_prio... FILE: tests/test_nix_target_resolution.py function test_resolve_nix_target_preserves_flakeref_on_success (line 22) | def test_resolve_nix_target_preserves_flakeref_on_success(monkeypatch): function test_resolve_nix_target_requests_derivation_for_buildtime_flakeref (line 38) | def test_resolve_nix_target_requests_derivation_for_buildtime_flakeref(m... function test_resolve_nix_target_normalizes_plain_nixos_configuration (line 66) | def test_resolve_nix_target_normalizes_plain_nixos_configuration(monkeyp... function test_resolve_nix_target_normalizes_quoted_nixos_configuration (line 92) | def test_resolve_nix_target_normalizes_quoted_nixos_configuration(monkey... function test_resolve_nix_target_leaves_malformed_nixos_configuration_refs (line 130) | def test_resolve_nix_target_leaves_malformed_nixos_configuration_refs( function test_resolve_nix_target_propagates_flakeref_realisation_failure_without_path_probe (line 156) | def test_resolve_nix_target_propagates_flakeref_realisation_failure_with... function test_resolve_nix_target_propagates_flakeref_eval_failure_without_path_probe (line 184) | def test_resolve_nix_target_propagates_flakeref_eval_failure_without_pat... function test_resolve_nix_target_uses_plain_path_validation (line 212) | def test_resolve_nix_target_uses_plain_path_validation(monkeypatch): function test_resolve_nix_target_realises_runtime_drv_target (line 236) | def test_resolve_nix_target_realises_runtime_drv_target(monkeypatch): function test_resolve_nix_target_uses_first_runtime_drv_output (line 279) | def test_resolve_nix_target_uses_first_runtime_drv_output(monkeypatch): function test_resolve_nix_target_rejects_empty_runtime_drv_output (line 301) | def test_resolve_nix_target_rejects_empty_runtime_drv_output(monkeypatch): function test_resolve_nix_target_rejects_failed_runtime_drv_realisation (line 320) | def test_resolve_nix_target_rejects_failed_runtime_drv_realisation(monke... FILE: tests/test_nix_utils_parsing.py function test_parse_nix_derivation_show_normalizes_nix_2_33_store_paths (line 16) | def test_parse_nix_derivation_show_normalizes_nix_2_33_store_paths(): function test_get_nix_store_dir_ignores_colon_separated_env_paths (line 64) | def test_get_nix_store_dir_ignores_colon_separated_env_paths(): function test_parse_nix_derivation_show_infers_store_dir_from_path_like_env_values (line 74) | def test_parse_nix_derivation_show_infers_store_dir_from_path_like_env_v... function test_parse_nix_derivation_show_rejects_changed_wrapper_shape (line 105) | def test_parse_nix_derivation_show_rejects_changed_wrapper_shape(): function test_parse_nix_derivation_show_rejects_changed_output_shape (line 110) | def test_parse_nix_derivation_show_rejects_changed_output_shape(): function test_parse_nix_derivation_show_rejects_invalid_json (line 126) | def test_parse_nix_derivation_show_rejects_invalid_json(): FILE: tests/test_nixgraph_graph.py class CapturingLogger (line 19) | class CapturingLogger: method __init__ (line 20) | def __init__(self): method debug (line 23) | def debug(self, msg, *args): method info (line 26) | def info(self, msg, *args): method warning (line 29) | def warning(self, msg, *args): method log (line 32) | def log(self, level, msg, *args): function test_dependency_graph_returns_dataframe_for_csv_output (line 36) | def test_dependency_graph_returns_dataframe_for_csv_output(): function test_dependency_graph_inverse_returns_dataframe_for_csv_output (line 72) | def test_dependency_graph_inverse_returns_dataframe_for_csv_output(): function test_dependency_graph_writes_raw_dot_without_graphviz_render (line 108) | def test_dependency_graph_writes_raw_dot_without_graphviz_render(tmp_path): function test_dependency_graph_deduplicates_rendered_nodes (line 131) | def test_dependency_graph_deduplicates_rendered_nodes(): function test_dependency_graph_warns_before_large_graphviz_render (line 148) | def test_dependency_graph_warns_before_large_graphviz_render(monkeypatch): function test_load_dependencies_logs_dependency_loading_at_info (line 182) | def test_load_dependencies_logs_dependency_loading_at_info(monkeypatch): function test_load_dependencies_buildtime_uses_derivation_json (line 203) | def test_load_dependencies_buildtime_uses_derivation_json(monkeypatch): function test_load_dependencies_runtime_uses_resolved_output_path (line 249) | def test_load_dependencies_runtime_uses_resolved_output_path(monkeypatch): function test_nixgraph_no_longer_exposes_removed_graph_helpers (line 281) | def test_nixgraph_no_longer_exposes_removed_graph_helpers(): FILE: tests/test_nixmeta_parsing.py function test_parse_json_metadata_flattens_nested_fields (line 13) | def test_parse_json_metadata_flattens_nested_fields(tmp_path): FILE: tests/test_nixmeta_progress.py class CapturingLogger (line 17) | class CapturingLogger: method __init__ (line 18) | def __init__(self): method debug (line 21) | def debug(self, msg, *args): method info (line 24) | def info(self, msg, *args): method warning (line 27) | def warning(self, msg, *args): method fatal (line 30) | def fatal(self, msg, *args): method log (line 33) | def log(self, level, msg, *args): function test_nixmeta_main_logs_scan_start (line 37) | def test_nixmeta_main_logs_scan_start(monkeypatch): function test_get_flake_metadata_logs_metadata_read (line 76) | def test_get_flake_metadata_logs_metadata_read(): function test_get_nixpkgs_flakeref_uses_root_nixpkgs_input_with_renamed_node (line 96) | def test_get_nixpkgs_flakeref_uses_root_nixpkgs_input_with_renamed_node(): function test_nixmeta_scanner_logs_nix_env_progress (line 128) | def test_nixmeta_scanner_logs_nix_env_progress(tmp_path, monkeypatch): function test_run_nix_env_metadata_captures_successful_stderr (line 187) | def test_run_nix_env_metadata_captures_successful_stderr(monkeypatch, tm... function test_nixmeta_scanner_tolerates_empty_metadata_json (line 212) | def test_nixmeta_scanner_tolerates_empty_metadata_json(tmp_path, monkeyp... function test_nixmeta_expression_scan_enables_flakes (line 233) | def test_nixmeta_expression_scan_enables_flakes(monkeypatch): function test_nixmeta_expression_scan_honors_impure (line 258) | def test_nixmeta_expression_scan_honors_impure(monkeypatch): FILE: tests/test_nixmeta_source.py function test_classify_meta_nixpkgs_reserved_modes_before_explicit_source (line 19) | def test_classify_meta_nixpkgs_reserved_modes_before_explicit_source(): function test_get_nixpkgs_meta_with_source_records_flakeref_lock (line 27) | def test_get_nixpkgs_meta_with_source_records_flakeref_lock(monkeypatch,... function test_get_nixpkgs_meta_with_source_records_opt_in_nix_path (line 60) | def test_get_nixpkgs_meta_with_source_records_opt_in_nix_path(monkeypatch): function test_explicit_nix_path_source_requires_nixpkgs_entry (line 86) | def test_explicit_nix_path_source_requires_nixpkgs_entry(monkeypatch): function test_path_target_without_source_skips_nix_path_metadata (line 102) | def test_path_target_without_source_skips_nix_path_metadata(monkeypatch): function test_explicit_store_path_source_records_explicit_method (line 123) | def test_explicit_store_path_source_records_explicit_method(monkeypatch,... function test_explicit_flakeref_source_resolves_nixpkgs_path (line 154) | def test_explicit_flakeref_source_resolves_nixpkgs_path(monkeypatch): function test_mutable_explicit_path_is_normalized_before_scanning (line 183) | def test_mutable_explicit_path_is_normalized_before_scanning(monkeypatch... function test_mutable_explicit_path_is_rejected_if_not_cache_safe (line 214) | def test_mutable_explicit_path_is_rejected_if_not_cache_safe(monkeypatch... function test_nixos_toplevel_flakeref_prefers_configuration_pkgs_path (line 229) | def test_nixos_toplevel_flakeref_prefers_configuration_pkgs_path( function test_nixos_toplevel_expression_locks_relative_flake_refs (line 295) | def test_nixos_toplevel_expression_locks_relative_flake_refs( function test_nixos_toplevel_expression_preserves_locked_subflake_dir (line 369) | def test_nixos_toplevel_expression_preserves_locked_subflake_dir( function test_nixos_toplevel_flakeref_handles_quoted_configuration_names (line 454) | def test_nixos_toplevel_flakeref_handles_quoted_configuration_names( function test_nixos_toplevel_flakeref_metadata_eval_honors_impure (line 512) | def test_nixos_toplevel_flakeref_metadata_eval_honors_impure(monkeypatch... function test_nixos_toplevel_expression_cache_uses_only_stable_refs (line 567) | def test_nixos_toplevel_expression_cache_uses_only_stable_refs(monkeypat... function test_nixos_toplevel_expression_scan_failure_skips_metadata (line 619) | def test_nixos_toplevel_expression_scan_failure_skips_metadata( function test_nixos_toplevel_flakeref_without_pkgs_path_returns_message (line 663) | def test_nixos_toplevel_flakeref_without_pkgs_path_returns_message(monke... function test_nixos_toplevel_flakeref_without_pkgs_returns_message (line 699) | def test_nixos_toplevel_flakeref_without_pkgs_returns_message( function test_plain_nixos_configuration_attrset_is_not_target_inferred (line 736) | def test_plain_nixos_configuration_attrset_is_not_target_inferred( function test_meta_scan_uses_already_resolved_scanner_path (line 766) | def test_meta_scan_uses_already_resolved_scanner_path(monkeypatch): FILE: tests/test_nixmeta_source_export.py function _make_minimal_sbom (line 16) | def _make_minimal_sbom(): function test_cdx_document_records_nixpkgs_metadata_source (line 53) | def test_cdx_document_records_nixpkgs_metadata_source(monkeypatch): function test_spdx_document_records_nixpkgs_metadata_source (line 70) | def test_spdx_document_records_nixpkgs_metadata_source(monkeypatch): FILE: tests/test_osv_client.py class FakeResponse (line 11) | class FakeResponse: method __init__ (line 12) | def __init__(self, payload): method json (line 16) | def json(self): method raise_for_status (line 19) | def raise_for_status(self): class FakeSession (line 23) | class FakeSession: method __init__ (line 24) | def __init__(self): method post (line 27) | def post(self, url, json=None, timeout=None): function test_osv_client_posts_with_timeout_and_parses_results (line 45) | def test_osv_client_posts_with_timeout_and_parses_results(tmp_path): FILE: tests/test_provenance_batching.py function _path_info_paths (line 15) | def _path_info_paths(cmd): function test_provenance_hash_query_batches_on_e2big (line 23) | def test_provenance_hash_query_batches_on_e2big(): FILE: tests/test_provenance_path_info.py function test_normalize_path_info_rejects_malformed_list_records (line 20) | def test_normalize_path_info_rejects_malformed_list_records(): function test_normalize_path_info_rejects_malformed_object_records (line 25) | def test_normalize_path_info_rejects_malformed_object_records(): function test_normalize_path_info_supports_list_records (line 30) | def test_normalize_path_info_supports_list_records(): function test_nar_hash_for_path_rejects_missing_hash (line 45) | def test_nar_hash_for_path_rejects_missing_hash(): function test_nar_hash_for_path_rejects_missing_record (line 50) | def test_nar_hash_for_path_rejects_missing_record(): function test_dependency_paths_rejects_mismatched_path_info_record (line 55) | def test_dependency_paths_rejects_mismatched_path_info_record(): function test_dependency_paths_recursive_includes_derivation_outputs (line 69) | def test_dependency_paths_recursive_includes_derivation_outputs(): function test_query_path_info_wraps_nix_command_failures (line 102) | def test_query_path_info_wraps_nix_command_failures(): FILE: tests/test_provenance_subjects.py function _dependency_hooks (line 32) | def _dependency_hooks(*, exec_cmd_fn, query_path_hashes_fn=None): function _subject_hooks (line 53) | def _subject_hooks(exec_cmd_fn): function _path_info_paths (line 63) | def _path_info_paths(cmd): function test_get_dependencies_supports_nix_2_33_wrapped_json (line 72) | def test_get_dependencies_supports_nix_2_33_wrapped_json(): function test_normalize_digest_does_not_shell_out (line 117) | def test_normalize_digest_does_not_shell_out(): function test_normalize_digest_rejects_overflowing_nix32_values (line 130) | def test_normalize_digest_rejects_overflowing_nix32_values(): function test_dependency_package_skips_non_normalized_digest (line 134) | def test_dependency_package_skips_non_normalized_digest(caplog): function test_get_dependencies_prefers_fixed_output_digest_for_output_paths (line 154) | def test_get_dependencies_prefers_fixed_output_digest_for_output_paths(): function test_get_dependencies_maps_env_only_output_paths_back_to_derivations (line 207) | def test_get_dependencies_maps_env_only_output_paths_back_to_derivations(): function test_get_dependencies_wraps_derivation_show_failures (line 256) | def test_get_dependencies_wraps_derivation_show_failures(): function test_get_subjects_falls_back_to_env_output_paths (line 273) | def test_get_subjects_falls_back_to_env_output_paths(): function test_get_subjects_prefers_derivation_hash_for_realized_flat_outputs (line 300) | def test_get_subjects_prefers_derivation_hash_for_realized_flat_outputs(): function test_get_subjects_uses_derivation_hash_when_output_is_not_realized (line 321) | def test_get_subjects_uses_derivation_hash_when_output_is_not_realized(): function test_get_subjects_supports_resource_sha256_metadata (line 342) | def test_get_subjects_supports_resource_sha256_metadata(): function test_get_subjects_skips_unrealized_outputs_without_digest (line 367) | def test_get_subjects_skips_unrealized_outputs_without_digest(): function test_get_subjects_skip_only_missing_unrealized_outputs (line 380) | def test_get_subjects_skip_only_missing_unrealized_outputs(): function test_provenance_uses_store_path_hint_for_nix_2_33_outputs_without_path (line 409) | def test_provenance_uses_store_path_hint_for_nix_2_33_outputs_without_pa... function test_provenance_wraps_target_derivation_show_failures (line 457) | def test_provenance_wraps_target_derivation_show_failures(monkeypatch): function test_provenance_rejects_empty_target_derivation_metadata (line 474) | def test_provenance_rejects_empty_target_derivation_metadata(monkeypatch): function test_provenance_rejects_target_derivation_without_outputs (line 492) | def test_provenance_rejects_target_derivation_without_outputs(monkeypatch): function test_provenance_keeps_fixed_output_subjects_when_output_is_not_realized (line 523) | def test_provenance_keeps_fixed_output_subjects_when_output_is_not_reali... FILE: tests/test_repology_adapter.py class FakeResponse (line 20) | class FakeResponse: method __init__ (line 21) | def __init__(self, text, status_code=200): method raise_for_status (line 25) | def raise_for_status(self): class MappingSession (line 30) | class MappingSession: method __init__ (line 31) | def __init__(self, responses): method get (line 35) | def get(self, url, timeout=None): function _fixture_text (line 42) | def _fixture_text(name): function test_repology_adapter_pkg_exact_parses_fixture_and_uses_timeout (line 46) | def test_repology_adapter_pkg_exact_parses_fixture_and_uses_timeout(): function test_repology_adapter_pkg_exact_raises_for_empty_results (line 71) | def test_repology_adapter_pkg_exact_raises_for_empty_results(): function test_repology_adapter_sbom_query_marks_special_statuses (line 90) | def test_repology_adapter_sbom_query_marks_special_statuses(tmp_path): function test_repology_adapter_query_cves_parses_fixture_and_uses_timeout (line 144) | def test_repology_adapter_query_cves_parses_fixture_and_uses_timeout(): FILE: tests/test_repology_cve.py class FakeResponse (line 15) | class FakeResponse: method __init__ (line 16) | def __init__(self, text, status_code=200): method raise_for_status (line 20) | def raise_for_status(self): class MappingSession (line 25) | class MappingSession: method __init__ (line 26) | def __init__(self, responses): method get (line 30) | def get(self, url, timeout=None): function test_query_cve_parses_fixture_and_uses_timeout (line 37) | def test_query_cve_parses_fixture_and_uses_timeout(): FILE: tests/test_repology_projects_parser.py function _fixture_text (line 17) | def _fixture_text(name): function test_parse_projects_search_html_parses_fixture_rows (line 21) | def test_parse_projects_search_html_parses_fixture_rows(): function test_parse_projects_search_html_respects_already_processed_packages (line 49) | def test_parse_projects_search_html_respects_already_processed_packages(): function test_parse_projects_search_html_raises_for_malformed_table (line 61) | def test_parse_projects_search_html_raises_for_malformed_table(): FILE: tests/test_repology_sbom.py function test_parse_cdx_sbom_normalizes_names_and_includes_metadata_component (line 21) | def test_parse_cdx_sbom_normalizes_names_and_includes_metadata_component... function test_merge_sbom_fields_and_classify_outdated_versions (line 45) | def test_merge_sbom_fields_and_classify_outdated_versions(): function test_sbom_status_helpers_cover_ignored_rows (line 67) | def test_sbom_status_helpers_cover_ignored_rows(): FILE: tests/test_runtime_closure.py function test_runtime_closure_from_path_info_extracts_edges_and_derivers (line 17) | def test_runtime_closure_from_path_info_extracts_edges_and_derivers(): function test_runtime_closure_from_path_info_supports_list_payloads (line 52) | def test_runtime_closure_from_path_info_supports_list_payloads(): function test_runtime_closure_from_path_info_rejects_missing_references (line 71) | def test_runtime_closure_from_path_info_rejects_missing_references(): function test_runtime_closure_from_path_info_rejects_malformed_reference_items (line 82) | def test_runtime_closure_from_path_info_rejects_malformed_reference_item... function test_load_runtime_closure_wraps_nix_command_failures (line 93) | def test_load_runtime_closure_wraps_nix_command_failures(monkeypatch): FILE: tests/test_sbom_closure.py function _dependency_df (line 17) | def _dependency_df(): function test_dependencies_to_depth_returns_reachable_dependency_rows (line 42) | def test_dependencies_to_depth_returns_reachable_dependency_rows(): function test_walk_dependency_rows_supports_inverse_traversal (line 61) | def test_walk_dependency_rows_supports_inverse_traversal(): function test_walk_dependency_rows_stops_after_matching_boundary_row (line 80) | def test_walk_dependency_rows_stops_after_matching_boundary_row(): function test_dependencies_to_depth_returns_empty_dataframe_for_missing_start (line 99) | def test_dependencies_to_depth_returns_empty_dataframe_for_missing_start(): function test_dependencies_to_depth_deduplicates_shared_diamond_edges (line 111) | def test_dependencies_to_depth_deduplicates_shared_diamond_edges(): function test_dependency_paths_returns_all_source_and_target_paths (line 183) | def test_dependency_paths_returns_all_source_and_target_paths(): FILE: tests/test_sbom_vuln_enrichment.py class CapturingLogger (line 22) | class CapturingLogger: method __init__ (line 23) | def __init__(self): method info (line 26) | def info(self, msg, *args): method fatal (line 29) | def fatal(self, msg, *args): function test_sbomnix_getargs_accepts_meta_nixpkgs (line 33) | def test_sbomnix_getargs_accepts_meta_nixpkgs(): function test_sbomnix_run_rejects_exclude_meta_with_meta_nixpkgs (line 45) | def test_sbomnix_run_rejects_exclude_meta_with_meta_nixpkgs(): function test_sbomnix_main_enriches_cdx_explicitly_when_include_vulns_is_set (line 65) | def test_sbomnix_main_enriches_cdx_explicitly_when_include_vulns_is_set(... function test_sbomnix_main_logs_generation_before_initializing_builder (line 144) | def test_sbomnix_main_logs_generation_before_initializing_builder(monkey... function test_to_cdx_no_longer_triggers_vulnerability_scans (line 201) | def test_to_cdx_no_longer_triggers_vulnerability_scans(tmp_path, monkeyp... function test_sbom_vuln_enrichment_scans_expected_nix_target (line 265) | def test_sbom_vuln_enrichment_scans_expected_nix_target( function test_sbom_vuln_tempfile_is_removed_on_scan_failure (line 305) | def test_sbom_vuln_tempfile_is_removed_on_scan_failure(tmp_path, monkeyp... FILE: tests/test_schema_validation.py function test_local_schema_aliases_resolve_to_vendored_resources (line 12) | def test_local_schema_aliases_resolve_to_vendored_resources(): function test_validate_json_uses_only_local_schema_resources (line 33) | def test_validate_json_uses_only_local_schema_resources(): FILE: tests/test_store_batching.py function test_load_many_batches_nix_derivation_show_and_preserves_outputs (line 18) | def test_load_many_batches_nix_derivation_show_and_preserves_outputs(mon... function test_load_many_supports_output_path_queries (line 94) | def test_load_many_supports_output_path_queries(monkeypatch): function test_load_many_maps_output_queries_from_derivation_env (line 156) | def test_load_many_maps_output_queries_from_derivation_env(monkeypatch): function test_load_many_can_ignore_missing_output_derivations (line 200) | def test_load_many_can_ignore_missing_output_derivations(monkeypatch): function test_load_recursive_wraps_nix_command_failures (line 252) | def test_load_recursive_wraps_nix_command_failures(monkeypatch): function test_load_rejects_empty_derivation_metadata (line 268) | def test_load_rejects_empty_derivation_metadata(monkeypatch): function test_load_recursive_rejects_empty_derivation_metadata (line 282) | def test_load_recursive_rejects_empty_derivation_metadata(monkeypatch): FILE: tests/test_temp_sbom_generation.py function test_vulnxscan_cleans_generated_tempfiles_on_failure (line 17) | def test_vulnxscan_cleans_generated_tempfiles_on_failure(tmp_path, monke... function test_generate_temp_sbom_without_csv_returns_only_cdx_path (line 76) | def test_generate_temp_sbom_without_csv_returns_only_cdx_path(tmp_path, ... function test_generate_temp_sbom_cleans_tempfiles_on_generation_failure (line 124) | def test_generate_temp_sbom_cleans_tempfiles_on_generation_failure( function test_generate_temp_sbom_cleans_first_tempfile_if_second_creation_fails (line 176) | def test_generate_temp_sbom_cleans_first_tempfile_if_second_creation_fails( FILE: tests/test_vulnix_test_support.py function test_build_vulnix_test_env_prepends_wrapper_dir (line 19) | def test_build_vulnix_test_env_prepends_wrapper_dir(tmp_path): function test_dummy_vulnix_wrapper_returns_empty_json (line 38) | def test_dummy_vulnix_wrapper_returns_empty_json(tmp_path): function test_real_vulnix_wrapper_forwards_cache_dir_and_args (line 58) | def test_real_vulnix_wrapper_forwards_cache_dir_and_args(tmp_path): function test_configure_vulnix_for_tests_rejects_unknown_mode (line 96) | def test_configure_vulnix_for_tests_rejects_unknown_mode(tmp_path): function test_real_vulnix_wrapper_shows_clear_error_when_binary_missing (line 107) | def test_real_vulnix_wrapper_shows_clear_error_when_binary_missing(tmp_p... function test_ensure_real_vulnix_cache_surfaces_warmup_errors (line 130) | def test_ensure_real_vulnix_cache_surfaces_warmup_errors(tmp_path): function test_real_vulnix_wrapper_executes_real_binary (line 158) | def test_real_vulnix_wrapper_executes_real_binary(tmp_path): FILE: tests/test_vulnxscan_engine.py function test_parse_vulnix_json_updates_cvss_cache (line 19) | def test_parse_vulnix_json_updates_cvss_cache(): function test_parse_grype_json_prefers_cvss_v3_scores (line 41) | def test_parse_grype_json_prefers_cvss_v3_scores(): function test_build_report_dataframe_merges_scanner_counts (line 75) | def test_build_report_dataframe_merges_scanner_counts(): function test_write_reports_writes_triage_report (line 119) | def test_write_reports_writes_triage_report(tmp_path): function test_scan_vulnix_uses_argv_lists (line 139) | def test_scan_vulnix_uses_argv_lists(monkeypatch, buildtime, expected_cmd): FILE: tests/test_vulnxscan_triage.py class FakeRepologyLookup (line 18) | class FakeRepologyLookup: method __init__ (line 19) | def __init__(self): method is_vulnerable (line 23) | def is_vulnerable(self, package, version, vuln_id=None): method query_repology_versions (line 27) | def query_repology_versions(self, df_vuln_pkgs): class FakeGitHubLookup (line 46) | class FakeGitHubLookup: method __init__ (line 47) | def __init__(self): method find_nixpkgs_prs (line 50) | def find_nixpkgs_prs(self, row): class FakeAdapter (line 55) | class FakeAdapter: method __init__ (line 56) | def __init__(self): method query (line 59) | def query(self, repology_query): function test_classify_vulnerability_marks_fixable_nixpkgs_update (line 79) | def test_classify_vulnerability_marks_fixable_nixpkgs_update(): function test_triage_vulnerabilities_groups_rows_and_adds_nixpkgs_prs (line 98) | def test_triage_vulnerabilities_groups_rows_and_adds_nixpkgs_prs(): function test_github_pr_lookup_queries_vuln_and_version_matches (line 134) | def test_github_pr_lookup_queries_vuln_and_version_matches(): function test_query_repology_versions_prefers_exact_version_match (line 178) | def test_query_repology_versions_prefers_exact_version_match(): function test_query_repology_rejects_unknown_match_type (line 213) | def test_query_repology_rejects_unknown_match_type(): FILE: tests/test_whitelist.py function test_whitelist (line 14) | def test_whitelist(): FILE: tests/testutils.py function resolve_local_schema_path (line 24) | def resolve_local_schema_path(uri, schema_dir): function create_local_schema_retriever (line 40) | def create_local_schema_retriever(schema_dir): function validate_json (line 50) | def validate_json(file_path, schema_path): function df_to_string (line 68) | def df_to_string(df): function df_difference (line 77) | def df_difference(df_left, df_right): FILE: tests/vulnix_test_support.py class VulnixTestConfig (line 22) | class VulnixTestConfig: function default_vulnix_cache_dir (line 31) | def default_vulnix_cache_dir(env: dict[str, str] | None = None) -> Path: function vulnix_cache_ready (line 40) | def vulnix_cache_ready(cache_dir: Path) -> bool: function write_vulnix_wrapper (line 46) | def write_vulnix_wrapper(wrapper_dir: Path) -> Path: function build_vulnix_test_env (line 79) | def build_vulnix_test_env( function configure_vulnix_for_tests (line 98) | def configure_vulnix_for_tests( function ensure_real_vulnix_cache (line 126) | def ensure_real_vulnix_cache(