Module: Gem::Util

Defined in:
lib/rubygems/util.rb

Overview

This module contains various utility methods as module methods.

Constant Summary collapse

NULL_DEVICE =
defined?(IO::NULL) ? IO::NULL : Gem.win_platform? ? 'NUL' : '/dev/null'

Class Method Summary collapse

Class Method Details

.gunzip(data) ⇒ Object

Zlib::GzipReader wrapper that unzips data.



12
13
14
15
16
17
18
19
20
# File 'lib/rubygems/util.rb', line 12

def self.gunzip(data)
  require 'zlib'
  require 'stringio'
  data = StringIO.new(data, 'r')

  unzipped = Zlib::GzipReader.new(data).read
  unzipped.force_encoding Encoding::BINARY if Object.const_defined? :Encoding
  unzipped
end

.gzip(data) ⇒ Object

Zlib::GzipWriter wrapper that zips data.



25
26
27
28
29
30
31
32
33
34
# File 'lib/rubygems/util.rb', line 25

def self.gzip(data)
  require 'zlib'
  require 'stringio'
  zipped = StringIO.new(String.new, 'w')
  zipped.set_encoding Encoding::BINARY if Object.const_defined? :Encoding

  Zlib::GzipWriter.wrap zipped do |io| io.write data end

  zipped.string
end

.inflate(data) ⇒ Object

A Zlib::Inflate#inflate wrapper



39
40
41
42
# File 'lib/rubygems/util.rb', line 39

def self.inflate(data)
  require 'zlib'
  Zlib::Inflate.inflate data
end

.popen(*command) ⇒ Object

This calls IO.popen where it accepts an array for a command (Ruby 1.9+) and implements an IO.popen-like behavior where it does not accept an array for a command.



49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
# File 'lib/rubygems/util.rb', line 49

def self.popen *command
  IO.popen command, &:read
rescue TypeError # ruby 1.8 only supports string command
  r, w = IO.pipe

  pid = fork do
    STDIN.close
    STDOUT.reopen w

    exec(*command)
  end

  w.close

  begin
    return r.read
  ensure
    Process.wait pid
  end
end

.silent_system(*command) ⇒ Object

Invokes system, but silences all output.



75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
# File 'lib/rubygems/util.rb', line 75

def self.silent_system *command
  opt = {:out => NULL_DEVICE, :err => [:child, :out]}
  if Hash === command.last
    opt.update(command.last)
    cmds = command[0...-1]
  else
    cmds = command.dup
  end
  return system(*(cmds << opt))
rescue TypeError
  require 'thread'

  @silent_mutex ||= Mutex.new

  null_device = NULL_DEVICE

  @silent_mutex.synchronize do
    begin
      stdout = STDOUT.dup
      stderr = STDERR.dup

      STDOUT.reopen null_device, 'w'
      STDERR.reopen null_device, 'w'

      return system(*command)
    ensure
      STDOUT.reopen stdout
      STDERR.reopen stderr
      stdout.close
      stderr.close
    end
  end
end

.traverse_parents(directory) ⇒ Object

Enumerates the parents of directory.



112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
# File 'lib/rubygems/util.rb', line 112

def self.traverse_parents directory
  return enum_for __method__, directory unless block_given?

  here = File.expand_path directory
  start = here

  Dir.chdir start

  begin
    loop do
      yield here

      Dir.chdir '..'

      return if Dir.pwd == here # toplevel

      here = Dir.pwd
    end
  ensure
    Dir.chdir start
  end
end