From 9fda03d4bc3dab1a0e1d56047e34e6885ec77a4e Mon Sep 17 00:00:00 2001 From: Alex Evanczuk Date: Mon, 31 Oct 2022 09:39:17 -0400 Subject: [PATCH] Create privacy protected package --- lib/packwerk/package.rb | 15 +++-- .../checkers/privacy_checker.rb | 36 +----------- .../privacy_protected_package.rb | 56 +++++++++++++++++++ 3 files changed, 70 insertions(+), 37 deletions(-) create mode 100644 lib/packwerk/reference_checking/checkers/privacy_checker/privacy_protected_package.rb diff --git a/lib/packwerk/package.rb b/lib/packwerk/package.rb index cb646b2f7..a5e1f44eb 100644 --- a/lib/packwerk/package.rb +++ b/lib/packwerk/package.rb @@ -48,22 +48,29 @@ def package_path?(path) # These functions to get information about package privacy concerns will soon be removed sig { returns(T.nilable(T.any(T::Boolean, T::Array[String]))) } def enforce_privacy - ReferenceChecking::Checkers::PrivacyChecker.enforce_privacy(self) + privacy_protected_package.enforce_privacy end sig { returns(String) } def public_path - @public_path ||= ReferenceChecking::Checkers::PrivacyChecker.public_path(self) + privacy_protected_package.public_path end sig { params(path: String).returns(T::Boolean) } def public_path?(path) - ReferenceChecking::Checkers::PrivacyChecker.public_path?(self, path) + privacy_protected_package.public_path?(path) end sig { returns(T.nilable(String)) } def user_defined_public_path - ReferenceChecking::Checkers::PrivacyChecker.user_defined_public_path(self) + privacy_protected_package.user_defined_public_path + end + + sig { returns(ReferenceChecking::Checkers::PrivacyChecker::PrivacyProtectedPackage) } + def privacy_protected_package + @privacy_protected_package ||= T.let(@privacy_protected_package, + T.nilable(ReferenceChecking::Checkers::PrivacyChecker::PrivacyProtectedPackage)) + @privacy_protected_package ||= ReferenceChecking::Checkers::PrivacyChecker::PrivacyProtectedPackage.from(self) end sig { params(other: T.untyped).returns(T.nilable(Integer)) } diff --git a/lib/packwerk/reference_checking/checkers/privacy_checker.rb b/lib/packwerk/reference_checking/checkers/privacy_checker.rb index d0139eabc..f58f09a69 100644 --- a/lib/packwerk/reference_checking/checkers/privacy_checker.rb +++ b/lib/packwerk/reference_checking/checkers/privacy_checker.rb @@ -6,44 +6,14 @@ module ReferenceChecking module Checkers # Checks whether a given reference references a private constant of another package. class PrivacyChecker + extend ActiveSupport::Autoload + autoload :PrivacyProtectedPackage + extend T::Sig include Checker VIOLATION_TYPE = T.let("privacy", String) - class << self - extend T::Sig - - sig { params(package: Package).returns(String) } - def public_path(package) - unprefixed_public_path = user_defined_public_path(package) || "app/public/" - - if package.root? - unprefixed_public_path - else - File.join(package.name, unprefixed_public_path) - end - end - - sig { params(package: Package).returns(T.nilable(String)) } - def user_defined_public_path(package) - return unless package.config["public_path"] - return package.config["public_path"] if package.config["public_path"].end_with?("/") - - package.config["public_path"] + "/" - end - - sig { params(package: Package, path: String).returns(T::Boolean) } - def public_path?(package, path) - path.start_with?(public_path(package)) - end - - sig { params(package: Package).returns(T.nilable(T.any(T::Boolean, T::Array[String]))) } - def enforce_privacy(package) - package.config["enforce_privacy"] - end - end - sig { override.returns(String) } def violation_type VIOLATION_TYPE diff --git a/lib/packwerk/reference_checking/checkers/privacy_checker/privacy_protected_package.rb b/lib/packwerk/reference_checking/checkers/privacy_checker/privacy_protected_package.rb new file mode 100644 index 000000000..3f230cb2c --- /dev/null +++ b/lib/packwerk/reference_checking/checkers/privacy_checker/privacy_protected_package.rb @@ -0,0 +1,56 @@ +# typed: strict +# frozen_string_literal: true + +module Packwerk + module ReferenceChecking + module Checkers + # Checks whether a given reference references a private constant of another package. + class PrivacyChecker + class PrivacyProtectedPackage < T::Struct + extend T::Sig + + const :public_path, String + const :user_defined_public_path, T.nilable(String) + const :enforce_privacy, T.nilable(T.any(T::Boolean, T::Array[String])) + + sig { params(path: String).returns(T::Boolean) } + def public_path?(path) + path.start_with?(public_path) + end + + class << self + extend T::Sig + + sig { params(package: Package).returns(PrivacyProtectedPackage) } + def from(package) + PrivacyProtectedPackage.new( + public_path: public_path_for(package), + user_defined_public_path: user_defined_public_path(package), + enforce_privacy: package.config["enforce_privacy"], + ) + end + + sig { params(package: Package).returns(T.nilable(String)) } + def user_defined_public_path(package) + return unless package.config["public_path"] + return package.config["public_path"] if package.config["public_path"].end_with?("/") + + package.config["public_path"] + "/" + end + + sig { params(package: Package).returns(String) } + def public_path_for(package) + unprefixed_public_path = user_defined_public_path(package) || "app/public/" + + if package.root? + unprefixed_public_path + else + File.join(package.name, unprefixed_public_path) + end + end + end + end + end + end + end +end