X-Git-Url: https://review.fuel-infra.org/gitweb?a=blobdiff_plain;f=lib%2Fmcollective%2Fmonkey_patches.rb;fp=lib%2Fmcollective%2Fmonkey_patches.rb;h=fbf72e343c46e69cb3cc655f6a3dca26fc3ac7ba;hb=b87d2f4e68281062df1913440ca5753ae63314a9;hp=0000000000000000000000000000000000000000;hpb=ab0ea530b8ac956091f17b104ab2311336cfc250;p=packages%2Fprecise%2Fmcollective.git diff --git a/lib/mcollective/monkey_patches.rb b/lib/mcollective/monkey_patches.rb new file mode 100644 index 0000000..fbf72e3 --- /dev/null +++ b/lib/mcollective/monkey_patches.rb @@ -0,0 +1,121 @@ +# start_with? was introduced in 1.8.7, we need to support +# 1.8.5 and 1.8.6 +class String + def start_with?(str) + return self[0 .. (str.length-1)] == str + end unless method_defined?("start_with?") +end + +# Make arrays of Symbols sortable +class Symbol + include Comparable + + def <=>(other) + self.to_s <=> other.to_s + end unless method_defined?("<=>") +end + +# This provides an alias for RbConfig to Config for versions of Ruby older then +# # version 1.8.5. This allows us to use RbConfig in place of the older Config in +# # our code and still be compatible with at least Ruby 1.8.1. +# require 'rbconfig' +unless defined? ::RbConfig + ::RbConfig = ::Config +end + +# a method # that walks an array in groups, pass a block to +# call the block on each sub array +class Array + def in_groups_of(chunk_size, padded_with=nil, &block) + arr = self.clone + + # how many to add + padding = chunk_size - (arr.size % chunk_size) + + # pad at the end + arr.concat([padded_with] * padding) unless padding == chunk_size + + # how many chunks we'll make + count = arr.size / chunk_size + + # make that many arrays + result = [] + count.times {|s| result << arr[s * chunk_size, chunk_size]} + + if block_given? + result.each_with_index do |a, i| + case block.arity + when 1 + yield(a) + when 2 + yield(a, (i == result.size - 1)) + else + raise "Expected 1 or 2 arguments, got #{block.arity}" + end + end + else + result + end + end unless method_defined?(:in_groups_of) +end + +class String + def bytes(&block) + # This should not be necessary, really ... + require 'enumerator' + return to_enum(:each_byte) unless block_given? + each_byte(&block) + end unless method_defined?(:bytes) +end + +class Dir + def self.mktmpdir(prefix_suffix=nil, tmpdir=nil) + case prefix_suffix + when nil + prefix = "d" + suffix = "" + when String + prefix = prefix_suffix + suffix = "" + when Array + prefix = prefix_suffix[0] + suffix = prefix_suffix[1] + else + raise ArgumentError, "unexpected prefix_suffix: #{prefix_suffix.inspect}" + end + tmpdir ||= Dir.tmpdir + t = Time.now.strftime("%Y%m%d") + n = nil + begin + path = "#{tmpdir}/#{prefix}#{t}-#{$$}-#{rand(0x100000000).to_s(36)}" + path << "-#{n}" if n + path << suffix + Dir.mkdir(path, 0700) + rescue Errno::EEXIST + n ||= 0 + n += 1 + retry + end + + if block_given? + begin + yield path + ensure + FileUtils.remove_entry_secure path + end + else + path + end + end unless method_defined?(:mktmpdir) + + def self.tmpdir + tmp = '.' + for dir in [ENV['TMPDIR'], ENV['TMP'], ENV['TEMP'], '/tmp'] + if dir and stat = File.stat(dir) and stat.directory? and stat.writable? + tmp = dir + break + end rescue nil + end + File.expand_path(tmp) + end unless method_defined?(:tmpdir) +end