lib/agile_utils/helper.rb in agile_utils-0.0.2 vs lib/agile_utils/helper.rb in agile_utils-0.0.4
- old
+ new
@@ -1,26 +1,32 @@
require 'open3'
+require 'stringio'
+
module AgileUtils
module Helper
class << self
# Wrapper function to call the 'popen3' and return the result
#
# @param [Array<String>] commands list of command
# @return [String] result of the command as the string
def shell(commands = [])
- stdin, stderr, status = Open3.capture3(commands.join(" "))
- raise "Problem processing #{input_file}" unless status.success?
+ begin
+ command = commands.join(' ')
+ stdin, _stderr, _status = Open3.capture3(command)
+ rescue Exception => e
+ raise "Problem processing #{command}, #{e.message}"
+ end
stdin
end
def is_osx?
- uname && uname.strip.downcase == "darwin"
+ uname && uname.strip.downcase == 'darwin'
end
def is_linux?
- uname && uname.strip.downcase == "linux"
+ uname && uname.strip.downcase == 'linux'
end
def uname
shell(%w(uname))
end
@@ -32,14 +38,14 @@
# @return [Hash<Symbol,String>] result hash extracted from the command
# @todo re-implement the code and look for specific list of keys and quit
# as fast as we get the specific list of keys
def string_to_hash(input)
hash = {}
- input.split("\n").each do |i|
+ input.split('\n').each do |i|
#TODO: code smell?
- item = i.split(":") if is_linux?
- item = i.split("=") if is_osx?
+ item = i.split(':') if is_linux?
+ item = i.split('=') if is_osx?
next if item.empty? || item.size != 2
hash[item[0].strip] = item[1].strip
end
hash
end
@@ -60,8 +66,76 @@
yield
end_time = Time.now
end_time - beg_time
end
+ # Good for capturing output from the :stdout
+ # e.g. sample usage
+ # output = capture(:stdout) { puts "Hello" }
+ def capture(stream)
+ begin
+ stream = stream.to_s
+ eval "$#{stream} = StringIO.new"
+ yield
+ result = eval("$#{stream}").string
+ ensure
+ eval("$#{stream} = #{stream.upcase}")
+ end
+ result
+ end
+
+ # Convert the hash options to list for use with Thor
+ #
+ # @param [Hash<Objects, Object>] options the option hash
+ # @return [Array<String>] the list of options for use with Thor
+ def make_list(options)
+ list = []
+ to_switches(options).split(" ").each do |a|
+ list << a.gsub('"', "")
+ end
+ list
+ end
+
+ # Cross-platform way of finding an executable in the $PATH.
+ #
+ # @param command [String] the command to look up
+ # @return [String, NilClass] full path to the executable file or nil if the
+ # executable is not valid or available.
+ # Example:
+ # which('ruby') #=> /usr/bin/ruby
+ # which('/usr/bin/ruby') #=> nil
+ # which('bad-executable') #=> nil
+ def which(command)
+ exts = ENV['PATHEXT'] ? ENV['PATHEXT'].split(';') : ['']
+ ENV['PATH'].split(File::PATH_SEPARATOR).each do |path|
+ exts.each do |ext|
+ exe = File.join(path, "#{command}#{ext}")
+ return exe if File.executable? exe
+ end
+ end
+ return nil
+ end
+
+ private
+
+ # https://github.com/erikhuda/thor/blob/master/lib/thor/parser/options.rb
+ #
+ # Receives a hash and makes it switches.
+ def to_switches(options)
+ options.map do |key, value|
+ case value
+ when true
+ "--#{key}"
+ when Array
+ "--#{key} #{value.map { |v| v.inspect }.join(' ')}" unless value.empty?
+ when Hash
+ "--#{key} #{value.map { |k, v| "#{k}:#{v}" }.join(' ')}" unless value.empty?
+ when nil, false
+ ""
+ else
+ "--#{key} #{value.inspect}"
+ end
+ end.join(" ")
+ end
end
end
end