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..1702dd2 100644
--- a/README.md
+++ b/README.md
@@ -31,6 +31,8 @@
+
+
@@ -64,6 +66,7 @@ pip install git+https://github.com/takline/ResumeGPT.git
or:
+
```bash
git clone https://github.com/takline/ResumeGPT.git
cd ResumeGPT
@@ -191,4 +194,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..ead9a79 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
[project]
name = "ResumeGPT"
-version = "1.4"
+version = "2.0"
description = "Tailor your resume to match any job posting effortlessly"
authors = [
{ name = "Tyler Kline", email = "tylerkline@gmail.com" }
@@ -26,9 +26,12 @@ dependencies = [
"requests>=2.25.1",
"ruamel.yaml>=0.16.12",
"pytest>=8.2.2",
- "free-proxy>=1.1.1"
+ "free-proxy>=1.1.1",
+ "Jinja2==3.1.4",
+ "PyYAML==5.3.1",
+ "pytest-cov==5.0.0"
]
-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])
diff --git a/setup.py b/setup.py
index 74bd67d..f862799 100644
--- a/setup.py
+++ b/setup.py
@@ -2,7 +2,7 @@
setup(
name="ResumeGPT",
- version="1.4",
+ version="2.0",
description="A brief description of your project",
author="Tyler Kline",
author_email="tylerkline@gmail.com",
@@ -20,6 +20,9 @@
"ruamel.yaml>=0.16.12",
"pytest>=8.2.2",
"free-proxy>=1.1.1",
+ "Jinja2==3.1.4",
+ "PyYAML==5.3.1",
+ "pytest-cov==5.0.0"
],
classifiers=[
"Programming Language :: Python :: 3",
diff --git a/tests/README.md b/tests/README.md
index c22772e..962fa6a 100644
--- a/tests/README.md
+++ b/tests/README.md
@@ -13,14 +13,59 @@ ResumeGPT tests are structured as follows:
## Running the Tests
-To run the tests, use the following command:
+```python
+To run the tests, use the following command:```python
+pytest tests/ --junitxml=tests/test-results.xml --tb=long -vv --cov=./ --cov-report=xml:tests/coverage.xml
+```
+
+or:
+
```python
pytest
```
-Or:
+
+
+or:
```python
pytest tests/test_services.py
-```
\ No newline at end of file
+```
+
+
+
+
+## Continuous Integration and Deployment
+
+The CI/CD workflow is defined in [`.github/workflows/publish-to-pypi.yaml`](https://github.com/takline/ResumeGPT/blob/main/.github/workflows/publish-to-pypi.yaml).
+
+### Workflow Overview
+
+1. **Test Job**:
+ - **Checkout code**: Retrieves the latest code from the repository.
+ - **Set up Python**: Configures the Python environment.
+ - **Install dependencies**: Installs the required dependencies from `requirements.txt`.
+ - **Run tests with pytest**: Executes the tests and generates test results and coverage reports.
+ - **Upload test results**: Uploads the test results as an artifact.
+ - **Upload coverage results**: Uploads the coverage report as an artifact.
+ - **Annotate the test results**: Adds annotations to the test results for easier debugging.
+
+2. **Build Job**:
+ - **Build distribution**: Creates a binary wheel and a source tarball of the package.
+ - **Store the distribution packages**: Uploads the built distributions as artifacts.
+
+3. **GitHub Release Job**:
+ - **Sign the distributions**: Uses Sigstore to sign the distribution packages.
+ - **Create GitHub Release**: Creates a new release on GitHub.
+ - **Upload artifact signatures**: Uploads the signed artifacts to the GitHub release.
+
+4. **Publish to PyPI Job**:
+ - **Publish distribution to PyPI**: Publishes the signed distribution packages to PyPI.
+
+### Artifacts
+
+- **Test Results**: Stored as `tests/test-results.xml`.
+- **Coverage Report**: Stored as `tests/coverage.xml`.
+- **Distribution Packages**: Stored in the `dist/` directory and uploaded to GitHub and PyPI.
+