From c2267f8bc5aa17ace0d9361041c8af258020534a Mon Sep 17 00:00:00 2001
From: takline
Date: Wed, 7 Aug 2024 17:57:37 +0000
Subject: [PATCH] v1.4
V1.4
---
.github/workflows/publish-to-pypi.yaml | 138 +++++++++++++++----------
README.md | 3 +-
config/config.py | 4 +-
pyproject.toml | 2 +-
requirements.txt | 7 +-
services/resume_improver.py | 60 +----------
6 files changed, 99 insertions(+), 115 deletions(-)
diff --git a/.github/workflows/publish-to-pypi.yaml b/.github/workflows/publish-to-pypi.yaml
index f2c580c..0f85e4d 100644
--- a/.github/workflows/publish-to-pypi.yaml
+++ b/.github/workflows/publish-to-pypi.yaml
@@ -1,54 +1,79 @@
+on:
+ push:
+ tags:
+ - 'v*'
+name: publish
jobs:
+ test:
+ runs-on: ubuntu-latest
+ env:
+ OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY }}
+ steps:
+ - name: Checkout code
+ uses: actions/checkout@v4
+
+ - name: Set up Python
+ uses: actions/setup-python@v5
+ with:
+ python-version: '3.11'
+
+ - name: Install dependencies
+ run: |
+ python -m pip install --upgrade pip
+ pip install -r requirements.txt
+
+ - name: Run tests with pytest
+ run: |
+ pytest tests/ --junitxml=tests/test-results.xml --tb=long -vv --cov=./ --cov-report=xml:tests/coverage.xml
+
+ continue-on-error: true
+
+ - name: Upload test results
+ if: always()
+ uses: actions/upload-artifact@v3
+ with:
+ name: test-results
+ path: tests/test-results.xml
+
+ - name: Upload coverage results
+ if: always()
+ uses: actions/upload-artifact@v3
+ with:
+ name: coverage-results
+ path: tests/coverage.xml
+
+ - name: Annotate the test results
+ if: failure()
+ uses: dorny/test-reporter@v1
+ with:
+ name: Pytest
+ path: tests/test-results.xml
+ reporter: pytest
build:
- - name: Build distribution 📦
+ name: Build distribution 📦
runs-on: ubuntu-latest
+ needs: test
steps:
- uses: actions/checkout@v4
- name: Set up Python
uses: actions/setup-python@v5
with:
python-version: "3.11"
- - name: Install pypa/build
- run: >-
- python3 -m
- pip install
- build
- --user
- - name: Build a binary wheel and a source tarball
- run: python3 -m build
- - name: Store the distribution packages
- uses: actions/upload-artifact@v3
- with:
- name: python-package-distributions
- path: dist/
- publish-to-pypi:
- name: >-
- Publish Python 🐍 distribution 📦 to PyPI
- if: startsWith(github.ref, 'refs/tags/')
- needs:
- - build
- runs-on: ubuntu-latest
- environment:
- name: pypi
- url: https://pypi.org/p/ResumeGPT
- permissions:
- id-token: write # IMPORTANT: mandatory for trusted publishing
- steps:
- - name: Download all the dists
- uses: actions/download-artifact@v3
+ - name: Install build dependencies
+ run: |
+ python3 -m pip install --upgrade pip
+ python3 -m pip install build
+ - name: Build a binary wheel and a source tarball
+ run: python3 -m build
+ - name: Store the distribution packages
+ uses: actions/upload-artifact@v3
with:
name: python-package-distributions
path: dist/
- - name: Publish distribution 📦 to PyPI
- uses: pypa/gh-action-pypi-publish@release/v1
github-release:
- name: >-
- Sign the Python 🐍 distribution 📦 with Sigstore
- and upload them to GitHub Release
- needs:
- - publish-to-pypi
+ name: Sign the Python 🐍 dist 📦 with Sigstore and upload them to GitHub Release
+ needs: build
runs-on: ubuntu-latest
-
permissions:
contents: write
id-token: write
@@ -61,24 +86,33 @@ jobs:
- name: Sign the dists with Sigstore
uses: sigstore/gh-action-sigstore-python@v2.1.1
with:
- inputs: >-
+ inputs: |
./dist/*.tar.gz
./dist/*.whl
- name: Create GitHub Release
env:
- GITHUB_TOKEN: ${{ github.token }}
- run: >-
- gh release create
- '${{ github.ref_name }}'
- --repo '${{ github.repository }}'
- --notes ""
+ GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
+ run: |
+ gh release create '${{ github.ref_name }}' --repo '${{ github.repository }}' --notes ""
- name: Upload artifact signatures to GitHub Release
env:
- GITHUB_TOKEN: ${{ github.token }}
- # Upload to GitHub Release using the `gh` CLI.
- # `dist/` contains the built packages, and the
- # sigstore-produced signatures and certificates.
- run: >-
- gh release upload
- '${{ github.ref_name }}' dist/**
- --repo '${{ github.repository }}'
\ No newline at end of file
+ GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
+ run: |
+ gh release upload '${{ github.ref_name }}' dist/** --repo '${{ github.repository }}'
+ publish-to-pypi:
+ name: Publish Python 🐍 distribution 📦 to PyPI
+ runs-on: ubuntu-latest
+ needs: github-release
+ environment:
+ name: pypi
+ url: https://pypi.org/p/ResumeGPT
+ steps:
+ - name: Download all the dists
+ uses: actions/download-artifact@v3
+ with:
+ name: python-package-distributions
+ path: dist/
+ - name: Publish distribution 📦 to PyPI
+ uses: pypa/gh-action-pypi-publish@release/v1
+ with:
+ password: ${{ secrets.PYPI }}
diff --git a/README.md b/README.md
index a5fbcd8..78ea7aa 100644
--- a/README.md
+++ b/README.md
@@ -31,6 +31,7 @@
+
@@ -64,6 +65,7 @@ pip install git+https://github.com/takline/ResumeGPT.git
or:
+
```bash
git clone https://github.com/takline/ResumeGPT.git
cd ResumeGPT
@@ -191,4 +193,3 @@ Feel free to give feedback, ask questions, report a bug, or suggest improvements
⭐️ Please star, fork, explore, and contribute to ResumeGPT. There's a lot of work room for improvement so any contributions are appreciated.
-
diff --git a/config/config.py b/config/config.py
index 477b64d..adcf0e7 100644
--- a/config/config.py
+++ b/config/config.py
@@ -28,8 +28,8 @@
CHAT_MODEL = ChatOpenAI
MODEL_NAME = "gpt-4o"
TEMPERATURE = 0.3
-OPEN_FILE_COMMAND = "cursor -r"
-# OPEN_FILE_COMMAND = "code -r"
+#OPEN_FILE_COMMAND = "cursor -r"
+OPEN_FILE_COMMAND = "code -r"
MAX_CONCURRENT_WORKERS = 4
MAX_RETRIES = 3
BACKOFF_FACTOR = 5
diff --git a/pyproject.toml b/pyproject.toml
index f6fd1da..dd8e2cc 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -28,7 +28,7 @@ dependencies = [
"pytest>=8.2.2",
"free-proxy>=1.1.1"
]
-keywords = ["resume", "job", "application", "automation"]
+keywords = ["resume", "job", "application", "automation", "job search"]
classifiers = [
"Development Status :: 4 - Beta",
"Programming Language :: Python :: 3"
diff --git a/requirements.txt b/requirements.txt
index 0520c99..f4eece2 100644
--- a/requirements.txt
+++ b/requirements.txt
@@ -3,9 +3,14 @@ configparser>=5.0.2
langchain==0.1.20
langchain-openai==0.1.6
langchain-core==0.1.52
+langchain-community==0.0.38
pydantic==2.7.1
reportlab>=3.5.59
requests>=2.25.1
ruamel.yaml>=0.16.12
pytest>=8.2.2
-free-proxy>=1.1.1
\ No newline at end of file
+python-dateutil>=2.8.0
+free-proxy>=1.1.1
+Jinja2==3.1.4
+PyYAML==5.3.1
+pytest-cov==5.0.0
\ No newline at end of file
diff --git a/services/resume_improver.py b/services/resume_improver.py
index fe0722a..51c1524 100644
--- a/services/resume_improver.py
+++ b/services/resume_improver.py
@@ -630,66 +630,10 @@ def create_pdf(self, auto_open=True):
Returns:
str: The file path to the generated PDF.
"""
- parsed_yaml = utils.read_yaml(filename=self.yaml_loc)
-
- def extract_education(education):
- """Extract education details from the resume.
-
- Args:
- education (list): The education data.
-
- Returns:
- list: A list of dictionaries containing degree and school information.
- """
- return [
- {"degree": degree, "school": edu["school"]}
- for edu in education
- for degree in edu["degrees"][0]["names"]
- ]
-
- def extract_experience(experiences):
- """Extract experience details from the resume.
-
- Args:
- experiences (list): The experience data.
-
- Returns:
- list: A list of dictionaries containing title, company, location, duration, and description.
- """
- return [
- {
- "title": title["name"],
- "company": exp["company"],
- "location": exp["location"],
- "duration": f"{title['startdate']}-{title['enddate']}",
- "description": exp["highlights"],
- }
- for exp in experiences
- for title in exp["titles"]
- ]
-
- def extract_skills(skills):
- """Extract skills details from the resume.
-
- Args:
- skills (list): The skills data.
-
- Returns:
- list: A list of formatted skills strings.
- """
- return [
- f"{skill['category']}: {', '.join(skill['skills'])}" for skill in skills
- ]
-
- result = {
- "education": extract_education(parsed_yaml.get("education", [])),
- "objective": parsed_yaml.get("objective", ""),
- "experiences": extract_experience(parsed_yaml.get("experiences", [])),
- "skills": extract_skills(parsed_yaml.get("skills", [])),
- }
pdf_generator = ResumePDFGenerator()
pdf_location = pdf_generator.generate_resume(
- job_data_location=self.job_data_location, data=result
+ job_data_location=self.job_data_location,
+ data=utils.read_yaml(filename=self.yaml_loc),
)
if auto_open:
subprocess.run(config.OPEN_FILE_COMMAND.split(" ") + [pdf_location])