tripwire-py


Nametripwire-py JSON
Version 0.13.0 PyPI version JSON
download
home_pageNone
SummaryCatch config errors before they explode - Python environment variable management with import-time validation, type safety, and secret detection
upload_time2025-10-17 00:17:55
maintainerNone
docs_urlNone
authorKibukx
requires_python>=3.11
licenseMIT License Copyright (c) 2025 DailyNerdOrg Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
keywords config configuration dotenv env environment validation
VCS
bugtrack_url
requirements No requirements were recorded.
Travis-CI No Travis.
coveralls test coverage No coveralls.
            <div align="center">

```
╔══════════════════════════╗
║      ━━━━━(○)━━━━━       ║
║                          ║
║     T R I P W I R E      ║
║                          ║
║    Config validation     ║
║     that fails fast      ║
╚══════════════════════════╝
```

**Smart Environment Variable Management for Python**

> Catch missing/invalid environment variables at import time (not runtime) with type validation, secret detection, and git history auditing.

[![CI](https://github.com/Daily-Nerd/TripWire/actions/workflows/ci.yml/badge.svg)](https://github.com/Daily-Nerd/TripWire/actions/workflows/ci.yml)
[![Security](https://github.com/Daily-Nerd/TripWire/actions/workflows/security.yml/badge.svg)](https://github.com/Daily-Nerd/TripWire/actions/workflows/security.yml)
[![codecov](https://codecov.io/gh/Daily-Nerd/TripWire/graph/badge.svg?token=QEWI3WS989)](https://codecov.io/gh/Daily-Nerd/TripWire)
[![PyPI version](https://badge.fury.io/py/tripwire-py.svg)](https://badge.fury.io/py/tripwire-py)
[![Python 3.11+](https://img.shields.io/badge/python-3.11+-blue.svg)](https://www.python.org/downloads/)
[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)
[![Examples](https://img.shields.io/badge/examples-verified-success)](examples/README.md)

[Quick Start](docs/getting-started/quick-start.md) • [Documentation](docs/README.md) • [Runnable Examples](examples/README.md) • [CLI Reference](docs/guides/cli-reference.md) • [API Docs](docs/reference/api.md) • [VS Code Extension](https://marketplace.visualstudio.com/items?itemName=Daily-Nerd.tripwire) • [Discord](https://discord.gg/eDwuVY68)

</div>

---

## The Problem

Every Python developer has experienced this:

```python
# Your code
import os
DATABASE_URL = os.getenv("DATABASE_URL")  # Returns None - no error yet

# 2 hours later in production...
host = DATABASE_URL.split('@')[1].split('/')[0]
# 💥 AttributeError: 'NoneType' object has no attribute 'split'

# Production is down. Users are angry. You're debugging at 2 AM.
```

[See this problem in action →](examples/problems/01_os_getenv_none.py)

**The pain:**
- Environment variables fail at runtime, not at startup
- No validation (wrong types, missing values, invalid formats)
- .env files drift across team members
- Secrets accidentally committed to git
- No type safety for configuration

---

## The Solution: TripWire

TripWire validates environment variables **at import time** and keeps your team in sync.

### Before TripWire
```python
import os

# Runtime crash waiting to happen
DATABASE_URL = os.getenv("DATABASE_URL")  # Could be None
PORT = int(os.getenv("PORT"))  # TypeError if PORT not set
DEBUG = os.getenv("DEBUG") == "true"  # Wrong! Returns False for "True", "1", etc.
```

[See these anti-patterns →](examples/problems/) | [Run: `python examples/problems/02_int_conversion_error.py`](examples/problems/02_int_conversion_error.py)

### After TripWire
```python
from tripwire import env

# Import fails immediately if vars missing/invalid
DATABASE_URL: str = env.require("DATABASE_URL", format="postgresql")
PORT: int = env.require("PORT", min_val=1, max_val=65535)
DEBUG: bool = env.optional("DEBUG", default=False)

# Your app won't even start with bad config!
```

[Try this example →](examples/basic/01_simple_require.py) | [See all examples →](examples/README.md)

**Key Benefits:**
- ✅ **Import-time validation** - Fail fast, not in production
- ✅ **Type safety** - Automatic type coercion with validation
- ✅ **Team sync** - Keep .env files consistent across team
- ✅ **Auto-documentation** - Generate .env.example from code
- ✅ **Secret detection** - 45+ platform-specific patterns (AWS, GitHub, Stripe, etc.)
- ✅ **Git history auditing** - Find when secrets were leaked and generate remediation steps
- ✅ **Great error messages** - Know exactly what's wrong and how to fix it

---

## Quick Start

### Installation

```bash
pip install tripwire-py
```

> **Note:** The package name on PyPI is `tripwire-py`, but you import it as `tripwire`:
> ```python
> from tripwire import env  # Import name is 'tripwire'
> ```

### Initialize Your Project

```bash
$ tripwire init

Welcome to TripWire! 🎯

✅ Created .env
✅ Created .env.example
✅ Updated .gitignore

Setup complete! ✅

Next steps:
  1. Edit .env with your configuration values
  2. Import in your code: from tripwire import env
  3. Use variables: API_KEY = env.require('API_KEY')
```

### Basic Usage

```python
# config.py
from tripwire import env

# Required variables (fail if missing)
API_KEY: str = env.require("API_KEY")
DATABASE_URL: str = env.require("DATABASE_URL", format="postgresql")

# Optional with defaults
DEBUG: bool = env.optional("DEBUG", default=False)
MAX_RETRIES: int = env.optional("MAX_RETRIES", default=3)

# Validated formats
EMAIL: str = env.require("ADMIN_EMAIL", format="email")
REDIS_URL: str = env.require("REDIS_URL", format="url")

# Now use them safely - guaranteed to be valid!
print(f"Connecting to {DATABASE_URL}")
```

[Run this example →](examples/basic/01_simple_require.py) | [Format validation →](examples/basic/04_format_validation.py) | [Quick Start Guide →](docs/getting-started/quick-start.md)

---

## Core Features

### 1. Import-Time Validation

Your app won't start with bad config.

```python
from tripwire import env

# This line MUST succeed or ImportError is raised
API_KEY = env.require("API_KEY")
# No more runtime surprises!
```

### 2. Type Inference & Validation

Automatic type detection from annotations (v0.4.0+) - no need to specify `type=` twice!

```python
from tripwire import env

# Type inferred from annotation
PORT: int = env.require("PORT", min_val=1, max_val=65535)
DEBUG: bool = env.optional("DEBUG", default=False)
TIMEOUT: float = env.optional("TIMEOUT", default=30.0)

# Lists and dicts
ALLOWED_HOSTS: list = env.require("ALLOWED_HOSTS")  # Handles CSV or JSON
FEATURE_FLAGS: dict = env.optional("FEATURE_FLAGS", default={})

# Choices/enums
ENVIRONMENT: str = env.require("ENVIRONMENT", choices=["dev", "staging", "prod"])
```

[Type coercion example →](examples/basic/03_type_coercion.py) | [Range validation →](examples/advanced/01_range_validation.py) | [Choices validation →](examples/advanced/02_choices_enum.py) | [Type Inference docs →](docs/reference/type-inference.md)

### 3. Format Validators

Built-in validators for common formats, plus advanced validators for security-critical configurations (v0.10.1+).

```python
# Basic format validation
ADMIN_EMAIL: str = env.require("ADMIN_EMAIL", format="email")
API_URL: str = env.require("API_URL", format="url")
DATABASE_URL: str = env.require("DATABASE_URL", format="postgresql")
SERVER_IP: str = env.require("SERVER_IP", format="ipv4")

# Custom regex patterns
API_KEY: str = env.require("API_KEY", pattern=r"^sk-[a-zA-Z0-9]{32}$")

# Advanced URL validation (v0.10.1+)
from tripwire.validation import validate_url_components
API_ENDPOINT: str = env.require(
    "API_ENDPOINT",
    validator=lambda url: validate_url_components(
        url,
        protocols=["https"],  # HTTPS-only for security
        forbidden_ports=[22, 23, 3389],  # Block SSH/Telnet/RDP
        required_params=["api_key"]  # Enforce authentication
    )[0]
)

# DateTime validation for expiration dates (v0.10.1+)
from tripwire.validation import validate_datetime
CERT_EXPIRY: str = env.require(
    "CERT_EXPIRY",
    validator=lambda dt: validate_datetime(
        dt,
        formats=["ISO8601"],
        require_timezone=True,
        min_datetime="2025-01-01T00:00:00Z"
    )[0]
)
```

[See all validators →](docs/reference/validators.md)

### 4. Secret Detection & Git Audit

Detect secrets in .env and audit git history for leaks.

```bash
# Auto-detect and audit all secrets
$ tripwire security audit --all

🔍 Auto-detecting secrets in .env file...
⚠️  Found 3 potential secret(s)

📊 Secret Leak Blast Radius
═══════════════════════════
🔍 Repository Secret Exposure
├─ 🔴 🚨 AWS_SECRET_ACCESS_KEY (47 occurrence(s))
│  ├─ Branches: origin/main, origin/develop
│  └─ Files: .env
├─ 🟡 ⚠️ STRIPE_SECRET_KEY (12 occurrence(s))
└─ 🟢 DATABASE_PASSWORD (0 occurrence(s))

📈 Summary: 2 leaked, 1 clean, 59 commits affected
```

**Detects 45+ secret types:** AWS, GitHub, Stripe, Azure, GCP, Slack, and more.

[Learn more about Secret Management →](docs/guides/secret-management.md) | [Git Audit Deep Dive →](docs/advanced/git-audit.md)

---

## Essential CLI Commands

```bash
# Initialize project
tripwire init

# Generate .env.example from code
tripwire generate

# Check for drift between .env and .env.example
tripwire check

# Sync .env with .env.example
tripwire sync

# Compare configurations (v0.4.0+)
tripwire diff .env .env.prod

# Scan for secrets (v0.8.0+)
tripwire security scan --strict

# Audit git history for secret leaks (v0.8.0+)
tripwire security audit --all

# Validate .env without running app
tripwire validate

# Plugin management (v0.10.0+)
tripwire plugin install vault
tripwire plugin list
```

[Complete CLI Reference →](docs/guides/cli-reference.md)

---

## Framework Integration

### FastAPI

```python
from fastapi import FastAPI
from tripwire import env

# Validate at import time
DATABASE_URL: str = env.require("DATABASE_URL", format="postgresql")
SECRET_KEY: str = env.require("SECRET_KEY", secret=True, min_length=32)
DEBUG: bool = env.optional("DEBUG", default=False)

app = FastAPI(debug=DEBUG)

@app.on_event("startup")
async def startup():
    print(f"Connecting to {DATABASE_URL[:20]}...")
```

[Run full FastAPI example →](examples/frameworks/fastapi_integration.py)

### Django

```python
# settings.py
from tripwire import env

SECRET_KEY = env.require("DJANGO_SECRET_KEY", secret=True, min_length=50)
DEBUG = env.optional("DEBUG", default=False)
ALLOWED_HOSTS = env.optional("ALLOWED_HOSTS", default=["localhost"], type=list)

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql',
        'NAME': env.require("DB_NAME"),
        'USER': env.require("DB_USER"),
        'PASSWORD': env.require("DB_PASSWORD", secret=True),
        'HOST': env.optional("DB_HOST", default="localhost"),
        'PORT': env.optional("DB_PORT", default=5432),
    }
}
```

[Run full Django example →](examples/frameworks/django_settings.py)

### Flask

```python
from flask import Flask
from tripwire import env

# Validate before app creation
DATABASE_URL: str = env.require("DATABASE_URL", format="postgresql")
SECRET_KEY: str = env.require("SECRET_KEY", secret=True)
DEBUG: bool = env.optional("DEBUG", default=False)

app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = DATABASE_URL
app.config['SECRET_KEY'] = SECRET_KEY
```

[Run full Flask example →](examples/frameworks/flask_integration.py)

[More framework examples →](docs/guides/framework-integration.md) | [See all framework integrations →](examples/frameworks/)

---

## Configuration as Code

Define environment variables declaratively using TOML schemas (v0.3.0+).

```toml
# .tripwire.toml
[project]
name = "my-app"
version = "1.0.0"

[variables.DATABASE_URL]
type = "string"
required = true
format = "postgresql"
description = "PostgreSQL connection"
secret = true

[variables.PORT]
type = "int"
required = false
default = 8000
min = 1024
max = 65535

[environments.production]
strict_secrets = true
```

```bash
# Validate against schema
tripwire schema validate --environment production

# Generate .env.example from schema
tripwire schema to-example

# Migrate legacy .env.example to schema (v0.4.1+)
tripwire schema from-example
```

[Learn more about Configuration as Code →](docs/guides/configuration-as-code.md)

---

## Plugin System

Extend TripWire with cloud secret managers and custom environment sources (v0.10.0+).

### Official Plugins

TripWire includes 4 production-ready plugins for major cloud providers:

```bash
# Install plugins from official registry
tripwire plugin install vault           # HashiCorp Vault
tripwire plugin install aws-secrets     # AWS Secrets Manager
tripwire plugin install azure-keyvault  # Azure Key Vault
tripwire plugin install remote-config   # Generic HTTP endpoint
```

### Using Plugins

```python
from tripwire import TripWire
from tripwire.plugins.sources import VaultEnvSource, AWSSecretsSource

# HashiCorp Vault
vault = VaultEnvSource(
    url="https://vault.company.com",
    token="hvs.xxx",
    mount_point="secret",
    path="myapp/config"
)

# AWS Secrets Manager
aws = AWSSecretsSource(
    secret_name="myapp/production",
    region_name="us-east-1"
    # Uses AWS credentials from environment or IAM role
)

# Use with TripWire
env = TripWire(sources=[vault, aws])
DATABASE_URL = env.require("DATABASE_URL")
API_KEY = env.require("API_KEY")
```

### Plugin Commands

```bash
# Search for plugins
tripwire plugin search vault

# List installed plugins
tripwire plugin list

# Update a plugin
tripwire plugin update vault --version 0.2.0

# Remove a plugin
tripwire plugin remove vault
```

### Authentication

**HashiCorp Vault:**
- Token authentication: `VAULT_TOKEN` env var
- AppRole authentication: `VAULT_ROLE_ID` + `VAULT_SECRET_ID`
- Kubernetes auth: Automatic when running in K8s

**AWS Secrets Manager:**
- IAM credentials: `AWS_ACCESS_KEY_ID` + `AWS_SECRET_ACCESS_KEY`
- IAM role: Automatic when running on EC2/ECS/Lambda
- AWS CLI profile: Respects `AWS_PROFILE` env var

**Azure Key Vault:**
- Service Principal: `AZURE_CLIENT_ID` + `AZURE_TENANT_ID` + `AZURE_CLIENT_SECRET`
- Managed Identity: Automatic when running on Azure VMs/App Service
- Azure CLI: Uses `az login` credentials

**Remote HTTP Endpoint:**
- Bearer token: `Authorization: Bearer <token>` header
- API key: Custom header authentication
- mTLS: Client certificate authentication

[Learn more about Plugin Development →](docs/guides/plugin-development.md)

---

## CI/CD Integration

### GitHub Actions

```yaml
name: Validate Environment
on: [push, pull_request]

jobs:
  validate:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v3
      - uses: actions/setup-python@v4
        with:
          python-version: '3.11'
      - run: pip install tripwire-py
      - run: tripwire generate --check
      - run: tripwire security scan --strict
      - run: tripwire schema validate --strict
```

[More CI/CD examples →](docs/guides/ci-cd-integration.md)

---

## Comparison with Alternatives

| Feature | TripWire | python-decouple | environs | pydantic-settings | python-dotenv |
|---------|---------|-----------------|----------|-------------------|---------------|
| Import-time validation | ✅ | ❌ | ⚠️ | ⚠️ | ❌ |
| Type coercion | ✅ | ⚠️ Basic | ✅ | ✅ | ❌ |
| Format validators | ✅ | ❌ | ✅ | ✅ | ❌ |
| .env.example generation | ✅ | ❌ | ❌ | ❌ | ❌ |
| Team sync (drift detection) | ✅ | ❌ | ❌ | ❌ | ❌ |
| Secret detection (45+ patterns) | ✅ | ❌ | ❌ | ❌ | ❌ |
| Git history auditing | ✅ | ❌ | ❌ | ❌ | ❌ |
| Plugin system (cloud secrets) | ✅ | ❌ | ❌ | ❌ | ❌ |
| CLI tools | ✅ | ❌ | ❌ | ❌ | ⚠️ |
| Multi-environment | ✅ | ✅ | ✅ | ✅ | ✅ |

### What Makes TripWire Different?

While all these libraries handle environment variables, **TripWire focuses on the complete developer workflow**:

- **Prevent production failures** with import-time validation
- **Keep teams in sync** with automated .env.example generation
- **Protect secrets** with detection and git history auditing
- **Streamline onboarding** with CLI tools for env management

TripWire is designed for teams that want comprehensive config management, not just loading .env files.

### When to Choose Each Library

**Choose TripWire When:**
- You need guaranteed import-time validation to prevent production starts with invalid config
- Your team struggles with .env file drift and keeping documentation current
- Security is paramount and you need secret detection/git history auditing
- You want automated .env.example generation from your code
- You prefer comprehensive CLI tools for environment management

**Choose python-dotenv When:**
- You need a minimal, zero-config .env loader
- You're building a simple script or small project
- Minimal dependencies are a priority

**Choose environs When:**
- You need comprehensive type validation powered by marshmallow
- You're already using marshmallow in your project

**Choose pydantic-settings When:**
- Your project already uses Pydantic for data validation
- You need settings to integrate seamlessly with FastAPI

**Choose python-decouple When:**
- You want strict separation of config from code with minimal overhead
- You need zero dependencies

### Acknowledgments

TripWire builds on the excellent work of the Python community, particularly:
- **python-dotenv** for reliable .env file parsing
- The validation patterns pioneered by **environs** and **pydantic**
- The config separation philosophy of **python-decouple**

---

## Development Roadmap

### Implemented Features ✅

- [x] Environment variable loading
- [x] Import-time validation
- [x] Type coercion (str, int, bool, float, list, dict)
- [x] **Type inference from annotations** (v0.4.0)
- [x] Format validators (email, url, uuid, ipv4, postgresql)
- [x] Custom validators
- [x] .env.example generation from code
- [x] Drift detection and team sync
- [x] **Configuration comparison** (diff command - v0.4.0)
- [x] Multi-environment support
- [x] **Unified config abstraction** (.env + TOML - v0.4.0)
- [x] Secret detection (45+ platform patterns)
- [x] **Git audit with timeline and remediation** (audit command)
- [x] **Configuration as Code** (TOML schemas - v0.3.0)
- [x] **Tool configuration** (`[tool.tripwire]` - v0.4.1)
- [x] **Schema migration** (schema from-example - v0.4.1)
- [x] **Plugin system** (v0.10.0) - Vault, AWS, Azure, Remote HTTP
- [x] **Modern architecture** (TripWireV2 - v0.9.0) - 22% faster
- [x] **Advanced validators** (v0.10.1) - URL components, DateTime validation
- [x] **VS Code extension** - Diagnostics, autocomplete, git audit integration ([Marketplace](https://marketplace.visualstudio.com/items?itemName=Daily-Nerd.tripwire))

### Planned Features 📋
- [ ] PyCharm plugin
- [ ] Encrypted .env files
- [ ] Web UI for team env management
- [ ] Environment variable versioning
- [ ] Compliance reports (SOC2, HIPAA)
- [ ] Additional plugins (GCP Secret Manager, 1Password, Bitwarden)

---

## Documentation

Complete documentation is available at [docs/README.md](docs/README.md):

### Getting Started
- [Installation](docs/getting-started/installation.md)
- [Quick Start (5 minutes)](docs/getting-started/quick-start.md)
- [Your First Project](docs/getting-started/your-first-project.md)

### Guides
- [CLI Reference](docs/guides/cli-reference.md)
- [Configuration as Code](docs/guides/configuration-as-code.md)
- [Secret Management](docs/guides/secret-management.md)
- [Framework Integration](docs/guides/framework-integration.md)
- [Multi-Environment](docs/guides/multi-environment.md)
- [CI/CD Integration](docs/guides/ci-cd-integration.md)

### Reference
- [Python API](docs/reference/api.md)
- [Validators](docs/reference/validators.md)
- [Type Inference](docs/reference/type-inference.md)
- [Configuration](docs/reference/configuration.md)

### Advanced
- [Custom Validators](docs/advanced/custom-validators.md)
- [Git Audit Deep Dive](docs/advanced/git-audit.md)
- [Type System](docs/advanced/type-system.md)
- [Troubleshooting](docs/advanced/troubleshooting.md)

---

## Contributing

We welcome contributions! See our development workflow:

```bash
# Clone and setup
git clone https://github.com/Daily-Nerd/TripWire.git
cd tripwire
python -m venv venv
source venv/bin/activate  # Windows: venv\Scripts\activate
pip install -e ".[dev]"

# Run tests
pytest

# Run linter
ruff check .

# Format code
black .
```

See [CONTRIBUTING.md](CONTRIBUTING.md) for detailed guidelines.

---

## License

MIT License - see [LICENSE](LICENSE) file for details.

---

## Support

- 💬 **Discord**: [discord.gg/eDwuVY68](https://discord.gg/eDwuVY68) - Get help, share ideas, connect with the community
- 📦 **PyPI**: [pypi.org/project/tripwire-py](https://pypi.org/project/tripwire-py/)
- 💻 **GitHub**: [github.com/Daily-Nerd/TripWire](https://github.com/Daily-Nerd/TripWire)
- 🐛 **Issues**: [github.com/Daily-Nerd/TripWire/issues](https://github.com/Daily-Nerd/TripWire/issues)
- 🔌 **VS Code Extension**: [marketplace.visualstudio.com/items?itemName=Daily-Nerd.tripwire](https://marketplace.visualstudio.com/items?itemName=Daily-Nerd.tripwire)

---

**TripWire** - Environment variables that just work. 🎯

*Stop debugging production crashes. Start shipping with confidence.*

            

Raw data

            {
    "_id": null,
    "home_page": null,
    "name": "tripwire-py",
    "maintainer": null,
    "docs_url": null,
    "requires_python": ">=3.11",
    "maintainer_email": null,
    "keywords": "config, configuration, dotenv, env, environment, validation",
    "author": "Kibukx",
    "author_email": null,
    "download_url": "https://files.pythonhosted.org/packages/56/c3/494d23f90b0f42b85cd13c96d7262f84537b11a651edc775f7c6f7b0e912/tripwire_py-0.13.0.tar.gz",
    "platform": null,
    "description": "<div align=\"center\">\n\n```\n\u2554\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2557\n\u2551      \u2501\u2501\u2501\u2501\u2501(\u25cb)\u2501\u2501\u2501\u2501\u2501       \u2551\n\u2551                          \u2551\n\u2551     T R I P W I R E      \u2551\n\u2551                          \u2551\n\u2551    Config validation     \u2551\n\u2551     that fails fast      \u2551\n\u255a\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u255d\n```\n\n**Smart Environment Variable Management for Python**\n\n> Catch missing/invalid environment variables at import time (not runtime) with type validation, secret detection, and git history auditing.\n\n[![CI](https://github.com/Daily-Nerd/TripWire/actions/workflows/ci.yml/badge.svg)](https://github.com/Daily-Nerd/TripWire/actions/workflows/ci.yml)\n[![Security](https://github.com/Daily-Nerd/TripWire/actions/workflows/security.yml/badge.svg)](https://github.com/Daily-Nerd/TripWire/actions/workflows/security.yml)\n[![codecov](https://codecov.io/gh/Daily-Nerd/TripWire/graph/badge.svg?token=QEWI3WS989)](https://codecov.io/gh/Daily-Nerd/TripWire)\n[![PyPI version](https://badge.fury.io/py/tripwire-py.svg)](https://badge.fury.io/py/tripwire-py)\n[![Python 3.11+](https://img.shields.io/badge/python-3.11+-blue.svg)](https://www.python.org/downloads/)\n[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)\n[![Examples](https://img.shields.io/badge/examples-verified-success)](examples/README.md)\n\n[Quick Start](docs/getting-started/quick-start.md) \u2022 [Documentation](docs/README.md) \u2022 [Runnable Examples](examples/README.md) \u2022 [CLI Reference](docs/guides/cli-reference.md) \u2022 [API Docs](docs/reference/api.md) \u2022 [VS Code Extension](https://marketplace.visualstudio.com/items?itemName=Daily-Nerd.tripwire) \u2022 [Discord](https://discord.gg/eDwuVY68)\n\n</div>\n\n---\n\n## The Problem\n\nEvery Python developer has experienced this:\n\n```python\n# Your code\nimport os\nDATABASE_URL = os.getenv(\"DATABASE_URL\")  # Returns None - no error yet\n\n# 2 hours later in production...\nhost = DATABASE_URL.split('@')[1].split('/')[0]\n# \ud83d\udca5 AttributeError: 'NoneType' object has no attribute 'split'\n\n# Production is down. Users are angry. You're debugging at 2 AM.\n```\n\n[See this problem in action \u2192](examples/problems/01_os_getenv_none.py)\n\n**The pain:**\n- Environment variables fail at runtime, not at startup\n- No validation (wrong types, missing values, invalid formats)\n- .env files drift across team members\n- Secrets accidentally committed to git\n- No type safety for configuration\n\n---\n\n## The Solution: TripWire\n\nTripWire validates environment variables **at import time** and keeps your team in sync.\n\n### Before TripWire\n```python\nimport os\n\n# Runtime crash waiting to happen\nDATABASE_URL = os.getenv(\"DATABASE_URL\")  # Could be None\nPORT = int(os.getenv(\"PORT\"))  # TypeError if PORT not set\nDEBUG = os.getenv(\"DEBUG\") == \"true\"  # Wrong! Returns False for \"True\", \"1\", etc.\n```\n\n[See these anti-patterns \u2192](examples/problems/) | [Run: `python examples/problems/02_int_conversion_error.py`](examples/problems/02_int_conversion_error.py)\n\n### After TripWire\n```python\nfrom tripwire import env\n\n# Import fails immediately if vars missing/invalid\nDATABASE_URL: str = env.require(\"DATABASE_URL\", format=\"postgresql\")\nPORT: int = env.require(\"PORT\", min_val=1, max_val=65535)\nDEBUG: bool = env.optional(\"DEBUG\", default=False)\n\n# Your app won't even start with bad config!\n```\n\n[Try this example \u2192](examples/basic/01_simple_require.py) | [See all examples \u2192](examples/README.md)\n\n**Key Benefits:**\n- \u2705 **Import-time validation** - Fail fast, not in production\n- \u2705 **Type safety** - Automatic type coercion with validation\n- \u2705 **Team sync** - Keep .env files consistent across team\n- \u2705 **Auto-documentation** - Generate .env.example from code\n- \u2705 **Secret detection** - 45+ platform-specific patterns (AWS, GitHub, Stripe, etc.)\n- \u2705 **Git history auditing** - Find when secrets were leaked and generate remediation steps\n- \u2705 **Great error messages** - Know exactly what's wrong and how to fix it\n\n---\n\n## Quick Start\n\n### Installation\n\n```bash\npip install tripwire-py\n```\n\n> **Note:** The package name on PyPI is `tripwire-py`, but you import it as `tripwire`:\n> ```python\n> from tripwire import env  # Import name is 'tripwire'\n> ```\n\n### Initialize Your Project\n\n```bash\n$ tripwire init\n\nWelcome to TripWire! \ud83c\udfaf\n\n\u2705 Created .env\n\u2705 Created .env.example\n\u2705 Updated .gitignore\n\nSetup complete! \u2705\n\nNext steps:\n  1. Edit .env with your configuration values\n  2. Import in your code: from tripwire import env\n  3. Use variables: API_KEY = env.require('API_KEY')\n```\n\n### Basic Usage\n\n```python\n# config.py\nfrom tripwire import env\n\n# Required variables (fail if missing)\nAPI_KEY: str = env.require(\"API_KEY\")\nDATABASE_URL: str = env.require(\"DATABASE_URL\", format=\"postgresql\")\n\n# Optional with defaults\nDEBUG: bool = env.optional(\"DEBUG\", default=False)\nMAX_RETRIES: int = env.optional(\"MAX_RETRIES\", default=3)\n\n# Validated formats\nEMAIL: str = env.require(\"ADMIN_EMAIL\", format=\"email\")\nREDIS_URL: str = env.require(\"REDIS_URL\", format=\"url\")\n\n# Now use them safely - guaranteed to be valid!\nprint(f\"Connecting to {DATABASE_URL}\")\n```\n\n[Run this example \u2192](examples/basic/01_simple_require.py) | [Format validation \u2192](examples/basic/04_format_validation.py) | [Quick Start Guide \u2192](docs/getting-started/quick-start.md)\n\n---\n\n## Core Features\n\n### 1. Import-Time Validation\n\nYour app won't start with bad config.\n\n```python\nfrom tripwire import env\n\n# This line MUST succeed or ImportError is raised\nAPI_KEY = env.require(\"API_KEY\")\n# No more runtime surprises!\n```\n\n### 2. Type Inference & Validation\n\nAutomatic type detection from annotations (v0.4.0+) - no need to specify `type=` twice!\n\n```python\nfrom tripwire import env\n\n# Type inferred from annotation\nPORT: int = env.require(\"PORT\", min_val=1, max_val=65535)\nDEBUG: bool = env.optional(\"DEBUG\", default=False)\nTIMEOUT: float = env.optional(\"TIMEOUT\", default=30.0)\n\n# Lists and dicts\nALLOWED_HOSTS: list = env.require(\"ALLOWED_HOSTS\")  # Handles CSV or JSON\nFEATURE_FLAGS: dict = env.optional(\"FEATURE_FLAGS\", default={})\n\n# Choices/enums\nENVIRONMENT: str = env.require(\"ENVIRONMENT\", choices=[\"dev\", \"staging\", \"prod\"])\n```\n\n[Type coercion example \u2192](examples/basic/03_type_coercion.py) | [Range validation \u2192](examples/advanced/01_range_validation.py) | [Choices validation \u2192](examples/advanced/02_choices_enum.py) | [Type Inference docs \u2192](docs/reference/type-inference.md)\n\n### 3. Format Validators\n\nBuilt-in validators for common formats, plus advanced validators for security-critical configurations (v0.10.1+).\n\n```python\n# Basic format validation\nADMIN_EMAIL: str = env.require(\"ADMIN_EMAIL\", format=\"email\")\nAPI_URL: str = env.require(\"API_URL\", format=\"url\")\nDATABASE_URL: str = env.require(\"DATABASE_URL\", format=\"postgresql\")\nSERVER_IP: str = env.require(\"SERVER_IP\", format=\"ipv4\")\n\n# Custom regex patterns\nAPI_KEY: str = env.require(\"API_KEY\", pattern=r\"^sk-[a-zA-Z0-9]{32}$\")\n\n# Advanced URL validation (v0.10.1+)\nfrom tripwire.validation import validate_url_components\nAPI_ENDPOINT: str = env.require(\n    \"API_ENDPOINT\",\n    validator=lambda url: validate_url_components(\n        url,\n        protocols=[\"https\"],  # HTTPS-only for security\n        forbidden_ports=[22, 23, 3389],  # Block SSH/Telnet/RDP\n        required_params=[\"api_key\"]  # Enforce authentication\n    )[0]\n)\n\n# DateTime validation for expiration dates (v0.10.1+)\nfrom tripwire.validation import validate_datetime\nCERT_EXPIRY: str = env.require(\n    \"CERT_EXPIRY\",\n    validator=lambda dt: validate_datetime(\n        dt,\n        formats=[\"ISO8601\"],\n        require_timezone=True,\n        min_datetime=\"2025-01-01T00:00:00Z\"\n    )[0]\n)\n```\n\n[See all validators \u2192](docs/reference/validators.md)\n\n### 4. Secret Detection & Git Audit\n\nDetect secrets in .env and audit git history for leaks.\n\n```bash\n# Auto-detect and audit all secrets\n$ tripwire security audit --all\n\n\ud83d\udd0d Auto-detecting secrets in .env file...\n\u26a0\ufe0f  Found 3 potential secret(s)\n\n\ud83d\udcca Secret Leak Blast Radius\n\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n\ud83d\udd0d Repository Secret Exposure\n\u251c\u2500 \ud83d\udd34 \ud83d\udea8 AWS_SECRET_ACCESS_KEY (47 occurrence(s))\n\u2502  \u251c\u2500 Branches: origin/main, origin/develop\n\u2502  \u2514\u2500 Files: .env\n\u251c\u2500 \ud83d\udfe1 \u26a0\ufe0f STRIPE_SECRET_KEY (12 occurrence(s))\n\u2514\u2500 \ud83d\udfe2 DATABASE_PASSWORD (0 occurrence(s))\n\n\ud83d\udcc8 Summary: 2 leaked, 1 clean, 59 commits affected\n```\n\n**Detects 45+ secret types:** AWS, GitHub, Stripe, Azure, GCP, Slack, and more.\n\n[Learn more about Secret Management \u2192](docs/guides/secret-management.md) | [Git Audit Deep Dive \u2192](docs/advanced/git-audit.md)\n\n---\n\n## Essential CLI Commands\n\n```bash\n# Initialize project\ntripwire init\n\n# Generate .env.example from code\ntripwire generate\n\n# Check for drift between .env and .env.example\ntripwire check\n\n# Sync .env with .env.example\ntripwire sync\n\n# Compare configurations (v0.4.0+)\ntripwire diff .env .env.prod\n\n# Scan for secrets (v0.8.0+)\ntripwire security scan --strict\n\n# Audit git history for secret leaks (v0.8.0+)\ntripwire security audit --all\n\n# Validate .env without running app\ntripwire validate\n\n# Plugin management (v0.10.0+)\ntripwire plugin install vault\ntripwire plugin list\n```\n\n[Complete CLI Reference \u2192](docs/guides/cli-reference.md)\n\n---\n\n## Framework Integration\n\n### FastAPI\n\n```python\nfrom fastapi import FastAPI\nfrom tripwire import env\n\n# Validate at import time\nDATABASE_URL: str = env.require(\"DATABASE_URL\", format=\"postgresql\")\nSECRET_KEY: str = env.require(\"SECRET_KEY\", secret=True, min_length=32)\nDEBUG: bool = env.optional(\"DEBUG\", default=False)\n\napp = FastAPI(debug=DEBUG)\n\n@app.on_event(\"startup\")\nasync def startup():\n    print(f\"Connecting to {DATABASE_URL[:20]}...\")\n```\n\n[Run full FastAPI example \u2192](examples/frameworks/fastapi_integration.py)\n\n### Django\n\n```python\n# settings.py\nfrom tripwire import env\n\nSECRET_KEY = env.require(\"DJANGO_SECRET_KEY\", secret=True, min_length=50)\nDEBUG = env.optional(\"DEBUG\", default=False)\nALLOWED_HOSTS = env.optional(\"ALLOWED_HOSTS\", default=[\"localhost\"], type=list)\n\nDATABASES = {\n    'default': {\n        'ENGINE': 'django.db.backends.postgresql',\n        'NAME': env.require(\"DB_NAME\"),\n        'USER': env.require(\"DB_USER\"),\n        'PASSWORD': env.require(\"DB_PASSWORD\", secret=True),\n        'HOST': env.optional(\"DB_HOST\", default=\"localhost\"),\n        'PORT': env.optional(\"DB_PORT\", default=5432),\n    }\n}\n```\n\n[Run full Django example \u2192](examples/frameworks/django_settings.py)\n\n### Flask\n\n```python\nfrom flask import Flask\nfrom tripwire import env\n\n# Validate before app creation\nDATABASE_URL: str = env.require(\"DATABASE_URL\", format=\"postgresql\")\nSECRET_KEY: str = env.require(\"SECRET_KEY\", secret=True)\nDEBUG: bool = env.optional(\"DEBUG\", default=False)\n\napp = Flask(__name__)\napp.config['SQLALCHEMY_DATABASE_URI'] = DATABASE_URL\napp.config['SECRET_KEY'] = SECRET_KEY\n```\n\n[Run full Flask example \u2192](examples/frameworks/flask_integration.py)\n\n[More framework examples \u2192](docs/guides/framework-integration.md) | [See all framework integrations \u2192](examples/frameworks/)\n\n---\n\n## Configuration as Code\n\nDefine environment variables declaratively using TOML schemas (v0.3.0+).\n\n```toml\n# .tripwire.toml\n[project]\nname = \"my-app\"\nversion = \"1.0.0\"\n\n[variables.DATABASE_URL]\ntype = \"string\"\nrequired = true\nformat = \"postgresql\"\ndescription = \"PostgreSQL connection\"\nsecret = true\n\n[variables.PORT]\ntype = \"int\"\nrequired = false\ndefault = 8000\nmin = 1024\nmax = 65535\n\n[environments.production]\nstrict_secrets = true\n```\n\n```bash\n# Validate against schema\ntripwire schema validate --environment production\n\n# Generate .env.example from schema\ntripwire schema to-example\n\n# Migrate legacy .env.example to schema (v0.4.1+)\ntripwire schema from-example\n```\n\n[Learn more about Configuration as Code \u2192](docs/guides/configuration-as-code.md)\n\n---\n\n## Plugin System\n\nExtend TripWire with cloud secret managers and custom environment sources (v0.10.0+).\n\n### Official Plugins\n\nTripWire includes 4 production-ready plugins for major cloud providers:\n\n```bash\n# Install plugins from official registry\ntripwire plugin install vault           # HashiCorp Vault\ntripwire plugin install aws-secrets     # AWS Secrets Manager\ntripwire plugin install azure-keyvault  # Azure Key Vault\ntripwire plugin install remote-config   # Generic HTTP endpoint\n```\n\n### Using Plugins\n\n```python\nfrom tripwire import TripWire\nfrom tripwire.plugins.sources import VaultEnvSource, AWSSecretsSource\n\n# HashiCorp Vault\nvault = VaultEnvSource(\n    url=\"https://vault.company.com\",\n    token=\"hvs.xxx\",\n    mount_point=\"secret\",\n    path=\"myapp/config\"\n)\n\n# AWS Secrets Manager\naws = AWSSecretsSource(\n    secret_name=\"myapp/production\",\n    region_name=\"us-east-1\"\n    # Uses AWS credentials from environment or IAM role\n)\n\n# Use with TripWire\nenv = TripWire(sources=[vault, aws])\nDATABASE_URL = env.require(\"DATABASE_URL\")\nAPI_KEY = env.require(\"API_KEY\")\n```\n\n### Plugin Commands\n\n```bash\n# Search for plugins\ntripwire plugin search vault\n\n# List installed plugins\ntripwire plugin list\n\n# Update a plugin\ntripwire plugin update vault --version 0.2.0\n\n# Remove a plugin\ntripwire plugin remove vault\n```\n\n### Authentication\n\n**HashiCorp Vault:**\n- Token authentication: `VAULT_TOKEN` env var\n- AppRole authentication: `VAULT_ROLE_ID` + `VAULT_SECRET_ID`\n- Kubernetes auth: Automatic when running in K8s\n\n**AWS Secrets Manager:**\n- IAM credentials: `AWS_ACCESS_KEY_ID` + `AWS_SECRET_ACCESS_KEY`\n- IAM role: Automatic when running on EC2/ECS/Lambda\n- AWS CLI profile: Respects `AWS_PROFILE` env var\n\n**Azure Key Vault:**\n- Service Principal: `AZURE_CLIENT_ID` + `AZURE_TENANT_ID` + `AZURE_CLIENT_SECRET`\n- Managed Identity: Automatic when running on Azure VMs/App Service\n- Azure CLI: Uses `az login` credentials\n\n**Remote HTTP Endpoint:**\n- Bearer token: `Authorization: Bearer <token>` header\n- API key: Custom header authentication\n- mTLS: Client certificate authentication\n\n[Learn more about Plugin Development \u2192](docs/guides/plugin-development.md)\n\n---\n\n## CI/CD Integration\n\n### GitHub Actions\n\n```yaml\nname: Validate Environment\non: [push, pull_request]\n\njobs:\n  validate:\n    runs-on: ubuntu-latest\n    steps:\n      - uses: actions/checkout@v3\n      - uses: actions/setup-python@v4\n        with:\n          python-version: '3.11'\n      - run: pip install tripwire-py\n      - run: tripwire generate --check\n      - run: tripwire security scan --strict\n      - run: tripwire schema validate --strict\n```\n\n[More CI/CD examples \u2192](docs/guides/ci-cd-integration.md)\n\n---\n\n## Comparison with Alternatives\n\n| Feature | TripWire | python-decouple | environs | pydantic-settings | python-dotenv |\n|---------|---------|-----------------|----------|-------------------|---------------|\n| Import-time validation | \u2705 | \u274c | \u26a0\ufe0f | \u26a0\ufe0f | \u274c |\n| Type coercion | \u2705 | \u26a0\ufe0f Basic | \u2705 | \u2705 | \u274c |\n| Format validators | \u2705 | \u274c | \u2705 | \u2705 | \u274c |\n| .env.example generation | \u2705 | \u274c | \u274c | \u274c | \u274c |\n| Team sync (drift detection) | \u2705 | \u274c | \u274c | \u274c | \u274c |\n| Secret detection (45+ patterns) | \u2705 | \u274c | \u274c | \u274c | \u274c |\n| Git history auditing | \u2705 | \u274c | \u274c | \u274c | \u274c |\n| Plugin system (cloud secrets) | \u2705 | \u274c | \u274c | \u274c | \u274c |\n| CLI tools | \u2705 | \u274c | \u274c | \u274c | \u26a0\ufe0f |\n| Multi-environment | \u2705 | \u2705 | \u2705 | \u2705 | \u2705 |\n\n### What Makes TripWire Different?\n\nWhile all these libraries handle environment variables, **TripWire focuses on the complete developer workflow**:\n\n- **Prevent production failures** with import-time validation\n- **Keep teams in sync** with automated .env.example generation\n- **Protect secrets** with detection and git history auditing\n- **Streamline onboarding** with CLI tools for env management\n\nTripWire is designed for teams that want comprehensive config management, not just loading .env files.\n\n### When to Choose Each Library\n\n**Choose TripWire When:**\n- You need guaranteed import-time validation to prevent production starts with invalid config\n- Your team struggles with .env file drift and keeping documentation current\n- Security is paramount and you need secret detection/git history auditing\n- You want automated .env.example generation from your code\n- You prefer comprehensive CLI tools for environment management\n\n**Choose python-dotenv When:**\n- You need a minimal, zero-config .env loader\n- You're building a simple script or small project\n- Minimal dependencies are a priority\n\n**Choose environs When:**\n- You need comprehensive type validation powered by marshmallow\n- You're already using marshmallow in your project\n\n**Choose pydantic-settings When:**\n- Your project already uses Pydantic for data validation\n- You need settings to integrate seamlessly with FastAPI\n\n**Choose python-decouple When:**\n- You want strict separation of config from code with minimal overhead\n- You need zero dependencies\n\n### Acknowledgments\n\nTripWire builds on the excellent work of the Python community, particularly:\n- **python-dotenv** for reliable .env file parsing\n- The validation patterns pioneered by **environs** and **pydantic**\n- The config separation philosophy of **python-decouple**\n\n---\n\n## Development Roadmap\n\n### Implemented Features \u2705\n\n- [x] Environment variable loading\n- [x] Import-time validation\n- [x] Type coercion (str, int, bool, float, list, dict)\n- [x] **Type inference from annotations** (v0.4.0)\n- [x] Format validators (email, url, uuid, ipv4, postgresql)\n- [x] Custom validators\n- [x] .env.example generation from code\n- [x] Drift detection and team sync\n- [x] **Configuration comparison** (diff command - v0.4.0)\n- [x] Multi-environment support\n- [x] **Unified config abstraction** (.env + TOML - v0.4.0)\n- [x] Secret detection (45+ platform patterns)\n- [x] **Git audit with timeline and remediation** (audit command)\n- [x] **Configuration as Code** (TOML schemas - v0.3.0)\n- [x] **Tool configuration** (`[tool.tripwire]` - v0.4.1)\n- [x] **Schema migration** (schema from-example - v0.4.1)\n- [x] **Plugin system** (v0.10.0) - Vault, AWS, Azure, Remote HTTP\n- [x] **Modern architecture** (TripWireV2 - v0.9.0) - 22% faster\n- [x] **Advanced validators** (v0.10.1) - URL components, DateTime validation\n- [x] **VS Code extension** - Diagnostics, autocomplete, git audit integration ([Marketplace](https://marketplace.visualstudio.com/items?itemName=Daily-Nerd.tripwire))\n\n### Planned Features \ud83d\udccb\n- [ ] PyCharm plugin\n- [ ] Encrypted .env files\n- [ ] Web UI for team env management\n- [ ] Environment variable versioning\n- [ ] Compliance reports (SOC2, HIPAA)\n- [ ] Additional plugins (GCP Secret Manager, 1Password, Bitwarden)\n\n---\n\n## Documentation\n\nComplete documentation is available at [docs/README.md](docs/README.md):\n\n### Getting Started\n- [Installation](docs/getting-started/installation.md)\n- [Quick Start (5 minutes)](docs/getting-started/quick-start.md)\n- [Your First Project](docs/getting-started/your-first-project.md)\n\n### Guides\n- [CLI Reference](docs/guides/cli-reference.md)\n- [Configuration as Code](docs/guides/configuration-as-code.md)\n- [Secret Management](docs/guides/secret-management.md)\n- [Framework Integration](docs/guides/framework-integration.md)\n- [Multi-Environment](docs/guides/multi-environment.md)\n- [CI/CD Integration](docs/guides/ci-cd-integration.md)\n\n### Reference\n- [Python API](docs/reference/api.md)\n- [Validators](docs/reference/validators.md)\n- [Type Inference](docs/reference/type-inference.md)\n- [Configuration](docs/reference/configuration.md)\n\n### Advanced\n- [Custom Validators](docs/advanced/custom-validators.md)\n- [Git Audit Deep Dive](docs/advanced/git-audit.md)\n- [Type System](docs/advanced/type-system.md)\n- [Troubleshooting](docs/advanced/troubleshooting.md)\n\n---\n\n## Contributing\n\nWe welcome contributions! See our development workflow:\n\n```bash\n# Clone and setup\ngit clone https://github.com/Daily-Nerd/TripWire.git\ncd tripwire\npython -m venv venv\nsource venv/bin/activate  # Windows: venv\\Scripts\\activate\npip install -e \".[dev]\"\n\n# Run tests\npytest\n\n# Run linter\nruff check .\n\n# Format code\nblack .\n```\n\nSee [CONTRIBUTING.md](CONTRIBUTING.md) for detailed guidelines.\n\n---\n\n## License\n\nMIT License - see [LICENSE](LICENSE) file for details.\n\n---\n\n## Support\n\n- \ud83d\udcac **Discord**: [discord.gg/eDwuVY68](https://discord.gg/eDwuVY68) - Get help, share ideas, connect with the community\n- \ud83d\udce6 **PyPI**: [pypi.org/project/tripwire-py](https://pypi.org/project/tripwire-py/)\n- \ud83d\udcbb **GitHub**: [github.com/Daily-Nerd/TripWire](https://github.com/Daily-Nerd/TripWire)\n- \ud83d\udc1b **Issues**: [github.com/Daily-Nerd/TripWire/issues](https://github.com/Daily-Nerd/TripWire/issues)\n- \ud83d\udd0c **VS Code Extension**: [marketplace.visualstudio.com/items?itemName=Daily-Nerd.tripwire](https://marketplace.visualstudio.com/items?itemName=Daily-Nerd.tripwire)\n\n---\n\n**TripWire** - Environment variables that just work. \ud83c\udfaf\n\n*Stop debugging production crashes. Start shipping with confidence.*\n",
    "bugtrack_url": null,
    "license": "MIT License\n        \n        Copyright (c) 2025 DailyNerdOrg\n        \n        Permission is hereby granted, free of charge, to any person obtaining a copy\n        of this software and associated documentation files (the \"Software\"), to deal\n        in the Software without restriction, including without limitation the rights\n        to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n        copies of the Software, and to permit persons to whom the Software is\n        furnished to do so, subject to the following conditions:\n        \n        The above copyright notice and this permission notice shall be included in all\n        copies or substantial portions of the Software.\n        \n        THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n        IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n        FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n        AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n        LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n        OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n        SOFTWARE.",
    "summary": "Catch config errors before they explode - Python environment variable management with import-time validation, type safety, and secret detection",
    "version": "0.13.0",
    "project_urls": {
        "Documentation": "https://github.com/Daily-Nerd/TripWire/tree/main/docs",
        "Homepage": "https://github.com/Daily-Nerd/TripWire",
        "Issues": "https://github.com/Daily-Nerd/TripWire/issues",
        "Repository": "https://github.com/Daily-Nerd/TripWire"
    },
    "split_keywords": [
        "config",
        " configuration",
        " dotenv",
        " env",
        " environment",
        " validation"
    ],
    "urls": [
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "c858ff76b7f6d8275b2ceae40f61f8f3633fa8e19dfb4bcc9bda497943940f0f",
                "md5": "d92af9eab481ac06e9413428f81d2e02",
                "sha256": "51ecdcb6d5f452f739de2deaa78ab6ebfd022e3a60ef08ba0b31bb223dd2c469"
            },
            "downloads": -1,
            "filename": "tripwire_py-0.13.0-py3-none-any.whl",
            "has_sig": false,
            "md5_digest": "d92af9eab481ac06e9413428f81d2e02",
            "packagetype": "bdist_wheel",
            "python_version": "py3",
            "requires_python": ">=3.11",
            "size": 244775,
            "upload_time": "2025-10-17T00:17:54",
            "upload_time_iso_8601": "2025-10-17T00:17:54.396012Z",
            "url": "https://files.pythonhosted.org/packages/c8/58/ff76b7f6d8275b2ceae40f61f8f3633fa8e19dfb4bcc9bda497943940f0f/tripwire_py-0.13.0-py3-none-any.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "56c3494d23f90b0f42b85cd13c96d7262f84537b11a651edc775f7c6f7b0e912",
                "md5": "7ea36656d7864e3b7fe28b3277549d48",
                "sha256": "0ac80efb14fcdcaa7deeeec8f61e1efaac2e88b458a4b32683176c8861aed33a"
            },
            "downloads": -1,
            "filename": "tripwire_py-0.13.0.tar.gz",
            "has_sig": false,
            "md5_digest": "7ea36656d7864e3b7fe28b3277549d48",
            "packagetype": "sdist",
            "python_version": "source",
            "requires_python": ">=3.11",
            "size": 469106,
            "upload_time": "2025-10-17T00:17:55",
            "upload_time_iso_8601": "2025-10-17T00:17:55.818989Z",
            "url": "https://files.pythonhosted.org/packages/56/c3/494d23f90b0f42b85cd13c96d7262f84537b11a651edc775f7c6f7b0e912/tripwire_py-0.13.0.tar.gz",
            "yanked": false,
            "yanked_reason": null
        }
    ],
    "upload_time": "2025-10-17 00:17:55",
    "github": true,
    "gitlab": false,
    "bitbucket": false,
    "codeberg": false,
    "github_user": "Daily-Nerd",
    "github_project": "TripWire",
    "travis_ci": false,
    "coveralls": false,
    "github_actions": true,
    "lcname": "tripwire-py"
}
        
Elapsed time: 2.93008s