A comprehensive pond planning application that helps you calculate optimal pond dimensions, fish stocking levels, and equipment requirements for your backyard pond project.
The easiest way to run Pond Planner is using Docker:
# Pull the latest image from GitHub Container Registry
docker pull ghcr.io/parttimelegend/pond-planner:latest
# Run the application interactively
docker run -it ghcr.io/parttimelegend/pond-planner:latest
# Or run with docker-compose
git clone https://github.com/parttimelegend/pond-planner.git
cd pond-planner
docker-compose up pond-planner
Clone the repository:
git clone https://github.com/parttimelegend/pond-planner.git
cd pond-planner
Create a virtual environment:
python3 -m venv venv
source venv/bin/activate # On Windows: venv\Scripts\activate
Install dependencies:
pip install -r requirements.txt
Verify installation:
python verify_setup.py
This script will check that all dependencies are installed and the application is working correctly.
# Interactive mode
docker run -it ghcr.io/parttimelegend/pond-planner:latest
# With persistent storage for saved ponds
docker run -it -v $(pwd)/data:/app/data ghcr.io/parttimelegend/pond-planner:latest
# With docker-compose for development (includes persistent storage)
docker-compose up pond-planner-dev
# Build locally
docker build -t pond-planner .
docker run -it pond-planner
Note: The docker-compose configuration automatically handles persistent storage for saved pond configurations.
Run the interactive pond planner:
python main.py
The application provides a user-friendly menu interface with options to:
list
command to browse all 267 available fish speciesThe application will guide you through:
from PondPlanner import PondPlanner
# Create a pond planner instance
planner = PondPlanner()
# Set pond dimensions (length, width, depth in meters, shape)
planner.set_dimensions(5.0, 3.0, 1.5, "rectangular")
# Add fish to the pond
planner.add_fish("goldfish", 10)
planner.add_fish("koi", 3)
# Or add multiple fish types at once (atomic operation)
fish_batch = {"goldfish": 10, "koi": 3, "shubunkin": 5}
planner.add_fish_batch(fish_batch)
# Save pond configuration with description
filename = planner.save_pond("My Garden Pond", "Beautiful koi pond for the backyard")
print(f"Saved as: {filename}")
# List all saved ponds
saved_ponds = planner.list_saved_ponds()
for pond in saved_ponds:
print(f"- {pond['name']}: {pond['shape']} pond with {pond['fish_count']} fish")
# Load a saved pond configuration
planner_2 = PondPlanner()
planner_2.load_pond("My Garden Pond")
print(f"Loaded pond volume: {planner_2.calculate_volume_liters():,.0f} liters")
print(f"Fish stock: {planner_2.get_fish_stock()}")
# Calculate pond volume
volume = planner.calculate_volume_liters()
print(f"Pond volume: {volume:,.0f} liters")
# Check if pond is adequately sized
required_volume = planner.calculate_required_volume()
bioload = planner.calculate_bioload()
# Get equipment recommendations
pump_lph, pump_category = planner.calculate_pump_size()
filter_specs = planner.calculate_filter_size()
# Get stocking recommendations
recommendations = planner.get_stocking_recommendations()
# Generate comprehensive report
report = planner.generate_report()
print(report)
The application follows SOLID principles and clean architecture patterns:
Pond configurations are automatically saved to the data/saved_ponds/
directory as JSON files. Each saved pond includes:
The persistence system is designed to be:
The application includes a comprehensive database of 267 fish species covering:
Each fish species includes detailed information:
Edit fish_database.yaml
:
fish_species:
your_fish_key:
name: "Your Fish Name"
adult_length_cm: 25
bioload_factor: 1.2
min_liters_per_fish: 150
Edit pond_shapes.yaml
:
pond_shapes:
your_shape:
name: "Your Shape"
description: "Description of your shape"
formula_type: "simple" # or circular, elliptical, etc.
area_formula: "length * width"
multiplier: 1.0
uses_length: true
uses_width: true
POND PLANNING REPORT
====================
Pond Specifications:
- Dimensions: 5.0m x 3.0m x 1.5m
- Shape: Rectangular
- Total Volume: 22,500 liters
Current Fish Stock:
- Goldfish: 10 fish
- Koi: 3 fish
Stocking Analysis:
- Required Volume: 3,600 liters
- Available Volume: 22,500 liters
- Status: β Adequate
- Total Bioload: 17.5
Equipment Recommendations:
- Pump Size: 12,375 LPH (Medium bioload)
- 2,475 liters filter media
- UV Sterilizer: 79 watts
- Mechanical Filter: Pre-filter with 50-100 micron capability
Maximum Stocking Recommendations:
- Goldfish: up to 300 fish
- Koi: up to 23 fish
- Shubunkin: up to 118 fish
...
The main facade class for pond planning operations.
Methods:
set_dimensions(length, width, depth, shape)
: Set pond dimensionsadd_fish(fish_type, quantity)
: Add fish to stockremove_fish(fish_type, quantity)
: Remove fish from stockadd_fish_batch(fish_dict)
: Add multiple fish types atomicallysave_pond(name, description)
: Save current pond configuration to fileload_pond(filename)
: Load pond configuration from filelist_saved_ponds()
: List all saved pond configurations with metadatadelete_saved_pond(filename)
: Delete a saved pond configurationpond_exists(filename)
: Check if a saved pond configuration existsget_fish_stock()
: Get current fish inventorycalculate_volume_liters()
: Calculate pond volumecalculate_required_volume()
: Calculate volume needed for current stockcalculate_bioload()
: Calculate total bioloadget_stocking_recommendations()
: Get maximum stocking levelscalculate_pump_size()
: Get pump requirementscalculate_filter_size()
: Get filtration requirementsgenerate_report()
: Generate comprehensive reportProperties:
fish_stock
: Current fish inventory (read-only)fish_database
: Fish species database (read-only)All input validation provides detailed error messages:
try:
planner.set_dimensions(-1, 5, 2, "rectangular")
except ValueError as e:
print(e) # "Invalid dimensions: Length must be at least 0.1 meters"
Run the test suite:
python -m pytest tests/
For coverage report:
python -m pytest --cov=. tests/
This occurs when PyYAML is not installed. Make sure youβve followed the installation steps:
# Activate your virtual environment first
source venv/bin/activate # On Windows: venv\Scripts\activate
# Install dependencies
pip install -r requirements.txt
# Or install PyYAML directly
pip install PyYAML>=6.0
Ensure the application has write permissions to create the data/
directory:
# Create the directory if it doesn't exist
mkdir -p data/saved_ponds
# Check permissions
ls -la data/
Use volume mounting to persist data:
# Mount local data directory
docker run -it -v $(pwd)/data:/app/data ghcr.io/parttimelegend/pond-planner:latest
# Or use docker-compose (recommended)
docker-compose up pond-planner
git checkout -b feature/amazing-feature
)git commit -m 'Add amazing feature'
)git push origin feature/amazing-feature
)This project is licensed under the MIT License - see the LICENSE file for details.
For questions, issues, or feature requests, please open an issue on GitHub.
The application is available as Docker images with multiple tags:
latest
- Latest stable release from main branchmain
- Latest build from main branchdevelop
- Latest build from develop branchv1.0.0
- Specific version tagsYYYY-MM-DD
- Daily builds from main branchThe project uses GitHub Actions for: