After all of that preparatory work, finishing the first basic implementation of repeating tasks is straightforward. (See version history for a fun little bug I had to find and fix, though!)
Interestingly, despite all effort to stay disciplined and do things in the right order, I am still over my skis a bit. Task repetition is mostly untested, a bunch of event- / command-handling logic is now cluttering up
main.py, Veery does not support the deletion of repeating tasks, and I haven't verified that event and command handling functions divide responsibilities properly.
It's normal to find yourself, quite suddenly, with a lot of infrastructure and cleanup work to do. What's essential is to actually do that kind of work and (especially) not to satisfy yourself with the mere appearance of stability. So, for example, I was briefly tempted to implement some complicated testing scheme, perhaps by mocking out the repositories in
main.py or adding a repository parameter to the event handlers. It would have been replaced soon, however, after I implement the infrastructure to have separate environments (including a test environment).
Programmers also often feel the temptation to simply abandon testing and planning once things get a bit messy, whether that's because it forces them to confront ugly features of their code, it's less fun than playing with the new things they've just implemented, or it feels like a lost cause. Don't do that.
So, after this we'll do a series of cleanup and maintenance installments.