lib/hirb/util.rb in hirb-0.1.2 vs lib/hirb/util.rb in hirb-0.2.2
- old
+ new
@@ -1,9 +1,10 @@
module Hirb
+ # Group of handy utility functions used throughout Hirb.
module Util
extend self
- # Returns a constant like const_get() no matter what namespace it's nested in.
+ # Returns a constant like Module#const_get no matter what namespace it's nested in.
# Returns nil if the constant is not found.
def any_const_get(name)
return name if name.is_a?(Module)
begin
klass = Object
@@ -19,11 +20,61 @@
# Recursively merge hash1 with hash2.
def recursive_hash_merge(hash1, hash2)
hash1.merge(hash2) {|k,o,n| (o.is_a?(Hash)) ? recursive_hash_merge(o,n) : n}
end
- # from Rails ActiveSupport
+ # From Rails ActiveSupport, converting undescored lowercase to camel uppercase.
def camelize(string)
string.to_s.gsub(/\/(.?)/) { "::#{$1.upcase}" }.gsub(/(?:^|_)(.)/) { $1.upcase }
+ end
+
+ # Used by Hirb::Menu to select items from an array. Array counting starts at 1. Ranges of numbers are specified with a '-' or '..'.
+ # Multiple ranges can be comma delimited. Anything that isn't a valid number is ignored. All elements can be returned with a '*'.
+ # Examples:
+ # 1-3,5-6 -> [1,2,3,5,6]
+ # * -> all elements in array
+ # '' -> []
+ def choose_from_array(array, input, options={})
+ options = {:splitter=>","}.merge(options)
+ return array if input.strip == '*'
+ result = []
+ input.split(options[:splitter]).each do |e|
+ if e =~ /-|\.\./
+ min,max = e.split(/-|\.\./)
+ slice_min = min.to_i - 1
+ result.push(*array.slice(slice_min, max.to_i - min.to_i + 1))
+ elsif e =~ /\s*(\d+)\s*/
+ index = $1.to_i - 1
+ next if index < 0
+ result.push(array[index]) if array[index]
+ end
+ end
+ return result
+ end
+
+ # Determines if a shell command exists by searching for it in ENV['PATH'].
+ def command_exists?(command)
+ ENV['PATH'].split(File::PATH_SEPARATOR).any? {|d| File.exists? File.join(d, command) }
+ end
+
+ # Returns [width, height] of terminal when detected, nil if not detected.
+ # Think of this as a simpler version of Highline's Highline::SystemExtensions.terminal_size()
+ def detect_terminal_size
+ (ENV['COLUMNS'] =~ /^\d+$/) && (ENV['LINES'] =~ /^\d+$/) ? [ENV['COLUMNS'].to_i, ENV['LINES'].to_i] :
+ ( command_exists?('stty') ? `stty size`.scan(/\d+/).map { |s| s.to_i }.reverse : nil )
+ rescue
+ nil
+ end
+
+ # Captures STDOUT of anything run in its block and returns it as string.
+ def capture_stdout(&block)
+ original_stdout = $stdout
+ $stdout = fake = StringIO.new
+ begin
+ yield
+ ensure
+ $stdout = original_stdout
+ end
+ fake.string
end
end
end
\ No newline at end of file