Translate between ASCII 'tree' text, JSON/YAML tree specs, and real directory structures.
Project description
🪵 fs-tree-spec (tree_adapter)
Translate between ASCII “tree” text, JSON/YAML tree specs, and real directory structures.
This tiny Python utility helps you describe, version, and reproduce directory layouts in a portable, human-readable way.
✨ Features
- Parse ASCII “tree” text (like
treecommand output) → nested Python structure - Serialize / deserialize JSON and YAML tree specs
- Render a Unicode tree from structured data
- Validate naming rules (strict enforcement, no invalid characters)
- Compute a dry-run plan (
--plan) of what would be created - Apply (
--apply) to actually build the filesystem - Optional YAML support via
pip install fs-tree-spec[yaml]
🧩 Installation
pip install fs-tree-spec
# or with YAML support:
pip install fs-tree-spec[yaml]
After installation, the CLI command fs-tree-spec becomes available.
🧭 Usage (CLI)
Basic
# Plan creation from an ASCII spec
fs-tree-spec --from-ascii second_brain_tree.txt --root ./second-brain --plan
# Apply (actually create directories/files)
fs-tree-spec --from-ascii second_brain_tree.txt --root ./second-brain --apply
# Print as normalized ASCII and JSON
fs-tree-spec --from-ascii second_brain_tree.txt --print-tree --print-json
From JSON or YAML
fs-tree-spec --from-json my_tree.json --plan
fs-tree-spec --from-yaml my_tree.yaml --apply
📜 Example Input
ASCII tree text
second-brain/
├─ .env # API keys + config (not committed)
├─ pyproject.toml
├─ README.md
├─ data/
│ ├─ raw/
│ │ └─ apple_notes_export/
│ ├─ attachments/
│ │ └─ ...
│ ├─ processed/
│ │ ├─ notes.jsonl
│ │ ├─ attachments.jsonl
│ │ └─ urls.jsonl
└─ notebooks/
└─ exploration.ipynb
Equivalent JSON
{
"second-brain": {
".env": null,
"pyproject.toml": null,
"README.md": null,
"data": {
"raw": { "apple_notes_export": {} },
"attachments": {},
"processed": {
"notes.jsonl": null,
"attachments.jsonl": null,
"urls.jsonl": null
}
},
"notebooks": {
"exploration.ipynb": null
}
}
}
Equivalent YAML
second-brain:
.env: null
pyproject.toml: null
README.md: null
data:
raw:
apple_notes_export: {}
attachments: {}
processed:
notes.jsonl: null
attachments.jsonl: null
urls.jsonl: null
notebooks:
exploration.ipynb: null
🧠 Naming Rules (Enforced)
- Names are single path segments (no
/or\). - Names must be non-empty after trimming.
- Names cannot be
.,..,..., or…. - Names cannot contain tree/box characters: `├└│─|+```
- Inline comments begin with
" #"and are ignored. "..."and"…"lines are treated as placeholders only.- Conflicts between file vs. directory at same level raise an error.
🧪 Python API Example
from tree_adapter import parse_ascii_tree, plan_fs_from_tree, create_fs_from_tree
ascii_spec = Path("second_brain_tree.txt").read_text()
tree = parse_ascii_tree(ascii_spec)
# Inspect
print(plan_fs_from_tree(tree, "./second-brain"))
# Create directories and files
create_fs_from_tree(tree, "./second-brain", create_files=True)
🛠️ Development
# Install in editable mode
pip install -e ".[yaml]"
Run locally:
python -m tree_adapter --from-ascii second_brain_tree.txt --plan
📦 Packaging
This project uses PEP 621 metadata and can be built with:
python -m build
⚖️ License
MIT License © 2025 Stephen Wood
💡 Inspiration
treecommand output formatting- JSON/YAML for reproducible data models
- Cross-tool “infrastructure as text” patterns
🪴 Example workflow
- Write a tree spec in a
README.mdfor documentation. - Extract the snippet and feed it to
fs-tree-spec --from-ascii. - Plan or apply to generate the directory structure for new projects.
- Optionally export the same spec to JSON or YAML for automation.
“Describe once. Recreate anywhere.”
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 fs_tree_spec-0.1.2.tar.gz.
File metadata
- Download URL: fs_tree_spec-0.1.2.tar.gz
- Upload date:
- Size: 9.3 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.14.0
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
d8970ab4ddeb846e1c86a40b9d132c15fbc2a63f085fd633f1d0c16724028d75
|
|
| MD5 |
56284901f8c62352a848106042b35955
|
|
| BLAKE2b-256 |
6a00c939d491bc8feba73806db4992ad54060eee9c69cd86241a31f9f76cb629
|
File details
Details for the file fs_tree_spec-0.1.2-py3-none-any.whl.
File metadata
- Download URL: fs_tree_spec-0.1.2-py3-none-any.whl
- Upload date:
- Size: 9.9 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.14.0
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
6c1845a17437f84fd2bd2778bd7443f0b3dab132557d7d830cb6e8060a9c6587
|
|
| MD5 |
da46e7846ffca107d378b6f5d9603d13
|
|
| BLAKE2b-256 |
a55b66a3d7286e73412042d36a0535813ae745b80b71f91f933a76f61af63923
|