paint-brush
How to build command line tools on shifting sandsby@nilshauk

How to build command line tools on shifting sands

by Nils Norman HaukåsMay 27th, 2018
Read on Terminal Reader
Read this story w/o Javascript
tldt arrow

Too Long; Didn't Read

The shifting tides of <a href="https://nilsnh.no/2018/01/13/how-good-code-dies/">code and hype</a>, <a href="https://en.wikipedia.org/wiki/Deprecation">deprecate</a> and <a href="https://en.wikipedia.org/wiki/Software_rot">bit rot</a> all the things. So, how do we build things that last? I recently built two command line tools and put careful thought into maximising their longevity. In this post I’ll share some of those thoughts.
featured image - How to build command line tools on shifting sands
Nils Norman Haukås HackerNoon profile picture

The shifting tides of code and hype, deprecate and bit rot all the things. So, how do we build things that last? I recently built two command line tools and put careful thought into maximising their longevity. In this post I’ll share some of those thoughts.

Search hard for existing solutions

“Someone must have done something about this issue,” I thought while I searched frantically. But really, I was not able to find a command line tool that would convert a mysql connection string to connection parameters that could be fed to either the mysql or mysqldump commands.

# This is what I wanted to write in the terminal, but could not. 
$ mysqldump mysql://username:[email protected]:3306/dbname

All the tools I found required you to manually decipher the connection string and break it up into separate arguments. Very easily done but it gets boring real fast.

Thus, I built mysql-parse which enables me to do this:

# Let's say we have a connection string
$ CONNSTR="mysql://username:[email protected]:3306/dbname" 

# And we feed it to mysql-parse
$ mysqldump $(mysql-parse $CONNSTR)

# This gets converted to
# mysqldump -u username -ppw -H examplesite.com -P 3306 dbname

Don’t reimplement the world

mysql-parse is a tiny tool based on Node and quite useless without the mysql and mysqldump commands. I could have tried to mimic the mysqldump and mysql commands solely in Node but that would have been so much buggy work. Why try to compete with mature battle-hardened tools? Build upon them instead. Mysql and mysqldump aren’t going anywhere soon.

Have great test coverage

Put tests on all your APIs. And by APIs I mean the functions that programmers can find and use when including your package in their code. mysql-parse exposes two functions at the moment of writing, and both of them have tests. Arguably not great tests, but they’re there and they’re triggered on each code change thanks to Travis CI.

Fight feature creep

I originally built upon commander.js for fancy command line ergonomics (it’s a really great library), but after finishing mysql-parse I decided to remove it again. I realized that there was no use for a help command or a version command. The command just needs to check the first input parameter and shout if you don’t give it an input.

Building things that last

In closing I just want add that it’s peculiar how some code just keeps on ticking over the years while other code falls over at the first whiff of change.

Originally published at nilsnh.no on May 27, 2018.