dry-philosophy
Don't Repeat Yourself (DRY) and Never Reinvent the Wheel (NRtW) - core b00t principles. Use existing libraries, leverage Rust via PyO3 instead of duplicating logic in Python, and contribute to upstream projects rather than fork privately.
$ Installieren
git clone https://github.com/elasticdotventures/_b00t_ /tmp/_b00t_ && cp -r /tmp/_b00t_/skills/dry-philosophy ~/.claude/skills/_b00t_// tip: Run this command in your terminal to install the skill
name: dry-philosophy description: | Don't Repeat Yourself (DRY) and Never Reinvent the Wheel (NRtW) - core b00t principles. Use existing libraries, leverage Rust via PyO3 instead of duplicating logic in Python, and contribute to upstream projects rather than fork privately. version: 1.0.0 allowed-tools: Read, Grep, Glob, Bash, WebSearch
What This Skill Does
The DRY philosophy is a central tenet of b00t: YEI exist to contribute ONLY new and novel meaningful work. This skill helps you:
- Identify when code is being duplicated or reinvented
- Find existing libraries instead of writing new code
- Use Rust functionality via PyO3 rather than duplicate in Python
- Contribute upstream rather than maintain private forks
- Write lean, maintainable code with minimal dependencies
When It Activates
Activate this skill when you see:
- "implement [common functionality]"
- "create a [parser/validator/client]"
- "write code to [read/parse/validate] [format]"
- Any task that sounds like it might already exist in a library
- Code that duplicates existing Rust functionality
- Multiple implementations of the same logic
Core Principles
1. DRY: Don't Repeat Yourself
AVOID writing code for functionality that exists in libraries:
â Anti-pattern:
# Writing custom JSON parser
def parse_json(text):
# 200 lines of parsing logic...
â DRY approach:
import json
data = json.loads(text)
2. NRtW: Never Reinvent the Wheel
SEARCH for existing solutions before coding:
# Search for Python packages
pip search [functionality]
# or
uv pip search [functionality]
# Check PyPI
https://pypi.org/search/?q=[functionality]
# Check Rust crates
https://crates.io/search?q=[functionality]
3. Leverage Rust via PyO3
USE Rust for heavy lifting, expose to Python:
â Anti-pattern:
# Duplicating Rust datum parsing in Python
def parse_datum_file(path: str) -> dict:
with open(path) as f:
toml_data = toml.load(f)
# Validation logic...
# Parsing logic...
return processed_data
â DRY approach:
# Use Rust via PyO3
import b00t_py
datum = b00t_py.load_ai_model_datum("model-name", "~/.dotfiles/_b00t_")
Why? Rust implementation already exists, is faster, type-safe, and tested.
4. Contribute Upstream
FORK and PATCH forward, don't maintain private copies:
â Anti-pattern:
# Copy library code into project
cp -r /path/to/library my_project/vendored/
# Make private modifications
â DRY approach:
# Fork the library
gh repo fork upstream/library
# Create patch
git checkout -b fix/issue-123
# Make changes
git commit -m "fix: resolve issue #123"
# Submit PR
gh pr create --upstream
# Use your fork temporarily
# pyproject.toml
dependencies = [
"library @ git+https://github.com/you/library@fix/issue-123"
]
Decision Tree
Need to implement functionality?
â
Does it already exist in a library?
ââ YES â Use the library (DRY)
ââ NO â
Is it standard functionality?
ââ YES â Search harder, it probably exists
ââ NO â
Does similar Rust code exist in b00t?
ââ YES â Expose via PyO3 (DRY)
ââ NO â
Is this truly novel?
ââ YES â Implement (with tests!)
ââ NO â Reconsider: use library
Examples
Finding Libraries
Task: Parse TOML files
# Search
pip search toml
# Results: tomli, tomlkit, pytoml
# Use established: tomli (or tomllib in Python 3.11+)
Task: Make HTTP requests
# DON'T: Write custom HTTP client
# DO: Use httpx or requests
pip install httpx
Task: Validate Pydantic models
# DON'T: Write custom validation
# DO: Use Pydantic's built-in validation
from pydantic import BaseModel, field_validator
Using Rust via PyO3
b00t Pattern: Rust does heavy lifting, Python uses it.
Datum Operations
â Duplicate (Anti-pattern):
# b00t_j0b_py/datum_parser.py
import toml
class DatumParser:
def load_provider(self, name: str):
path = f"~/.dotfiles/_b00t_/{name}.ai.toml"
with open(os.path.expanduser(path)) as f:
data = toml.load(f)
# Validation...
# Parsing...
return data
â DRY (Use Rust):
# Use PyO3 bindings
import b00t_py
datum = b00t_py.load_ai_model_datum("model-name", "~/.dotfiles/_b00t_")
Why better?
- â No duplication - single source of truth in Rust
- â Type-safe - Rust ensures correctness
- â Tested - Rust tests cover this
- â Faster - Rust performance
- â Maintainable - one codebase, not two
Environment Validation
â Duplicate:
def validate_provider_env(provider: str) -> bool:
# Read datum
# Parse required env vars
# Check os.environ
# Return result
â DRY:
import b00t_py
validation = b00t_py.check_provider_env("openrouter", "~/.dotfiles/_b00t_")
if not validation["available"]:
print(f"Missing: {validation['missing_env_vars']}")
Contributing Upstream
Scenario: Bug in pydantic-ai library
â Anti-pattern:
# Copy code into project
cp -r site-packages/pydantic_ai b00t_j0b_py/vendored/
# Fix bug privately
# Now you maintain a fork forever
â DRY approach:
# Fork
gh repo fork pydantic/pydantic-ai
# Fix and test
git checkout -b fix/agent-validation-bug
# Make changes
pytest tests/
git commit -m "fix: agent validation for None values"
# Submit PR
gh pr create --title "fix: agent validation for None values"
# Temporarily use your fork
# pyproject.toml
dependencies = [
"pydantic-ai @ git+https://github.com/elasticdotventures/pydantic-ai@fix/agent-validation-bug"
]
# After PR merged, switch back to upstream
dependencies = [
"pydantic-ai>=0.0.15" # includes fix
]
Library Selection Criteria
When choosing a library:
â Good Signs
- â Many stars (>1000 on GitHub)
- â Active maintenance (commits in last month)
- â Minimal open issues/PRs
- â Good documentation
- â Permissive license (MIT, Apache, BSD)
- â Used by major projects
- â Type hints (Python) or strong types (Rust)
- â Comprehensive tests
- â Lively, polite community discussions
đ© Red Flags
- đ© Abandoned (no commits in 1+ years)
- đ© Many unresolved issues
- đ© No tests
- đ© Copyleft license (GPL) for permissive projects
- đ© No type hints
- đ© Breaking changes without semver
- đ© Hostile maintainers
PyO3 Pattern
When to Use Rust (via PyO3)
Use Rust for:
- â Performance-critical code
- â Type-safe validation
- â Complex parsing
- â Shared logic between Rust and Python
- â System-level operations
How to Expose Rust to Python
// b00t-py/src/lib.rs
use pyo3::prelude::*;
#[pyfunction]
fn my_function(py: Python<'_>, arg: &str) -> PyResult<String> {
// Rust implementation
Ok(format!("Processed: {}", arg))
}
#[pymodule]
fn b00t_py(_py: Python, m: &PyModule) -> PyResult<()> {
m.add_function(wrap_pyfunction!(my_function, m)?)?;
Ok(())
}
# Python usage
import b00t_py
result = b00t_py.my_function("test")
Code Review Checklist
Before writing code, ask:
- â Does this functionality exist in a library?
- â Does similar Rust code exist in b00t?
- â Can I use PyO3 to expose Rust instead?
- â Is this truly novel functionality?
- â Have I searched PyPI/crates.io?
- â Have I checked existing b00t modules?
If all answers are "no", then implement.
Anti-Patterns to Avoid
1. Reinventing Standard Library
â Bad:
def read_json_file(path):
with open(path) as f:
return custom_json_parse(f.read())
â Good:
import json
def read_json_file(path):
with open(path) as f:
return json.load(f)
2. Duplicating Rust Logic
â Bad:
# Reimplementing datum validation in Python
class DatumValidator:
def validate_env(self, provider): ...
def parse_toml(self, path): ...
â Good:
# Use Rust via PyO3
import b00t_py
validation = b00t_py.check_provider_env(provider, path)
3. Private Forks
â Bad:
# Fork library, never contribute back
# Maintain private version forever
â Good:
# Fork, fix, PR upstream
# Use fork temporarily until merged
# Switch back to upstream after merge
4. Not Using Type Hints
â Bad:
def process_data(data):
# No types, unclear what's expected
return data.transform()
â Good:
from pydantic import BaseModel
def process_data(data: dict[str, Any]) -> ProcessedData:
return ProcessedData(**data)
Benefits of DRY
- Less code to maintain - fewer bugs, faster development
- Better quality - libraries are tested by many users
- Security updates - library maintainers handle CVEs
- Performance - Rust is faster than Python for heavy tasks
- Type safety - Rust ensures correctness
- Community - contribute to ecosystem, get help
Related Skills
- datum-system: Uses Rust via PyO3 (DRY example)
- direnv-pattern: Uses existing direnv tool (DRY)
- justfile-usage: Uses casey/just tool (DRY)
References
CLAUDE.md- YEI MUST ALWAYS/NEVER sectionb00t-py/src/lib.rs- PyO3 bindings exampleb00t-j0b-py/pyproject.toml- Dependency management
Summary
DRY Philosophy:
- đ Search for existing solutions first
- đŠ Use established libraries over custom code
- đŠ Leverage Rust via PyO3 instead of duplicating in Python
- đ Fork, fix, PR upstream - don't maintain private copies
- â Write only novel, meaningful code
- đ§Ș Test everything you write
Alignment: A lean hive is a happy hive. Finding and patching bugs in libraries is divine; committing buggy code is unforgivable.
Repository
