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].max top_line = " #{key}#{" "*blanks} " indent = top_line.length first = true each_slice_words(desc, line_len - indent).each_with_object([]) do |line, lines| # rubocop:disable Style/RedundantEach 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| next unless out.empty? || !liner.empty? yield(liner) if block_given? out << liner if liner end end end end end end