Sha256: a01b32729da2583efbf0754524926f52b3694ede264a34c937f0a99630108096

Contents?: true

Size: 1.29 KB

Versions: 6

Compression:

Stored size: 1.29 KB

Contents

# frozen_string_literal: true

module Rubocop
  module Cop
    module Performance
      # Flags inefficient uses of rubyzip's Zip::File, since when instantiated
      # it reads the file's Central Directory into memory entirely. For zips with many
      # files and directories, this can be very expensive even when the archive's size
      # in bytes is small.
      #
      # See also:
      # - https://github.com/rubyzip/rubyzip/issues/506
      # - https://github.com/rubyzip/rubyzip#notes-on-zipinputstream
      class Rubyzip < RuboCop::Cop::Base
        MSG = 'Be careful when opening or iterating zip files via Zip::File. ' \
              'Zip archives may contain many entries, and their file index is ' \
              'read into memory upon construction, which can lead to ' \
              'high memory use and poor performance. ' \
              'Consider iterating archive entries via Zip::InputStream instead.'

        # @!method reads_central_directory?(node)
        def_node_matcher :reads_central_directory?, <<-PATTERN
          (send
            (const
              (const {nil? (cbase)} :Zip) :File) {:new :open :foreach} ...)
        PATTERN

        def on_send(node)
          return unless reads_central_directory?(node)

          add_offense(node)
        end
      end
    end
  end
end

Version data entries

6 entries across 6 versions & 1 rubygems

Version Path
gitlab-styles-11.0.0 lib/rubocop/cop/performance/rubyzip.rb
gitlab-styles-10.1.0 lib/rubocop/cop/performance/rubyzip.rb
gitlab-styles-10.0.0 lib/rubocop/cop/performance/rubyzip.rb
gitlab-styles-9.2.0 lib/rubocop/cop/performance/rubyzip.rb
gitlab-styles-9.1.0 lib/rubocop/cop/performance/rubyzip.rb
gitlab-styles-9.0.0 lib/rubocop/cop/performance/rubyzip.rb