Add Band Name Generator project with CLI, tests, and documentation

This commit is contained in:
2026-10-03 12:10:47 +08:00
commit 9f6a401f9b
8 changed files with 206 additions and 0 deletions
+34
View File
@@ -0,0 +1,34 @@
# Byte-compiled / cache
__pycache__/
*.py[cod]
*$py.class
# Virtual environments
.venv/
venv/
env/
ENV/
# Environment files
.env
# Packaging / build
build/
dist/
*.egg-info/
.eggs/
# Test / coverage
.pytest_cache/
.coverage
.coverage.*
htmlcov/
.tox/
.mypy_cache/
.ruff_cache/
# IDEs / OS
.idea/
.vscode/
.DS_Store
Thumbs.db
+96
View File
@@ -0,0 +1,96 @@
# 🚀 Band Name Generator
A beginner-friendly Python program that suggests a band name using the user's hometown and pet's name.
## 📚 Table of Contents
- [Overview](#-overview)
- [Requirements](#-requirements)
- [Setup](#-setup)
- [Run](#-run)
- [Tests](#-tests)
- [License](#-license)
- [Links](#-links)
## 🧭 Overview
This is the Day 1 project from Udemy's [100 Days of Code™: The Complete Python Pro Bootcamp](https://www.udemy.com/course/100-days-of-code/). The program asks for the city you grew up in and the name of a pet, then combines them into your band name.
```text
Welcome to the Band Name Generator.
What's the name of the city you grew up in?
Paris
What's the name of a pet?
Rex
Your band name could be: Paris Rex
```
## 📋 Requirements
- Python 3.13 or newer
- No runtime dependencies (the tests use Python's built-in `unittest`)
## 🛠️ Setup
Create a local virtual environment named `.venv` in the project root and activate it.
Windows (PowerShell):
```powershell
python -m venv .venv
.venv\Scripts\Activate.ps1
```
Windows (Command Prompt):
```bat
python -m venv .venv
.venv\Scripts\activate.bat
```
macOS / Linux:
```bash
python3 -m venv .venv
source .venv/bin/activate
```
Then install the project in editable mode:
```bash
python -m pip install -e .
```
Run `deactivate` to leave the virtual environment. The `.venv` folder is ignored by Git.
## ▶️ Run
With `.venv` active:
```bash
python -m band_name_generator
```
Or use the installed command:
```bash
band-name-generator
```
## 🧪 Tests
With `.venv` active:
```bash
python -m unittest discover -s tests
```
## 📄 License
No license has been chosen yet. Add a `LICENSE` file and name it here once one is picked.
## 🔗 Links
- [Repository](https://git.tirsystem.com/Tirsvad-Udemy-100_days_of_code)
- [Documentation](https://git.tirsystem.com/Tirsvad-Udemy-100_days_of_code#readme)
- [Issue tracker](https://git.tirsystem.com/Tirsvad-Udemy-100_days_of_code/issues)
+17
View File
@@ -0,0 +1,17 @@
[build-system]
requires = ["setuptools>=68"]
build-backend = "setuptools.build_meta"
[project]
name = "band-name-generator"
version = "0.1.0"
description = "Day 1 of 100 Days of Code: suggest a band name from a hometown and a pet's name."
readme = "README.md"
requires-python = ">=3.13"
dependencies = []
[project.scripts]
band-name-generator = "band_name_generator.cli:main"
[tool.setuptools.packages.find]
where = ["src"]
+1
View File
@@ -0,0 +1 @@
"""Band Name Generator: combine a hometown and a pet's name into a band name."""
+3
View File
@@ -0,0 +1,3 @@
from band_name_generator.cli import main
main()
+19
View File
@@ -0,0 +1,19 @@
"""Command-line interface for the Band Name Generator."""
from band_name_generator.generator import generate_band_name
def main() -> None:
print("Welcome to the Band Name Generator.")
city = input("What's the name of the city you grew up in?\n")
pet = input("What's the name of a pet?\n")
try:
band_name = generate_band_name(city, pet)
except ValueError as error:
print(error)
raise SystemExit(1)
print(f"Your band name could be: {band_name}")
if __name__ == "__main__":
main()
+13
View File
@@ -0,0 +1,13 @@
"""Core logic for building a band name."""
def generate_band_name(city: str, pet: str) -> str:
"""Combine a city and a pet's name into a band name.
Raises ValueError if either value is empty or only whitespace.
"""
city = city.strip()
pet = pet.strip()
if not city or not pet:
raise ValueError("Both the city and the pet's name are required.")
return f"{city} {pet}"
+23
View File
@@ -0,0 +1,23 @@
import unittest
from band_name_generator.generator import generate_band_name
class GenerateBandNameTests(unittest.TestCase):
def test_combines_city_and_pet(self):
self.assertEqual(generate_band_name("Paris", "Rex"), "Paris Rex")
def test_strips_whitespace(self):
self.assertEqual(generate_band_name(" Paris ", " Rex\n"), "Paris Rex")
def test_empty_city_raises(self):
with self.assertRaises(ValueError):
generate_band_name("", "Rex")
def test_blank_pet_raises(self):
with self.assertRaises(ValueError):
generate_band_name("Paris", " ")
if __name__ == "__main__":
unittest.main()