Add tip calculator project structure and documentation

This commit is contained in:
2026-10-03 12:27:36 +08:00
commit 78be05027f
9 changed files with 170 additions and 0 deletions
+31
View File
@@ -0,0 +1,31 @@
# Byte-compiled / cache
__pycache__/
*.py[cod]
*$py.class
# Virtual environments
.venv/
venv/
env/
# Secrets
.env
# Packaging / build
build/
dist/
*.egg-info/
.eggs/
# Testing / tooling
.pytest_cache/
.coverage
htmlcov/
.mypy_cache/
.ruff_cache/
# IDEs / OS
.idea/
.vscode/
.DS_Store
Thumbs.db
+76
View File
@@ -0,0 +1,76 @@
# 🚀 Tip Calculator
A beginner-friendly Python console app that splits a restaurant bill, including a tip, between friends.
## 📚 Table of Contents
- [Overview](#-overview)
- [Requirements](#-requirements)
- [Setup](#-setup)
- [Run](#-run)
- [Tests](#-tests)
- [License](#-license)
- [Links](#-links)
## 🧭 Overview
Day 2 project from Udemy's *100 Days of Code: The Complete Python Pro Bootcamp*. The program asks for the total bill, the tip percentage and the number of people, then prints what each person should pay, rounded to two decimal places.
```
Welcome to the tip calculator!
What was the total bill? $124.56
What percentage tip would you like to give? 10, 12, or 15? 12
How many people to split the bill? 7
Each person should pay: $19.93
```
## 📋 Requirements
- Python 3.13 or newer
- No runtime dependencies
## 🛠️ Setup
Create and activate a local virtual environment:
```powershell
# Windows (PowerShell)
python -m venv .venv
.venv\Scripts\Activate.ps1
```
```bash
# macOS / Linux / Git Bash
python -m venv .venv
source .venv/bin/activate # Git Bash on Windows: source .venv/Scripts/activate
```
Install the project in editable mode (required to run it from `src/`; also adds the `tip-calculator` command):
```bash
pip install -e .
```
Secrets such as repository tokens belong in a local `.env` file (see `.env.example`). `.env` is git-ignored; the app itself does not need it.
## ▶️ Run
```bash
python -m tip_calculator
```
## 🧪 Tests
```bash
python -m unittest discover -s tests
```
## 📄 License
No license has been chosen yet.
## 🔗 Links
- [Repository](https://git.tirsystem.com/Tirsvad-Udemy-100_days_of_code/002-tip_calculator)
- [Documentation](https://git.tirsystem.com/Tirsvad-Udemy-100_days_of_code/002-tip_calculator#readme)
- [Issue tracker](https://git.tirsystem.com/Tirsvad-Udemy-100_days_of_code/002-tip_calculator/issues)
+18
View File
@@ -0,0 +1,18 @@
[build-system]
requires = ["setuptools>=68"]
build-backend = "setuptools.build_meta"
[project]
name = "tip-calculator"
version = "0.1.0"
description = "A beginner-friendly console app that splits a restaurant bill with a tip."
readme = "README.md"
requires-python = ">=3.13"
dependencies = []
[project.scripts]
tip-calculator = "tip_calculator.main:main"
[tool.setuptools.packages.find]
where = ["src"]
+1
View File
@@ -0,0 +1 @@
"""Tip Calculator - Day 2 of 100 Days of Code."""
+3
View File
@@ -0,0 +1,3 @@
from tip_calculator.main import main
main()
+8
View File
@@ -0,0 +1,8 @@
def bill_per_person(bill: float, tip_percent: int, people: int) -> float:
"""Return what each person pays, rounded to two decimal places."""
if people < 1:
raise ValueError("people must be at least 1")
tip_as_percent = tip_percent / 100
total_tip_amount = bill * tip_as_percent
total_bill = bill + total_tip_amount
return round(total_bill / people, 2)
+14
View File
@@ -0,0 +1,14 @@
from tip_calculator.calculator import bill_per_person
def main() -> None:
print("Welcome to the tip calculator!")
bill = float(input("What was the total bill? $"))
tip = int(input("What percentage tip would you like to give? 10, 12, or 15? "))
people = int(input("How many people to split the bill? "))
final_amount = bill_per_person(bill, tip, people)
print(f"Each person should pay: ${final_amount:.2f}")
if __name__ == "__main__":
main()
View File
+19
View File
@@ -0,0 +1,19 @@
import unittest
from tip_calculator.calculator import bill_per_person
class BillPerPersonTests(unittest.TestCase):
def test_course_example(self):
self.assertEqual(bill_per_person(124.56, 12, 7), 19.93)
def test_tip_split_five_ways(self):
self.assertEqual(bill_per_person(150, 12, 5), 33.6)
def test_zero_people_raises(self):
with self.assertRaises(ValueError):
bill_per_person(100, 10, 0)
if __name__ == "__main__":
unittest.main()