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 day[1], 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.
[1] In my culture, kids get presents that day too.
pythonrants