Sha256: baf62cfec91c647774db596e7eaa79f79ceea6742ac3b9cef5ab1edc956f86db

Contents?: true

Size: 1.52 KB

Versions: 1

Compression:

Stored size: 1.52 KB

Contents

module ZipDir
  class Zipper
    attr_reader :copy_path, :file

    def initialize
      @copy_path = Dir.mktmpdir
    end

    def add_path(source_path)
      FileUtils.cp_r source_path, copy_path
    end
    alias_method :<<, :add_path

    def generated?
      !!file
    end

    def generate(filename="zipper")
      yield self
      @file = Zip.new(copy_path, filename).file
    end

    def cleanup
      FileUtils.remove_entry_secure copy_path
    end

    class Zip
      attr_reader :source_path
      def initialize(source_path, filename)
        @source_path, @file = source_path, Tempfile.new([filename, ".zip"])
      end

      def file
        generate unless generated?
        @file
      end

      def generate
        ::Zip::File.open(@file.path, ::Zip::File::CREATE) do |zip_io|
          zip_path(zip_io)
        end
        @generated = true
      end

      def generated?
        !!@generated
      end

      def zip_path(zip_io, relative_path="")
        entries = Dir.clean_entries(relative_path.empty? ? source_path : File.join(source_path, relative_path))
        entries.each do |entry|
          relative_entry_path = relative_path.empty? ? entry : File.join(relative_path, entry)
          source_entry_path = File.join(source_path, relative_entry_path)

          if File.directory?(source_entry_path)
            zip_io.mkdir relative_entry_path
            zip_path zip_io, relative_entry_path
          else
            zip_io.add relative_entry_path, source_entry_path
          end
        end
      end
    end
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
zip_dir-0.1.0 lib/zip_dir/zipper.rb