Retimr

Published in category Project
on Christian Mayer's Weblog.

After I saw the simplicity of moro I curtly decided to rewrite Timr. It is time to release a useful Timr version. It has not reached v1.0.0 anyway.

The first attempt to build Timr was using TermKit and Curses. Read more in the first blog post about Timr.

So I rebuild Timr. It does not use TermKit anymore. Means, there is no interactive User Interface. You run a single command and after that it terminates. Like you execute /bin/date.

Command-line Arguments

To handle command-line arguments I most use OptionParser. You can register arguments you want to accept by your script and OptionParser handles everything for you. It even can print you a help page. I’m not using OptionParser for Timr. Timr has sub-commands. The structure is like on Git. For example:

timr [<common_options>] <command> [<command_options>] [<sub_commands...>] [<sub_options>]

OptionParser is too simple for this purpose. It does not support subcommands. I even tried to build an own arguments parser. Named SimpleOptParser. But it does not went so simple in the end. So I’m not using SimpleOptParser. Parsing arguments should be easy. However. I ended up having a parsing loop for each command. Some commands don’t have subcommands rather than dynamic arguments. For example, look at Git Log:

$ git log -h
usage: git log [<options>] [<revision-range>] [[--] <path>...]

Most Git Commands have this double-dash -- argument to separate options from files. The point is it’s optional. Git needs to understand what you want even if you don’t use --. It even recognizes the <options> at the end of the line instead on the 3rd position. Assumed when not using --.

In Timrs case not all commands have subcommands. Putting this in one big formular is difficult. You need to differ between subcommands and dynamic arguments. I did not want to spend too much time on this single feature. This is maybe an idea for a separate project. I continued building relevant Timr features.

Terminal Tables

Using the Terminal-Table Gem is an easy way to present a table on the terminal. You need to handle the column size of the terminal by yourself. Also too long lines. Otherwise everything looks shit. Terminal-Table does not handle this for you. I created an own Table version for Timr. I don’t want to invent the wheel for everything. Some things just don’t fit my needs.

Progressbar

Also I wanted to use ruby-progressbar to show the Estimated Remaining Time for Tasks. It looks promising. But it does not fit my requirements. It says Ruby/ProgressBar is an extremely flexible text progress bar library. I cannot get it just as one single String? Why does it even have a to_s function when I cannot use it as stand-alone? See issue #131. How complicated can it be to get a progressbar as a single String?

I also tried progress_bar. That is a flop too. This drives me crazy. And again, I built an own version of a Progressbar. Without bullshit.

Ruby Hashes

You maybe already saw this to assign default value to a Hash key:

def my_test(options = Hash.new)
  options[:format] ||= '%x'
  
  # Do something with options[:format] here.
end

This means options[:format] will be set to %x when it’s unset. This approach is good for an initialize method, when no further

def initialize(options = Hash.new)
  @options = options
  @options[:format] ||= '%x'
end

On normal class methods I prefer Hash#fetch:

def my_test(options = Hash.new)
  format = options.fetch(:format, '%x')
  
  # Do something with format here.
end

Man pages

Creating man pages is pretty simple using Ronn. I’m documenting as much as possible.

See man pages for Timr here: https://timr.fox21.at/man/

More Resources

Recent Posts

About the Author

Christian is a professional software developer living in Vienna, Austria. He loves coffee and is strongly addicted to music. In his spare time he writes open source software. He is known for developing automatic data processing systems for Debian Linux.