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