Spaces:
Sleeping
Sleeping
| import streamlit as st | |
| from typing import Dict, List, Any, Optional | |
| def render_header(): | |
| """Render the application header""" | |
| st.title("📄 Resume Analyzer & Job Matcher") | |
| st.markdown(""" | |
| Upload your resume to get personalized job matches, identify skill gaps, | |
| and receive recommendations for improvement. | |
| """) | |
| st.divider() | |
| def render_upload_section(): | |
| """Render the file upload section""" | |
| st.subheader("Upload Your Resume") | |
| st.markdown("Supported formats: PDF, DOCX") | |
| uploaded_file = st.file_uploader("Choose a file", type=["pdf", "docx"]) | |
| if uploaded_file is not None: | |
| st.success(f"File uploaded: {uploaded_file.name}") | |
| file_details = { | |
| "Filename": uploaded_file.name, | |
| "File size": f"{uploaded_file.size / 1024:.2f} KB", | |
| "File type": uploaded_file.type | |
| } | |
| with st.expander("File Details"): | |
| for key, value in file_details.items(): | |
| st.write(f"**{key}:** {value}") | |
| return uploaded_file | |
| def render_results_section( | |
| resume_data: Any, | |
| job_matches: List[Dict[str, Any]], | |
| skill_gaps: List[Dict[str, Any]], | |
| improvement_tips: List[str] | |
| ): | |
| """Render the results section with analysis output""" | |
| st.divider() | |
| st.header("Analysis Results") | |
| # Create tabs for different result categories | |
| tab1, tab2, tab3 = st.tabs(["Job Matches", "Skill Gaps", "Resume Improvement"]) | |
| # Tab 1: Job Matches | |
| with tab1: | |
| st.subheader("Recommended Job Roles") | |
| if not job_matches: | |
| st.info("No job matches found. Please try uploading a different resume.") | |
| else: | |
| for i, job in enumerate(job_matches): | |
| with st.container(): | |
| col1, col2 = st.columns([3, 1]) | |
| with col1: | |
| st.markdown(f"### {i+1}. {job.get('title', 'Unknown Job')}") | |
| st.markdown(f"**Match Score:** {job.get('match_score', 'N/A')}%") | |
| st.markdown(f"**Description:** {job.get('description', 'No description available')}") | |
| with col2: | |
| st.markdown("**Matching Skills:**") | |
| for skill in job.get('key_matching_skills', []): | |
| st.markdown(f"- {skill}") | |
| st.divider() | |
| # Tab 2: Skill Gaps | |
| with tab2: | |
| st.subheader("Skill Gap Analysis") | |
| if not skill_gaps: | |
| st.info("No skill gaps identified.") | |
| else: | |
| for skill_gap in skill_gaps: | |
| with st.container(): | |
| col1, col2 = st.columns([1, 2]) | |
| with col1: | |
| st.markdown(f"### {skill_gap.get('skill', 'Unknown Skill')}") | |
| st.markdown(f"**Importance:** {skill_gap.get('importance', 'Medium')}") | |
| with col2: | |
| st.markdown("**How to acquire this skill:**") | |
| st.markdown(skill_gap.get('acquisition_recommendation', 'No recommendation available')) | |
| st.divider() | |
| # Tab 3: Resume Improvement | |
| with tab3: | |
| st.subheader("Resume Improvement Tips") | |
| if not improvement_tips: | |
| st.info("No improvement tips available.") | |
| else: | |
| for i, tip in enumerate(improvement_tips): | |
| st.markdown(f"**{i+1}.** {tip}") | |
| def render_footer(): | |
| """Render the application footer""" | |
| st.divider() | |
| st.markdown(""" | |
| **Note:** This application uses AI to analyze your resume and provide recommendations. | |
| The results should be considered as suggestions and may not be 100% accurate. | |
| """) |