module Eco class CLI class Config module Help def help(*args) raise "this needs to be reimplemented in the child class and return a string" end private def keys_max_len(keys) keys.max {|a, b| a.length <=> b.length}.length end # Creatas a well aligned line def help_line(key, desc, keys_max_len = key.length, line_len = 100) blanks = keys_max_len + 3 - key.length blanks = blanks < 0 ? 0 : blanks top_line = " #{key}#{" "*blanks} " indent = top_line.length first = true each_slice_words(desc, line_len - indent).each_with_object([]) do |line, lines| lines << (first ? "#{top_line}#{line}" : "#{" " * indent}#{line}") first = false end.join("\n") end def each_slice_words(str, max_len = 100) liner = "" str.to_s.scan(/[^\s]+|\s+/).each_with_object([]) do |part, out| if "#{liner}#{part}".length <= max_len liner << part else yield(liner) if block_given? out << liner liner = part.strip end end.tap do |out| if out.empty? || !liner.empty? yield(liner) if block_given? out << liner if liner end end end end end end end