diff options
author | mwrock <matt@mattwrock.com> | 2020-09-04 18:46:27 -0700 |
---|---|---|
committer | mwrock <matt@mattwrock.com> | 2020-09-08 14:46:36 -0700 |
commit | 41ae92bd5070b450e04f02ae9a1d30987d14bb93 (patch) | |
tree | 952399197c5344e29a648560fda242ef77a7dd7e | |
parent | 313afa345a0d19019218807a16bf6fdd6447a87b (diff) | |
download | chef-41ae92bd5070b450e04f02ae9a1d30987d14bb93.tar.gz |
use autoloading for many required gems
Signed-off-by: mwrock <matt@mattwrock.com>
68 files changed, 220 insertions, 157 deletions
diff --git a/azure-pipelines.yml b/azure-pipelines.yml index f808fa6ff9..78cfdef9f0 100644 --- a/azure-pipelines.yml +++ b/azure-pipelines.yml @@ -82,6 +82,8 @@ jobs: bundle config set without 'omnibus_package docgen ruby_prof' bundle install --jobs=3 --retry=3 --path=vendor/bundle gem install berkshelf --no-doc + $env:RUBYOPT="-W0" berks vendor cookbooks + $env:RUBYOPT="-W1" chef-client -z -o end_to_end --chef-license accept-no-persist displayName: 'Run end_to_end::default recipe' diff --git a/chef-config/lib/chef-config/config.rb b/chef-config/lib/chef-config/config.rb index a767d072ef..2c4323db82 100644 --- a/chef-config/lib/chef-config/config.rb +++ b/chef-config/lib/chef-config/config.rb @@ -20,8 +20,8 @@ # limitations under the License. require "mixlib/config" unless defined?(Mixlib::Config) -require "pathname" unless defined?(Pathname) -require "chef-utils" unless defined?(ChefUtils::CANARY) +autoload :Pathname, "pathname" +autoload :ChefUtils, "chef-utils" require_relative "fips" require_relative "logger" @@ -29,11 +29,13 @@ require_relative "windows" require_relative "path_helper" require_relative "mixin/fuzzy_hostname_matcher" -require "mixlib/shellout" unless defined?(Mixlib::ShellOut::DEFAULT_READ_TIMEOUT) -require "uri" unless defined?(URI) -require "addressable/uri" unless defined?(Addressable::URI) -require "openssl" unless defined?(OpenSSL) -require "yaml" +module Mixlib + autoload :ShellOut, "mixlib/shellout" +end +autoload :URI, "uri" +autoload :Addressable, "addressable/uri" +autoload :OpenSSL, "openssl" +autoload :YAML, "yaml" require_relative "dist" module ChefConfig @@ -1102,13 +1104,6 @@ module ChefConfig export_no_proxy(no_proxy) if key?(:no_proxy) && no_proxy end - # Character classes for Addressable - # See https://www.ietf.org/rfc/rfc3986.txt 3.2.1 - # The user part may not have a : in it - USER = Addressable::URI::CharacterClasses::UNRESERVED + Addressable::URI::CharacterClasses::SUB_DELIMS - # The password part may have any valid USERINFO characters - PASSWORD = USER + "\\:" - # Builds a proxy uri and exports it to the appropriate environment variables. Examples: # http://username:password@hostname:port # https://username@hostname:port @@ -1120,15 +1115,22 @@ module ChefConfig # pass = password # @api private def self.export_proxy(scheme, path, user, pass) + # Character classes for Addressable + # See https://www.ietf.org/rfc/rfc3986.txt 3.2.1 + # The user part may not have a : in it + user_class = Addressable::URI::CharacterClasses::UNRESERVED + Addressable::URI::CharacterClasses::SUB_DELIMS + # The password part may have any valid USERINFO characters + password_class = user_class + "\\:" + path = "#{scheme}://#{path}" unless path.include?("://") # URI.split returns the following parts: # [scheme, userinfo, host, port, registry, path, opaque, query, fragment] uri = Addressable::URI.encode(path, Addressable::URI) if user && !user.empty? - userinfo = Addressable::URI.encode_component(user, USER) + userinfo = Addressable::URI.encode_component(user, user_class) if pass - userinfo << ":#{Addressable::URI.encode_component(pass, PASSWORD)}" + userinfo << ":#{Addressable::URI.encode_component(pass, password_class)}" end uri.userinfo = userinfo end diff --git a/chef-config/lib/chef-config/mixin/credentials.rb b/chef-config/lib/chef-config/mixin/credentials.rb index 12fceef75d..de004a062f 100644 --- a/chef-config/lib/chef-config/mixin/credentials.rb +++ b/chef-config/lib/chef-config/mixin/credentials.rb @@ -15,7 +15,7 @@ # limitations under the License. # -require "tomlrb" +autoload :Tomlrb, "tomlrb" require_relative "../path_helper" module ChefConfig diff --git a/lib/chef/application.rb b/lib/chef/application.rb index 42bcf9445e..be69e01f7f 100644 --- a/lib/chef/application.rb +++ b/lib/chef/application.rb @@ -28,7 +28,9 @@ require "tmpdir" unless defined?(Dir.mktmpdir) require "rbconfig" unless defined?(RbConfig) require_relative "application/exit_code" require_relative "dist" -require "license_acceptance/acceptor" +module LicenseAcceptance + autoload :Acceptor, "license_acceptance/acceptor" +end class Chef class Application diff --git a/lib/chef/application/base.rb b/lib/chef/application/base.rb index 1749284ea2..738788fa96 100644 --- a/lib/chef/application/base.rb +++ b/lib/chef/application/base.rb @@ -24,7 +24,9 @@ require_relative "../dist" require_relative "../daemon" require "chef-config/mixin/dot_d" require "license_acceptance/cli_flags/mixlib_cli" -require "mixlib/archive" unless defined?(Mixlib::Archive) +module Mixlib + autoload :Archive, "mixlib/archive" +end # This is a temporary class being used as a part of an effort to reduce duplication # between Chef::Application::Client and Chef::Application::Solo. @@ -360,6 +362,7 @@ class Chef::Application::Base < Chef::Application end def fetch_recipe_tarball(url, path) + require "open-uri" unless defined?(OpenURI) Chef::Log.trace("Download recipes tarball from #{url} to #{path}") if File.exist?(url) FileUtils.cp(url, path) diff --git a/lib/chef/application/client.rb b/lib/chef/application/client.rb index af942c0254..03ceff1727 100644 --- a/lib/chef/application/client.rb +++ b/lib/chef/application/client.rb @@ -20,7 +20,12 @@ require_relative "base" require_relative "../handler/error_report" require_relative "../workstation_config_loader" -require "uri" unless defined?(URI) +autoload :URI, "uri" +module Mixlib + module Authentication + autoload :Log, "mixlib/authentication" + end +end # DO NOT MAKE EDITS, see Chef::Application::Base # diff --git a/lib/chef/application/knife.rb b/lib/chef/application/knife.rb index c719768f11..3d6563f43a 100644 --- a/lib/chef/application/knife.rb +++ b/lib/chef/application/knife.rb @@ -19,7 +19,9 @@ require_relative "../knife" require_relative "../application" require "mixlib/log" require "ohai/config" -require "chef/monkey_patches/net_http.rb" +module Net + autoload :HTTP, File.expand_path("../monkey_patches/net_http", __dir__) +end require_relative "../dist" class Chef::Application::Knife < Chef::Application diff --git a/lib/chef/client.rb b/lib/chef/client.rb index 91d1758f70..1a6da64c8f 100644 --- a/lib/chef/client.rb +++ b/lib/chef/client.rb @@ -29,7 +29,7 @@ require_relative "api_client/registration" require_relative "node" require_relative "role" require_relative "file_cache" -require_relative "run_context" +Chef.autoload :RunContext, File.expand_path("run_context", __dir__) require_relative "runner" require_relative "run_status" require_relative "cookbook/cookbook_collection" @@ -48,7 +48,7 @@ require_relative "action_collection" require_relative "resource_reporter" require_relative "data_collector" require_relative "run_lock" -require_relative "policy_builder" +Chef.autoload :PolicyBuilder, File.expand_path("policy_builder", __dir__) require_relative "request_id" require_relative "platform/rebooter" require_relative "mixin/deprecation" diff --git a/lib/chef/cookbook_site_streaming_uploader.rb b/lib/chef/cookbook_site_streaming_uploader.rb index 1598808234..7de89f9ad8 100644 --- a/lib/chef/cookbook_site_streaming_uploader.rb +++ b/lib/chef/cookbook_site_streaming_uploader.rb @@ -18,10 +18,16 @@ # limitations under the License. # -require "uri" unless defined?(URI) -require "net/http" unless defined?(Net::HTTP) -require "mixlib/authentication/signedheaderauth" -require "openssl" unless defined?(OpenSSL) +autoload :URI, "uri" +module Net + autoload :HTTP, File.expand_path("monkey_patches/net_http", __dir__) +end +autoload :OpenSSL, "openssl" +module Mixlib + module Authentication + autoload :SignedHeaderAuth, "mixlib/authentication/signedheaderauth" + end +end require_relative "dist" class Chef diff --git a/lib/chef/cookbook_uploader.rb b/lib/chef/cookbook_uploader.rb index 816cbf95fe..235a539b94 100644 --- a/lib/chef/cookbook_uploader.rb +++ b/lib/chef/cookbook_uploader.rb @@ -1,5 +1,5 @@ -require "set" unless defined?(Set) +autoload :Set, "set" require_relative "exceptions" require_relative "knife/cookbook_metadata" require_relative "digester" diff --git a/lib/chef/data_collector.rb b/lib/chef/data_collector.rb index 5424461f76..e1d7d9b97b 100644 --- a/lib/chef/data_collector.rb +++ b/lib/chef/data_collector.rb @@ -21,7 +21,7 @@ require_relative "server_api" require_relative "http/simple_json" require_relative "event_dispatch/base" -require "set" unless defined?(Set) +autoload :Set, "set" require_relative "data_collector/run_end_message" require_relative "data_collector/run_start_message" require_relative "data_collector/config_validation" diff --git a/lib/chef/digester.rb b/lib/chef/digester.rb index b9180ddd24..36df63f3a1 100644 --- a/lib/chef/digester.rb +++ b/lib/chef/digester.rb @@ -18,8 +18,8 @@ # limitations under the License. # -require "openssl" unless defined?(OpenSSL) -require "digest" unless defined?(Digest) +autoload :OpenSSL, "openssl" +autoload :Digest, "digest" require "singleton" unless defined?(Singleton) class Chef diff --git a/lib/chef/dsl/chef_vault.rb b/lib/chef/dsl/chef_vault.rb index bfb256ef3f..031627c358 100644 --- a/lib/chef/dsl/chef_vault.rb +++ b/lib/chef/dsl/chef_vault.rb @@ -17,7 +17,7 @@ # limitations under the License. # -require "chef-vault" +autoload :ChefVault, "chef-vault" require_relative "data_query" class Chef diff --git a/lib/chef/dsl/data_query.rb b/lib/chef/dsl/data_query.rb index 8bfeff96b1..3b15affb5b 100644 --- a/lib/chef/dsl/data_query.rb +++ b/lib/chef/dsl/data_query.rb @@ -17,8 +17,8 @@ # require_relative "../search/query" -require_relative "../data_bag" -require_relative "../data_bag_item" +Chef.autoload :DataBag, File.expand_path("../data_bag", __dir__) +Chef.autoload :DataBagItem, File.expand_path("../data_bag_item", __dir__) require_relative "../encrypted_data_bag_item" require_relative "../encrypted_data_bag_item/check_encrypted" diff --git a/lib/chef/dsl/platform_introspection.rb b/lib/chef/dsl/platform_introspection.rb index aa6c8946d9..49ec396cf2 100644 --- a/lib/chef/dsl/platform_introspection.rb +++ b/lib/chef/dsl/platform_introspection.rb @@ -16,7 +16,7 @@ # limitations under the License. # -require "chef-utils" unless defined?(ChefUtils::CANARY) +autoload :ChefUtils, "chef-utils" require_relative "../mixin/chef_utils_wiring" unless defined?(Chef::Mixin::ChefUtilsWiring) class Chef diff --git a/lib/chef/encrypted_data_bag_item.rb b/lib/chef/encrypted_data_bag_item.rb index 4a28d7ed35..c36c6923c5 100644 --- a/lib/chef/encrypted_data_bag_item.rb +++ b/lib/chef/encrypted_data_bag_item.rb @@ -17,11 +17,10 @@ # require_relative "config" -require_relative "data_bag_item" +Chef.autoload :DataBagItem, File.expand_path("data_bag_item", __dir__) require_relative "encrypted_data_bag_item/decryptor" require_relative "encrypted_data_bag_item/encryptor" require_relative "dist" -require "open-uri" unless defined?(OpenURI) # An EncryptedDataBagItem represents a read-only data bag item where # all values, except for the value associated with the id key, have @@ -129,6 +128,7 @@ class Chef::EncryptedDataBagItem end def self.load_secret(path = nil) + require "open-uri" unless defined?(OpenURI) path ||= Chef::Config[:encrypted_data_bag_secret] unless path raise ArgumentError, "No secret specified and no secret found at #{Chef::Config.platform_specific_path(Chef::Dist::CONF_DIR + "/encrypted_data_bag_secret")}" diff --git a/lib/chef/encrypted_data_bag_item/decryptor.rb b/lib/chef/encrypted_data_bag_item/decryptor.rb index 9bc4f32ed3..57119796a9 100644 --- a/lib/chef/encrypted_data_bag_item/decryptor.rb +++ b/lib/chef/encrypted_data_bag_item/decryptor.rb @@ -16,10 +16,10 @@ # limitations under the License. # -require "yaml" unless defined?(YAML) +autoload :YAML, "yaml" require_relative "../json_compat" -require "openssl" unless defined?(OpenSSL) -require "base64" unless defined?(Base64) +autoload :OpenSSL, "openssl" +autoload :Base64, "base64" require "digest/sha2" unless defined?(Digest::SHA2) require_relative "../encrypted_data_bag_item" require_relative "unsupported_encrypted_data_bag_item_format" diff --git a/lib/chef/encrypted_data_bag_item/encryptor.rb b/lib/chef/encrypted_data_bag_item/encryptor.rb index 14094928ca..f068d134d8 100644 --- a/lib/chef/encrypted_data_bag_item/encryptor.rb +++ b/lib/chef/encrypted_data_bag_item/encryptor.rb @@ -16,10 +16,10 @@ # limitations under the License. # -require "base64" unless defined?(Base64) +autoload :Base64, "base64" require "digest/sha2" unless defined?(Digest::SHA2) -require "openssl" unless defined?(OpenSSL) -require "ffi_yajl" unless defined?(FFI_Yajl) +autoload :OpenSSL, "openssl" +autoload :FFI_Yajl, "ffi_yajl" require_relative "../encrypted_data_bag_item" require_relative "unsupported_encrypted_data_bag_item_format" require_relative "encryption_failure" diff --git a/lib/chef/formatters/error_inspectors/api_error_formatting.rb b/lib/chef/formatters/error_inspectors/api_error_formatting.rb index 6a1c75e0d3..47e8523323 100644 --- a/lib/chef/formatters/error_inspectors/api_error_formatting.rb +++ b/lib/chef/formatters/error_inspectors/api_error_formatting.rb @@ -18,6 +18,7 @@ require_relative "../../http/authenticator" require_relative "../../dist" +require "timeout" unless defined?(Timeout) class Chef module Formatters diff --git a/lib/chef/http.rb b/lib/chef/http.rb index 650ee73bb7..619cdbecec 100644 --- a/lib/chef/http.rb +++ b/lib/chef/http.rb @@ -22,11 +22,13 @@ # require "tempfile" unless defined?(Tempfile) -require "openssl" unless defined?(OpenSSL) -require "net/http" unless defined?(Net::HTTP) -require "uri" unless defined?(URI) +autoload :OpenSSL, "openssl" +autoload :URI, "uri" +module Net + autoload :HTTP, File.expand_path("monkey_patches/net_http", __dir__) + autoload :HTTPClientException, File.expand_path("monkey_patches/net_http", __dir__) +end require_relative "http/basic_client" -require_relative "monkey_patches/net_http" require_relative "config" require_relative "platform/query_helpers" require_relative "exceptions" diff --git a/lib/chef/http/auth_credentials.rb b/lib/chef/http/auth_credentials.rb index 765c9ee778..1702ae7e24 100644 --- a/lib/chef/http/auth_credentials.rb +++ b/lib/chef/http/auth_credentials.rb @@ -21,7 +21,11 @@ # limitations under the License. # require_relative "../log" -require "mixlib/authentication/signedheaderauth" +module Mixlib + module Authentication + autoload :SignedHeaderAuth, "mixlib/authentication/signedheaderauth" + end +end class Chef class HTTP diff --git a/lib/chef/http/authenticator.rb b/lib/chef/http/authenticator.rb index 4a29fcea33..80b32be750 100644 --- a/lib/chef/http/authenticator.rb +++ b/lib/chef/http/authenticator.rb @@ -18,7 +18,7 @@ require_relative "auth_credentials" require_relative "../exceptions" -require "openssl" unless defined?(OpenSSL) +autoload :OpenSSL, "openssl" class Chef class HTTP diff --git a/lib/chef/http/basic_client.rb b/lib/chef/http/basic_client.rb index fa77b67427..f4be3b98ec 100644 --- a/lib/chef/http/basic_client.rb +++ b/lib/chef/http/basic_client.rb @@ -20,8 +20,10 @@ # See the License for the specific language governing permissions and # limitations under the License. # -require "uri" unless defined?(URI) -require "net/http" unless defined?(Net::HTTP) +autoload :URI, "uri" +module Net + autoload :HTTP, File.expand_path("../monkey_patches/net_http", __dir__) +end require_relative "ssl_policies" require_relative "http_request" diff --git a/lib/chef/http/http_request.rb b/lib/chef/http/http_request.rb index 9569c4133a..dbb1e0ce70 100644 --- a/lib/chef/http/http_request.rb +++ b/lib/chef/http/http_request.rb @@ -20,9 +20,11 @@ # See the License for the specific language governing permissions and # limitations under the License. # -require "uri" unless defined?(URI) -require "cgi" unless defined?(CGI) -require "net/http" unless defined?(Net::HTTP) +autoload :URI, "uri" +autoload :CGI, "cgi" +module Net + autoload :HTTP, File.expand_path("../monkey_patches/net_http", __dir__) +end require_relative "../dist" # To load faster, we only want ohai's version string. diff --git a/lib/chef/http/socketless_chef_zero_client.rb b/lib/chef/http/socketless_chef_zero_client.rb index 0cd7b564d9..feebba5a2c 100644 --- a/lib/chef/http/socketless_chef_zero_client.rb +++ b/lib/chef/http/socketless_chef_zero_client.rb @@ -45,6 +45,9 @@ require "chef_zero/server" require_relative "../dist" +module Net + autoload :HTTPResponse, File.expand_path("../monkey_patches/net_http", __dir__) +end class Chef class HTTP diff --git a/lib/chef/http/ssl_policies.rb b/lib/chef/http/ssl_policies.rb index 05e4baf581..d03494defe 100644 --- a/lib/chef/http/ssl_policies.rb +++ b/lib/chef/http/ssl_policies.rb @@ -21,7 +21,7 @@ # limitations under the License. # -require "openssl" unless defined?(OpenSSL) +autoload :OpenSSL, "openssl" require_relative "../util/path_helper" class Chef diff --git a/lib/chef/json_compat.rb b/lib/chef/json_compat.rb index 188a5d38f3..47d66dba96 100644 --- a/lib/chef/json_compat.rb +++ b/lib/chef/json_compat.rb @@ -17,7 +17,7 @@ # Wrapper class for interacting with JSON. -require "ffi_yajl" unless defined?(FFI_Yajl) +autoload :FFI_Yajl, "ffi_yajl" require_relative "exceptions" # We're requiring this to prevent breaking consumers using Hash.to_json require "json" unless defined?(JSON) diff --git a/lib/chef/knife/core/object_loader.rb b/lib/chef/knife/core/object_loader.rb index 9cabbf97db..5421fc46ce 100644 --- a/lib/chef/knife/core/object_loader.rb +++ b/lib/chef/knife/core/object_loader.rb @@ -16,7 +16,7 @@ # limitations under the License. # -require "ffi_yajl" unless defined?(FFI_Yajl) +autoload :FFI_Yajl, "ffi_yajl" require_relative "../../util/path_helper" require_relative "../../data_bag_item" diff --git a/lib/chef/knife/yaml_convert.rb b/lib/chef/knife/yaml_convert.rb index ff64f5c53a..6bd2d1c0ea 100644 --- a/lib/chef/knife/yaml_convert.rb +++ b/lib/chef/knife/yaml_convert.rb @@ -16,7 +16,7 @@ # limitations under the License. # -require "yaml" unless defined?(YAML) +autoload :YAML, "yaml" require_relative "../knife" class Chef::Knife::YamlConvert < Chef::Knife diff --git a/lib/chef/mixin/openssl_helper.rb b/lib/chef/mixin/openssl_helper.rb index db422175bb..1d50523df8 100644 --- a/lib/chef/mixin/openssl_helper.rb +++ b/lib/chef/mixin/openssl_helper.rb @@ -14,15 +14,12 @@ # See the License for the specific language governing permissions and # limitations under the License. # +autoload :OpenSSL, "openssl" class Chef module Mixin # various helpers for use with openssl. Currently used by the openssl_* resources module OpenSSLHelper - def self.included(_base) - require "openssl" unless defined?(::OpenSSL) - end - # determine the key filename from the cert filename # @param [String] cert_filename the path to the certfile # @return [String] the path to the keyfile diff --git a/lib/chef/mixin/template.rb b/lib/chef/mixin/template.rb index d72bfe9e3a..a369cae9e5 100644 --- a/lib/chef/mixin/template.rb +++ b/lib/chef/mixin/template.rb @@ -16,8 +16,8 @@ # limitations under the License. # -require "tempfile" unless defined?(Tempfile) -require "erubis" unless defined?(Erubis) +autoload :Tempfile, "tempfile" +autoload :Erubis, "erubis" class Chef module Mixin diff --git a/lib/chef/mixin/uris.rb b/lib/chef/mixin/uris.rb index ab33c6791e..74c2af73d8 100644 --- a/lib/chef/mixin/uris.rb +++ b/lib/chef/mixin/uris.rb @@ -16,8 +16,8 @@ # limitations under the License. # -require "uri" unless defined?(URI) -require "addressable/uri" unless defined?(Addressable::URI) +autoload :URI, "uri" +autoload :Addressable, "addressable/uri" class Chef module Mixin diff --git a/lib/chef/monkey_patches/net_http.rb b/lib/chef/monkey_patches/net_http.rb index 42007d23a7..5955f1c6d2 100644 --- a/lib/chef/monkey_patches/net_http.rb +++ b/lib/chef/monkey_patches/net_http.rb @@ -7,16 +7,16 @@ end require "net/http" unless defined?(Net::HTTP) module Net - class HTTPError + class HTTPError < Net::ProtocolError include ChefNetHTTPExceptionExtensions end - class HTTPRetriableError + class HTTPRetriableError < Net::ProtoRetriableError include ChefNetHTTPExceptionExtensions end - class HTTPClientException + class HTTPClientException < Net::ProtoServerError include ChefNetHTTPExceptionExtensions end - class HTTPFatalError + class HTTPFatalError < Net::ProtoFatalError include ChefNetHTTPExceptionExtensions end end diff --git a/lib/chef/provider/ifconfig.rb b/lib/chef/provider/ifconfig.rb index fbff49468a..d5e18ae730 100644 --- a/lib/chef/provider/ifconfig.rb +++ b/lib/chef/provider/ifconfig.rb @@ -20,7 +20,7 @@ require_relative "../log" require_relative "../provider" require_relative "../resource/file" require_relative "../exceptions" -require "erb" unless defined?(Erb) +autoload :ERB, "erb" class Chef class Provider diff --git a/lib/chef/provider/launchd.rb b/lib/chef/provider/launchd.rb index 78ae823596..37c73924f8 100644 --- a/lib/chef/provider/launchd.rb +++ b/lib/chef/provider/launchd.rb @@ -20,7 +20,7 @@ require_relative "../provider" require_relative "../resource/file" require_relative "../resource/cookbook_file" require_relative "../resource/macosx_service" -require "plist" +autoload :Plist, "plist" require "forwardable" unless defined?(Forwardable) class Chef diff --git a/lib/chef/provider/package/rubygems.rb b/lib/chef/provider/package/rubygems.rb index 0dd62338dc..f9e89ead02 100644 --- a/lib/chef/provider/package/rubygems.rb +++ b/lib/chef/provider/package/rubygems.rb @@ -17,7 +17,7 @@ # limitations under the License. # -require "uri" unless defined?(URI) +autoload :URI, "uri" require_relative "../package" require_relative "../../resource/package" require_relative "../../mixin/get_source_from_package" @@ -25,31 +25,34 @@ require_relative "../../mixin/which" require_relative "../../dist" # Class methods on Gem are defined in rubygems -require "rubygems" unless defined?(Gem) +autoload :Gem, "rubygems" # Ruby 1.9's gem_prelude can interact poorly with loading the full rubygems # explicitly like this. Make sure rubygems/specification is always last in this # list -require "rubygems/version" -require "rubygems/dependency" -require "rubygems/spec_fetcher" -require "rubygems/platform" -require "rubygems/package" unless defined?(Gem::Package) -require "rubygems/dependency_installer" -require "rubygems/uninstaller" -require "rubygems/specification" +Gem.autoload :Version, "rubygems/version" +Gem.autoload :Dependency, "rubygems/dependency" +Gem.autoload :SpecFetcher, "rubygems/spec_fetcher" +Gem.autoload :Platform, "rubygems/platform" +Gem.autoload :Package, "rubygems/package" +Gem.autoload :DependencyInstaller, "rubygems/dependency_installer" +Gem.autoload :Uninstaller, "rubygems/uninstaller" +Gem.autoload :Specification, "rubygems/specification" class Chef class Provider class Package class Rubygems < Chef::Provider::Package class GemEnvironment - # HACK: trigger gem config load early. Otherwise it can get lazy - # loaded during operations where we've set Gem.sources to an - # alternate value and overwrite it with the defaults. - Gem.configuration - DEFAULT_UNINSTALLER_OPTS = { ignore: true, executables: true }.freeze + def initialize(*args) + super + # HACK: trigger gem config load early. Otherwise it can get lazy + # loaded during operations where we've set Gem.sources to an + # alternate value and overwrite it with the defaults. + Gem.configuration + end + # The paths where rubygems should search for installed gems. # Implemented by subclasses. def gem_paths diff --git a/lib/chef/provider/package/windows.rb b/lib/chef/provider/package/windows.rb index e654c80c83..c722d8222c 100644 --- a/lib/chef/provider/package/windows.rb +++ b/lib/chef/provider/package/windows.rb @@ -21,7 +21,7 @@ require_relative "../../resource/windows_package" require_relative "../package" require_relative "../../util/path_helper" require_relative "../../mixin/checksum" -require "cgi" unless defined?(CGI) +autoload :CGI, "cgi" class Chef class Provider @@ -33,7 +33,7 @@ class Chef provides :package, os: "windows" provides :windows_package - require "chef/provider/package/windows/registry_uninstall_entry.rb" + autoload :RegistryUninstallEntry, ::File.expand_path("windows/registry_uninstall_entry.rb", __dir__) def define_resource_requirements if new_resource.checksum diff --git a/lib/chef/provider/package/windows/registry_uninstall_entry.rb b/lib/chef/provider/package/windows/registry_uninstall_entry.rb index f1814d5dcf..6e7b825256 100644 --- a/lib/chef/provider/package/windows/registry_uninstall_entry.rb +++ b/lib/chef/provider/package/windows/registry_uninstall_entry.rb @@ -17,7 +17,9 @@ # limitations under the License. # -require "win32/registry" if RUBY_PLATFORM.match?(/mswin|mingw32|windows/) +module Win32 + autoload :Registry, File.expand_path("../../../monkey_patches/win32/registry", __dir__) if RUBY_PLATFORM.match?(/mswin|mingw32|windows/) +end class Chef class Provider diff --git a/lib/chef/provider/remote_file/content.rb b/lib/chef/provider/remote_file/content.rb index c76029c091..665da47e8d 100644 --- a/lib/chef/provider/remote_file/content.rb +++ b/lib/chef/provider/remote_file/content.rb @@ -21,6 +21,9 @@ require "uri" unless defined?(URI) require "tempfile" unless defined?(Tempfile) require_relative "../../file_content_management/content_base" require_relative "../../mixin/uris" +module Net + autoload :FTPError, "net/ftp" +end class Chef class Provider diff --git a/lib/chef/provider/remote_file/ftp.rb b/lib/chef/provider/remote_file/ftp.rb index e2b32ddaf6..44a6d1c6e8 100644 --- a/lib/chef/provider/remote_file/ftp.rb +++ b/lib/chef/provider/remote_file/ftp.rb @@ -16,10 +16,12 @@ # limitations under the License. # -require "uri" unless defined?(URI) -require "cgi" unless defined?(CGI) -require "tempfile" unless defined?(Tempfile) -require "net/ftp" +autoload :URI, "uri" +autoload :CGI, "cgi" +autoload :Tempfile, "tempfile" +module Net + autoload :FTP, "net/ftp" +end require_relative "../remote_file" require_relative "../../file_content_management/tempfile" diff --git a/lib/chef/provider/remote_file/sftp.rb b/lib/chef/provider/remote_file/sftp.rb index 43654bd67c..be2a34fc54 100644 --- a/lib/chef/provider/remote_file/sftp.rb +++ b/lib/chef/provider/remote_file/sftp.rb @@ -16,10 +16,12 @@ # limitations under the License. # -require "uri" unless defined?(URI) -require "cgi" unless defined?(CGI) -require "tempfile" unless defined?(Tempfile) -require "net/sftp" +autoload :URI, "uri" +autoload :CGI, "cgi" +autoload :Tempfile, "tempfile" +module Net + autoload :SFTP, "net/sftp" +end require_relative "../remote_file" require_relative "../../file_content_management/tempfile" diff --git a/lib/chef/provider/route.rb b/lib/chef/provider/route.rb index afb1fd5a88..3eac41aef0 100644 --- a/lib/chef/provider/route.rb +++ b/lib/chef/provider/route.rb @@ -19,7 +19,7 @@ require_relative "../log" require_relative "../provider" -require "ipaddr" unless defined?(IPAddr) +autoload :IPAddr, "ipaddr" class Chef class Provider diff --git a/lib/chef/provider/service/macosx.rb b/lib/chef/provider/service/macosx.rb index 7e695aaf2b..ae04c7bfdd 100644 --- a/lib/chef/provider/service/macosx.rb +++ b/lib/chef/provider/service/macosx.rb @@ -18,7 +18,7 @@ # require "etc" unless defined?(Etc) -require "rexml/document" unless defined?(REXML::Document) +autoload :REXML, "rexml/document" require_relative "../../resource/service" require_relative "../../resource/macosx_service" require_relative "simple" diff --git a/lib/chef/provider/user/dscl.rb b/lib/chef/provider/user/dscl.rb index 7b86fa5269..80853d43da 100644 --- a/lib/chef/provider/user/dscl.rb +++ b/lib/chef/provider/user/dscl.rb @@ -19,8 +19,8 @@ require_relative "../../mixin/shell_out" require_relative "../user" require_relative "../../resource/user/dscl_user" -require "openssl" unless defined?(OpenSSL) -require "plist" +autoload :OpenSSL, "openssl" +autoload :Plist, "plist" require_relative "../../util/path_helper" class Chef diff --git a/lib/chef/provider/user/mac.rb b/lib/chef/provider/user/mac.rb index 9ae1628d5c..a738fa4aa0 100644 --- a/lib/chef/provider/user/mac.rb +++ b/lib/chef/provider/user/mac.rb @@ -22,7 +22,7 @@ require_relative "../../mixin/shell_out" require_relative "../../mixin/which" require_relative "../user" require_relative "../../resource/user/mac_user" -require "plist" +autoload :Plist, "plist" class Chef class Provider diff --git a/lib/chef/provider/windows_task.rb b/lib/chef/provider/windows_task.rb index c402818321..963c52ef02 100644 --- a/lib/chef/provider/windows_task.rb +++ b/lib/chef/provider/windows_task.rb @@ -16,8 +16,7 @@ # limitations under the License. # -require "rexml/document" unless defined?(REXML::Document) -require "iso8601" if ChefUtils.windows? +autoload :ISO8601, "iso8601" if ChefUtils.windows? require_relative "../provider" require_relative "../util/path_helper" require "win32/taskscheduler" if ChefUtils.windows? diff --git a/lib/chef/recipe.rb b/lib/chef/recipe.rb index be188817d6..4009677936 100644 --- a/lib/chef/recipe.rb +++ b/lib/chef/recipe.rb @@ -17,7 +17,7 @@ # limitations under the License. # -require "yaml" unless defined?(YAML) +autoload :YAML, "yaml" require_relative "dsl/recipe" require_relative "mixin/from_file" require_relative "mixin/deprecation" diff --git a/lib/chef/resource.rb b/lib/chef/resource.rb index 735ef47b63..2e5b17f277 100644 --- a/lib/chef/resource.rb +++ b/lib/chef/resource.rb @@ -36,7 +36,7 @@ require_relative "resource/resource_notification" require_relative "provider_resolver" require_relative "resource_resolver" require_relative "provider" -require "set" unless defined?(Set) +autoload :Set, "set" require_relative "mixin/deprecation" require_relative "mixin/properties" diff --git a/lib/chef/resource/apt_repository.rb b/lib/chef/resource/apt_repository.rb index bc0c904745..e4569561fc 100644 --- a/lib/chef/resource/apt_repository.rb +++ b/lib/chef/resource/apt_repository.rb @@ -19,7 +19,7 @@ require_relative "../resource" require_relative "../http/simple" require "tmpdir" unless defined?(Dir.mktmpdir) -require "addressable" unless defined?(Addressable) +autoload :Addressable, "addressable" class Chef class Resource diff --git a/lib/chef/resource/build_essential.rb b/lib/chef/resource/build_essential.rb index ad37d3924f..17b97ebd97 100644 --- a/lib/chef/resource/build_essential.rb +++ b/lib/chef/resource/build_essential.rb @@ -15,7 +15,7 @@ # require_relative "../resource" -require "plist" +autoload :Plist, "plist" class Chef class Resource diff --git a/lib/chef/resource/chef_vault_secret.rb b/lib/chef/resource/chef_vault_secret.rb index d8a2e89ffe..1c8fa985f9 100644 --- a/lib/chef/resource/chef_vault_secret.rb +++ b/lib/chef/resource/chef_vault_secret.rb @@ -16,7 +16,7 @@ # require_relative "../resource" -require "chef-vault" +autoload :ChefVault, "chef-vault" class Chef class Resource diff --git a/lib/chef/resource/macos_userdefaults.rb b/lib/chef/resource/macos_userdefaults.rb index d163fd8402..ab789635e7 100644 --- a/lib/chef/resource/macos_userdefaults.rb +++ b/lib/chef/resource/macos_userdefaults.rb @@ -17,7 +17,7 @@ require_relative "../resource" require_relative "../dist" -require "plist" +autoload :Plist, "plist" class Chef class Resource diff --git a/lib/chef/resource/openssl_ec_private_key.rb b/lib/chef/resource/openssl_ec_private_key.rb index 36ad8f43ae..26f28b1ad8 100644 --- a/lib/chef/resource/openssl_ec_private_key.rb +++ b/lib/chef/resource/openssl_ec_private_key.rb @@ -66,10 +66,12 @@ class Chef description: "The desired passphrase for the key." property :key_cipher, String, - equal_to: OpenSSL::Cipher.ciphers, - validation_message: "key_cipher must be a cipher known to openssl. Run `openssl list-cipher-algorithms` to see available options.", description: "The designed cipher to use when generating your key. Run `openssl list-cipher-algorithms` to see available options.", - default: "des3" + default: lazy { "des3" }, + callbacks: { + "key_cipher must be a cipher known to openssl. Run `openssl list-cipher-algorithms` to see available options." => + proc { |v| OpenSSL::Cipher.ciphers.include?(v) }, + } property :owner, [String, Integer], description: "The owner applied to all files created by the resource." diff --git a/lib/chef/resource/openssl_rsa_private_key.rb b/lib/chef/resource/openssl_rsa_private_key.rb index c8129a728e..381e2af696 100644 --- a/lib/chef/resource/openssl_rsa_private_key.rb +++ b/lib/chef/resource/openssl_rsa_private_key.rb @@ -65,10 +65,12 @@ class Chef description: "The desired passphrase for the key." property :key_cipher, String, - equal_to: OpenSSL::Cipher.ciphers, - validation_message: "key_cipher must be a cipher known to openssl. Run `openssl list-cipher-algorithms` to see available options.", description: "The designed cipher to use when generating your key. Run `openssl list-cipher-algorithms` to see available options.", - default: "des3" + default: lazy { "des3" }, + callbacks: { + "key_cipher must be a cipher known to openssl. Run `openssl list-cipher-algorithms` to see available options." => + proc { |v| OpenSSL::Cipher.ciphers.include?(v) }, + } property :owner, [String, Integer], description: "The owner applied to all files created by the resource." diff --git a/lib/chef/resource/osx_profile.rb b/lib/chef/resource/osx_profile.rb index c3ff099436..d1a2791d3c 100644 --- a/lib/chef/resource/osx_profile.rb +++ b/lib/chef/resource/osx_profile.rb @@ -19,8 +19,8 @@ require_relative "../resource" require_relative "../log" require_relative "../resource/file" -require "uuidtools" -require "plist" +autoload :UUIDTools, "uuidtools" +autoload :Plist, "plist" class Chef class Resource diff --git a/lib/chef/resource/plist.rb b/lib/chef/resource/plist.rb index 06811ea8b6..f4058520a9 100644 --- a/lib/chef/resource/plist.rb +++ b/lib/chef/resource/plist.rb @@ -16,7 +16,7 @@ # limitations under the License. # require_relative "../resource" -require "plist" +autoload :Plist, "plist" class Chef class Resource diff --git a/lib/chef/resource/windows_certificate.rb b/lib/chef/resource/windows_certificate.rb index ce1bcede40..215f87d9c3 100644 --- a/lib/chef/resource/windows_certificate.rb +++ b/lib/chef/resource/windows_certificate.rb @@ -19,8 +19,10 @@ require_relative "../util/path_helper" require_relative "../resource" -require "win32-certstore" if Chef::Platform.windows? -require "openssl" unless defined?(OpenSSL) +module Win32 + autoload :Certstore, "win32-certstore" if Chef::Platform.windows? +end +autoload :OpenSSL, "openssl" require_relative "../dist" class Chef diff --git a/lib/chef/resource/windows_printer.rb b/lib/chef/resource/windows_printer.rb index 947477baeb..dea15ba112 100644 --- a/lib/chef/resource/windows_printer.rb +++ b/lib/chef/resource/windows_printer.rb @@ -24,7 +24,7 @@ class Chef class WindowsPrinter < Chef::Resource unified_mode true - require "resolv" + autoload :Resolv, "resolv" provides(:windows_printer) { true } @@ -78,8 +78,10 @@ class Chef property :ipv4_address, String, description: "The IPv4 address of the printer, such as `10.4.64.23`", - validation_message: "The ipv4_address property must be in the IPv4 format of `WWW.XXX.YYY.ZZZ`", - regex: Resolv::IPv4::Regex + callbacks: { + "The ipv4_address property must be in the IPv4 format of `WWW.XXX.YYY.ZZZ`" => + proc { |v| v.match(Resolv::IPv4::Regex) }, + } PRINTERS_REG_KEY = 'HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Print\Printers\\'.freeze unless defined?(PRINTERS_REG_KEY) diff --git a/lib/chef/resource/windows_printer_port.rb b/lib/chef/resource/windows_printer_port.rb index 1b3f8753ba..2a4eaa09b3 100644 --- a/lib/chef/resource/windows_printer_port.rb +++ b/lib/chef/resource/windows_printer_port.rb @@ -24,7 +24,7 @@ class Chef class WindowsPrinterPort < Chef::Resource unified_mode true - require "resolv" + autoload :Resolv, "resolv" provides(:windows_printer_port) { true } @@ -61,9 +61,11 @@ class Chef property :ipv4_address, String, name_property: true, - regex: Resolv::IPv4::Regex, - validation_message: "The ipv4_address property must be in the format of WWW.XXX.YYY.ZZZ!", - description: "An optional property for the IPv4 address of the printer if it differs from the resource block's name." + description: "An optional property for the IPv4 address of the printer if it differs from the resource block's name.", + callbacks: { + "The ipv4_address property must be in the format of WWW.XXX.YYY.ZZZ!" => + proc { |v| v.match(Resolv::IPv4::Regex) }, + } property :port_name, String, description: "The port name." diff --git a/lib/chef/run_context.rb b/lib/chef/run_context.rb index 7ba7d9f33e..bfefc6e101 100644 --- a/lib/chef/run_context.rb +++ b/lib/chef/run_context.rb @@ -28,7 +28,7 @@ require_relative "event_dispatch/events_output_stream" require_relative "train_transport" require_relative "exceptions" require "forwardable" unless defined?(Forwardable) -require "set" unless defined?(Set) +autoload :Set, "set" class Chef diff --git a/lib/chef/run_context/cookbook_compiler.rb b/lib/chef/run_context/cookbook_compiler.rb index 51b841d798..27461fea9a 100644 --- a/lib/chef/run_context/cookbook_compiler.rb +++ b/lib/chef/run_context/cookbook_compiler.rb @@ -16,7 +16,7 @@ # limitations under the License. # -require "set" unless defined?(Set) +autoload :Set, "set" require_relative "../log" require_relative "../recipe" require_relative "../resource/lwrp_base" diff --git a/lib/chef/search/query.rb b/lib/chef/search/query.rb index cd4275e8db..70b31cd5e4 100644 --- a/lib/chef/search/query.rb +++ b/lib/chef/search/query.rb @@ -20,8 +20,8 @@ require_relative "../config" require_relative "../exceptions" require_relative "../server_api" -require "uri" unless defined?(URI) -require "addressable/uri" unless defined?(Addressable::URI) +autoload :URI, "uri" +autoload :Addressable, "addressable/uri" class Chef class Search @@ -132,10 +132,9 @@ class Chef args_h end - QUERY_PARAM_VALUE = Addressable::URI::CharacterClasses::QUERY + "\\&\\;" - def escape_value(s) - s && Addressable::URI.encode_component(s.to_s, QUERY_PARAM_VALUE) + query_param_value = Addressable::URI::CharacterClasses::QUERY + "\\&\\;" + s && Addressable::URI.encode_component(s.to_s, query_param_value) end def create_query_string(type, query, rows, start) diff --git a/lib/chef/shell.rb b/lib/chef/shell.rb index 8429110eec..1a012144ed 100644 --- a/lib/chef/shell.rb +++ b/lib/chef/shell.rb @@ -15,6 +15,11 @@ # limitations under the License. # +module Mixlib + module Authentication + autoload :Log, "mixlib/authentication" + end +end require "singleton" unless defined?(Singleton) require "pp" unless defined?(PP) require "etc" unless defined?(Etc) diff --git a/lib/chef/train_transport.rb b/lib/chef/train_transport.rb index 81d1ae09f2..a4f311fc51 100644 --- a/lib/chef/train_transport.rb +++ b/lib/chef/train_transport.rb @@ -16,7 +16,7 @@ # require "chef-config/mixin/credentials" -require "train" +autoload :Train, "train" require_relative "dist" class Chef diff --git a/lib/chef/util/diff.rb b/lib/chef/util/diff.rb index 3f8a925c4d..0774dea813 100644 --- a/lib/chef/util/diff.rb +++ b/lib/chef/util/diff.rb @@ -40,9 +40,6 @@ # CONNECTION WITH THE SOFTWARE OR THE USE OF OTHER DEALINGS IN THE # SOFTWARE. -require "diff/lcs" -require "diff/lcs/hunk" - class Chef class Util class Diff @@ -86,6 +83,9 @@ class Chef # produces a unified-output-format diff with 3 lines of context # ChefFS uses udiff() directly def udiff(old_file, new_file) + require "diff/lcs" + require "diff/lcs/hunk" + diff_str = "" file_length_difference = 0 diff --git a/lib/chef/util/powershell/cmdlet.rb b/lib/chef/util/powershell/cmdlet.rb index 344e20f466..ea84798814 100644 --- a/lib/chef/util/powershell/cmdlet.rb +++ b/lib/chef/util/powershell/cmdlet.rb @@ -16,7 +16,9 @@ # limitations under the License. # -require "mixlib/shellout" unless defined?(Mixlib::ShellOut::DEFAULT_READ_TIMEOUT) +module Mixlib + autoload :ShellOut, "mixlib/shellout" +end require_relative "../../mixin/windows_architecture_helper" require_relative "cmdlet_result" diff --git a/lib/chef/util/powershell/ps_credential.rb b/lib/chef/util/powershell/ps_credential.rb index cc11cc6c36..0404f5a1ac 100644 --- a/lib/chef/util/powershell/ps_credential.rb +++ b/lib/chef/util/powershell/ps_credential.rb @@ -18,24 +18,28 @@ require_relative "../../win32/crypto" if ChefUtils.windows? -class Chef::Util::Powershell - class PSCredential - def initialize(username, password) - @username = username - @password = password - end +class Chef + class Util + class Powershell + class PSCredential + def initialize(username, password) + @username = username + @password = password + end - def to_psobject - "New-Object System.Management.Automation.PSCredential('#{@username}',('#{encrypt(@password)}' | ConvertTo-SecureString))" - end + def to_psobject + "New-Object System.Management.Automation.PSCredential('#{@username}',('#{encrypt(@password)}' | ConvertTo-SecureString))" + end - alias to_s to_psobject - alias to_text to_psobject + alias to_s to_psobject + alias to_text to_psobject - private + private - def encrypt(str) - Chef::ReservedNames::Win32::Crypto.encrypt(str) + def encrypt(str) + Chef::ReservedNames::Win32::Crypto.encrypt(str) + end + end end end end diff --git a/lib/chef/win32/registry.rb b/lib/chef/win32/registry.rb index 6a9f229b27..4b5f8ede41 100644 --- a/lib/chef/win32/registry.rb +++ b/lib/chef/win32/registry.rb @@ -21,9 +21,8 @@ require_relative "api" require_relative "../mixin/wide_string" if RUBY_PLATFORM.match?(/mswin|mingw32|windows/) - require_relative "../monkey_patches/win32/registry" + Win32.autoload :Registry, File.expand_path("../monkey_patches/win32/registry", __dir__) require_relative "api/registry" - require "win32/registry" unless defined?(Win32::Registry) require "win32/api" end |