SYMBOL INDEX (695 symbols across 66 files) FILE: scripts/badges/badge_notification.py function main (line 31) | def main(): FILE: scripts/badges/badge_notification_core.py class RateLimiter (line 30) | class RateLimiter: method __init__ (line 33) | def __init__(self): method check_rate_limit (line 39) | def check_rate_limit(self, github_client: Github) -> dict: method wait_if_needed (line 61) | def wait_if_needed(self, github_client: Github): method handle_rate_limit_error (line 83) | def handle_rate_limit_error(self, error: RateLimitExceededException): class BadgeNotificationCore (line 91) | class BadgeNotificationCore: method __init__ (line 99) | def __init__(self, github_token: str): method validate_input_safety (line 108) | def validate_input_safety(text: str, field_name: str = "input") -> tup... method validate_github_url (line 181) | def validate_github_url(url: str) -> bool: method create_issue_body (line 224) | def create_issue_body(self, resource_name: str, description: str = "")... method can_create_label (line 286) | def can_create_label(self, repo) -> bool: method create_notification_issue (line 312) | def create_notification_issue( class ManualNotificationTracker (line 407) | class ManualNotificationTracker: method __init__ (line 410) | def __init__(self, tracking_file: str = ".manual_notifications.json"): method _load_history (line 414) | def _load_history(self) -> list: method _save_history (line 424) | def _save_history(self): method record_notification (line 432) | def record_notification(self, repo_url: str, issue_url: str, resource_... method get_notification_count (line 443) | def get_notification_count(self, repo_url: str, time_window_hours: int... method has_recent_notification (line 459) | def has_recent_notification(self, repo_url: str, time_window_hours: in... FILE: scripts/categories/add_category.py class CategoryAdder (line 24) | class CategoryAdder: method __init__ (line 27) | def __init__(self, repo_root: Path): method get_max_order (line 33) | def get_max_order(self) -> int: method add_category_to_yaml (line 40) | def add_category_to_yaml( method update_issue_template (line 121) | def update_issue_template(self, name: str) -> bool: method generate_readme (line 187) | def generate_readme(self) -> bool: method create_commit (line 212) | def create_commit(self, name: str) -> bool: function interactive_mode (line 269) | def interactive_mode(adder: CategoryAdder) -> None: function main (line 370) | def main(): FILE: scripts/categories/category_utils.py class CategoryManager (line 28) | class CategoryManager: method __new__ (line 34) | def __new__(cls): method __init__ (line 40) | def __init__(self): method _load_categories (line 45) | def _load_categories(self) -> None: method get_all_categories (line 52) | def get_all_categories(self) -> list[str]: method get_category_prefixes (line 58) | def get_category_prefixes(self) -> dict[str, str]: method get_category_by_name (line 64) | def get_category_by_name(self, name: str) -> dict[str, Any] | None: method get_category_by_id (line 73) | def get_category_by_id(self, cat_id: str) -> dict[str, Any] | None: method get_all_subcategories (line 82) | def get_all_subcategories(self) -> list[dict[str, str]]: method get_subcategories_for_category (line 102) | def get_subcategories_for_category(self, category_name: str) -> list[s... method validate_category_subcategory (line 110) | def validate_category_subcategory(self, category: str, subcategory: st... method get_categories_for_readme (line 124) | def get_categories_for_readme(self) -> list[dict[str, Any]]: method get_toc_config (line 131) | def get_toc_config(self) -> dict[str, Any]: FILE: scripts/graphics/generate_logo_svgs.py function generate_logo_svg (line 36) | def generate_logo_svg(theme: str = "light") -> str: function main (line 63) | def main(): FILE: scripts/ids/generate_resource_id.py function main (line 18) | def main(): FILE: scripts/ids/resource_id.py function generate_resource_id (line 18) | def generate_resource_id(display_name: str, primary_link: str, category:... FILE: scripts/maintenance/check_repo_health.py function get_repo_info (line 48) | def get_repo_info(owner, repo): function is_outdated (line 87) | def is_outdated(last_updated_str, months_threshold): function check_repos_health (line 104) | def check_repos_health( function main (line 200) | def main(): FILE: scripts/maintenance/update_github_release_data.py function format_commit_date (line 45) | def format_commit_date(commit_date: str | None) -> str | None: function parse_github_repo (line 55) | def parse_github_repo(url: str | None) -> tuple[str | None, str | None]: function github_get (line 67) | def github_get(url: str, params: dict | None = None) -> requests.Response: function fetch_last_commit_date (line 78) | def fetch_last_commit_date(owner: str, repo: str) -> tuple[str | None, s... function fetch_latest_release (line 99) | def fetch_latest_release(owner: str, repo: str) -> tuple[str | None, str... function update_release_data (line 112) | def update_release_data(csv_path: str, max_rows: int | None = None, dry_... function main (line 202) | def main() -> None: FILE: scripts/readme/generate_readme.py function build_root_generator (line 39) | def build_root_generator( function main (line 63) | def main(): FILE: scripts/readme/generators/awesome.py class AwesomeReadmeGenerator (line 25) | class AwesomeReadmeGenerator(ReadmeGenerator): method template_filename (line 29) | def template_filename(self) -> str: method output_filename (line 33) | def output_filename(self) -> str: method style_id (line 37) | def style_id(self) -> str: method format_resource_entry (line 40) | def format_resource_entry(self, row: dict, include_separator: bool = T... method generate_toc (line 44) | def generate_toc(self) -> str: method generate_weekly_section (line 48) | def generate_weekly_section(self) -> str: method generate_section_content (line 52) | def generate_section_content(self, category: dict, section_index: int)... method generate_repo_ticker (line 57) | def generate_repo_ticker(self) -> str: method generate_banner_image (line 61) | def generate_banner_image(self, output_path: Path) -> str: FILE: scripts/readme/generators/base.py function load_template (line 27) | def load_template(template_path: str) -> str: function load_overrides (line 33) | def load_overrides(template_dir: str) -> dict: function apply_overrides (line 44) | def apply_overrides(row: dict, overrides: dict) -> dict: function create_backup (line 68) | def create_backup(file_path: str, keep_latest: int = 1) -> str | None: class ReadmeGenerator (line 94) | class ReadmeGenerator(ABC): method __init__ (line 97) | def __init__(self, csv_path: str, template_dir: str, assets_dir: str, ... method template_filename (line 111) | def template_filename(self) -> str: method output_filename (line 117) | def output_filename(self) -> str: method style_id (line 123) | def style_id(self) -> str: method is_root_style (line 128) | def is_root_style(self) -> bool: method resolved_output_path (line 133) | def resolved_output_path(self) -> str: method get_style_selector (line 139) | def get_style_selector(self, output_path: Path) -> str: method format_resource_entry (line 144) | def format_resource_entry(self, row: dict, include_separator: bool = T... method generate_toc (line 149) | def generate_toc(self) -> str: method generate_weekly_section (line 154) | def generate_weekly_section(self) -> str: method generate_section_content (line 159) | def generate_section_content(self, category: dict, section_index: int)... method generate_repo_ticker (line 163) | def generate_repo_ticker(self) -> str: method generate_banner_image (line 167) | def generate_banner_image(self, output_path: Path) -> str: method load_csv_data (line 172) | def load_csv_data(self) -> list[dict]: method load_categories (line 183) | def load_categories(self) -> list[dict]: method load_overrides (line 189) | def load_overrides(self) -> dict: method load_announcements (line 193) | def load_announcements(self) -> str: method load_footer (line 197) | def load_footer(self) -> str: method build_general_anchor_map (line 207) | def build_general_anchor_map(self) -> dict: method create_backup (line 211) | def create_backup(self, output_path: str) -> str | None: method generate (line 215) | def generate(self, output_path: str | None = None) -> tuple[int, str |... method alternative_output_path (line 274) | def alternative_output_path(self) -> str: FILE: scripts/readme/generators/flat.py class ParameterizedFlatListGenerator (line 55) | class ParameterizedFlatListGenerator(ReadmeGenerator): method __init__ (line 60) | def __init__( method template_filename (line 76) | def template_filename(self) -> str: method output_filename (line 80) | def output_filename(self) -> str: method style_id (line 87) | def style_id(self) -> str: method format_resource_entry (line 90) | def format_resource_entry(self, row: dict, include_separator: bool = T... method generate_toc (line 95) | def generate_toc(self) -> str: method generate_weekly_section (line 99) | def generate_weekly_section(self) -> str: method generate_section_content (line 103) | def generate_section_content(self, category: dict, section_index: int)... method get_filtered_resources (line 108) | def get_filtered_resources(self) -> list[dict]: method sort_resources (line 115) | def sort_resources(self, resources: list[dict]) -> list[dict]: method generate_sort_navigation (line 159) | def generate_sort_navigation(self) -> str: method generate_category_navigation (line 167) | def generate_category_navigation(self) -> str: method generate_navigation (line 175) | def generate_navigation(self) -> str: method generate_resources_table (line 184) | def generate_resources_table(self) -> str: method _get_default_template (line 190) | def _get_default_template(self) -> str: method generate (line 194) | def generate(self, output_path: str | None = None) -> tuple[int, str |... FILE: scripts/readme/generators/minimal.py class MinimalReadmeGenerator (line 18) | class MinimalReadmeGenerator(ReadmeGenerator): method template_filename (line 22) | def template_filename(self) -> str: method output_filename (line 26) | def output_filename(self) -> str: method style_id (line 30) | def style_id(self) -> str: method format_resource_entry (line 33) | def format_resource_entry(self, row: dict, include_separator: bool = T... method generate_toc (line 37) | def generate_toc(self) -> str: method generate_weekly_section (line 41) | def generate_weekly_section(self) -> str: method generate_section_content (line 45) | def generate_section_content(self, category: dict, section_index: int)... FILE: scripts/readme/generators/visual.py class VisualReadmeGenerator (line 21) | class VisualReadmeGenerator(ReadmeGenerator): method template_filename (line 25) | def template_filename(self) -> str: method output_filename (line 29) | def output_filename(self) -> str: method style_id (line 33) | def style_id(self) -> str: method format_resource_entry (line 36) | def format_resource_entry(self, row: dict, include_separator: bool = T... method generate_toc (line 44) | def generate_toc(self) -> str: method generate_weekly_section (line 52) | def generate_weekly_section(self) -> str: method generate_section_content (line 56) | def generate_section_content(self, category: dict, section_index: int)... method generate_repo_ticker (line 66) | def generate_repo_ticker(self) -> str: FILE: scripts/readme/helpers/generate_toc_assets.py function main (line 18) | def main() -> None: FILE: scripts/readme/helpers/readme_assets.py function create_h2_svg_file (line 37) | def create_h2_svg_file(text: str, filename: str, assets_dir: str, icon: ... function create_h3_svg_file (line 48) | def create_h3_svg_file(text: str, filename: str, assets_dir: str) -> str: function ensure_category_header_exists (line 61) | def ensure_category_header_exists( function ensure_section_divider_exists (line 87) | def ensure_section_divider_exists(variant: int, assets_dir: str) -> tupl... function ensure_desc_box_exists (line 101) | def ensure_desc_box_exists(position: str, assets_dir: str) -> str: function ensure_toc_row_exists (line 114) | def ensure_toc_row_exists( function ensure_toc_sub_exists (line 133) | def ensure_toc_sub_exists( function get_category_svg_filename (line 152) | def get_category_svg_filename(category_id: str) -> str: function get_subcategory_svg_filename (line 168) | def get_subcategory_svg_filename(subcat_id: str) -> str: function get_category_header_svg (line 191) | def get_category_header_svg(category_id: str) -> tuple[str, str]: function get_section_divider_svg (line 227) | def get_section_divider_svg() -> tuple[str, str]: function normalize_toc_svgs (line 235) | def normalize_toc_svgs(assets_dir: str) -> None: function regenerate_main_toc_svgs (line 259) | def regenerate_main_toc_svgs(categories: list[dict], assets_dir: str) ->... function regenerate_sub_toc_svgs (line 277) | def regenerate_sub_toc_svgs(categories: list[dict], assets_dir: str) -> ... function regenerate_toc_header (line 296) | def regenerate_toc_header(assets_dir: str) -> None: function save_resource_badge_svg (line 304) | def save_resource_badge_svg(display_name: str, author_name: str, assets_... function generate_entry_separator_svg (line 321) | def generate_entry_separator_svg() -> str: function ensure_separator_svg_exists (line 326) | def ensure_separator_svg_exists(assets_dir: str) -> str: function generate_flat_badges (line 332) | def generate_flat_badges(assets_dir: str, sort_types: dict, categories: ... FILE: scripts/readme/helpers/readme_config.py function load_config (line 13) | def load_config() -> dict: function get_root_style (line 57) | def get_root_style() -> str: function get_style_selector_target (line 63) | def get_style_selector_target(style_id: str) -> str: FILE: scripts/readme/helpers/readme_paths.py function asset_path_token (line 19) | def asset_path_token(filename: str) -> str: function ensure_generated_header (line 25) | def ensure_generated_header(content: str) -> str: function resolve_asset_tokens (line 32) | def resolve_asset_tokens(content: str, output_path: Path, repo_root: Pat... function resolve_relative_link (line 57) | def resolve_relative_link(from_path: Path, to_path: Path, repo_root: Pat... FILE: scripts/readme/helpers/readme_utils.py function extract_github_owner_repo (line 9) | def extract_github_owner_repo(url: str) -> tuple[str, str] | None: function format_stars (line 26) | def format_stars(num: int) -> str: function format_delta (line 35) | def format_delta(delta: int) -> str: function get_anchor_suffix_for_icon (line 44) | def get_anchor_suffix_for_icon(icon: str | None) -> str: function generate_toc_anchor (line 63) | def generate_toc_anchor( function generate_subcategory_anchor (line 87) | def generate_subcategory_anchor( function sanitize_filename_from_anchor (line 120) | def sanitize_filename_from_anchor(anchor: str) -> str: function build_general_anchor_map (line 128) | def build_general_anchor_map(categories: list[dict], csv_data: list[dict... function parse_resource_date (line 161) | def parse_resource_date(date_string: str | None) -> datetime | None: function format_category_dir_name (line 182) | def format_category_dir_name(name: str, category_id: str | None = None) ... FILE: scripts/readme/markup/awesome.py function format_resource_entry (line 15) | def format_resource_entry(row: dict, include_separator: bool = True) -> ... function generate_toc (line 52) | def generate_toc(categories: list[dict], csv_data: list[dict]) -> str: function generate_weekly_section (line 96) | def generate_weekly_section(csv_data: list[dict]) -> str: function generate_section_content (line 126) | def generate_section_content(category: dict, csv_data: list[dict]) -> str: function generate_repo_ticker (line 164) | def generate_repo_ticker() -> str: FILE: scripts/readme/markup/flat.py function generate_shields_badges (line 9) | def generate_shields_badges(owner: str, repo: str) -> str: function generate_sort_navigation (line 30) | def generate_sort_navigation( function generate_category_navigation (line 49) | def generate_category_navigation( function generate_navigation (line 68) | def generate_navigation( function generate_resources_table (line 90) | def generate_resources_table(sorted_resources: list[dict], sort_type: st... function get_default_template (line 186) | def get_default_template() -> str: FILE: scripts/readme/markup/minimal.py function format_resource_entry (line 15) | def format_resource_entry(row: dict, include_separator: bool = True) -> ... function generate_toc (line 61) | def generate_toc(categories: list[dict], csv_data: list[dict]) -> str: function generate_weekly_section (line 116) | def generate_weekly_section(csv_data: list[dict]) -> str: function generate_section_content (line 147) | def generate_section_content(category: dict, csv_data: list[dict]) -> str: FILE: scripts/readme/markup/shared.py function generate_style_selector (line 14) | def generate_style_selector( function load_announcements (line 46) | def load_announcements(template_dir: str) -> str: FILE: scripts/readme/markup/visual.py function format_resource_entry (line 29) | def format_resource_entry( function generate_weekly_section (line 84) | def generate_weekly_section( function generate_toc_from_categories (line 139) | def generate_toc_from_categories( function generate_section_content (line 249) | def generate_section_content( function generate_repo_ticker (line 402) | def generate_repo_ticker() -> str: FILE: scripts/readme/svg_templates/badges.py function generate_resource_badge_svg (line 4) | def generate_resource_badge_svg(display_name, author_name=""): function render_flat_sort_badge_svg (line 83) | def render_flat_sort_badge_svg(display: str, color: str) -> str: function render_flat_category_badge_svg (line 92) | def render_flat_category_badge_svg(display: str, color: str, width: int)... FILE: scripts/readme/svg_templates/dividers.py function generate_section_divider_light_svg (line 4) | def generate_section_divider_light_svg(variant=1): function generate_desc_box_light_svg (line 148) | def generate_desc_box_light_svg(position="top"): function generate_entry_separator_svg (line 275) | def generate_entry_separator_svg(): FILE: scripts/readme/svg_templates/headers.py function render_h2_svg (line 4) | def render_h2_svg(text: str, icon: str = "") -> str: function render_h3_svg (line 122) | def render_h3_svg(text: str) -> str: function generate_category_header_light_svg (line 169) | def generate_category_header_light_svg(title, section_number="01"): FILE: scripts/readme/svg_templates/toc.py function generate_toc_row_svg (line 6) | def generate_toc_row_svg(directory_name, description): function generate_toc_row_light_svg (line 65) | def generate_toc_row_light_svg(directory_name, description): function generate_toc_header_light_svg (line 122) | def generate_toc_header_light_svg(): function generate_toc_sub_svg (line 158) | def generate_toc_sub_svg(directory_name, description): function generate_toc_sub_light_svg (line 205) | def generate_toc_sub_light_svg(directory_name, description): function _normalize_svg_root (line 240) | def _normalize_svg_root(tag: str, target_width: int, target_height: int)... FILE: scripts/resources/create_resource_pr.py function run_command (line 32) | def run_command(cmd: list[str], check: bool = True) -> subprocess.Comple... function create_unique_branch_name (line 37) | def create_unique_branch_name(base_name: str) -> str: function get_badge_filename (line 43) | def get_badge_filename(display_name: str) -> str: function validate_generated_outputs (line 53) | def validate_generated_outputs(status_stdout: str, repo_root: str) -> None: function write_step_outputs (line 91) | def write_step_outputs(outputs: dict[str, str]) -> None: function main (line 111) | def main(): FILE: scripts/resources/detect_informal_submission.py class Action (line 27) | class Action(Enum): class DetectionResult (line 34) | class DetectionResult: function count_template_field_matches (line 89) | def count_template_field_matches(text: str) -> int: function calculate_confidence (line 95) | def calculate_confidence(title: str, body: str) -> DetectionResult: function sanitize_output (line 144) | def sanitize_output(value: str) -> str: function set_github_output (line 156) | def set_github_output(name: str, value: str) -> None: function main (line 171) | def main() -> None: FILE: scripts/resources/download_resources.py function sanitize_filename (line 97) | def sanitize_filename(name: str) -> str: function download_github_file (line 107) | def download_github_file( function load_overrides (line 239) | def load_overrides() -> dict[str, Any]: function apply_overrides (line 251) | def apply_overrides(row: dict[str, str], overrides: dict[str, Any]) -> d... function process_resources (line 284) | def process_resources( function main (line 467) | def main() -> None: FILE: scripts/resources/parse_issue_form.py function parse_issue_body (line 22) | def parse_issue_body(issue_body: str) -> dict[str, str]: function validate_parsed_data (line 116) | def validate_parsed_data(data: dict[str, str]) -> tuple[bool, list[str],... function check_for_duplicates (line 201) | def check_for_duplicates(data: dict[str, str]) -> list[str]: function main (line 231) | def main(): FILE: scripts/resources/resource_utils.py function append_to_csv (line 18) | def append_to_csv(data: dict[str, str]) -> bool: function generate_pr_content (line 75) | def generate_pr_content(data: dict[str, str]) -> str: FILE: scripts/resources/sort_resources.py function sort_resources (line 19) | def sort_resources(csv_path: Path) -> None: function main (line 117) | def main(): FILE: scripts/testing/test_regenerate_cycle.py function run (line 22) | def run(cmd: list[str]) -> None: function git_status (line 26) | def git_status() -> str: function read_config_text (line 37) | def read_config_text() -> str: function write_config_text (line 41) | def write_config_text(text: str) -> None: function set_root_style (line 45) | def set_root_style(text: str, root_style: str) -> str: function get_style_order (line 51) | def get_style_order(text: str) -> list[str]: function set_style_order (line 65) | def set_style_order(text: str, style_order: list[str]) -> str: function read_readme (line 72) | def read_readme() -> str: function selector_order_from_content (line 76) | def selector_order_from_content(content: str) -> list[str]: function main (line 87) | def main() -> int: FILE: scripts/testing/validate_toc_anchors.py function extract_github_anchor_ids (line 66) | def extract_github_anchor_ids(html_content: str) -> set[str]: function extract_toc_anchors_from_readme (line 76) | def extract_toc_anchors_from_readme(readme_content: str) -> set[str]: function normalize_anchor (line 97) | def normalize_anchor(anchor: str) -> str: function compare_anchors (line 102) | def compare_anchors( function validate (line 125) | def validate( function generate_expected_anchors (line 194) | def generate_expected_anchors( function main (line 212) | def main() -> int: FILE: scripts/ticker/fetch_repo_ticker_data.py function load_previous_data (line 23) | def load_previous_data(csv_path: Path) -> dict[str, dict[str, int]]: function fetch_repos (line 50) | def fetch_repos(token: str) -> list[dict[str, Any]]: function calculate_deltas (line 106) | def calculate_deltas( function save_to_csv (line 152) | def save_to_csv(repos: list[dict[str, Any]], output_path: Path) -> None: function main (line 183) | def main() -> None: FILE: scripts/ticker/generate_ticker_svg.py function fetch_recent_star_delta (line 26) | def fetch_recent_star_delta( function apply_recent_star_deltas (line 87) | def apply_recent_star_deltas(repos: list[dict[str, Any]]) -> None: function format_number (line 100) | def format_number(num: int) -> str: function format_delta (line 118) | def format_delta(delta: int) -> str: function truncate_repo_name (line 136) | def truncate_repo_name(name: str, max_length: int = 20) -> str: function get_delta_color (line 152) | def get_delta_color(delta: int, colors: dict[str, str]) -> str: function load_repos (line 171) | def load_repos(csv_path: Path) -> list[dict[str, Any]]: function generate_repo_group (line 199) | def generate_repo_group( function generate_ticker_svg (line 271) | def generate_ticker_svg(repos: list[dict[str, Any]], theme: str = "dark"... function generate_awesome_repo_group (line 480) | def generate_awesome_repo_group(repo: dict[str, Any], x_offset: int, fli... function generate_awesome_ticker_svg (line 564) | def generate_awesome_ticker_svg(repos: list[dict[str, Any]]) -> str: function main (line 678) | def main() -> None: FILE: scripts/utils/git_utils.py class GitUtils (line 9) | class GitUtils: method __init__ (line 12) | def __init__(self, logger: logging.Logger | None = None): method check_command_exists (line 22) | def check_command_exists(self, command: str) -> bool: method run_command (line 40) | def run_command(self, cmd: list[str], error_msg: str = "") -> bool: method is_git_installed (line 63) | def is_git_installed(self) -> bool: method is_gh_installed (line 67) | def is_gh_installed(self) -> bool: method is_gh_authenticated (line 71) | def is_gh_authenticated(self) -> bool: method get_github_username (line 86) | def get_github_username(self) -> str | None: method get_git_config (line 106) | def get_git_config(self, key: str) -> str | None: method check_remote_exists (line 125) | def check_remote_exists(self, remote_name: str = "origin") -> bool: method get_remote_url (line 140) | def get_remote_url(self, remote_name: str = "origin") -> str | None: method get_remote_type (line 161) | def get_remote_type(self, remote_name: str = "origin") -> str | None: method is_working_directory_clean (line 183) | def is_working_directory_clean(self) -> bool: method get_uncommitted_files (line 198) | def get_uncommitted_files(self) -> str | None: method stage_file (line 213) | def stage_file(self, filepath: Path, cwd: Path | None = None) -> bool: method check_file_modified (line 239) | def check_file_modified(self, filepath: Path, cwd: Path | None = None)... FILE: scripts/utils/github_utils.py function _normalize_repo_name (line 17) | def _normalize_repo_name(repo: str) -> str: function get_github_client (line 23) | def get_github_client( function github_request_json (line 40) | def github_request_json( function parse_github_url (line 70) | def parse_github_url(url: str) -> tuple[str, bool, str | None, str | None]: function parse_github_resource_url (line 132) | def parse_github_resource_url(url: str) -> dict[str, str] | None: FILE: scripts/utils/repo_root.py function find_repo_root (line 8) | def find_repo_root(start: Path) -> Path: FILE: scripts/validation/validate_links.py function github_request_json_paced (line 67) | def github_request_json_paced( function load_overrides (line 80) | def load_overrides(): function apply_overrides (line 93) | def apply_overrides(row, overrides): function parse_last_modified_date (line 138) | def parse_last_modified_date(value: str | None) -> datetime | None: function is_stale (line 163) | def is_stale(last_modified: datetime | None, stale_days: int = STALE_DAY... function ensure_stale_column (line 175) | def ensure_stale_column( function get_github_license (line 189) | def get_github_license(owner: str, repo: str) -> str: function get_committer_date_from_response (line 205) | def get_committer_date_from_response(data: object) -> str | None: function format_commit_date (line 238) | def format_commit_date(commit_date: str) -> str: function _header_int (line 246) | def _header_int(headers: Mapping[str, object], key: str) -> int: function get_github_last_modified (line 264) | def get_github_last_modified(owner: str, repo: str, path: str | None = N... function get_github_commit_dates (line 285) | def get_github_commit_dates(owner: str, repo: str) -> tuple[str | None, ... function get_github_commit_dates_from_url (line 336) | def get_github_commit_dates_from_url(url: str) -> tuple[str | None, str ... function get_github_latest_release (line 352) | def get_github_latest_release(owner: str, repo: str) -> tuple[str | None... function get_github_latest_tag (line 378) | def get_github_latest_tag(owner: str, repo: str) -> tuple[str | None, st... function get_npm_latest_release (line 413) | def get_npm_latest_release(package_name: str = "") -> tuple[str | None, ... function get_pypi_latest_release (line 445) | def get_pypi_latest_release(package_name: str = "") -> tuple[str | None,... function get_crates_latest_release (line 477) | def get_crates_latest_release(crate_name: str) -> tuple[str | None, str ... function get_homebrew_latest_release (line 506) | def get_homebrew_latest_release(formula_name: str) -> tuple[str | None, ... function get_github_readme_version (line 536) | def get_github_readme_version(owner: str, repo: str) -> tuple[str | None... function detect_package_info (line 578) | def detect_package_info(url: str, display_name: str = "") -> tuple[str |... function get_latest_release_info (line 638) | def get_latest_release_info( function validate_url (line 662) | def validate_url( function validate_links (line 746) | def validate_links(csv_file, max_links=None, ignore_overrides=False, ver... function main (line 968) | def main(): FILE: scripts/validation/validate_single_resource.py function validate_single_resource (line 23) | def validate_single_resource( function validate_resource_from_dict (line 101) | def validate_resource_from_dict( function main (line 133) | def main(): FILE: tests/conftest.py class DummyReset (line 12) | class DummyReset: method timestamp (line 16) | def timestamp() -> int: class DummyCore (line 20) | class DummyCore: method __init__ (line 23) | def __init__(self) -> None: class DummyRateLimit (line 29) | class DummyRateLimit: method __init__ (line 32) | def __init__(self) -> None: class DummyIssue (line 36) | class DummyIssue: class DummyRepo (line 42) | class DummyRepo: method __init__ (line 45) | def __init__(self, full_name: str) -> None: method get_label (line 48) | def get_label(self, name: str): method create_label (line 51) | def create_label(self, name: str, color: str, description: str): method get_issues (line 54) | def get_issues(self, **kwargs): method create_issue (line 57) | def create_issue(self, title: str, body: str, labels: list[str]): class DummyUser (line 61) | class DummyUser: class DummyGithub (line 67) | class DummyGithub: method __init__ (line 70) | def __init__(self, *args, **kwargs) -> None: method get_rate_limit (line 73) | def get_rate_limit(self): method get_repo (line 76) | def get_repo(self, full_name: str): method get_user (line 79) | def get_user(self): function find_repo_root (line 83) | def find_repo_root(start: Path) -> Path: function repo_root (line 93) | def repo_root() -> Path: function github_stub (line 99) | def github_stub(monkeypatch: pytest.MonkeyPatch): FILE: tests/temp-verify-override-autolock.temp.py function test_auto_locking (line 18) | def test_auto_locking(): function test_skip_validation_precedence (line 54) | def test_skip_validation_precedence(): function test_legacy_locked_flags_ignored (line 72) | def test_legacy_locked_flags_ignored(): function test_notes_field_ignored (line 95) | def test_notes_field_ignored(): FILE: tests/test_asset_path_resolution.py function test_resolve_asset_tokens_root (line 13) | def test_resolve_asset_tokens_root(tmp_path: Path) -> None: function test_resolve_asset_tokens_alternative (line 19) | def test_resolve_asset_tokens_alternative(tmp_path: Path) -> None: function test_resolve_asset_tokens_asset_scheme (line 27) | def test_resolve_asset_tokens_asset_scheme(tmp_path: Path) -> None: function test_ensure_generated_header (line 33) | def test_ensure_generated_header() -> None: FILE: tests/test_badge_notification_validation.py function test_dangerous_input_rejection (line 18) | def test_dangerous_input_rejection() -> None: function test_safe_input_acceptance (line 45) | def test_safe_input_acceptance() -> None: function test_length_limit_enforcement (line 69) | def test_length_limit_enforcement() -> None: function test_case_insensitive_detection (line 87) | def test_case_insensitive_detection() -> None: function test_issue_creation_with_validation (line 106) | def test_issue_creation_with_validation() -> None: function test_notification_creation_flow (line 139) | def test_notification_creation_flow() -> None: function run_all_tests (line 159) | def run_all_tests() -> bool: FILE: tests/test_category_utils.py function create_test_categories (line 19) | def create_test_categories() -> dict[str, Any]: function test_get_all_categories (line 65) | def test_get_all_categories() -> None: function test_get_category_prefixes (line 80) | def test_get_category_prefixes() -> None: function test_get_category_by_name (line 94) | def test_get_category_by_name() -> None: function test_get_category_by_id (line 112) | def test_get_category_by_id() -> None: function test_get_all_subcategories (line 129) | def test_get_all_subcategories() -> None: function test_get_subcategories_for_category (line 158) | def test_get_subcategories_for_category() -> None: function test_validate_category_subcategory (line 178) | def test_validate_category_subcategory() -> None: function test_get_categories_for_readme (line 197) | def test_get_categories_for_readme() -> None: function test_get_toc_config (line 213) | def test_get_toc_config() -> None: function test_singleton_behavior (line 228) | def test_singleton_behavior() -> None: function test_loading_from_file (line 238) | def test_loading_from_file() -> None: function test_robustness_with_missing_fields (line 275) | def test_robustness_with_missing_fields() -> None: FILE: tests/test_detect_informal_submission.py class TestCountTemplateFieldMatches (line 13) | class TestCountTemplateFieldMatches: method test_no_matches (line 16) | def test_no_matches(self) -> None: method test_single_match (line 21) | def test_single_match(self) -> None: method test_multiple_matches (line 26) | def test_multiple_matches(self) -> None: method test_case_insensitive (line 36) | def test_case_insensitive(self) -> None: class TestCalculateConfidence (line 42) | class TestCalculateConfidence: method test_empty_input (line 45) | def test_empty_input(self) -> None: method test_high_confidence_template_fields (line 51) | def test_high_confidence_template_fields(self) -> None: method test_high_confidence_strong_signals (line 65) | def test_high_confidence_strong_signals(self) -> None: method test_medium_confidence_partial_signals (line 74) | def test_medium_confidence_partial_signals(self) -> None: method test_low_confidence_bug_report (line 84) | def test_low_confidence_bug_report(self) -> None: method test_low_confidence_question (line 93) | def test_low_confidence_question(self) -> None: method test_negative_signals_reduce_score (line 102) | def test_negative_signals_reduce_score(self) -> None: method test_feature_request_no_action (line 112) | def test_feature_request_no_action(self) -> None: method test_combined_signals (line 120) | def test_combined_signals(self) -> None: method test_score_clamped_to_one (line 133) | def test_score_clamped_to_one(self) -> None: method test_score_clamped_to_zero (line 150) | def test_score_clamped_to_zero(self) -> None: class TestMatchedSignals (line 160) | class TestMatchedSignals: method test_strong_signals_labeled (line 163) | def test_strong_signals_labeled(self) -> None: method test_medium_signals_labeled (line 169) | def test_medium_signals_labeled(self) -> None: method test_negative_signals_labeled (line 175) | def test_negative_signals_labeled(self) -> None: method test_template_fields_labeled (line 181) | def test_template_fields_labeled(self) -> None: class TestEdgeCases (line 188) | class TestEdgeCases: method test_url_with_bug_language (line 191) | def test_url_with_bug_language(self) -> None: method test_partial_template_fields (line 200) | def test_partial_template_fields(self) -> None: method test_license_mention_alone (line 206) | def test_license_mention_alone(self) -> None: method test_category_mention_in_question (line 211) | def test_category_mention_in_question(self) -> None: class TestSanitizeOutput (line 220) | class TestSanitizeOutput: method test_removes_newlines (line 223) | def test_removes_newlines(self) -> None: method test_removes_carriage_returns (line 229) | def test_removes_carriage_returns(self) -> None: method test_removes_null_bytes (line 235) | def test_removes_null_bytes(self) -> None: method test_preserves_normal_text (line 241) | def test_preserves_normal_text(self) -> None: method test_handles_empty_string (line 246) | def test_handles_empty_string(self) -> None: method test_injection_attempt_via_newline (line 250) | def test_injection_attempt_via_newline(self) -> None: FILE: tests/test_fetch_repo_ticker_data.py class DummyResponse (line 18) | class DummyResponse: method __init__ (line 21) | def __init__(self, payload: dict, status_code: int = 200) -> None: method raise_for_status (line 25) | def raise_for_status(self) -> None: method json (line 29) | def json(self) -> dict: function test_load_previous_data_missing_file (line 33) | def test_load_previous_data_missing_file(tmp_path: Path) -> None: function test_load_previous_data_reads_csv (line 37) | def test_load_previous_data_reads_csv(tmp_path: Path) -> None: function test_calculate_deltas_with_previous (line 48) | def test_calculate_deltas_with_previous() -> None: function test_calculate_deltas_new_repo_with_prior_snapshot (line 57) | def test_calculate_deltas_new_repo_with_prior_snapshot() -> None: function test_calculate_deltas_no_previous_baseline (line 66) | def test_calculate_deltas_no_previous_baseline() -> None: function test_save_to_csv_writes_output (line 74) | def test_save_to_csv_writes_output(tmp_path: Path) -> None: function test_fetch_repos_maps_fields (line 97) | def test_fetch_repos_maps_fields(monkeypatch: pytest.MonkeyPatch) -> None: function test_fetch_repos_request_error_exits (line 143) | def test_fetch_repos_request_error_exits(monkeypatch: pytest.MonkeyPatch... function test_main_missing_token_exits (line 152) | def test_main_missing_token_exits(monkeypatch: pytest.MonkeyPatch) -> None: FILE: tests/test_flat_list_generator.py class FlatListEnv (line 25) | class FlatListEnv: function write_csv (line 80) | def write_csv(path: Path, rows: list[dict[str, str]]) -> None: function create_env (line 92) | def create_env(tmp_path: Path, rows: list[dict[str, str]]) -> FlatListEnv: function make_generator (line 109) | def make_generator(env: FlatListEnv, category_slug: str = "all", sort_ty... function flat_list_env (line 122) | def flat_list_env(tmp_path: Path) -> FlatListEnv: class TestFlatCategories (line 127) | class TestFlatCategories: method test_all_category_exists (line 130) | def test_all_category_exists(self) -> None: method test_all_categories_have_required_fields (line 137) | def test_all_categories_have_required_fields(self) -> None: method test_expected_categories_exist (line 146) | def test_expected_categories_exist(self) -> None: method test_category_count (line 164) | def test_category_count(self) -> None: class TestFlatSortTypes (line 169) | class TestFlatSortTypes: method test_all_sort_types_exist (line 172) | def test_all_sort_types_exist(self) -> None: method test_sort_types_have_required_fields (line 178) | def test_sort_types_have_required_fields(self) -> None: method test_sort_type_count (line 188) | def test_sort_type_count(self) -> None: class TestParameterizedFlatListGenerator (line 193) | class TestParameterizedFlatListGenerator: method test_output_filename_format (line 196) | def test_output_filename_format(self, flat_list_env: FlatListEnv) -> N... method test_output_filename_with_different_params (line 209) | def test_output_filename_with_different_params( method test_get_filtered_resources_all (line 216) | def test_get_filtered_resources_all(self, flat_list_env: FlatListEnv) ... method test_get_filtered_resources_specific_category (line 223) | def test_get_filtered_resources_specific_category(self, flat_list_env:... method test_get_filtered_resources_hooks_category (line 231) | def test_get_filtered_resources_hooks_category(self, flat_list_env: Fl... method test_sort_resources_alphabetical (line 239) | def test_sort_resources_alphabetical(self, flat_list_env: FlatListEnv)... method test_sort_resources_by_updated (line 250) | def test_sort_resources_by_updated(self, flat_list_env: FlatListEnv) -... method test_sort_resources_by_created (line 261) | def test_sort_resources_by_created(self, flat_list_env: FlatListEnv) -... method test_generate_sort_navigation (line 272) | def test_generate_sort_navigation(self, flat_list_env: FlatListEnv) ->... method test_generate_category_navigation (line 294) | def test_generate_category_navigation(self, flat_list_env: FlatListEnv... method test_generate_resources_table_standard (line 315) | def test_generate_resources_table_standard(self, flat_list_env: FlatLi... method test_generate_resources_table_empty_category (line 340) | def test_generate_resources_table_empty_category(self, flat_list_env: ... method test_default_template_has_correct_paths (line 348) | def test_default_template_has_correct_paths(self, flat_list_env: FlatL... method test_releases_disclaimer_in_template (line 356) | def test_releases_disclaimer_in_template(self, flat_list_env: FlatList... class TestGenerateFlatBadges (line 365) | class TestGenerateFlatBadges: method test_creates_sort_badges (line 368) | def test_creates_sort_badges(self, tmp_path: Path) -> None: method test_creates_category_badges (line 376) | def test_creates_category_badges(self, tmp_path: Path) -> None: method test_badge_is_valid_svg (line 384) | def test_badge_is_valid_svg(self, tmp_path: Path) -> None: method test_sort_badge_contains_display_name (line 395) | def test_sort_badge_contains_display_name(self, tmp_path: Path) -> None: method test_category_badge_contains_display_name (line 405) | def test_category_badge_contains_display_name(self, tmp_path: Path) ->... class TestReleasesSort (line 416) | class TestReleasesSort: method test_releases_filter_recent (line 419) | def test_releases_filter_recent(self, tmp_path: Path) -> None: method test_releases_sort_order (line 464) | def test_releases_sort_order(self, tmp_path: Path) -> None: method test_releases_table_format (line 524) | def test_releases_table_format(self, tmp_path: Path) -> None: class TestCombinationGeneration (line 568) | class TestCombinationGeneration: method test_all_combinations_instantiate (line 573) | def test_all_combinations_instantiate( method test_total_combinations (line 581) | def test_total_combinations(self) -> None: FILE: tests/test_generate_readme.py function write_yaml (line 28) | def write_yaml(path: os.PathLike[str], data: Any) -> None: class TestParseResourceDate (line 34) | class TestParseResourceDate: method test_parse_date_only_format (line 37) | def test_parse_date_only_format(self) -> None: method test_parse_date_with_timestamp_format (line 43) | def test_parse_date_with_timestamp_format(self) -> None: method test_parse_with_whitespace (line 49) | def test_parse_with_whitespace(self) -> None: method test_parse_empty_string (line 55) | def test_parse_empty_string(self) -> None: method test_parse_none (line 59) | def test_parse_none(self) -> None: method test_parse_invalid_format (line 74) | def test_parse_invalid_format(self, invalid_date: str) -> None: method test_parse_various_timestamps (line 87) | def test_parse_various_timestamps(self, date_string: str, expected: da... method test_date_comparison (line 91) | def test_date_comparison(self) -> None: class TestGetAnchorSuffix (line 103) | class TestGetAnchorSuffix: method test_no_icon (line 107) | def test_no_icon(self, icon: str | None) -> None: method test_simple_emoji (line 112) | def test_simple_emoji(self, icon: str) -> None: method test_emoji_with_variation_selector (line 116) | def test_emoji_with_variation_selector(self) -> None: class TestGenerateTOC (line 122) | class TestGenerateTOC: method test_empty_categories (line 125) | def test_empty_categories(self) -> None: method test_simple_categories (line 135) | def test_simple_categories(self) -> None: method test_categories_with_subcategories (line 152) | def test_categories_with_subcategories(self) -> None: method test_special_characters_in_names (line 183) | def test_special_characters_in_names(self) -> None: method test_mixed_categories (line 198) | def test_mixed_categories(self) -> None: class TestLoadAnnouncements (line 244) | class TestLoadAnnouncements: method test_empty_announcements (line 247) | def test_empty_announcements(self, tmp_path) -> None: method test_simple_string_announcement (line 255) | def test_simple_string_announcement(self, tmp_path) -> None: method test_collapsible_announcement_items (line 283) | def test_collapsible_announcement_items(self, tmp_path) -> None: method test_multi_line_text_in_announcements (line 317) | def test_multi_line_text_in_announcements(self, tmp_path) -> None: method test_mixed_announcement_types (line 347) | def test_mixed_announcement_types(self, tmp_path) -> None: method test_multiple_date_groups (line 379) | def test_multiple_date_groups(self, tmp_path) -> None: method test_markdown_in_announcements (line 410) | def test_markdown_in_announcements(self, tmp_path) -> None: method test_nonexistent_directory (line 437) | def test_nonexistent_directory(self, tmp_path) -> None: class TestGenerateSectionContent (line 446) | class TestGenerateSectionContent: method test_simple_category_with_resources (line 449) | def test_simple_category_with_resources(self) -> None: method test_category_with_description (line 479) | def test_category_with_description(self) -> None: method test_category_with_subcategories (line 493) | def test_category_with_subcategories(self) -> None: method test_category_with_main_and_sub_resources (line 549) | def test_category_with_main_and_sub_resources(self) -> None: method test_category_without_icon (line 587) | def test_category_without_icon(self) -> None: method test_empty_subcategory_not_rendered (line 596) | def test_empty_subcategory_not_rendered(self) -> None: class TestBackToTopButtons (line 632) | class TestBackToTopButtons: method test_weekly_section_has_back_to_top (line 635) | def test_weekly_section_has_back_to_top(self) -> None: method test_category_without_subcategories_has_html_anchor (line 643) | def test_category_without_subcategories_has_html_anchor(self) -> None: method test_category_without_icon_has_back_to_top (line 657) | def test_category_without_icon_has_back_to_top(self) -> None: method test_category_with_subcategories_has_markdown_link (line 666) | def test_category_with_subcategories_has_markdown_link(self) -> None: method test_subcategory_has_html_anchor (line 682) | def test_subcategory_has_html_anchor(self) -> None: method test_multiple_subcategories_all_have_anchors (line 709) | def test_multiple_subcategories_all_have_anchors(self) -> None: method test_back_to_top_preserves_existing_structure (line 749) | def test_back_to_top_preserves_existing_structure(self) -> None: class TestFormatResourceEntryGitHubStats (line 790) | class TestFormatResourceEntryGitHubStats: method test_github_resource_with_stats (line 793) | def test_github_resource_with_stats(self) -> None: method test_non_github_resource_no_stats (line 814) | def test_non_github_resource_no_stats(self) -> None: method test_github_blob_url_with_stats (line 831) | def test_github_blob_url_with_stats(self) -> None: method test_github_tree_url_with_stats (line 848) | def test_github_tree_url_with_stats(self) -> None: method test_empty_primary_link_no_stats (line 865) | def test_empty_primary_link_no_stats(self) -> None: FILE: tests/test_generate_ticker_svg.py function test_truncate_repo_name_short (line 13) | def test_truncate_repo_name_short(): function test_truncate_repo_name_exactly_20 (line 20) | def test_truncate_repo_name_exactly_20(): function test_truncate_repo_name_long (line 27) | def test_truncate_repo_name_long(): function test_truncate_repo_name_custom_length (line 35) | def test_truncate_repo_name_custom_length(): function test_truncate_repo_name_preserves_beginning (line 43) | def test_truncate_repo_name_preserves_beginning(): function test_truncate_repo_name_edge_cases (line 51) | def test_truncate_repo_name_edge_cases(): FILE: tests/test_git_utils.py function test_check_command_exists_true (line 19) | def test_check_command_exists_true(monkeypatch: pytest.MonkeyPatch) -> N... function test_check_command_exists_false_on_missing (line 27) | def test_check_command_exists_false_on_missing(monkeypatch: pytest.Monke... function test_run_command_failure_logs_error (line 35) | def test_run_command_failure_logs_error( function test_is_gh_authenticated (line 48) | def test_is_gh_authenticated(monkeypatch: pytest.MonkeyPatch) -> None: function test_is_gh_authenticated_false_on_empty_stdout (line 56) | def test_is_gh_authenticated_false_on_empty_stdout(monkeypatch: pytest.M... function test_get_github_username_success (line 64) | def test_get_github_username_success(monkeypatch: pytest.MonkeyPatch) ->... function test_get_github_username_failure (line 72) | def test_get_github_username_failure(monkeypatch: pytest.MonkeyPatch) ->... function test_get_git_config_returns_value (line 80) | def test_get_git_config_returns_value(monkeypatch: pytest.MonkeyPatch) -... function test_get_remote_type_variants (line 88) | def test_get_remote_type_variants(monkeypatch: pytest.MonkeyPatch) -> None: function test_is_working_directory_clean (line 100) | def test_is_working_directory_clean(monkeypatch: pytest.MonkeyPatch) -> ... function test_is_working_directory_dirty (line 108) | def test_is_working_directory_dirty(monkeypatch: pytest.MonkeyPatch) -> ... function test_get_uncommitted_files (line 116) | def test_get_uncommitted_files(monkeypatch: pytest.MonkeyPatch) -> None: function test_stage_file_success (line 124) | def test_stage_file_success(monkeypatch: pytest.MonkeyPatch, tmp_path: P... function test_stage_file_failure (line 132) | def test_stage_file_failure(monkeypatch: pytest.MonkeyPatch, tmp_path: P... function test_check_file_modified (line 140) | def test_check_file_modified(monkeypatch: pytest.MonkeyPatch, tmp_path: ... function test_check_file_modified_staged (line 152) | def test_check_file_modified_staged(monkeypatch: pytest.MonkeyPatch, tmp... function test_check_file_modified_clean (line 164) | def test_check_file_modified_clean(monkeypatch: pytest.MonkeyPatch, tmp_... FILE: tests/test_github_utils.py function test_parse_github_url_blob_with_slash_branch (line 14) | def test_parse_github_url_blob_with_slash_branch() -> None: function test_parse_github_url_tree_docs_path (line 26) | def test_parse_github_url_tree_docs_path() -> None: function test_parse_github_url_repo_root (line 35) | def test_parse_github_url_repo_root() -> None: function test_parse_github_url_non_github (line 44) | def test_parse_github_url_non_github() -> None: function test_parse_github_resource_url_file_and_raw (line 53) | def test_parse_github_resource_url_file_and_raw() -> None: function test_parse_github_resource_url_dir_repo_gist (line 75) | def test_parse_github_resource_url_dir_repo_gist() -> None: function test_parse_github_resource_url_normalizes_repo_name (line 95) | def test_parse_github_resource_url_normalizes_repo_name() -> None: function test_parse_github_resource_url_non_github (line 101) | def test_parse_github_resource_url_non_github() -> None: FILE: tests/test_readme_alternative_outputs.py class DummyReadmeGenerator (line 19) | class DummyReadmeGenerator(ReadmeGenerator): method __init__ (line 22) | def __init__( method template_filename (line 38) | def template_filename(self) -> str: method output_filename (line 42) | def output_filename(self) -> str: method style_id (line 46) | def style_id(self) -> str: method load_csv_data (line 49) | def load_csv_data(self) -> list[dict]: method load_categories (line 52) | def load_categories(self) -> list[dict]: method load_overrides (line 55) | def load_overrides(self) -> dict: method load_announcements (line 58) | def load_announcements(self) -> str: method load_footer (line 61) | def load_footer(self) -> str: method build_general_anchor_map (line 64) | def build_general_anchor_map(self) -> dict: method format_resource_entry (line 67) | def format_resource_entry(self, row: dict, include_separator: bool = T... method generate_toc (line 71) | def generate_toc(self) -> str: method generate_weekly_section (line 74) | def generate_weekly_section(self) -> str: method generate_section_content (line 77) | def generate_section_content(self, category: dict, section_index: int)... function _write_template (line 82) | def _write_template(template_dir: Path, filename: str) -> None: function _write_pyproject (line 90) | def _write_pyproject(repo_root: Path) -> None: function _configure_styles (line 94) | def _configure_styles(monkeypatch: pytest.MonkeyPatch, root_style: str) ... function test_root_classic_creates_alternative_copy (line 117) | def test_root_classic_creates_alternative_copy(tmp_path: Path, monkeypat... function test_root_extra_creates_alternative_copy (line 152) | def test_root_extra_creates_alternative_copy(tmp_path: Path, monkeypatch... function test_visual_weekly_section_uses_asset_prefix (line 187) | def test_visual_weekly_section_uses_asset_prefix(tmp_path: Path) -> None: FILE: tests/test_readme_config_path.py function _load_root_style (line 16) | def _load_root_style(repo_root: Path) -> str: function test_load_config_uses_repo_root (line 23) | def test_load_config_uses_repo_root() -> None: FILE: tests/test_readme_generators_minimal_visual.py function test_minimal_generator_properties (line 19) | def test_minimal_generator_properties() -> None: function test_minimal_generator_delegates (line 26) | def test_minimal_generator_delegates(monkeypatch: pytest.MonkeyPatch) ->... function test_visual_generator_properties (line 67) | def test_visual_generator_properties() -> None: function test_visual_generator_delegates (line 74) | def test_visual_generator_delegates(monkeypatch: pytest.MonkeyPatch) -> ... FILE: tests/test_resource_utils.py function temp_csv (line 26) | def temp_csv() -> Generator[Path, None, None]: function sample_resource_data (line 61) | def sample_resource_data() -> dict[str, str]: function set_csv_path (line 77) | def set_csv_path(monkeypatch: pytest.MonkeyPatch, path: Path | str) -> N... function test_append_to_csv_adds_all_columns (line 82) | def test_append_to_csv_adds_all_columns( function test_append_to_csv_default_values (line 122) | def test_append_to_csv_default_values( function test_append_to_csv_with_removed_from_origin_true (line 149) | def test_append_to_csv_with_removed_from_origin_true( function test_append_to_csv_date_fields (line 170) | def test_append_to_csv_date_fields( function test_append_to_csv_handles_csv_error (line 207) | def test_append_to_csv_handles_csv_error( function test_append_to_csv_preserves_existing_data (line 219) | def test_append_to_csv_preserves_existing_data( FILE: tests/test_sort_resources.py function temp_csv (line 28) | def temp_csv() -> Generator[Path, None, None]: function sample_csv_data (line 37) | def sample_csv_data() -> list[dict[str, str]]: function write_csv (line 93) | def write_csv(path: Path, data: list[dict[str, str]]) -> None: function read_csv (line 105) | def read_csv(path: Path) -> list[dict[str, str]]: function set_category_order (line 111) | def set_category_order(monkeypatch: pytest.MonkeyPatch, categories: list... function set_category_order_error (line 119) | def set_category_order_error( class TestSortResources (line 133) | class TestSortResources: method test_sort_by_category_order (line 136) | def test_sort_by_category_order( method test_sort_by_subcategory (line 162) | def test_sort_by_subcategory( method test_sort_by_display_name (line 183) | def test_sort_by_display_name(self, temp_csv: Path, monkeypatch: pytes... method test_empty_subcategory_sorts_last (line 227) | def test_empty_subcategory_sorts_last( method test_unknown_category_sorts_last (line 264) | def test_unknown_category_sorts_last( method test_subcategory_yaml_order_sort (line 301) | def test_subcategory_yaml_order_sort( method test_case_insensitive_display_name_sort (line 381) | def test_case_insensitive_display_name_sort( method test_empty_csv_file (line 428) | def test_empty_csv_file(self, temp_csv: Path, monkeypatch: pytest.Monk... method test_missing_fields_handled_gracefully (line 440) | def test_missing_fields_handled_gracefully( method test_category_manager_exception_handling (line 488) | def test_category_manager_exception_handling( method test_preserve_all_csv_fields (line 509) | def test_preserve_all_csv_fields(self, temp_csv: Path, monkeypatch: py... method test_category_summary_output (line 540) | def test_category_summary_output( method test_multiple_sort_stability (line 569) | def test_multiple_sort_stability( FILE: tests/test_style_selector_paths.py function _resolve_selector (line 30) | def _resolve_selector(html: str, output_path: Path, repo_root: Path) -> ... class TestResolveRelativeLink (line 34) | class TestResolveRelativeLink: method test_root_self_link_is_dot_slash (line 37) | def test_root_self_link_is_dot_slash(self, tmp_path: Path) -> None: method test_root_to_alternative_link (line 41) | def test_root_to_alternative_link(self, tmp_path: Path) -> None: method test_alternative_to_root_link (line 49) | def test_alternative_to_root_link(self, tmp_path: Path) -> None: method test_alternative_to_sibling_link (line 57) | def test_alternative_to_sibling_link(self, tmp_path: Path) -> None: class TestGetRootStyle (line 66) | class TestGetRootStyle: method test_root_style_from_config (line 69) | def test_root_style_from_config(self) -> None: method test_root_style_can_be_changed (line 74) | def test_root_style_can_be_changed(self, monkeypatch) -> None: method test_root_style_fallback (line 79) | def test_root_style_fallback(self, monkeypatch) -> None: method test_root_style_missing_readme_section (line 84) | def test_root_style_missing_readme_section(self, monkeypatch) -> None: class TestGetStyleSelectorTarget (line 90) | class TestGetStyleSelectorTarget: method test_root_style_goes_to_root (line 93) | def test_root_style_goes_to_root(self) -> None: method test_non_root_style_goes_to_alternatives (line 99) | def test_non_root_style_goes_to_alternatives(self) -> None: method test_style_swap_extra_to_alternatives (line 110) | def test_style_swap_extra_to_alternatives(self, monkeypatch) -> None: method test_style_originally_in_alternatives_becomes_root (line 124) | def test_style_originally_in_alternatives_becomes_root(self, monkeypat... class TestGenerateStyleSelector (line 138) | class TestGenerateStyleSelector: method test_root_readme_uses_assets_prefix (line 141) | def test_root_readme_uses_assets_prefix(self, tmp_path: Path) -> None: method test_alternatives_readme_uses_parent_assets_prefix (line 148) | def test_alternatives_readme_uses_parent_assets_prefix(self, tmp_path:... method test_root_readme_links_to_alternatives_with_full_path (line 162) | def test_root_readme_links_to_alternatives_with_full_path(self, tmp_pa... method test_selector_uses_asset_tokens (line 167) | def test_selector_uses_asset_tokens(self, tmp_path: Path) -> None: method test_alternatives_readme_links_to_root_with_parent (line 173) | def test_alternatives_readme_links_to_root_with_parent(self, tmp_path:... method test_alternatives_readme_links_to_siblings_with_filename (line 182) | def test_alternatives_readme_links_to_siblings_with_filename(self, tmp... method test_current_style_gets_highlight_border (line 191) | def test_current_style_gets_highlight_border(self, tmp_path: Path) -> ... method test_selector_includes_all_styles_in_order (line 196) | def test_selector_includes_all_styles_in_order(self, tmp_path: Path) -... class TestPathConsistency (line 205) | class TestPathConsistency: method test_asset_prefix_consistency (line 208) | def test_asset_prefix_consistency(self, tmp_path: Path) -> None: method test_cross_linking_symmetry (line 231) | def test_cross_linking_symmetry(self, tmp_path: Path) -> None: class TestEdgeCases (line 247) | class TestEdgeCases: method test_missing_style_config_handled (line 250) | def test_missing_style_config_handled(self, monkeypatch, tmp_path: Pat... method test_unknown_style_id (line 258) | def test_unknown_style_id(self, tmp_path: Path) -> None: class TestAssumptionsDocumented (line 264) | class TestAssumptionsDocumented: method test_assumption_readme_at_root_uses_assets_directly (line 272) | def test_assumption_readme_at_root_uses_assets_directly(self, tmp_path... method test_assumption_alternatives_one_level_deep (line 283) | def test_assumption_alternatives_one_level_deep(self, tmp_path: Path) ... method test_assumption_root_style_is_root_readme (line 303) | def test_assumption_root_style_is_root_readme(self) -> None: method test_assumption_only_one_readme_at_root (line 313) | def test_assumption_only_one_readme_at_root(self) -> None: method test_assumption_flat_is_special_case (line 323) | def test_assumption_flat_is_special_case(self) -> None: FILE: tests/test_toc_anchor_validation.py function is_placeholder (line 53) | def is_placeholder(path: Path) -> bool: class TestAnchorExtraction (line 61) | class TestAnchorExtraction: method test_extract_github_anchors_finds_user_content_ids (line 64) | def test_extract_github_anchors_finds_user_content_ids(self) -> None: method test_extract_toc_anchors_markdown_style (line 73) | def test_extract_toc_anchors_markdown_style(self) -> None: method test_extract_toc_anchors_html_style (line 82) | def test_extract_toc_anchors_html_style(self) -> None: method test_extract_toc_anchors_excludes_back_to_top (line 91) | def test_extract_toc_anchors_excludes_back_to_top(self) -> None: method test_normalize_anchor_url_decodes (line 100) | def test_normalize_anchor_url_decodes(self) -> None: class TestAnchorComparison (line 105) | class TestAnchorComparison: method test_compare_anchors_perfect_match (line 108) | def test_compare_anchors_perfect_match(self) -> None: method test_compare_anchors_with_url_encoded (line 116) | def test_compare_anchors_with_url_encoded(self) -> None: method test_compare_anchors_missing_in_github (line 123) | def test_compare_anchors_missing_in_github(self) -> None: method test_compare_anchors_extra_in_github (line 129) | def test_compare_anchors_extra_in_github(self) -> None: function _validate_style (line 136) | def _validate_style(style_name: str) -> None: class TestAwesomeStyle (line 154) | class TestAwesomeStyle: method test_toc_anchors_match_github (line 161) | def test_toc_anchors_match_github(self) -> None: method test_expected_anchor_count (line 169) | def test_expected_anchor_count(self) -> None: class TestClassicStyle (line 179) | class TestClassicStyle: method test_toc_anchors_match_github (line 186) | def test_toc_anchors_match_github(self) -> None: class TestExtraStyle (line 191) | class TestExtraStyle: method test_toc_anchors_match_github (line 198) | def test_toc_anchors_match_github(self) -> None: class TestFlatStyle (line 203) | class TestFlatStyle: method test_toc_anchors_match_github (line 210) | def test_toc_anchors_match_github(self) -> None: class TestExpectedAnchorsFixture (line 219) | class TestExpectedAnchorsFixture: method test_github_structure_unchanged (line 222) | def test_github_structure_unchanged(self) -> None: FILE: tests/test_validate_links.py class DummyResponse (line 18) | class DummyResponse: method __init__ (line 21) | def __init__(self, status_code: int, headers: dict[str, str] | None = ... function test_parse_last_modified_date_variants (line 26) | def test_parse_last_modified_date_variants() -> None: function test_is_stale_threshold (line 42) | def test_is_stale_threshold() -> None: function test_ensure_stale_column_adds_defaults (line 50) | def test_ensure_stale_column_adds_defaults() -> None: function test_apply_overrides_sets_and_locks_fields (line 56) | def test_apply_overrides_sets_and_locks_fields() -> None: function test_header_int_parsing (line 94) | def test_header_int_parsing() -> None: function test_get_committer_date_from_response_prefers_commit_info (line 102) | def test_get_committer_date_from_response_prefers_commit_info() -> None: function test_get_committer_date_from_response_falls_back_to_author (line 114) | def test_get_committer_date_from_response_falls_back_to_author() -> None: function test_detect_package_info (line 130) | def test_detect_package_info(url: str, expected: tuple[str | None, str |... function test_get_latest_release_info_for_github (line 134) | def test_get_latest_release_info_for_github(monkeypatch: pytest.MonkeyPa... function test_validate_url_non_github_success (line 150) | def test_validate_url_non_github_success(monkeypatch: pytest.MonkeyPatch... function test_validate_url_non_github_client_error (line 163) | def test_validate_url_non_github_client_error(monkeypatch: pytest.Monkey... function test_validate_url_non_github_retries_on_server_error (line 174) | def test_validate_url_non_github_retries_on_server_error( function test_validate_url_github_file_enriches_metadata (line 191) | def test_validate_url_github_file_enriches_metadata(monkeypatch: pytest.... function test_validate_url_github_rate_limit_retry (line 212) | def test_validate_url_github_rate_limit_retry(monkeypatch: pytest.Monkey... FILE: tests/test_validate_single_resource.py function test_validate_single_resource_missing_primary (line 16) | def test_validate_single_resource_missing_primary() -> None: function test_validate_single_resource_primary_failure (line 23) | def test_validate_single_resource_primary_failure(monkeypatch: pytest.Mo... function test_validate_single_resource_success_with_secondary (line 41) | def test_validate_single_resource_success_with_secondary(monkeypatch: py... function test_validate_resource_from_dict_maps_fields (line 68) | def test_validate_resource_from_dict_maps_fields(monkeypatch: pytest.Mon... FILE: tools/readme_tree/update_readme_tree.py class Node (line 20) | class Node: class IgnoreRule (line 29) | class IgnoreRule: class GitIgnoreChecker (line 39) | class GitIgnoreChecker: method __post_init__ (line 46) | def __post_init__(self) -> None: method _git_available (line 51) | def _git_available(self) -> bool: method _canon_rel (line 71) | def _canon_rel(rel_path: str) -> str: method _check (line 81) | def _check(self, paths: list[str]) -> set[str]: method is_ignored (line 106) | def is_ignored(self, rel_path: str, is_dir: bool) -> bool: function find_repo_root (line 129) | def find_repo_root(start: Path) -> Path: function normalize_key (line 164) | def normalize_key(path: str | Path | None) -> str: function load_config (line 175) | def load_config(config_path: Path) -> dict: function parse_ignore_rule (line 183) | def parse_ignore_rule(pattern: str | Path | None) -> IgnoreRule | None: function parse_ignore_rules (line 210) | def parse_ignore_rules(patterns: list[str | Path]) -> list[IgnoreRule]: function matches_ignore_rule (line 220) | def matches_ignore_rule(rule: IgnoreRule, rel_path: str, is_dir: bool) -... function is_ignored (line 250) | def is_ignored(rel_path: str, is_dir: bool, rules: list[IgnoreRule]) -> ... function is_pruned (line 259) | def is_pruned(rel_path: str, patterns: list[str]) -> bool: function add_path (line 271) | def add_path(root: Node, parts: list[str], is_dir: bool) -> Node: function walk_include (line 287) | def walk_include( function build_tree (line 347) | def build_tree(config: dict, repo_root: Path) -> Node: function sort_children (line 410) | def sort_children(node: Node, path: str, order_map: dict[str, list[str]]... function render_tree (line 433) | def render_tree(root: Node, comments: dict[str, str], order_map: dict[st... function update_document (line 462) | def update_document( function main (line 506) | def main() -> int: