Can I haz libfoo
In my last job I had to do a complex Python script for merging several git histories
into one. I used Python because I needed to do a lot of high level stuff I was sure
bash would be a pain to use, like building trees and traversing them. My options
for managing the underlaying git repositories were two: either do an ugly hack to
execute git and parse its output; or use the ugly hack that already exists, called
GitPython. The first was not
an option, and the second meant that in some corner cases I had to rely on it just
to execute particular git invocations. It was not pleasant, but it somehow worked.
While developing ayrton I'm using
paramiko as the ssh client for implementing
semi transparent remote code execution.
The problem I have with it is that it's mostly aimed at executing commands almost
blindly, with not much interaction. It only makes sense: its main client code is
fabric, which mostly uses it in that context.
ayrton aims to have a ssh client as transparent as the original openssh client,
but bugs like this and
this are in the way.
What those two situations have in common? Well, there are two incomplete Python
libraries to emulate an existing program. At least in the case of GitPython they
have a backdoor to call git directly. My complaint is not their
incompleteness, far from it, but the fact that they have to do it from scratch.
It's because of that that they're incomplete.
Take ayrton, for instance. It's mostly an executable that serves as an interpreter for
scripts written in that language (dialect?), but it's implementation is so that the
executable itself barely handles command line options and calls a library. That
library implements everything that ayrton does for interpreting the language, to
the point where most unit tests are using ayrton library for executing ayrton
scripts. ayrton is not alone, others do similarly:
fades, and at some point all those other Python
modules like timeit or unittest.
So that's my wish for these Christmas, or Three Wise Men day1, or my birthday next month;
I would even accept it as an Easter Egg: have all these complex pieces of software
implemented mainly as a public library (even if the API changed a lot, but that right
now should be fairly stable) and very thin frontends as executables. I wish for
libgit and libssh and their Python bindings.
-
In my culture, kids get presents that day too. ↩