Skip to content
dry-philosophy logo

Writing custom JSON parser

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.

SKILL.md

Full skill instructions

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:

  1. ☐ Does this functionality exist in a library?
  2. ☐ Does similar Rust code exist in b00t?
  3. ☐ Can I use PyO3 to expose Rust instead?
  4. ☐ Is this truly novel functionality?
  5. ☐ Have I searched PyPI/​crates.io?
  6. ☐ 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

  1. Less code to maintain - fewer bugs, faster development
  2. Better quality - libraries are tested by many users
  3. Security updates - library maintainers handle CVEs
  4. Performance - Rust is faster than Python for heavy tasks
  5. Type safety - Rust ensures correctness
  6. 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 section
  • b00t-py/​src/​lib.rs - PyO3 bindings example
  • b00t-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.

More skills from majiayu000

xiaohongshu logo
majiayu000/claude-arsenal

xiaohongshu

xiaohongshu

286 148
View
agent-task-conductor logo
majiayu000/claude-skill-registry

agent-task-conductor

Conduct multi-agent task orchestration and workflow coordination.

663 1
View
conductor-setup logo
majiayu000/claude-skill-registry

conductor-setup

Initialize project with Conductor artifacts (product definition,

663 1
View
animation-designer logo
majiayu000/claude-skill-registry

animation-designer

Expert in web animations, transitions, and motion design using Framer Motion and CSS

663 1
View
diagramming logo
majiayu000/claude-skill-registry

diagramming

Creates Mermaid and ASCII diagrams for flowcharts, architecture, ERDs, state machines, mindmaps, and more. Use when user mentions diagram, flowchart, mermaid, ASCII diagram, text diagram, terminal diagram, visualize, C4, mindmap, architecture diagram, sequence diagram, ERD, or needs visual docume...

663 1
View
h3-pg logo
majiayu000/claude-skill-registry-data

h3-pg

PostgreSQL bindings for H3 hexagonal grid system. Use when working with H3 cells in Postgres, including spatial indexing, geometry/geography integration, and raster analysis.

23 1
View
conductor-development logo
majiayu000/claude-skill-registry

conductor-development

Context-Driven Development skill for projects using Conductor. Use this skill when you detect a `conductor/` directory in the project, when working on tasks defined in a `plan.md` file, or when the user asks about tracks, specs, or plans. Automatically applies TDD workflow, tracks task completion...

663 1
View
conductor-status logo
majiayu000/claude-skill-registry

conductor-status

Display project status, active tracks, and next actions

663 1
View
dockerization logo
majiayu000/claude-skill-registry

dockerization

Official Stakpak application containerization standard operating procedure, a step-by-step guidline to properly dockerize applications. This is a rule book curated by the Stakpak Team.

663 1
View

Popular AI tools

Kaiber logo
Video

Kaiber

Generate, edit, and beat-sync AI video with leading models in one workspace.

Paid
View
Vimcal logo
Productivity

Vimcal

The world's fastest calendar for remote work

Free
View

Transform Your Design with AI Designer by ImgCreator.ai

Freemium
View
Akool AI logo
Content & writing

Akool AI

Revolutionizing Video Production with AI-Powered Creativity

Paid
View

Extend an image past the frame and let AI fill the new aspect ratio.

Freemium
View
StarByFace logo
Security

StarByFace

Discover your celebrity doppelgänger with StarByFace!

Free
View
C

ChainClarity explains 700+ crypto whitepapers in plain English, with layered summaries, comparisons, research tools, alerts, and a $4.99 Pro plan.

Freemium
View
Opus Clip logo
Coding & apps

Opus Clip

Opus.ai: Revolutionize Your Web Experience

Free
View