mirror of
https://github.com/kuhyx/testsAndMisc.git
synced 2026-11-11 15:34:06 +01:00
1017 lines down to 148. Six libs: the per-language doc-URL builders (split in two only for the cap), the lookup/dispatch layer, and one per generation phase. The hard part was not the ten functions but the 335-line top-level block, which extract_shell_functions.py cannot move because it only relocates functions. It is now generate_doc_links / generate_anki_cards / generate_llm_prompt, wrapped WITHOUT re-indenting the bodies: five heredocs use quoted terminators, which must stay at column 0. Proof the split is behaviour-preserving: a golden fixture captured before any edit, re-checked after every step. All three outputs -- anki_cards.txt, documentation_links.md, llm_anki_prompt.md -- stay byte-identical by sha256sum, and stdout matches too. Four latent defects surfaced while writing the tests, all fixed: python_doc_url required a $2 it never reads, and get_doc_url has always called it with one argument. That only worked because the entry script runs `set -e` without `-u`, so "$2" silently expanded to empty; any caller with `set -u` aborted. Defaulted, along with three more positionals documented as optional but declared required. The two imports loops hardcoded `head -20` while the other seven honoured TOP_N, so --top was silently ignored for imports. Only one of nine term loops skipped comment lines, so a '#' line in an analysis file became a flashcard whose front was a comment. Introduced and fixed within this change: the comment filter has to run BEFORE `head -n` or comment lines count against the limit, and it needs `|| true`, since grep exits 1 when it filters every line and the callers run under `set -e`. The golden fixture cannot show the last three, because it has no comments and fewer than 20 imports -- which is exactly why they survived. A second fixture with 25 imports and comment lines, at --top 3, emitted 20 imports and two comment cards before, and 3 imports with zero leakage after. 166 assertions across 4 test files. 100% line coverage on study_doc_urls.sh (38/38), study_doc_urls_more.sh (30/30), study_doc_lookup.sh (49/49) and study_gen_llm.sh (54/54). study_gen_docs.sh 93.10% and study_gen_anki.sh 96.15%, where every remaining line is a `} >>"$FILE"` closing a brace group whose output a passing test asserts -- the same kcov attribution artifact recorded for services_hosts.sh. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01F3PzGc75gBcdxP3PkHXGcV
135 lines
4.8 KiB
Bash
Executable File
135 lines
4.8 KiB
Bash
Executable File
#!/bin/bash
|
|
# Generate study materials (documentation links + Anki cards) from repo analysis
|
|
# Usage: ./generate_study_materials.sh <results_dir> [--top N] [--languages "python,c,js"]
|
|
#
|
|
# Examples:
|
|
# ./generate_study_materials.sh /tmp/repo_analysis/results_myproject
|
|
# ./generate_study_materials.sh /tmp/repo_analysis/results_linux --top 20 --languages "c"
|
|
# ./generate_study_materials.sh ./results --languages "python,typescript"
|
|
|
|
set -e
|
|
|
|
# Each generation phase and each family of doc-URL builders lives in a lib
|
|
# beside this file; this script keeps the configuration, the argument
|
|
# parsing and the order the phases run in.
|
|
LIB_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)/lib"
|
|
# shellcheck source=lib/study_doc_urls.sh
|
|
. "$LIB_DIR/study_doc_urls.sh"
|
|
# shellcheck source=lib/study_doc_urls_more.sh
|
|
. "$LIB_DIR/study_doc_urls_more.sh"
|
|
# shellcheck source=lib/study_doc_lookup.sh
|
|
. "$LIB_DIR/study_doc_lookup.sh"
|
|
# shellcheck source=lib/study_gen_docs.sh
|
|
. "$LIB_DIR/study_gen_docs.sh"
|
|
# shellcheck source=lib/study_gen_anki.sh
|
|
. "$LIB_DIR/study_gen_anki.sh"
|
|
# shellcheck source=lib/study_gen_llm.sh
|
|
. "$LIB_DIR/study_gen_llm.sh"
|
|
|
|
#==============================================================================
|
|
# Configuration
|
|
#==============================================================================
|
|
RESULTS_DIR="${1:-.}"
|
|
TOP_N=30
|
|
LANGUAGES="auto" # Will detect from results
|
|
|
|
# Parse arguments
|
|
shift || true
|
|
while [[ $# -gt 0 ]]; do
|
|
case "$1" in
|
|
--top)
|
|
TOP_N="$2"
|
|
shift 2
|
|
;;
|
|
--languages)
|
|
LANGUAGES="$2"
|
|
shift 2
|
|
;;
|
|
*)
|
|
shift
|
|
;;
|
|
esac
|
|
done
|
|
|
|
# Output files
|
|
DOCS_FILE="$RESULTS_DIR/documentation_links.md"
|
|
ANKI_FILE="$RESULTS_DIR/anki_cards.txt"
|
|
LLM_PROMPT_FILE="$RESULTS_DIR/llm_anki_prompt.md"
|
|
|
|
# Offline documentation setup
|
|
OFFLINE_DOCS_DIR="${OFFLINE_DOCS_DIR:-$HOME/.local/share/offline-docs}"
|
|
LOOKUP_SCRIPT="$(dirname "$0")/lookup_docs.sh"
|
|
USE_OFFLINE_DOCS=false
|
|
|
|
# Check if offline docs are available
|
|
if [ -d "$OFFLINE_DOCS_DIR" ] && [ -x "$LOOKUP_SCRIPT" ]; then
|
|
USE_OFFLINE_DOCS=true
|
|
fi
|
|
|
|
# Colors
|
|
RED='\033[0;31m'
|
|
GREEN='\033[0;32m'
|
|
BLUE='\033[0;34m'
|
|
YELLOW='\033[1;33m'
|
|
NC='\033[0m'
|
|
|
|
#==============================================================================
|
|
# Documentation URL Generators (online fallback)
|
|
#==============================================================================
|
|
|
|
#==============================================================================
|
|
# Main Processing
|
|
#==============================================================================
|
|
|
|
# Check if results directory exists
|
|
if [ ! -d "$RESULTS_DIR" ]; then
|
|
echo -e "${RED}Error: Results directory not found: $RESULTS_DIR${NC}"
|
|
echo "Run analyze_repo.sh first to generate analysis results."
|
|
exit 1
|
|
fi
|
|
|
|
# Detect or use specified language
|
|
if [ "$LANGUAGES" = "auto" ]; then
|
|
PRIMARY_LANG=$(detect_language)
|
|
echo -e "${BLUE}Detected primary language: ${GREEN}$PRIMARY_LANG${NC}"
|
|
else
|
|
PRIMARY_LANG=$(echo "$LANGUAGES" | cut -d',' -f1)
|
|
echo -e "${BLUE}Using specified language: ${GREEN}$PRIMARY_LANG${NC}"
|
|
fi
|
|
|
|
echo ""
|
|
echo -e "${BLUE}════════════════════════════════════════════════════════════${NC}"
|
|
echo -e "${GREEN} Generating Study Materials${NC}"
|
|
echo -e "${BLUE}════════════════════════════════════════════════════════════${NC}"
|
|
echo ""
|
|
# Patch for generate_study_materials.sh - use per-language files
|
|
|
|
# The three generation phases, in the order their outputs reference each
|
|
# other. Defined above and called here so the file can be split into libs.
|
|
generate_doc_links
|
|
generate_anki_cards
|
|
generate_llm_prompt
|
|
|
|
#==============================================================================
|
|
# Summary
|
|
#==============================================================================
|
|
echo ""
|
|
echo -e "${BLUE}════════════════════════════════════════════════════════════${NC}"
|
|
echo -e "${GREEN} Study Materials Generated!${NC}"
|
|
echo -e "${BLUE}════════════════════════════════════════════════════════════${NC}"
|
|
echo ""
|
|
echo "Files created:"
|
|
echo " 📚 Documentation Links: $DOCS_FILE"
|
|
echo " 🎴 Anki Cards: $ANKI_FILE"
|
|
echo " 🤖 LLM Prompt: $LLM_PROMPT_FILE"
|
|
echo ""
|
|
echo "Next steps:"
|
|
echo " 1. Review documentation_links.md for learning resources"
|
|
echo " 2. Import anki_cards.txt into Anki (File -> Import)"
|
|
echo " 3. Use llm_anki_prompt.md with ChatGPT/Claude to generate more cards"
|
|
echo ""
|
|
echo "Anki import settings:"
|
|
echo " - Field separator: Tab"
|
|
echo " - Allow HTML: Yes"
|
|
echo " - Tags are in last field: Yes"
|