/ test_batch_processing.py
test_batch_processing.py
1 #!/usr/bin/env python3 2 """ 3 Test script for batch processing of CVs. 4 5 This script demonstrates how to use the batch processing functionality 6 to generate multiple tailored CVs for different jobs. 7 """ 8 9 import os 10 import sys 11 import argparse 12 import logging 13 from datetime import datetime 14 15 # Configure logging 16 logging.basicConfig( 17 level=logging.INFO, 18 format='%(asctime)s - %(name)s - %(levelname)s - %(message)s' 19 ) 20 logger = logging.getLogger(__name__) 21 22 def main(): 23 """Main function to test batch processing.""" 24 parser = argparse.ArgumentParser(description='Test batch processing of CVs') 25 parser.add_argument('--cv', required=True, help='Path to CV template (.docx)') 26 parser.add_argument('--keyword', default='Software Engineer', help='Job title or keyword to search for') 27 parser.add_argument('--location', default='Berlin', help='Location to search in') 28 parser.add_argument('--max-jobs', type=int, default=5, help='Maximum number of jobs to scrape') 29 parser.add_argument('--output-dir', help='Directory to save the tailored CVs') 30 31 args = parser.parse_args() 32 33 # Check if CV template exists 34 if not os.path.exists(args.cv): 35 logger.error(f"CV template not found: {args.cv}") 36 sys.exit(1) 37 38 # Import modules 39 try: 40 from job_apply_ai.scraper.linkedin import LinkedInScraper 41 from job_apply_ai.cv_modifier.cv_analyzer import batch_process_jobs 42 from job_apply_ai.utils.helpers import ensure_directory_exists 43 except ImportError: 44 logger.error("Failed to import required modules. Make sure the package is installed.") 45 logger.error("Run: pip install -e .") 46 sys.exit(1) 47 48 # Step 1: Scrape job listings 49 logger.info(f"Scraping job listings for '{args.keyword}' in '{args.location}'...") 50 scraper = LinkedInScraper(headless=True) 51 jobs = scraper.scrape_job_listings(args.keyword, args.location, max_jobs=args.max_jobs) 52 53 if not jobs: 54 logger.error("No jobs found. Try different search terms.") 55 sys.exit(1) 56 57 logger.info(f"Found {len(jobs)} jobs") 58 59 # Step 2: Fetch job descriptions 60 logger.info("Fetching job descriptions...") 61 for i, job in enumerate(jobs): 62 logger.info(f"Fetching description for job {i+1}/{len(jobs)}: {job['title']} at {job['company']}") 63 title, company, description = scraper.fetch_job_description(job['link']) 64 jobs[i]['description'] = description 65 66 # Step 3: Save jobs to Excel 67 jobs_output_dir = os.path.join(os.getcwd(), "job_apply_ai", "outputs", "jobs") 68 ensure_directory_exists(jobs_output_dir) 69 70 today_date = datetime.today().strftime("%Y-%m-%d") 71 jobs_file = os.path.join(jobs_output_dir, f"linkedin_jobs_{today_date}.xlsx") 72 73 scraper.save_jobs_to_excel(jobs, jobs_file) 74 logger.info(f"Saved jobs to {jobs_file}") 75 76 # Step 4: Generate tailored CVs 77 cv_output_dir = args.output_dir or os.path.join(os.getcwd(), "job_apply_ai", "outputs", "cvs") 78 ensure_directory_exists(cv_output_dir) 79 80 logger.info("Generating tailored CVs...") 81 generated_cvs = batch_process_jobs(jobs_file, args.cv, cv_output_dir) 82 83 if generated_cvs: 84 logger.info(f"Successfully generated {len(generated_cvs)} tailored CVs:") 85 for cv_path in generated_cvs: 86 logger.info(f" - {cv_path}") 87 else: 88 logger.warning("Failed to generate any CVs") 89 90 logger.info("Test completed") 91 92 if __name__ == "__main__": 93 main()