Spaces:
Paused
Paused
| #!/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() |