Pitz is my open-source, distributed, plain-text, command-line, very flexible issue tracker. I just started working on it and I’m looking for feedback and contributors.

This post describes a little of what I’ve gotten done so far. I haven’t written any interface yet other than from within an interactive python session. Deal with it.

Getting started

You have to make a bag to keep all the tasks and then you make tasks with any keywords you can dream up.



>>> from pitz import Bag, Task

>>> b = Bag('.pitz')

>>> b.append(Task(title='Wash the dishes', creator='Matt', importance='Not very'))

>>> b.append(Task(title='Clean the cat box', creator='Matt', importance='Not very'))



You can add tasks to the bag by using the append method on the bag, or by passing in the bag as the first argument to the task:



>>> Task(b, title='Set new high score on Sushi-go-round', creator='Matt', importance='critical')



Printing a bag really prints the title of each task in the bag:



>>> print(b)

Clean the cat box

Set new high score on Sushi-go-round

Wash the dishes



Running queries

I’m proud of this one. This is the main reason I’m working on ditz. Bag instances have a feature called matching_pairs that can filter the tasks down to a smaller new bag.

You can filter by a single pair like this:



>>> critical_tasks = b.matching_pairs([('importance', 'critical')])

>>> print(critical_tasks)

Set new high score on Sushi-go-round



Or you can filter by multiple pairs and the filtered tasks must satisfy ALL the pairs.



>>> print(b.matching_pairs([('creator', 'Matt'), ('importance', 'Not very')]))

Clean the cat box

Wash the dishes



Dumping and loading

Use the bag that holds all the tasks to quickly write all the tasks out to your hard drive like this:



>>> b.to_yaml_files()

['.pitz/task-07e1af97-0ac6-4904-9187-0c2fd61692b6.yaml', '.pitz/task-6a7af07c-d0fb-4a77-9347-8dc78ef490fe.yaml', '.pitz/task-5ce725dc-c1db-4eca-a74c-55cd0e910786.yaml']



The returned stuff is a list of files that pitz just wrote.

Loading from the hard drive is pretty simple too. Just tell the bag where to load from.



>>> b2 = Bag('.pitz')

>>> print(b2)

Clean the cat box

Set new high score on Sushi-go-round

Wash the dishes



Task details

Printing a task by itself gives all the details on the task.



>>> t = Task.from_yaml_file ('.pitz/task-4d9c1db2-fef3-4b50-8095-b2339384e118.yaml')

>>> print(t)

Do the 2008 taxes

-----------------

type: Task

name: task-4d9c1db2-fef3-4b50-8095-b2339384e118

title: Do the 2008 taxes

created date: 2009-03-01 22:29:58.242512

modified date: 2009-03-01 22:29:58.242512

creator: Matt

last modified by: Matt

description:

Do the 2008 taxes



Other stuff

You can use bags as iterators to go through the tasks one-by-one:



for task in b:

print(t['title'])



Also notice that tasks are really just subclassed dictionaries (UserDict, actually) with some extra methods bolted on.