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.



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

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

Instance Attribute Details

#targetObject

The target directory to extract to.



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

def target
  @target
end

#zip_fileObject

The zip file to extract.



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

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.



194
195
196
197
198
199
200
201
# File 'lib/buildr/packaging/ziptask.rb', line 194

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


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

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
  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) rescue nil
        entry.restore_permissions = true
        entry.extract(dest) { true }
      end
    end
  end
  # Let other tasks know we updated the target directory.
  touch target.to_s
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.



217
218
219
# File 'lib/buildr/packaging/ziptask.rb', line 217

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.



177
178
179
180
181
182
183
184
# File 'lib/buildr/packaging/ziptask.rb', line 177

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.



227
228
229
# File 'lib/buildr/packaging/ziptask.rb', line 227

def root
  self
end

#to_sObject

Returns the path to the target directory.



232
233
234
# File 'lib/buildr/packaging/ziptask.rb', line 232

def to_s
  target.to_s
end