SYMBOL INDEX (123 symbols across 23 files) FILE: job_scraper/hacker_news/scraper.py class ScrapingInterrupt (line 6) | class ScrapingInterrupt(Exception): class HNScraper (line 9) | class HNScraper: method __init__ (line 10) | def __init__(self, db_path='job_listings.db'): method save_to_database (line 16) | def save_to_database(self, original_text, original_html, source, exter... method scrape_hn_jobs (line 34) | def scrape_hn_jobs(self, start_url, stdscr, update_func=None, done_eve... FILE: job_scraper/scraper_selectors/workday_selectors.py class WorkDaySelectors (line 4) | class WorkDaySelectors(StrEnum): FILE: job_scraper/utils.py function get_workday_company_urls (line 1) | def get_workday_company_urls() -> dict: function get_workday_post_time_range (line 10) | def get_workday_post_time_range() -> list[str]: FILE: job_scraper/waas/work_startup_scraper.py class ScrapingInterrupt (line 6) | class ScrapingInterrupt(Exception): class WorkStartupScraper (line 9) | class WorkStartupScraper: method __init__ (line 11) | def __init__(self, db_path='job_listings.db'): method get_company_links (line 17) | def get_company_links(self): method get_job_links (line 32) | def get_job_links(self, company_url): method get_job_details (line 61) | def get_job_details(self, job_url): method scrape_jobs (line 101) | def scrape_jobs(self, stdscr, update_func=None, done_event=None, resul... method save_to_database (line 155) | def save_to_database(self, original_text, original_html, source, exter... FILE: job_scraper/workday/scraper.py class WorkdayScraper (line 16) | class WorkdayScraper: method __init__ (line 17) | def __init__(self, db_path='job_listings.db', update_func=None, done_e... method get_selenium_configs (line 29) | def get_selenium_configs() -> Options: method save_to_database (line 37) | def save_to_database(self, original_text, original_html, source, exter... method save_new_job_listing (line 53) | def save_new_job_listing(self, job_description, job_description_html, ... method save_job_listings_to_db (line 69) | def save_job_listings_to_db(self): method scrape (line 83) | def scrape(self): FILE: src/database_manager.py class DatabaseManager (line 4) | class DatabaseManager: method __init__ (line 5) | def __init__(self, db_path): method initialize_db (line 11) | def initialize_db(self): method fetch_job_listings (line 32) | def fetch_job_listings(self, listings_per_batch): method fetch_processed_listings_count (line 47) | def fetch_processed_listings_count(self): method fetch_applied_listings_count (line 56) | def fetch_applied_listings_count(self): method save_gpt_interaction (line 64) | def save_gpt_interaction(self, job_id, prompt, answer): method close (line 68) | def close(self): FILE: src/display_all_jobs.py class AllJobsDisplay (line 12) | class AllJobsDisplay: method __init__ (line 13) | def __init__(self, stdscr, db_path): method log (line 23) | def log(self, message): method format_scraped_date (line 27) | def format_scraped_date(self, scraped_at): method get_search_filters (line 38) | def get_search_filters(self): method prompt_search (line 53) | def prompt_search(self): method fetch_total_entries (line 86) | def fetch_total_entries(self): method fetch_job (line 105) | def fetch_job(self, offset=None): method fetch_data (line 145) | def fetch_data(self, page_num): method draw_page (line 184) | def draw_page(self, current_page): method draw_table (line 279) | def draw_table(self): method discard_listing (line 348) | def discard_listing(self, job_id): method apply_to_listing (line 359) | def apply_to_listing(self, job_id): method show_job_detail (line 400) | def show_job_detail(self, job_index): method show_post_apply_dialog (line 533) | def show_post_apply_dialog(self): FILE: src/display_applications.py class ApplicationsDisplay (line 13) | class ApplicationsDisplay: method __init__ (line 14) | def __init__(self, stdscr, db_path): method fetch_applications (line 27) | def fetch_applications(self): method fetch_notes (line 67) | def fetch_notes(self, application_id): method fetch_job_detail (line 83) | def fetch_job_detail(self, job_id): method delete_note (line 117) | def delete_note(self, note_id): method add_note (line 143) | def add_note(self, application_id, job_id): method view_note (line 293) | def view_note(self, note_text): method finalize (line 401) | def finalize(self, application_id, job_id): method draw_board (line 440) | def draw_board(self): FILE: src/display_matching_table.py class MatchingTableDisplay (line 12) | class MatchingTableDisplay: method __init__ (line 13) | def __init__(self, stdscr, db_path): method log (line 32) | def log(self, message): method format_scraped_date (line 36) | def format_scraped_date(self, scraped_at): method get_search_filters (line 47) | def get_search_filters(self): method prompt_search (line 62) | def prompt_search(self): method fetch_total_entries (line 95) | def fetch_total_entries(self): method fetch_job (line 112) | def fetch_job(self, offset=None): method fetch_data (line 150) | def fetch_data(self, page_num): method draw_page (line 187) | def draw_page(self, current_page): method draw_table (line 289) | def draw_table(self): method discard_listing (line 364) | def discard_listing(self, job_id): method apply_to_listing (line 375) | def apply_to_listing(self, job_id): method show_job_detail (line 418) | def show_job_detail(self, job_index): method show_post_apply_dialog (line 532) | def show_post_apply_dialog(self): FILE: src/display_table.py function fetch_data (line 6) | def fetch_data(db_path): function draw_table (line 17) | def draw_table(stdscr, db_path): FILE: src/gpt_processor.py class GPTProcessor (line 8) | class GPTProcessor: method __init__ (line 9) | def __init__(self, db_manager, api_key): method log (line 19) | def log(self, message): method process_job_listings_with_gpt (line 24) | async def process_job_listings_with_gpt(self, resume_path, update_ui_c... method process_single_listing (line 35) | async def process_single_listing(self, job_id, job_text, job_html, res... method read_resume_from_file (line 57) | def read_resume_from_file(self, file_path): method generate_prompt (line 64) | def generate_prompt(self, job_text, job_html, resume): method get_gpt_response (line 103) | async def get_gpt_response(self, prompt): FILE: src/menu.py class MenuApp (line 24) | class MenuApp: method __init__ (line 25) | def __init__(self, stdscr, logger): method update_processed_listings_count (line 90) | def update_processed_listings_count(self): method process_with_gpt (line 93) | async def process_with_gpt(self): method read_resume_from_file (line 112) | def read_resume_from_file(self): method setup_ncurses (line 119) | def setup_ncurses(self): method display_splash_screen (line 135) | def display_splash_screen(self): method draw_title (line 172) | def draw_title(self, title="Command Jobs"): method draw_menu (line 180) | def draw_menu(self): method run (line 205) | def run(self): method handle_keypress (line 211) | def handle_keypress(self, key): method update_menu_items (line 221) | def update_menu_items(self): method execute_menu_action (line 271) | def execute_menu_action(self): method display_text_with_scrolling (line 304) | def display_text_with_scrolling(self, header, lines): method get_total_listings (line 339) | def get_total_listings(self): method manage_resume (line 349) | def manage_resume(self, stdscr): method update_status_bar (line 370) | def update_status_bar(self, text): method start_scraping_with_status_updates (line 384) | def start_scraping_with_status_updates(self): method start_scraping_WaaS_with_status_updates (line 402) | def start_scraping_WaaS_with_status_updates(self): method start_scraping_workday_with_status_updates (line 414) | def start_scraping_workday_with_status_updates(self): method capture_text_with_scrolling (line 432) | def capture_text_with_scrolling(self): function main (line 494) | def main(stdscr): FILE: src/migrations/000_create_initial_tables.py function table_exists (line 11) | def table_exists(cursor, table_name): function main (line 19) | def main(): FILE: src/migrations/001_add_discarded_applied.py function column_exists (line 7) | def column_exists(cursor, table_name, column_name): function main (line 11) | def main(): FILE: src/migrations/002_create_application_notes.py function column_exists (line 7) | def column_exists(cur, table, column): function main (line 11) | def main(): FILE: src/migrations/003_add_applied_date.py function column_exists (line 6) | def column_exists(cur, table, column): function main (line 10) | def main(): FILE: src/migrations/004_migrate_applications_table.py function table_exists (line 9) | def table_exists(cur, name): function column_list (line 13) | def column_list(cur, table): function main (line 17) | def main(): FILE: src/migrations/005_migrate_old_notes.py function table_exists (line 9) | def table_exists(cur, name): function main (line 13) | def main(): FILE: src/migrations/006_unique_applications_job_id.py function main (line 9) | def main(db_path): FILE: src/migrations/007_add_scraped_at_timestamp.py function main (line 9) | def main(db_path): FILE: src/test_menu.py class TestManageResume (line 8) | class TestManageResume(unittest.TestCase): method test_manage_resume (line 12) | def test_manage_resume(self, mock_getenv, mock_curses): FILE: src/truncate_tables.py function truncate_tables (line 6) | def truncate_tables(database_path): FILE: tests/test_workday_scraper.py function selenium_driver (line 16) | def selenium_driver(): function test_job_listing_xpath_present (line 29) | def test_job_listing_xpath_present(selenium_driver, company_name, url):