codeclimate/codeclimate

View on GitHub
lib/cc/resolv.rb

Summary

Maintainability
A
0 mins
Test Coverage
A
100%
require "resolv-replace"

module CC
  class Resolv
    def self.with_fixed_dns(dns = ::Resolv::DNS.new)
      ::Resolv::DefaultResolver.replace_resolvers([Fixed.new(dns)])

      yield if block_given?
    ensure
      # There's no way to ask what the current values are before we override
      # them; hopefully going by the source is good enough.
      # https://docs.ruby-lang.org/en/2.0.0/Resolv.html#method-c-new
      default_resolvers = [::Resolv::Hosts.new, ::Resolv::DNS.new]
      ::Resolv::DefaultResolver.replace_resolvers(default_resolvers)
    end

    class Fixed
      def initialize(fallback)
        @addresses = {}
        @fallback = fallback
      end

      def each_address(name)
        if addresses.key?(name)
          yield addresses.fetch(name)
        else
          fallback.each_address(name) do |address|
            addresses[name] ||= address
            yield address
          end
        end
      end

      private

      attr_reader :addresses, :fallback
    end
  end
end