Sha256: 33f880fd1daf801b52563b01738aa3b4f2e22262c81e61585005697f7198ce11

Contents?: true

Size: 1.88 KB

Versions: 75

Compression:

Stored size: 1.88 KB

Contents

# frozen_string_literal: true

require 'set'
require 'forwardable'

# MIME::Types requires a serializable keyed container that returns an empty Set
# on a key miss. Hash#default_value cannot be used because, while it traverses
# the Marshal format correctly, it won't survive any other serialization
# format (plus, a default of a mutable object resuls in a shared mess).
# Hash#default_proc cannot be used without a wrapper because it prevents
# Marshal serialization (and doesn't survive the round-trip).
class MIME::Types::Container #:nodoc:
  extend Forwardable

  def initialize(hash = {})
    @container = {}
    merge!(hash)
  end

  def [](key)
    container[key] || EMPTY_SET
  end

  def []=(key, value)
    container[key] =
      case value
      when Set
        value
      else
        Set[*value]
      end
  end

  def merge(other)
    self.class.new(other)
  end

  def merge!(other)
    tap {
      other = other.kind_of?(MIME::Types::Container) ? other.container : other
      container.merge!(other)
      normalize
    }
  end

  def to_hash
    container
  end

  def_delegators :@container,
                 :==,
                 :count,
                 :each,
                 :each_value,
                 :empty?,
                 :flat_map,
                 :keys,
                 :select,
                 :values

  def add(key, value)
    (container[key] ||= Set.new).add(value)
  end

  def marshal_dump
    {}.merge(container)
  end

  def marshal_load(hash)
    @container = hash
  end

  def encode_with(coder)
    container.each { |k, v| coder[k] = v.to_a }
  end

  def init_with(coder)
    @container = {}
    coder.map.each { |k, v| container[k] = Set[*v] }
  end

  protected

  attr_accessor :container

  def normalize
    container.each do |k, v|
      next if v.kind_of?(Set)

      container[k] = Set[*v]
    end
  end

  EMPTY_SET = Set.new.freeze
  private_constant :EMPTY_SET
end

Version data entries

75 entries across 41 versions & 8 rubygems

Version Path
vagrant-unbundled-2.2.19.0 vendor/bundle/ruby/3.0.0/gems/mime-types-3.3.1/lib/mime/types/container.rb
tdiary-5.2.0 vendor/bundle/ruby/2.7.0/gems/mime-types-3.3.1/lib/mime/types/container.rb
vagrant-unbundled-2.2.18.0 vendor/bundle/ruby/3.0.0/gems/mime-types-3.3.1/lib/mime/types/container.rb
tdiary-5.1.7 vendor/bundle/ruby/2.7.0/gems/mime-types-3.3.1/lib/mime/types/container.rb
tdiary-5.1.7 vendor/bundle/ruby/3.0.0/gems/mime-types-3.3.1/lib/mime/types/container.rb
tdiary-5.1.6 vendor/bundle/ruby/3.0.0/gems/mime-types-3.3.1/lib/mime/types/container.rb
tdiary-5.1.6 vendor/bundle/ruby/2.7.0/gems/tdiary-5.1.5/vendor/bundle/ruby/3.0.0/gems/mime-types-3.3.1/lib/mime/types/container.rb
tdiary-5.1.6 vendor/bundle/ruby/2.7.0/gems/mime-types-3.3.1/lib/mime/types/container.rb
tdiary-5.1.6 vendor/bundle/ruby/2.7.0/gems/tdiary-5.1.5/vendor/bundle/ruby/3.0.0/gems/tdiary-5.1.4/vendor/bundle/ruby/2.7.0/gems/mime-types-3.3.1/lib/mime/types/container.rb
tdiary-5.1.6 vendor/bundle/ruby/2.7.0/gems/tdiary-5.1.5/vendor/bundle/ruby/2.7.0/gems/mime-types-3.3.1/lib/mime/types/container.rb
vagrant-unbundled-2.2.16.0 vendor/bundle/ruby/3.0.0/gems/mime-types-3.3.1/lib/mime/types/container.rb
vagrant-unbundled-2.2.16.0 vendor/bundle/ruby/2.7.0/gems/mime-types-3.3.1/lib/mime/types/container.rb
kinetic_sdk-5.0.19 gems/mime-types-3.3.1/lib/mime/types/container.rb
tdiary-5.1.5 vendor/bundle/ruby/2.7.0/gems/mime-types-3.3.1/lib/mime/types/container.rb
tdiary-5.1.5 vendor/bundle/ruby/3.0.0/gems/tdiary-5.1.4/vendor/bundle/ruby/2.7.0/gems/mime-types-3.3.1/lib/mime/types/container.rb
tdiary-5.1.5 vendor/bundle/ruby/3.0.0/gems/mime-types-3.3.1/lib/mime/types/container.rb
vagrant-unbundled-2.2.14.0 vendor/bundle/ruby/2.7.0/gems/mime-types-3.3.1/lib/mime/types/container.rb
tdiary-5.1.4 vendor/bundle/ruby/2.7.0/gems/mime-types-3.3.1/lib/mime/types/container.rb
paynow_sdk-1.1.0 vendor/bundle/ruby/2.7.0/gems/mime-types-3.3.1/lib/mime/types/container.rb
paynow_sdk-1.1.0 vendor/bundle/ruby/2.7.0/gems/paynow_sdk-1.0.9/vendor/bundle/ruby/2.7.0/gems/mime-types-3.3.1/lib/mime/types/container.rb