Class: Buildr::Unzip

Inherits:
Object show all
Defined in:
lib/buildr/packaging/ziptask.rb

Overview

An object for unzipping a file into a target directory. You can tell it to include or exclude only specific files and directories, and also to map files from particular paths inside the zip file into the target directory. Once ready, call #extract.

Usually it is more convenient to create a file task for extracting the zip file (see #unzip) and pass this object as a prerequisite to other tasks.

See Buildr#unzip.

Defined Under Namespace

Classes: FromPath

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(args) ⇒ Unzip

Initialize with hash argument of the form target=>zip_file.



124
125
126
127
# File 'lib/buildr/packaging/ziptask.rb', line 124

def initialize(args)
  @target, arg_names, @zip_file = Buildr.application.resolve_args([args])
  @paths = {}
end

Instance Attribute Details

#targetObject

The target directory to extract to.



121
122
123
# File 'lib/buildr/packaging/ziptask.rb', line 121

def target
  @target
end

#zip_fileObject

The zip file to extract.



119
120
121
# File 'lib/buildr/packaging/ziptask.rb', line 119

def zip_file
  @zip_file
end

Instance Method Details

#exclude(*files) ⇒ Object

:call-seq:

exclude(*files) => self

Exclude all files that match the patterns and return self.

Use exclude to unzip all files except those that match the pattern. You can use #exclude in combination with #include.



191
192
193
194
195
196
197
198
# File 'lib/buildr/packaging/ziptask.rb', line 191

def exclude(*files)
  if Hash === files.last
    from_path(files.pop[:path]).exclude *files
  else
    from_path(nil).exclude *files
  end
  self
end

#extractObject

:call-seq:

extract

Extract the zip file into the target directory.

You can call this method directly. However, if you are using the #unzip method, it creates a file task for the target directory: use that task instead as a prerequisite. For example:

build unzip(dir=>zip_file)

Or:

unzip(dir=>zip_file).target.invoke


140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
# File 'lib/buildr/packaging/ziptask.rb', line 140

def extract
  # If no paths specified, then no include/exclude patterns
  # specified. Nothing will happen unless we include all files.
  if @paths.empty?
    @paths[nil] = FromPath.new(self, nil)
  end

  # Otherwise, empty unzip creates target as a file when touching.
  mkpath target.to_s, :verbose=>false
  Zip::ZipFile.open(zip_file.to_s) do |zip|
    entries = zip.collect
    @paths.each do |path, patterns|
      patterns.map(entries).each do |dest, entry|
        next if entry.directory?
        dest = File.expand_path(dest, target.to_s)
        trace "Extracting #{dest}"
        mkpath File.dirname(dest), :verbose=>false rescue nil
        entry.extract(dest) { true }
      end
    end
  end
  # Let other tasks know we updated the target directory.
  touch target.to_s, :verbose=>false
end

#from_path(name) ⇒ Object Also known as: path

:call-seq:

from_path(name) => Path

Allows you to unzip from a path. Returns an object you can use to specify which files to include/exclude relative to that path. Expands the file relative to that path.

For example:

unzip(Dir.pwd=>'test.jar').from_path('etc').include('LICENSE')

will unzip etc/LICENSE into ./LICENSE.

This is different from:

unzip(Dir.pwd=>'test.jar').include('etc/LICENSE')

which unzips etc/LICENSE into ./etc/LICENSE.



214
215
216
# File 'lib/buildr/packaging/ziptask.rb', line 214

def from_path(name)
  @paths[name] ||= FromPath.new(self, name)
end

#include(*files) ⇒ Object Also known as: add

:call-seq:

include(*files) => self
include(*files, :path=>name) => self

Include all files that match the patterns and returns self.

Use include if you only want to unzip some of the files, by specifying them instead of using exclusion. You can use #include in combination with #exclude.



174
175
176
177
178
179
180
181
# File 'lib/buildr/packaging/ziptask.rb', line 174

def include(*files)
  if Hash === files.last
    from_path(files.pop[:path]).include *files
  else
    from_path(nil).include *files
  end
  self
end

#rootObject

:call-seq:

root => Unzip

Returns the root path, essentially the Unzip object itself. In case you are wondering down paths and want to go back.



224
225
226
# File 'lib/buildr/packaging/ziptask.rb', line 224

def root
  self
end

#to_sObject

Returns the path to the target directory.



229
230
231
# File 'lib/buildr/packaging/ziptask.rb', line 229

def to_s
  target.to_s
end