A Python library for managing complex software projects with Goals, Tasks, Concepts, and Commands
Project description
ToDoWrite
A Python library for managing complex software projects with Goals, Tasks, Concepts, and Commands.
Installation
pip install todowrite
For PostgreSQL support:
pip install 'todowrite[postgres]'
Quick Start
Basic Usage
from todowrite import ToDoWrite
# Initialize the application
app = ToDoWrite("sqlite:///myproject.db")
app.init_database()
# Create a goal
goal_data = {
"id": "GOAL-001",
"layer": "Goal",
"title": "Implement User Authentication",
"description": "Create secure user authentication system",
"metadata": {
"owner": "developer1",
"labels": ["security", "auth"],
"severity": "high",
"work_type": "implementation"
}
}
goal = app.create_node(goal_data)
# Create a task
task_data = {
"id": "TSK-001",
"layer": "Task",
"title": "Design Database Schema",
"description": "Design and implement database schema for users",
"metadata": {
"owner": "developer1",
"labels": ["database"],
"severity": "medium",
"work_type": "design"
}
}
task = app.create_node(task_data)
# Link task to goal
app.link_nodes("GOAL-001", "TSK-001")
# Update progress
app.update_node("TSK-001", {"status": "in_progress", "progress": 50})
Using Different Storage Backends
SQLite
app = ToDoWrite("sqlite:///project.db")
app.init_database()
PostgreSQL
app = ToDoWrite("postgresql://user:password@localhost/projectdb")
app.init_database()
YAML Storage
app = ToDoWrite("sqlite:///project.db", yaml_base_path="./configs")
app.init_database()
Node Types
Goals
goal_data = {
"id": "GOAL-001",
"layer": "Goal",
"title": "Project Goal",
"description": "High-level project objective",
"metadata": {
"owner": "project_manager",
"labels": ["strategic"],
"severity": "high",
"work_type": "planning"
}
}
Tasks
task_data = {
"id": "TSK-001",
"layer": "Task",
"title": "Implementation Task",
"description": "Detailed implementation work",
"metadata": {
"owner": "developer",
"labels": ["implementation"],
"severity": "medium",
"work_type": "development"
}
}
Concepts
concept_data = {
"id": "CON-001",
"layer": "Concept",
"title": "Design Pattern",
"description": "Architectural concept or pattern",
"metadata": {
"owner": "architect",
"labels": ["architecture"],
"severity": "low",
"work_type": "research"
}
}
Commands
command_data = {
"id": "CMD-001",
"layer": "Command",
"title": "Build Command",
"description": "Automated build process",
"command": {
"ac_ref": "AC-001",
"run": {
"shell": "make build",
"workdir": "/project",
"env": {"TARGET": "production"}
},
"artifacts": ["dist/", "build.log"]
},
"metadata": {
"owner": "ci",
"labels": ["automation"],
"severity": "critical",
"work_type": "automation"
}
}
Advanced Operations
Complex Hierarchies
# Create a multi-level hierarchy
goal = app.create_node({
"id": "GOAL-001",
"layer": "Goal",
"title": "Main Project Goal"
})
concept1 = app.create_node({
"id": "CON-001",
"layer": "Concept",
"title": "Architecture Concept"
})
concept2 = app.create_node({
"id": "CON-002",
"layer": "Concept",
"title": "Security Concept"
})
task1 = app.create_node({
"id": "TSK-001",
"layer": "Task",
"title": "Implementation Task 1"
})
task2 = app.create_node({
"id": "TSK-002",
"layer": "Task",
"title": "Implementation Task 2"
})
# Link everything together
app.link_nodes("GOAL-001", "CON-001")
app.link_nodes("GOAL-001", "CON-002")
app.link_nodes("GOAL-001", "TSK-001")
app.link_nodes("GOAL-001", "TSK-002")
Batch Operations
# Create multiple nodes
nodes_data = [
{"id": "GOAL-001", "layer": "Goal", "title": "Goal 1"},
{"id": "GOAL-002", "layer": "Goal", "title": "Goal 2"},
{"id": "TSK-001", "layer": "Task", "title": "Task 1"},
{"id": "TSK-002", "layer": "Task", "title": "Task 2"}
]
for node_data in nodes_data:
app.create_node(node_data)
# Get all goals
goals = app.get_nodes("Goal")
Querying and Filtering
# Get nodes by status
incomplete_tasks = app.get_nodes("Task", {"status": "in_progress"})
# Get nodes by owner
developer_tasks = app.get_nodes("Task", {"owner": "developer1"})
# Get nodes by label
critical_nodes = app.get_nodes_by_label("critical")
# Get node with links
node_with_links = app.get_node_with_links("GOAL-001")
YAML Integration
# Export nodes to YAML
from todowrite.storage.yaml_manager import YAMLManager
yaml_manager = YAMLManager(app)
yaml_manager.export_to_yaml("./exported")
# Import nodes from YAML
yaml_manager.import_yaml_files()
# Check sync status
sync_status = yaml_manager.check_yaml_sync()
Validation
# Validate node data
from todowrite.storage.validators import validate_node_data
try:
validate_node_data(node_data)
print("Node data is valid")
except Exception as e:
print(f"Invalid node data: {e}")
# Validate database schema
from todowrite.storage.validators import validate_database_schema
schema_valid = validate_database_schema()
Custom Metadata
# Add custom metadata fields
node_data = {
"id": "GOAL-001",
"layer": "Goal",
"title": "Custom Goal",
"metadata": {
"owner": "developer",
"labels": ["custom"],
"severity": "medium",
"work_type": "implementation",
"custom_field": "custom_value",
"another_field": 42
}
}
API Reference
Core Classes
ToDoWrite- Main application classNode- Represents a goal, task, concept, or commandLayerType- Enum for node layers (Goal, Task, Concept, Command)StatusType- Enum for node status (planned, in_progress, completed, blocked)
Core Methods
init_database()- Initialize database schemacreate_node(data)- Create a new nodeget_node(id)- Get a specific nodeget_nodes(layer, filters)- Get nodes by layer and filtersupdate_node(id, data)- Update an existing nodedelete_node(id)- Delete a nodelink_nodes(parent_id, child_id)- Create parent-child relationshipget_node_with_links(id)- Get node with all its relationships
Storage Classes
YAMLManager- YAML import/export operationsYAMLStorage- YAML storage backend- Validators for data integrity
Development
Setup Development Environment
git clone https://github.com/dderyldowney/todowrite.git
cd todowrite/lib_package
pip install -e .[dev]
Run Tests
pytest tests/
Run Linters
black .
isort .
flake8 .
mypy .
Pre-commit Hooks
pre-commit install
Contributing
- Fork the repository
- Create a feature branch
- Make your changes
- Run tests and linters
- Submit a pull request
License
MIT License - see LICENSE file for details.
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
todowrite-0.2.0.tar.gz
(44.9 kB
view details)
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
todowrite-0.2.0-py3-none-any.whl
(56.7 kB
view details)
File details
Details for the file todowrite-0.2.0.tar.gz.
File metadata
- Download URL: todowrite-0.2.0.tar.gz
- Upload date:
- Size: 44.9 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.12.8
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
79a357185456ddbeffd13c49e0799a54e3c2a7fa3321f40f54f98c42c116d74f
|
|
| MD5 |
258bae4acbd22b512394b55183b54387
|
|
| BLAKE2b-256 |
8e5a5058d9d284b93cbbb06acdf90810566f2630ba342db5c7bc86cdd6c2bd9f
|
File details
Details for the file todowrite-0.2.0-py3-none-any.whl.
File metadata
- Download URL: todowrite-0.2.0-py3-none-any.whl
- Upload date:
- Size: 56.7 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.12.8
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
ab545f15de47ac14112ccc252b1525c8266e2f3c20edd334c72d5eb9609888ca
|
|
| MD5 |
70d62fa99f4e7c8c3fae0326d9f1df5e
|
|
| BLAKE2b-256 |
e2c856981402b2bf97ae9df289444509da79526e1ca6ff4a86c3e16fbdebca7d
|