From c5bd0626610888357b0a36731ee8a0045e492c4f Mon Sep 17 00:00:00 2001 From: Tim Smith Date: Mon, 24 Aug 2020 11:53:34 -0700 Subject: [PATCH] Add ChefRuby/RequireNetHttps Catch anywhere we're still doing this. Signed-off-by: Tim Smith --- config/chefstyle.yml | 7 ++- .../cop/chef/ruby/require_net_https.rb | 54 +++++++++++++++++++ .../cop/chef/ruby/require_net_https_spec.rb | 39 ++++++++++++++ 3 files changed, 99 insertions(+), 1 deletion(-) create mode 100644 lib/rubocop/cop/chef/ruby/require_net_https.rb create mode 100644 spec/rubocop/cop/chef/ruby/require_net_https_spec.rb diff --git a/config/chefstyle.yml b/config/chefstyle.yml index de60018..96b504a 100644 --- a/config/chefstyle.yml +++ b/config/chefstyle.yml @@ -650,4 +650,9 @@ ChefRuby/GemspecRequireRubygems: Enabled: true VersionAdded: '1.3.0' Include: - - '**/*.gemspec' \ No newline at end of file + - '**/*.gemspec' + +ChefRuby/RequireNetHttps: + Description: net/http is deprecated and just includes net/http and openssl. We should include those directly instead + Enabled: true + VersionAdded: '1.3.0' diff --git a/lib/rubocop/cop/chef/ruby/require_net_https.rb b/lib/rubocop/cop/chef/ruby/require_net_https.rb new file mode 100644 index 0000000..8210fd5 --- /dev/null +++ b/lib/rubocop/cop/chef/ruby/require_net_https.rb @@ -0,0 +1,54 @@ +# frozen_string_literal: true +# +# Copyright:: Chef Software, Inc. +# Author:: Tim Smith () +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +module RuboCop + module Cop + module Chef + module ChefRuby + # net/http is deprecated and just includes net/http and openssl. We should include those directly instead. + # + # @example + # + # # bad + # require 'net/https' + # + # # good + # require 'net/http' + # require 'openssl' + # + class RequireNetHttps < Base + extend RuboCop::Cop::AutoCorrector + + MSG = "net/http is deprecated and just includes net/http and openssl. We should include those directly instead." + + def_node_matcher :require_net_https?, <<-PATTERN + (send nil? :require (str "net/https")) + PATTERN + + def on_send(node) + require_net_https?(node) do + add_offense(node.loc.expression, message: MSG, severity: :refactor) do |corrector| + corrector.replace(node, %Q{require "net/http"\nrequire "openssl"}) + end + end + end + end + end + end + end +end diff --git a/spec/rubocop/cop/chef/ruby/require_net_https_spec.rb b/spec/rubocop/cop/chef/ruby/require_net_https_spec.rb new file mode 100644 index 0000000..8c76438 --- /dev/null +++ b/spec/rubocop/cop/chef/ruby/require_net_https_spec.rb @@ -0,0 +1,39 @@ +# frozen_string_literal: true +# +# Copyright:: Chef Software, Inc. +# Author:: Tim Smith () +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +require "spec_helper" + +describe RuboCop::Cop::Chef::ChefRuby::RequireNetHttps, :config do + subject(:cop) { described_class.new(config) } + + it "registers an offense when when requiring net/https" do + expect_offense(<<~RUBY) + require 'net/https' + ^^^^^^^^^^^^^^^^^^^ net/http is deprecated and just includes net/http and openssl. We should include those directly instead. + RUBY + + expect_correction(<<~RUBY) + require "net/http" + require "openssl" + RUBY + end + + it "doesn't register an offense when requiring net/http" do + expect_no_offenses("require 'net/http'") + end +end