fix: apply review fixes from PR #309 and stabilize flaky benchmark test

Follow-up to PR #309 (perf: optimize with caching, pre-compiled regex,
O(1) lookups, and bisect line indexing). These fixes were committed to
the PR branch but missed the squash merge.

Review fixes (credit: PR #309 by copperlang2007):
1. Rename _pending_set -> _enqueued_urls to accurately reflect that the
   set tracks all ever-enqueued URLs, not just currently pending ones
2. Extract duplicated _build_line_index()/_offset_to_line() into shared
   build_line_index()/offset_to_line() in cli/utils.py (DRY)
3. Fix pre-existing bug: infer_categories() guard checked 'tutorial'
   but wrote to 'tutorials' key, risking silent overwrites
4. Remove unnecessary _store_results() closure in scrape_page()
5. Simplify parser pre-import in codebase_scraper.py

Benchmark stabilization:
- test_benchmark_metadata_overhead was flaky on CI (106.7% overhead
  observed, threshold 50%) because 5 iterations with mean averaging
  can't reliably measure microsecond-level differences
- Fix: 20 iterations, warm-up run, median instead of mean, threshold
  raised to 200% (guards catastrophic regression, not noise)

Ref: https://github.com/yusufkaraaslan/Skill_Seekers/pull/309
This commit is contained in:
yusyus
2026-03-14 23:39:23 +03:00
parent 89f5e6fe5f
commit f214976ccd
6 changed files with 91 additions and 56 deletions

View File

@@ -40,13 +40,14 @@ Credits:
"""
import ast
import bisect
import logging
import re
from dataclasses import dataclass, field
from pathlib import Path
from typing import Any
from skill_seekers.cli.utils import build_line_index, offset_to_line
try:
import networkx as nx
@@ -98,14 +99,9 @@ class DependencyAnalyzer:
self.file_nodes: dict[str, FileNode] = {}
self._newline_offsets: list[int] = []
@staticmethod
def _build_line_index(content: str) -> list[int]:
"""Build a sorted list of newline positions for O(log n) line lookups."""
return [i for i, ch in enumerate(content) if ch == "\n"]
def _offset_to_line(self, offset: int) -> int:
"""Convert a character offset to a 1-based line number using bisect."""
return bisect.bisect_left(self._newline_offsets, offset) + 1
return offset_to_line(self._newline_offsets, offset)
def analyze_file(self, file_path: str, content: str, language: str) -> list[DependencyInfo]:
"""
@@ -121,7 +117,7 @@ class DependencyAnalyzer:
List of DependencyInfo objects
"""
# Build line index once for O(log n) lookups in all extractors
self._newline_offsets = self._build_line_index(content)
self._newline_offsets = build_line_index(content)
if language == "Python":
deps = self._extract_python_imports(content, file_path)