Skip to content

Commit

Permalink
initial commit
Browse files Browse the repository at this point in the history
  • Loading branch information
koek67 committed May 24, 2024
0 parents commit ebce95d
Show file tree
Hide file tree
Showing 6 changed files with 511 additions and 0 deletions.
4 changes: 4 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
__pycache__
*resume.html
*_resume.py
*.zip
55 changes: 55 additions & 0 deletions readme.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
# Resume Builder

A no nonsense tool to build resumes in pure Python.

See my resume definition [resume.py](./resume.py) and its output [resume.pdf](./resume.pdf).

## Requirements

* Python 3.7 or later (that's it!)

## Installation

The entire library is a single python file `resume_builder.py`. Download this file

## Usage

To generate a resume:

```bash
python resume.py --output resume.html
```

To convert to a PDF, open in a web browser and Print as PDF. The resume generated is optimized for PDF.
In the browser, you can zoom in/out your PDF to make it fit to a page better.

## Resume Definition

Resumes are defined in Python files like `resume.py`. These files provide the best examples for how to configure a Resume.

For more details, see `resume_builder.py` and reference.md.

## Motivation

As many of us do when we have had to look for a new job, I started making a resume. Ever since college, this was a document written in either Google Docs or Microsoft Word but neither tool seemed to fit. Moreover, making small changes to the resume took time which prevented me from creating custom resumes for specific job applications.

That's when I decided to create a resume in HTML. This served me for many years and after helping a few folks modernize their resumes, I decided to open source my resume-making-tool.

This tool lets you define your resume in __Python__. No custom editors, no complicated themes, and no cost. Just a plain old resume that is easy to read, and easy to write.

## Resume Structure

* A Resume consists of:
* a ContactInfo
* a list of Sections
* A ContactInfo consists of:
* name (your name)
* details (a list of strings, can be used for email, location etc.)
* A Section consists of:
* a title
* a list of SectionEntries
* A SectionEntry consists of:
* a title (big bold text)
* a caption (text in parenthesis)
* a dates string
* a description
64 changes: 64 additions & 0 deletions reference.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,64 @@
## resume_builder.py

This module provides functionalities to build and save a resume in HTML format.

### Classes

* **Text:** This class represents a plain text element in the resume. It has the following attributes:
* `text` (str): The text content.

* **StrLike:** This type alias represents a union type that can be either a string or a `Text` object.

* **OptionalStrLike:** This type alias represents an optional `StrLike` type, which can be either `None` or a `StrLike` value.

* **LinkText:** This class inherits from `Text` and represents a text element with a hyperlink. It has the following attributes in addition to those inherited from `Text`:
* `url` (str): The URL of the link.
* `show_icon` (bool, optional): A flag indicating whether to display an icon next to the text (defaults to `False`).

* **BulletedList:** This class inherits from `Text` and represents a bulleted list. It has the following attribute:
* `items` (List[StrLike]): A list of items in the bulleted list.

* **ItalicsText:** This class inherits from `Text` and represents a text element rendered in italics.

* **UnderlinedText:** This class inherits from `Text` and represents a text element rendered with an underline.

* **BoldText:** This class inherits from `Text` and represents a text element rendered in bold.

* **ConcatText:** This class inherits from `Text` and is used to concatenate multiple text elements. It takes variable number of arguments of type `StrLike`.

* **SectionEntry:** This class represents an entry in a resume section. It has the following attributes:
* `title` (OptionalStrLike): The title of the entry.
* `caption` (OptionalStrLike): A caption for the entry (e.g., job title).
* `location` (OptionalStrLike): The location of the entry (e.g., company name).
* `dates` (OptionalStrLike): The dates associated with the entry (e.g., employment dates).
* `description` (OptionalStrLike): A description of the entry.

* **Section:** This class represents a section in the resume. It has the following attributes:
* `title` (StrLike): The title of the section.
* `entries` (List[SectionEntry]): A list of entries in the section.

* **ContactInfo:** This class represents the contact information section of the resume. It has the following attributes:
* `name` (StrLike): The name of the person.
* `details` (Optional[List[StrLike]]): A list of contact details (e.g., email, phone number).
* `tag_line` (OptionalStrLike): A tagline or objective statement.

* **Resume:** This class represents the entire resume document. It has the following attributes:
* `contact_info` (ContactInfo): The contact information section of the resume.
* `sections` (List[Section]): A list of sections in the resume.

### Methods

* **render_contact_info(self) -> str:** This method renders the contact information section of the resume in HTML format.

* **render_section(self, section: Section) -> str:** This method renders a single section of the resume in HTML format.

* **render_sections(self) -> str:** This method renders all sections of the resume in HTML format.

* **render(self) -> str:** This method renders the entire resume in HTML format.

* **save(self, filename: str) -> None:** This method saves the rendered HTML content of the resume to a file.

* **cli_main(self):** This method serves as the entry point for the command-line interface (CLI) functionality. It parses command-line arguments for the output filename and calls the `save` method to generate the HTML file.


This module provides a way to structure and format the content of a resume in an easy-to-use way. By creating instances of the provided classes and organizing them into sections and contact information, you can generate an HTML resume that can be saved to a file.
Binary file added resume.pdf
Binary file not shown.
188 changes: 188 additions & 0 deletions resume.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,188 @@
# Koushik Krishnan's Resume

from resume_builder import Resume, Section, SectionEntry, ContactInfo, ConcatText, ItalicsText, UnderlinedText, LinkText, BulletedList

resume = Resume(
contact_info=ContactInfo(
name="Koushik Krishnan",
details=[
"(111) 111-1111",
"[email protected]",
LinkText("koushik.bearblog.dev", "https://koushik.bearblog.dev"),
LinkText(
"linkedin.com/in/koushikkrishnan",
"https://www.linkedin.com/in/koushikkrishnan/",
),
LinkText("github.com/koek67", "https://www.github.com/koek67"),
],
tag_line="Making software as reliable as the sunrise.",
),
sections = [
Section(
title="Experience",
entries=[
SectionEntry(
title=LinkText("Microsoft", "https://www.microsoft.com"),
caption="Senior Software Engineer",
location="Remote",
dates="February 2023 - present",
description=BulletedList(
[
"Building reliability improvements into the storage and replication layers of Cosmos DB.",
"Technical lead for a team of engineers, ramping them up on distributed systems and database concepts as well as preparing them for incident response.",
]
),
),
SectionEntry(
title=LinkText("Yugabyte", "https://www.yugabyte.com"),
caption="Senior Site Reliability Engineer",
location="Seattle, Washington",
dates="May 2022 - February 2023",
description=BulletedList(
[
"Managed reliable operation of Kubernetes and Yugabyte database clusters across AWS and GCP for the Yugabyte Managed product."
]
),
),
SectionEntry(
title=LinkText("Microsoft", "https://www.microsoft.com"),
caption="Software Engineer 2, Azure Cosmos DB",
location="Redmond, Washington",
dates="August 2018 - April 2022",
description=BulletedList(
[
"Worked as a technical lead for a petabyte-scale, globally distributed database. Reduced number of production incidents by 80%.",
'Founded a team that built a Python microservice that would perform real-time root cause analysis/mitigation of incidents and eliminate the need for an on-call engineer. Open sourced this work on Github as <a class="open-link" target="_blank" href="http:https://github.com/microsoft/jupyrest">Jupyrest</a>',
]
),
),
SectionEntry(
title=LinkText("Microsoft", "https://www.microsoft.com"),
caption="Software Engineering Intern, Azure Cosmos DB",
location="Seattle, Washington",
dates="May 2017 - August 2017",
),
SectionEntry(
title=LinkText("Fitbit", "https://fitbit.com"),
caption="Software Engineering Intern",
location="Boston, Massachusetts",
dates="May 2016 - August 2016",
),
SectionEntry(
title=LinkText("Kayak.com", "https://www.kayak.com"),
caption="Software Engineering Intern",
location="Concord, Massachusetts",
dates="May 2015 - August 2015",
)
],
),
Section(
title="Presentations",
entries=[
SectionEntry(
title=LinkText(
text="PyCon 2024",
url="https://us.pycon.org/2024/schedule/presentation/95/",
show_icon=True,
),
caption="Rest East with Jupyrest: Deploy notebooks as web services",
location="Pittsburgh, PA",
dates="May 2024",
),
SectionEntry(
title=LinkText(
text="PyTexas",
url="https://www.pytexas.org/2024/schedule/talks/#rest-easy-with-jupyrest-deploy-notebooks-as-web-services",
show_icon=True,
),
caption="Rest East with Jupyrest",
location="Austin, TX",
dates="April 2024",
),
SectionEntry(
title=LinkText(
text="PyCascades",
url="https://2024.pycascades.com/program/talks/jupyrest/",
show_icon=True,
),
caption="Rest East with Jupyrest: Deploy notebooks as web services",
location="Seattle, WA",
dates="April 2024",
),
SectionEntry(
title=LinkText(
text="PyOhio 2023",
url="https://www.pyohio.org/2023/speakers/koushik-krishnan/",
show_icon=True,
),
caption=LinkText('Serverless Jupyter Notebook Functions (YouTube)', url="https://youtu.be/hoGJ0c3jIeo?si=srbRtjSxOxETFWN5", show_icon=True),
location="Virtual",
dates="December 2023",
),
SectionEntry(
title=LinkText(
text="PyData Seattle 2023",
url="https://seattle2023.pydata.org/cfp/talk/K8KV8M/",
show_icon=True,
),
caption=LinkText('Notebooks as Serverless Functions (YouTube)', url="https://youtu.be/hoGJ0c3jIeo?si=srbRtjSxOxETFWN5", show_icon=True),
location="Seattle, WA",
dates="April 2023",
),
],
),
Section(
title="Volunteering",
entries=[
SectionEntry(
title=LinkText(
"ASHA Chennai", url="https://chennai.ashanet.org/", show_icon=True
),
caption="Spoken English Teacher",
location="Remote",
dates="December 2020 - March 2022",
description=BulletedList(
[
"Created a curriculum with story-telling, skits, and friendly debates to provide disadvantaged children isolated in quarantine a fun way to learn spoken English.",
]
),
)
],
),
Section(
title="Education",
entries=[
SectionEntry(
title="Georgia Institute of Technology",
location="Atlanta, Georgia",
dates="August 2014 - May 2018",
description=ItalicsText(
"Bachelors of Science in Computer Science and Mathematics"
),
)
],
),
Section(
title="Skills",
entries=[
SectionEntry(
description=BulletedList(
[
ConcatText(
UnderlinedText("Languages:"),
" Python, Golang, C/C++, JavaScript, C#, Powershell, Zig",
),
ConcatText(
UnderlinedText("Tools:"),
" Kubernetes, PostgreSQL, Linux, Windows, Azure Service Fabric, Distributed Databases, Storage Engines, Docker",
),
]
)
),
],
),
]
)

if __name__ == "__main__":
resume.cli_main()
Loading

0 comments on commit ebce95d

Please sign in to comment.