Files
wehub-resource-sync 97e91a83f3
Ruff / Ruff (push) Waiting to run
Test / Core Tests (push) Waiting to run
Test / Offline Coverage Tests (Python 3.10) (push) Waiting to run
Test / Offline Coverage Tests (Python 3.11) (push) Waiting to run
Test / Offline Coverage Tests (Python 3.12) (push) Waiting to run
Test / Offline Coverage Tests (Python 3.13) (push) Waiting to run
Test / Offline Coverage Tests (Python 3.9) (push) Waiting to run
Test / Full Coverage (Python 3.11) (push) Waiting to run
Test / Core Provider Tests (OpenAI) (push) Blocked by required conditions
Test / Core Provider Tests (Anthropic) (push) Blocked by required conditions
Test / Core Provider Tests (Google) (push) Blocked by required conditions
Test / Core Provider Tests (Other) (push) Blocked by required conditions
Test / Anthropic Tests (push) Blocked by required conditions
Test / Gemini Tests (push) Blocked by required conditions
Test / Google GenAI Tests (push) Blocked by required conditions
Test / Vertex AI Tests (push) Blocked by required conditions
Test / OpenAI Tests (push) Blocked by required conditions
Test / Writer Tests (push) Blocked by required conditions
Test / Auto Client Tests (push) Blocked by required conditions
ty / type-check (push) Waiting to run
chore: import upstream snapshot with attribution
2026-07-13 13:36:38 +08:00

177 lines
5.9 KiB
Python
Executable File

#!/usr/bin/env python3
"""
Audit documentation files for old patterns that need to be updated.
Reports:
- Old API call patterns (client.chat.completions.*)
- Old initialization patterns (instructor.from_*, instructor.patch)
- Unused imports
"""
import argparse
import re
from collections import defaultdict
from pathlib import Path
from typing import Dict, List
def find_markdown_files(docs_dir: Path) -> List[Path]:
"""Find all markdown files in the docs directory."""
return list(docs_dir.rglob("*.md")) + list(docs_dir.rglob("*.ipynb"))
def audit_api_calls(content: str, file_path: Path) -> Dict[str, List[int]]:
"""Find old API call patterns."""
issues = defaultdict(list)
patterns = {
"client.chat.completions.create": r"client\.chat\.completions\.create\(",
"client.chat.completions.create_partial": r"client\.chat\.completions\.create_partial\(",
"client.chat.completions.create_iterable": r"client\.chat\.completions\.create_iterable\(",
"client.chat.completions.create_with_completion": r"client\.chat\.completions\.create_with_completion\(",
}
for name, pattern in patterns.items():
for match in re.finditer(pattern, content):
line_num = content[: match.start()].count("\n") + 1
issues[name].append(line_num)
return issues
def audit_old_init_patterns(content: str, file_path: Path) -> Dict[str, List[int]]:
"""Find old initialization patterns."""
issues = defaultdict(list)
# Find instructor.from_* patterns
from_pattern = r"instructor\.from_(\w+)\("
for match in re.finditer(from_pattern, content):
provider = match.group(1)
line_num = content[: match.start()].count("\n") + 1
issues[f"instructor.from_{provider}"].append(line_num)
# Find instructor.patch patterns
patch_pattern = r"instructor\.patch\("
for match in re.finditer(patch_pattern, content):
line_num = content[: match.start()].count("\n") + 1
issues["instructor.patch"].append(line_num)
return issues
def audit_unused_imports(content: str, file_path: Path) -> Dict[str, List[int]]:
"""Find potentially unused imports when from_provider is used."""
issues = defaultdict(list)
# Check if from_provider is used
uses_from_provider = "from_provider" in content or "from_provider" in content
if not uses_from_provider:
return issues
# Find provider imports
import_patterns = {
"import openai": r"^import\s+openai\b",
"from openai import": r"^from\s+openai\s+import",
"import anthropic": r"^import\s+anthropic\b",
"from anthropic import": r"^from\s+anthropic\s+import",
}
lines = content.split("\n")
for line_num, line in enumerate(lines, 1):
for name, pattern in import_patterns.items():
if re.search(pattern, line):
# Check if the import is actually used
if name.startswith("import "):
module = name.split()[1]
# Simple check - if module name appears elsewhere, might be used
if content.count(module) <= 2: # Just import and maybe one use
issues[name].append(line_num)
return issues
def process_file(file_path: Path) -> Dict[str, Dict[str, List[int]]]:
"""Process a single file and return all issues."""
try:
content = file_path.read_text(encoding="utf-8")
return {
"api_calls": audit_api_calls(content, file_path),
"old_init": audit_old_init_patterns(content, file_path),
"unused_imports": audit_unused_imports(content, file_path),
}
except Exception as e:
print(f"Error processing {file_path}: {e}")
return {"api_calls": {}, "old_init": {}, "unused_imports": {}}
def main():
parser = argparse.ArgumentParser(
description="Audit documentation files for old patterns"
)
parser.add_argument(
"--docs-dir",
type=Path,
default=Path("docs"),
help="Directory containing documentation files (default: docs)",
)
parser.add_argument(
"--file",
type=Path,
help="Audit a single file instead of all files",
)
parser.add_argument(
"--summary",
action="store_true",
help="Show only summary statistics",
)
args = parser.parse_args()
if args.file:
files = [args.file]
else:
files = find_markdown_files(args.docs_dir)
all_issues = {}
total_counts = defaultdict(int)
for file_path in files:
issues = process_file(file_path)
if any(issues.values()):
all_issues[str(file_path)] = issues
# Count totals
for issue_type, patterns in issues.items():
for pattern, line_nums in patterns.items():
total_counts[f"{issue_type}:{pattern}"] += len(line_nums)
if args.summary:
print("Summary Statistics:")
print("=" * 60)
for key, count in sorted(total_counts.items()):
issue_type, pattern = key.split(":", 1)
print(f" {pattern}: {count} instances")
else:
# Detailed report
for file_path, issues in sorted(all_issues.items()):
print(f"\n{file_path}:")
print("-" * 60)
for issue_type, patterns in issues.items():
if patterns:
print(f" {issue_type.replace('_', ' ').title()}:")
for pattern, line_nums in sorted(patterns.items()):
lines_str = ", ".join(map(str, line_nums[:10]))
if len(line_nums) > 10:
lines_str += f", ... ({len(line_nums)} total)"
print(f" {pattern}: lines {lines_str}")
print(f"\nTotal files with issues: {len(all_issues)}")
print(f"Total issues found: {sum(total_counts.values())}")
if __name__ == "__main__":
main()