Add tip calculator project structure and documentation
This commit is contained in:
+31
@@ -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
|
||||
@@ -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)
|
||||
@@ -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"]
|
||||
|
||||
@@ -0,0 +1 @@
|
||||
"""Tip Calculator - Day 2 of 100 Days of Code."""
|
||||
@@ -0,0 +1,3 @@
|
||||
from tip_calculator.main import main
|
||||
|
||||
main()
|
||||
@@ -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)
|
||||
@@ -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()
|
||||
@@ -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()
|
||||
Reference in New Issue
Block a user