/ 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()