Class: Sorbet::Private::GemLoader

Inherits:
Object
  • Object
show all
Defined in:
lib/gem_loader.rb

Overview

typed: ignore

Constant Summary collapse

NO_GEM =
"_unknown"
GEM_LOADER =

A map defining the code to load a gem. By default any gem mentioned by Gemfile is loaded by its name, here are either overrides or things that Bundler misses.

{
  'Ascii85' => proc do
    my_require 'ascii85'
  end,
  'aws-sdk-v1' => proc do
    my_require 'aws-sdk-v1'
    AWS.eager_autoload!
    [
      AWS::DynamoDB::Errors::InternalServerError,
      AWS::DynamoDB::Errors::ProvisionedThroughputExceededException,
      AWS::DynamoDB::Errors::ResourceInUseException,
      AWS::DynamoDB::Errors::ResourceNotFoundException,
      AWS::EC2::Errors::RequestLimitExceeded,
      AWS::S3::Errors::AccessDenied,
      AWS::S3::Errors::NoSuchBucket,
      AWS::S3::Errors::NotFound,
    ]
  end,
  'aws-sdk-core' => proc do
    my_require 'aws-sdk'
    [
      Aws::AssumeRoleCredentials,
      Aws::Athena,
      Aws::AutoScaling::Client,
      Aws::AutoScaling::Errors::AlreadyExists,
      Aws::AutoScaling::Errors::Throttling,
      Aws::AutoScaling::Errors::ValidationError,
      Aws::CloudFormation::Client,
      Aws::CloudFormation::Errors::ValidationError,
      Aws::CloudWatchLogs::Client,
      Aws::Credentials,
      Aws::DynamoDB::Client,
      Aws::DynamoDB::Errors::ProvisionedThroughputExceededException,
      Aws::EC2::Errors::RequestLimitExceeded,
      Aws::ElasticLoadBalancing::Client,
      Aws::Errors::ServiceError,
      Aws::IAM::Client,
      Aws::IAM::Errors::NoSuchEntity,
      Aws::IAM::Resource,
      Aws::InstanceProfileCredentials,
      Aws::Lambda::Client,
      Aws::Query::ParamList,
      Aws::S3::Bucket,
      Aws::S3::Client,
      Aws::S3::Encryption::Client,
      Aws::S3::Errors::InvalidRange,
      Aws::S3::Errors::NoSuchKey,
      Aws::S3::Errors::NotFound,
      Aws::S3::Object,
      Aws::S3::Resource,
      Aws::SES::Client,
      Aws::SES::Errors,
      Aws::SES::Errors::AccessDenied,
      Aws::SES::Errors::MessageRejected,
      Aws::SES::Errors::ServiceError,
      Aws::SES::Types,
      Aws::SES::Types::SendEmailResponse,
      Aws::SNS::Client,
      Aws::SNS::MessageVerifier,
      Aws::SQS::QueuePoller,
      Aws::STS::Client,
      Aws::STS::Errors::AccessDenied,
      Seahorse::Client::NetworkingError,
      Seahorse::Client::Response,
    ]
  end,
  'bloomfilter-rb' => proc do
    my_require 'bloomfilter-rb'
  end,
  'hashie' => proc do
    my_require 'hashie'
    [
      Hashie::Mash,
    ]
  end,
  'hike' => proc do
    my_require 'hike'
    [
      Hike::Trail,
    ]
  end,
  'http' => proc do
    my_require 'http'
  end,
  'http-form_data' => proc do
    my_require 'http/form_data'
  end,
  'http_parser.rb' => proc do
    my_require 'http/parser'
  end,
  'minitest' => proc do
    my_require 'minitest'
    my_require 'minitest/mock'
    my_require 'minitest/spec'
    my_require 'minitest/reporters'
  end,
  'rack-test' => proc do
    my_require 'rack/test'
  end,
  'pagerduty-full' => proc do
    my_require 'pagerduty/full'
  end,
  'puma' => proc do
    my_require 'puma'
    my_require 'puma/configuration'
    my_require 'puma/launcher'
    my_require 'puma/server'
  end,
  'term-ansicolor' => proc do
    my_require 'term/ansicolor'
  end,
  'rexml' => proc do
    my_require "rexml/document"
    my_require "rexml/streamlistener"
  end,
  'rubyzip' => proc do
    my_require "zip"
    my_require 'zip/filesystem'
  end,
  'nsq-ruby' => proc do
    my_require 'nsq'
  end,
  'mongo-ruby-driver' => proc do
    my_require 'mongo'
  end,
  'presto-client-ruby' => proc do
    my_require 'presto-client'
  end,
  'bcrypt-ruby' => proc do
    my_require 'bcrypt'
  end,
  'xml-simple' => proc do
    my_require 'xmlsimple'
  end,
  'sinatra-contrib' => proc do
    # We can't my_require all of 'sinatra/contrib' since we put `raise` in them
    my_require 'sinatra/content_for'
    my_require 'sinatra/capture'
    my_require 'sinatra/multi_route'
    my_require 'sinatra/contrib/version'
  end,
  'thin-attach_socket' => proc do
    my_require 'thin'
    my_require 'thin/attach_socket'
  end,
  'sinatra-partial' => proc do
    my_require 'sinatra/partial'
  end,
  'rack_csrf' => proc do
    my_require 'rack/csrf'
  end,
  'rack-flash3' => proc do
    my_require 'rack-flash'
  end,
  'google-api-client' => proc do
    # There are lots more but this is all we use for now
    my_require 'google/apis/calendar_v3'
    my_require 'google/apis/drive_v3'
    my_require 'google/apis/gmail_v1'
  end,
  'concurrent-ruby' => proc do
    my_require 'concurrent'
  end,
  'cld2' => proc do
    my_require 'cld'
  end,
  'twitter_cldr' => proc do
    my_require 'twitter_cldr'
    [
      TwitterCldr::Shared::Territories,
    ]
  end,
  'stackprof' => proc do
    my_require 'stackprof'
    [
      StackProf::Report,
    ]
  end,
  'sprockets' => proc do
    my_require 'sprockets'
    [
      Sprockets::Cache::FileStore,
      Sprockets::Environment,
      Sprockets::Manifest,
    ]
  end,
  'signet' => proc do
    my_require 'signet'
    my_require 'signet/oauth_2/client'
  end,
  'roo' => proc do
    my_require 'roo'
    [
      Roo::Spreadsheet,
    ]
    version = Bundler.load.specs['roo'][0].stub.version
    if Gem::Requirement.create('<2.0.0').satisfied_by?(version)
      [
        Roo::Excel,
      ]
    end
  end,
  'rack-protection' => proc do
    my_require 'rack-protection'
    [
      Rack::Protection::FrameOptions,
    ]
  end,
  'rack' => proc do
    my_require 'rack'
    [
      Rack::Auth::Basic::Request,
      Rack::Builder,
      Rack::Deflater,
      Rack::File,
      Rack::Mime,
      Rack::MockRequest,
      Rack::MockResponse,
      Rack::Session::Cookie,
      Rack::Static,
    ]
  end,
  'poncho' => proc do
    [
      Poncho::ClientError,
      Poncho::JSONMethod,
      Poncho::Resource,
      Poncho::ValidationError,
    ]
  end,
  'parser' => proc do
    my_require 'parser'
    my_require 'parser/ruby24'
  end,
  'net' => proc do
    my_require 'net/dns'
    my_require 'net/ftp'
    my_require 'net/http'
    my_require 'net/http/digest_auth'
    my_require 'net/http/persistent'
    my_require 'net/imap'
    my_require 'net/protocol'
    my_require 'net/sftp'
    my_require 'net/smtp'
    my_require 'net/ssh'
    my_require 'net/ssh/proxy/http'
    my_require 'rubyntlm'
  end,
  'openssl' => proc do
    my_require 'openssl'
    [
      OpenSSL::X509::Store,
    ]
  end,
  'mail' => proc do
    my_require 'mail'
    [
      Mail::Address,
      Mail::AddressList,
      Mail::Parsers::AddressListsParser,
      Mail::Parsers::ContentDispositionParser,
      Mail::Parsers::ContentLocationParser,
      Mail::Parsers::ContentTransferEncodingParser,
      Mail::Parsers::ContentTypeParser,
      Mail::Parsers::DateTimeParser,
      Mail::Parsers::EnvelopeFromParser,
      Mail::Parsers::MessageIdsParser,
      Mail::Parsers::MimeVersionParser,
      Mail::Parsers::PhraseListsParser,
      Mail::Parsers::ReceivedParser,
    ]
  end,
  'kramdown' => proc do
    my_require 'kramdown'
    [
      Kramdown::Converter::Html,
    ]
  end,
  'ice_cube' => proc do
    my_require 'ice_cube'
    [
      IceCube::DailyRule,
      IceCube::MonthlyRule,
      IceCube::WeeklyRule,
      IceCube::YearlyRule,
      IceCube::Schedule,
    ]
  end,
  'i18n' => proc do
    my_require 'i18n'
    [
      I18n::Locale::Tag::Rfc4646,
    ]
  end,
  'http-cookie' => proc do
    my_require 'http-cookie'
    my_require 'http/cookie_jar'
    my_require 'mechanize'
    [
      HTTP::CookieJar::AbstractSaver,
    ]
  end,
  'faraday' => proc do
    my_require 'faraday'
    [
      Faraday::Request::Multipart,
      Faraday::Request::UrlEncoded,
      Faraday::Response::RaiseError,
    ]
  end,
  'escort' => proc do
    my_require 'escort'
    [
      Escort::App,
      Escort::Setup::Dsl::Options,
      Escort::Trollop::Parser,
    ]
  end,
  'digest' => proc do
    my_require 'digest'
    [
      Digest::SHA2,
    ]
  end,
  'coderay' => proc do
    my_require 'coderay'
    [
      CodeRay::PluginHost,
    ]
  end,
  'byebug' => proc do
    my_require 'byebug'
    my_require 'byebug/core'
  end,
  'racc' => proc do
    my_require 'parser'
  end,
  'rbnacl' => proc do
    my_require 'rbnacl/libsodium'
  end,
  'double-bag-ftps' => proc do
    my_require 'double_bag_ftps'
  end,
  'livechat_client' => proc do
    my_require 'livechat'
  end,
  'nio4r' => proc do
    my_require 'nio'
  end,
  'rgl' => proc do
    my_require 'rgl/adjacency'
    my_require 'rgl/implicit'
    my_require 'rgl/traversal'
    my_require 'rgl/graph_iterator'
    my_require 'rgl/edmonds_karp'
  end,
  'redcarpet' => proc do
    my_require 'redcarpet'
    my_require 'redcarpet/render_strip'
  end,
  'sequel' => proc do
    my_require 'sequel'
    my_require 'sequel/sql'
  end,
  'sequel_pg' => proc do
    # sequel_pg assumes that it was required by the adapter class in sequel
    # (i.e., it's not mean to be required manually). But also, sequel lazily
    # loads the adapter class depending on the scheme of the database being
    # connected to. Since 'srb init' never only requires and never connects,
    # we need to manually load the adapter class ourself, which will then
    # transitively load sequel_pg
    my_require 'sequel/adapters/postgres'
  end,
  'will_paginate' => proc do
    my_require 'will_paginate'
    my_require 'will_paginate/collection'
  end,
  'yard' => proc do
    my_require 'yard'
    [
      YARD::CodeObjects::MethodObject,
      YARD::Docstring,
      YARD::Handlers::Ruby::Base,
      YARD::Registry,
      YARD::Tags::Library,
      YARD::Tags::Tag,
    ]
  end,
  'mocha' => proc do
    my_require 'minitest/spec' # mocha forces you to do this first
    my_require 'mocha/setup'
  end,
  'bundler-audit' => proc do
    my_require 'bundler/audit'
  end,
  'google-protobuf' => proc do
    my_require 'google/protobuf'
  end,
  'multipart-post' => proc do
    my_require 'net/http/post/multipart'
  end,
  'rdl' => proc do
    # needed because this isn't required by default in the Gemfile
    my_require 'rdl_disable'
  end,
  'rss' => proc do
    # needed because this isn't required our Gemfile but some of our gems use it
    my_require 'rss'
  end,
  'ruby-ole' => proc do
    my_require 'ole/storage'
  end,
  'ruby-rc4' => proc do
    my_require 'rc4'
  end,
  'ruby-prof' => proc do
    my_require 'ruby-prof'
    [
      RubyProf::AbstractPrinter,
    ]
  end,
  'stylus-source' => proc do
    my_require 'stylus'
  end,
  'time-utils' => proc do
    my_require 'time/utils'
    my_require 'date/utils'
  end,
  'thor' => proc do
    my_require 'thor'
    [
      Thor::Actions,
      Thor::Group,
    ]
  end,
  'unicode-display_width' => proc do
    my_require 'unicode/display_width'
  end,
  'simplecov-html' => proc do
    my_require 'simplecov'
  end,
  'thwait' => proc do
    my_require 'thwait'
  end,
  'matrix' => proc do
    my_require 'matrix'
  end,
  'zxcvbn-ruby' => proc do
    my_require 'zxcvbn'
  end,
  'elasticsearch-transport' => proc do
    my_require 'elasticsearch'
  end,
  'tzinfo' => proc do
    my_require 'tzinfo'
    my_require 'tzinfo/data'
    TZInfo::Timezone.all.map(&:canonical_zone)
  end,
  'pry-doc' => proc do
    my_require 'pry'
    my_require 'pry-doc'
  end,
  'taxjar-ruby' => proc do
    my_require 'taxjar'
  end,
  'nokogiri' => proc do
    my_require 'nokogiri'
    my_require 'webrobots'
    my_require 'html_truncator'
  end,
  'actionpack' => proc do
    my_require 'actionpack'
    [
      ActionController::Base,
      ActionDispatch::SystemTestCase,
    ]
  end,
  'actionmailer' => proc do
    my_require 'actionmailer'
    [
      ActionMailer::Base,
      ActionMailer::MessageDelivery,
    ]
  end,
  'activejob' => proc do
    my_require 'activejob'
    [
      ActiveJob::Base,
    ]
  end,
  'activerecord' => proc do
    my_require 'activerecord'
    [
      ActiveRecord::Schema,
      ActiveRecord::Migration::Current,
    ]
  end,
  'actionview' => proc do
    my_require 'actionview'
    [
      ActionView::TestCase,
    ]
  end,
  'rdoc' => proc do
    my_require 'rdoc'
    [
      RDoc::Options,
    ]
  end,
  'paul_revere' => proc do
    my_require 'paul_revere'
    [
      Announcement,
    ]
  end,
  'clearance' => proc do
    my_require 'clearance'
    [
      ClearanceMailer,
    ]
  end,
  'webmock' => proc do
    my_require 'webmock'
    WebMock.singleton_class.send(:define_method, :enable!) do
      puts "\nWebMock.enable! is incompatible with Sorbet. Please don't unconditionally do it on requiring this file."
    end
  end,
  'codecov' => proc do
    my_require 'simplecov'
    my_require 'codecov'
  end,
}

Class Method Summary collapse

Class Method Details

.my_require(gem) ⇒ Object

This is so that the autoloader doesn’t treat these as manditory requires before loading this file



545
546
547
# File 'lib/gem_loader.rb', line 545

def self.my_require(gem)
  require gem # rubocop:disable PrisonGuard/NoDynamicRequire
end

.require_all_gemsObject



566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
# File 'lib/gem_loader.rb', line 566

def self.require_all_gems
  require 'bundler/setup'

  # Do not load gems in Gemfile where require is false
  deps = Bundler.load.dependencies.reject { |dep| dep.autorequire && dep.autorequire.empty? }
  specs = deps.flat_map do |dep|
    begin
      dep.to_specs
    rescue Gem::MissingSpecError
      []
    end
  end.to_set

  specs.sort_by(&:name).each do |gemspec|
    begin
      require_gem(gemspec.name)
    rescue LoadError
    end
  end
  Bundler.require
end

.require_gem(gem) ⇒ Object



549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
# File 'lib/gem_loader.rb', line 549

def self.require_gem(gem)
  if gem == NO_GEM
    require_all_gems
    return
  end
  loader = GEM_LOADER[gem]
  if loader
    begin
      loader.call
    rescue NameError => e
      puts "NameError: #{e}"
    end
  else
    require gem # rubocop:disable PrisonGuard/NoDynamicRequire
  end
end