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