I had a weird situation at work today. I have a script which runs for a specific amount of time:
script.rb --time 360
I had to add an option to make it run, then sleep, then run, then sleep, and so on. But I also still had to support the total time option.
The first thing I did was come up with a working model inside the code to support “run, then sleep, then run, then sleep”. I decided on a multidimensional array:
timeArray = [[100, 200], [150,300], [10,30]]
And I iterated over each:
timeArray.each do |timeArray| timeToRun = timeArray timeToSleep = timeArray end
Now that was out of the way, I came up with comma-separated-semicolon-delimited strings as a way of specifying this on the command line:
script.rb --runandsleep 100,200;150,300;10,30
I called split on a semicolon first to give me a bunch of arrays containing each comma delimited string, then split on the comma and cast to integers using .to_i:
timesToRun = runAndSleepArgument.split(";") timesToRun.each do |runAndSleepString| sleepAndRunTimes = runAndSleepString.split(",") runTime = sleepAndRunString.to_i sleepTime = sleepAndRunString.to_i
All’s well and good, but what if the combination of run and sleep are specified with the total run time?
script.rb --time 150 --runandsleep "30,30;60,60;90,90"
I flopped back and forth for a while. I could preparse the –runandsleep time and if it was greater than the –time then refuse to run. That’d solve it. I could just run for the greater of the two times.
But what if someone enters:
script.rb --time 10000 --runandsleep "30,30"
I could run for 30, sleep for 30, then run for 9940. That had a decent solution.
The problem in my mind here is that I know what these kinds of things are like. I added a command line flag to this script (which is used a lot) called –destroy, because it called the destroyAllHumans function which reset a database. Within a week, the developers and QA were talking about how they were running with DESTROY or not with DESTROY and how it impacted things. As such, I know that the flags enter peoples’ heads. They get inside.
If the flag is non-intuitive, the person using the script is irritated. If the flag is intuitive, the person using the script thinks in terms of the flag.
So I solved the problem thus. You can specify:
script.rb --time 300
or you can specify:
script.rb --time "100,50;100,30;10,100"
Both of the syntaxes really specify a total run time, so why make them different? The script becomes better because it has fewer, more flexible, options.