| """ |
| Command Line Interface (CLI) for AI Resume Scanner. |
| Usage: |
| python -m resume_scanner.cli <resume_path> <jd_path> |
| """ |
|
|
| import argparse |
| import sys |
| from dotenv import load_dotenv |
|
|
| from .extractor import prepare_scanner_inputs, ExtractionError |
| from .assessor import ResumeAssessor, AssessorError |
|
|
|
|
| def print_assessment_card(assessment, resume_path: str, jd_path: str): |
| """Prints a clean, beautifully formatted assessment card to terminal.""" |
| print("\n" + "=" * 68) |
| print(" π AI RESUME SCANNER REPORT ") |
| print("=" * 68) |
| print(f" Resume File : {resume_path}") |
| print(f" Job Description : {jd_path}") |
| print("-" * 68) |
| print(f" π― ALIGNMENT SCORE : {assessment.match_score} / 100") |
| print("-" * 68) |
| print(f" π‘ RATIONALE:\n {assessment.score_rationale}\n") |
|
|
| print(" β
MATCHED REQUIREMENTS:") |
| for item in assessment.matched_requirements: |
| print(f" β’ {item}") |
|
|
| print("\n β οΈ MISSING REQUIREMENTS (GAPS):") |
| for item in assessment.missing_requirements: |
| print(f" β’ {item}") |
|
|
| print("\n π ACTIONABLE SUGGESTIONS:") |
| for item in assessment.suggestions: |
| print(f" β’ {item}") |
|
|
| if assessment.limitations: |
| print("\n βΉοΈ LIMITATIONS & DOCUMENT UNCERTAINTY:") |
| for item in assessment.limitations: |
| print(f" β’ {item}") |
| print("=" * 68 + "\n") |
|
|
|
|
| def main(): |
| load_dotenv() |
|
|
| parser = argparse.ArgumentParser( |
| description="AI Resume Scanner β AI & Generative AI Fellowship Project 1" |
| ) |
| parser.add_argument( |
| "resume_path", |
| help="Path to the candidate's resume (.pdf or .txt)", |
| ) |
| parser.add_argument( |
| "jd_path", |
| help="Path to the job description (.pdf or .txt)", |
| ) |
|
|
| args = parser.parse_args() |
|
|
| print(f"π Loading and extracting local documents...") |
| try: |
| resume_text, jd_text = prepare_scanner_inputs(args.resume_path, args.jd_path) |
| except ExtractionError as exc: |
| print(f"\nβ Document Extraction Error:\n {exc}", file=sys.stderr) |
| sys.exit(1) |
|
|
| print(f"π€ Sending extracted text to Gemini Flash Assessment Engine...") |
| assessor = ResumeAssessor() |
|
|
| try: |
| assessment = assessor.assess(resume_text, jd_text) |
| print_assessment_card(assessment, args.resume_path, args.jd_path) |
| except AssessorError as exc: |
| print(f"\nβ Assessment Failed:\n {exc}", file=sys.stderr) |
| sys.exit(2) |
|
|
|
|
| if __name__ == "__main__": |
| main() |
|
|