Senior-grade Python CLI to convert text between identifier cases.
Project description
text-case
Senior-grade Python CLI for converting text between identifier cases.
text-case converts a string between the six common identifier cases — snake_case, camelCase, PascalCase, kebab-case, SCREAMING_SNAKE_CASE, Title Case — accepting input as a CLI argument or via stdin. It detects word boundaries from any input format (camelCase, PascalCase, snake_case, kebab-case, SCREAMING_SNAKE_CASE, space-separated, or any mix).
Install
pip install text-case
Local development:
git clone https://github.com/brunoraniere2003/project-factory.git
cd project-factory/projects/text-case
python3.12 -m venv .venv
source .venv/bin/activate
pip install -e ".[dev]"
Usage
$ textcase to-snake "Hello World"
hello_world
$ textcase to-camel "hello world"
helloWorld
$ textcase to-pascal "hello world"
HelloWorld
$ textcase to-kebab "Hello World"
hello-world
$ textcase to-screaming "hello world"
HELLO_WORLD
$ textcase to-title "hello_world"
Hello World
Stdin support
$ echo "helloWorld" | textcase to-snake
hello_world
Cross-format conversion
text-case detects word boundaries from any input format:
$ textcase to-snake "helloWorld"
hello_world
$ textcase to-camel "HELLO_WORLD"
helloWorld
$ textcase to-pascal "hello-world_test case"
HelloWorldTestCase
Edge cases
- Idempotent: converting input that is already in the target format is a no-op.
- Unicode preserved: Latin-1 characters (e.g.,
Olá,Á) round-trip correctly. - Empty input: rejected with a non-zero exit code.
Development
# Run tests + coverage (must be 100%)
pytest
# Lint + format-check + type-check
ruff check .
black --check .
mypy --strict src
# All-in-one
pre-commit run --all-files
Architecture
See docs/adr/0001-typer-and-pytest.md for design rationale.
Three-layer module:
text_case/
├── __init__.py # Public API (re-exports `convert`)
├── converter.py # Pure functions: case conversions
└── cli.py # Typer-based CLI (thin wrapper)
Methodology
Built by the Project Factory AI team following a 15-step methodology cycle on every change. See CLAUDE.md at the factory root.
- 🗂️ Voyager (PM) — spec
- 🧠 Apollo (TL) — design + review
- 🌿💻♻️📚 Falcon (ENG) — branch, implement, refactor, document
- 🧪 Hubble (QA) — failing tests first (RED)
- 🚀 Atlas (DevOps) — ship
License
MIT
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file racdev_textcase-0.1.0.tar.gz.
File metadata
- Download URL: racdev_textcase-0.1.0.tar.gz
- Upload date:
- Size: 8.1 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.12.13
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
920f3fbcb68c5d546687eaf108f0f08ee6dd9aa06b41ee189ba27cc391a744b6
|
|
| MD5 |
d8d0c4a5edc703a55f9327cf22adee69
|
|
| BLAKE2b-256 |
41e12f97dddb32d6be50d0ae2fa4eceb647914cb78a30b1011a049e8fa56867a
|
File details
Details for the file racdev_textcase-0.1.0-py3-none-any.whl.
File metadata
- Download URL: racdev_textcase-0.1.0-py3-none-any.whl
- Upload date:
- Size: 5.1 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.12.13
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
112e6b7af389e9ce311667f089c36c4862f013fba91e5d339080b30a394d9748
|
|
| MD5 |
9f7253c210220fe692dedf486a3311d1
|
|
| BLAKE2b-256 |
c6a786922459c42de6a96a316034c964b5ee1272a58ea952dd1b1fee3a5bf961
|