Module: Gem::Util

Defined in:
lib/rubygems/util.rb

Overview

This module contains various utility methods as module methods.

Class Method Summary collapse

Class Method Details

.glob_files_in_dir(glob, base_path) ⇒ Object

Globs for files matching pattern inside of directory, returning absolute paths to the matching files.


123
124
125
126
127
128
129
# File 'lib/rubygems/util.rb', line 123

def self.glob_files_in_dir(glob, base_path)
  if RUBY_VERSION >= "2.5"
    Dir.glob(glob, base: base_path).map! {|f| File.join(base_path, f) }
  else
    Dir.glob(File.expand_path(glob, base_path))
  end
end

.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
  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

  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.


73
74
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
# File 'lib/rubygems/util.rb', line 73

def self.silent_system *command
  opt = {:out => IO::NULL, :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
  @silent_mutex ||= Mutex.new

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

      STDOUT.reopen IO::NULL, 'w'
      STDERR.reopen IO::NULL, 'w'

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

.traverse_parents(directory, &block) ⇒ Object

Enumerates the parents of directory.


106
107
108
109
110
111
112
113
114
115
116
117
# File 'lib/rubygems/util.rb', line 106

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

  here = File.expand_path directory
  loop do
    Dir.chdir here, &block rescue Errno::EACCES

    new_here = File.expand_path('..', here)
    return if new_here == here # toplevel
    here = new_here
  end
end