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
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.
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.
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.
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
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
def my_test(options = Hash.new) format = options.fetch(:format, '%x') # Do something with format here. end
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/