Skip to content

jim-wyatt/msn-weather-wrapper

Folders and files

NameName
Last commit message
Last commit date

Latest commit

Β 

History

307 Commits
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 

MSN Weather Wrapper

A modern, production-ready Python wrapper for MSN Weather with Flask REST API and React frontend.

CI/CD Pipeline PyPI version Python License Documentation Code style: ruff Checked with mypy Container


Overview

MSN Weather Wrapper is a comprehensive weather data solution featuring:

  • Python Library - Type-safe weather client with Pydantic models
  • REST API - Production-ready Flask API with OpenAPI/Swagger docs
  • Web Frontend - Modern React 19 + TypeScript 5.7+ with Vite 7
  • Containerized - Podman/Docker deployment with Gunicorn & Nginx

Technology Stack:

  • Backend: Python 3.10+, Flask 3.1+, Pydantic 2.12+, Flasgger, Gunicorn 23.0+
  • Frontend: React 19.2, Vite 7.2, TypeScript 5.7+
  • Testing: pytest 8.0+, Playwright, 168 tests (128 backend, 40 frontend E2E) with 97% coverage
  • Quality: ruff 0.14+, mypy 1.19+, pre-commit hooks
  • Security: Bandit, Semgrep, pip-audit, Trivy, Grype, weekly automated scans
  • Deployment: Podman/Docker, Nginx, multi-stage builds

Quick Start

πŸš€ Containerized Deployment (Recommended)

git clone https://github.com/jim-wyatt/msn-weather-wrapper.git
cd msn-weather-wrapper
podman-compose up -d
# Access at http://localhost:8080

πŸ“¦ Python Package

pip install msn-weather-wrapper
from msn_weather_wrapper import WeatherClient, Location

with WeatherClient() as client:
    location = Location(city="London", country="UK")
    weather = client.get_weather(location)
    print(f"Temperature: {weather.temperature}Β°C")

πŸ§ͺ Development Environment

./dev.sh setup   # One-time setup
./dev.sh start   # Start dev servers
./dev.sh status  # Check health
# Frontend: http://localhost:5173
# API: http://localhost:5000
# Health: http://localhost:5000/api/v1/health

Features

  • 🌀️ Weather data extraction from MSN Weather
  • 🌍 406+ cities worldwide with autocomplete
  • πŸ”Œ RESTful API with comprehensive validation
  • πŸ“š Interactive API docs (Swagger UI at /apidocs/)
  • βš›οΈ Modern web interface with React + TypeScript
  • πŸš€ 5-minute caching (90%+ faster repeated requests)
  • πŸ”’ Rate limiting (30 req/min per IP, 200/hr global)
  • πŸ›‘οΈ Input validation & attack prevention (SQL injection, XSS, etc.)
  • πŸ” Automated security scanning (Bandit, Semgrep, Trivy, Grype)
  • πŸ” Type safety with mypy strict mode
  • πŸ“‹ SBOM generation for supply chain security
  • β™Ώ WCAG 2.1 Level AA accessible frontend
  • πŸ”„ Modular CI/CD workflows - Reusable, maintainable architecture
  • πŸ”„ Optimized CI/CD with Docker caching & conditional matrices
  • 🏷️ Automated semantic versioning - Every PR auto-publishes to PyPI

Installation

Prerequisites

  • Python 3.10+
  • Node.js 20+ (for frontend development)
  • Podman or Docker (for containerized deployment)

From Source

git clone https://github.com/jim-wyatt/msn-weather-wrapper.git
cd msn-weather-wrapper
python -m venv .venv
source .venv/bin/activate  # Windows: .venv\Scripts\activate
pip install -e ".[dev]"
pre-commit install

Usage

Python Library

from msn_weather_wrapper import WeatherClient, Location

with WeatherClient() as client:
    location = Location(city="Seattle", country="USA")
    weather = client.get_weather(location)

    print(f"Temperature: {weather.temperature}Β°C")
    print(f"Condition: {weather.condition}")
    print(f"Humidity: {weather.humidity}%")

REST API

# Development
python api.py

# Production
gunicorn --bind 0.0.0.0:5000 --workers 4 --timeout 120 api:app

# GET request
curl "http://localhost:5000/api/weather?city=London&country=UK"

# POST request
curl -X POST http://localhost:5000/api/weather \
  -H "Content-Type: application/json" \
  -d '{"city": "London", "country": "UK"}'

Web Frontend

cd frontend
npm install
npm run dev  # http://localhost:5173

Features: City autocomplete (406+ cities), temperature unit toggle (Β°C/Β°F), geolocation support, responsive design, WCAG 2.1 Level AA accessibility


Development

# Setup & Run
./dev.sh setup   # One-time setup
./dev.sh start   # Start dev environment
./dev.sh test    # Run tests
./dev.sh logs    # View logs

# Code Quality
ruff format .                    # Format
ruff check .                     # Lint
mypy src/msn_weather_wrapper     # Type check
pre-commit run --all-files       # Run all checks

# Testing
pytest                           # All tests
pytest --cov=src --cov-report=html  # With coverage
pytest tests/test_client.py -v   # Specific file

Deployment

# Podman/Docker Compose
podman-compose up -d
podman-compose logs -f
podman-compose down

# Standalone Container
podman build -t msn-weather-wrapper .
podman run -p 8080:80 msn-weather-wrapper

Architecture: Unified container (Python + Node.js), Nginx (reverse proxy), Gunicorn WSGI (4 workers), Supervisor (process manager), Kubernetes-ready health checks


Documentation

πŸ“š Full Documentation


Project Structure

msn-weather-wrapper/
β”œβ”€β”€ src/msn_weather_wrapper/    # Python package
β”œβ”€β”€ tests/                      # Test suite (168 tests: 128 backend + 40 frontend E2E, 97% coverage)
β”œβ”€β”€ frontend/                   # React application
β”œβ”€β”€ api.py                      # Flask REST API with Swagger
β”œβ”€β”€ docs/                       # Documentation
β”œβ”€β”€ Containerfile               # Production container
└── pyproject.toml              # Python config

Contributing

Contributions are welcome! Please ensure:

  1. βœ… All tests pass: pytest
  2. 🎨 Code is formatted: ruff format .
  3. πŸ” Type checks pass: mypy src/
  4. πŸͺ Pre-commit hooks pass
  5. πŸ“ Documentation is updated

See CONTRIBUTING.md for detailed guidelines.


License

MIT License - see LICENSE for details.


Links


Disclaimer

This project is an unofficial wrapper for MSN Weather data and is provided for educational and personal use only. This software is not affiliated with, endorsed by, or officially connected to Microsoft Corporation or MSN Weather in any way.


About

Modern Python weather API wrapper with Flask REST backend, React frontend, and Docker deployment. Automated CI/CD, security scanning, and semantic versioning.

Topics

Resources

License

Code of conduct

Contributing

Security policy

Stars

Watchers

Forks

Packages

 
 
 

Contributors