# Perl::Critic configuration.  -*- conf -*-
#
# This .perlcriticrc expects precisely the following set of critic
# policies and related distributions to be installed, **and no others**:
#
#          SHANCOCK/Perl-Tidy-20210402.tar.gz
#          PETDANCE/Perl-Critic-1.140.tar.gz
#          DBOOK/Perl-Critic-Community-v1.0.0.tar.gz
#          KRYDE/Perl-Critic-Pulp-99.tar.gz
#          GUGOD/Perl-Critic-TooMuchCode-0.15.tar.gz
#
# Make sure to keep this list in sync with the CI configuration.
#
# In order to ensure stable lint results, we explicitly enable or
# disable every single policy from the policy packages we use, and we
# have an ancillary script (build-aux/scripts/check-perlcritic-config)
# that enforces that _all_ installed policies are mentioned and _all_
# mentioned policies are installed.

# Start from the empty set, but with severity maxed.
severity = 1
only = 1

# compilation-mode--compatible diagnostic formatting
verbose = %f:%l:%c: warning: %m (%p; %e)\n

# Policies are listed strictly in alphabetical order.
# Each disabled policy should be annotated with an explanation.

[-BuiltinFunctions::ProhibitBooleanGrep]
# The rationale for prohibiting boolean 'grep' is sensible
# (it doesn't short-circuit, which could be a huge waste of time)
# but the recommended alternative is 'any' from List::MoreUtils,
# which would be the only CPAN dependency we had.

[BuiltinFunctions::ProhibitComplexMappings]

[BuiltinFunctions::ProhibitLvalueSubstr]

[BuiltinFunctions::ProhibitReverseSortBlock]

[BuiltinFunctions::ProhibitShiftRef]

[BuiltinFunctions::ProhibitSleepViaSelect]

[BuiltinFunctions::ProhibitStringyEval]

[BuiltinFunctions::ProhibitStringySplit]

[BuiltinFunctions::ProhibitUniversalCan]

[BuiltinFunctions::ProhibitUniversalIsa]

[BuiltinFunctions::ProhibitUselessTopic]

[BuiltinFunctions::ProhibitVoidGrep]

[BuiltinFunctions::ProhibitVoidMap]

[BuiltinFunctions::RequireBlockGrep]

[BuiltinFunctions::RequireBlockMap]

[BuiltinFunctions::RequireGlobFunction]

[BuiltinFunctions::RequireSimpleSortBlock]

[ClassHierarchies::ProhibitAutoloading]

[ClassHierarchies::ProhibitExplicitISA]

[ClassHierarchies::ProhibitOneArgBless]

[CodeLayout::ProhibitFatCommaNewline]

[CodeLayout::ProhibitHardTabs]

[CodeLayout::ProhibitIfIfSameLine]

[CodeLayout::ProhibitParensWithBuiltins]

[CodeLayout::ProhibitQuotedWordLists]

[CodeLayout::ProhibitTrailingWhitespace]

[CodeLayout::RequireConsistentNewlines]

[CodeLayout::RequireFinalSemicolon]

[CodeLayout::RequireTidyCode]
perltidyrc = .perltidyrc

[CodeLayout::RequireTrailingCommaAtNewline]

[CodeLayout::RequireTrailingCommas]

[-Community::AmpersandSubCalls]
# Duplicates core or pulp policy.

[-Community::ArrayAssignAref]
# Duplicates core or pulp policy.

[-Community::BarewordFilehandles]
# Duplicates core or pulp policy.

[-Community::ConditionalDeclarations]
# Duplicates core or pulp policy.

[Community::ConditionalImplicitReturn]

[Community::DeprecatedFeatures]

[-Community::DiscouragedModules]
# FindBin works fine for our purposes, and we can't use CPAN modules.
# There is no option to ignore use of just one module
# (https://github.com/Grinnz/Perl-Critic-Community/issues/42)

[Community::DollarAB]

[-Community::Each]
# I don't agree with this style rule.

[Community::EmptyReturn]

[-Community::IndirectObjectNotation]
# Duplicates core or pulp policy.

[-Community::LexicalForeachIterator]
# Duplicates core or pulp policy.

[-Community::LoopOnHash]
# Duplicates core or pulp policy.

[Community::ModPerl]

[Community::MultidimensionalArrayEmulation]

[-Community::OpenArgs]
# Duplicates core or pulp policy.

[Community::OverloadOptions]

[-Community::POSIXImports]
# Duplicates core or pulp policy.

[-Community::PackageMatchesFilename]
# Duplicates core or pulp policy.

[Community::PreferredAlternatives]

[-Community::Prototypes]
# Duplicates core or pulp policy.

[-Community::StrictWarnings]
# Duplicates core or pulp policy.

[Community::Threads]

[-Community::Wantarray]
# I don't agree with this style rule.

[Community::WarningsSwitch]

[-Community::WhileDiamondDefaultAssignment]
# I don't agree with this style rule.

[Compatibility::ConstantLeadingUnderscore]

[Compatibility::ConstantPragmaHash]

[Compatibility::Gtk2Constants]

[Compatibility::PodMinimumVersion]

[Compatibility::ProhibitUnixDevNull]

[ControlStructures::ProhibitCStyleForLoops]

[ControlStructures::ProhibitCascadingIfElse]
max_elsif = 3

[ControlStructures::ProhibitDeepNests]

[ControlStructures::ProhibitLabelsWithSpecialBlockNames]

[ControlStructures::ProhibitMutatingListFunctions]

[ControlStructures::ProhibitNegativeExpressionsInUnlessAndUntilConditions]

[-ControlStructures::ProhibitPostfixControls]
# I don't agree with this style rule.

[ControlStructures::ProhibitUnlessBlocks]

[ControlStructures::ProhibitUnreachableCode]

[ControlStructures::ProhibitUntilBlocks]

[ControlStructures::ProhibitYadaOperator]

[Documentation::PodSpelling]

[Documentation::ProhibitAdjacentLinks]

[Documentation::ProhibitBadAproposMarkup]

[Documentation::ProhibitDuplicateHeadings]

[Documentation::ProhibitDuplicateSeeAlso]

[Documentation::ProhibitLinkToSelf]

[Documentation::ProhibitParagraphEndComma]

[Documentation::ProhibitParagraphTwoDots]

[Documentation::ProhibitUnbalancedParens]

[Documentation::ProhibitVerbatimMarkup]

[Documentation::RequireEndBeforeLastPod]

[Documentation::RequireFilenameMarkup]

[Documentation::RequireFinalCut]

[Documentation::RequireLinkedURLs]

[Documentation::RequirePackageMatchesPodName]

[Documentation::RequirePodAtEnd]

[Documentation::RequirePodSections]

[-ErrorHandling::RequireCarping]
# This only makes sense for large libraries with lots of consumers.

[ErrorHandling::RequireCheckingReturnValueOfEval]

# All Freenode:: backward compatibility aliases are disabled.
# See https://github.com/Grinnz/Perl-Critic-Community/issues/41
[-Freenode::AmpersandSubCalls]
[-Freenode::ArrayAssignAref]
[-Freenode::BarewordFilehandles]
[-Freenode::ConditionalDeclarations]
[-Freenode::ConditionalImplicitReturn]
[-Freenode::DeprecatedFeatures]
[-Freenode::DiscouragedModules]
[-Freenode::DollarAB]
[-Freenode::Each]
[-Freenode::EmptyReturn]
[-Freenode::IndirectObjectNotation]
[-Freenode::LexicalForeachIterator]
[-Freenode::LoopOnHash]
[-Freenode::ModPerl]
[-Freenode::MultidimensionalArrayEmulation]
[-Freenode::OpenArgs]
[-Freenode::OverloadOptions]
[-Freenode::POSIXImports]
[-Freenode::PackageMatchesFilename]
[-Freenode::PreferredAlternatives]
[-Freenode::Prototypes]
[-Freenode::StrictWarnings]
[-Freenode::Threads]
[-Freenode::Wantarray]
[-Freenode::WarningsSwitch]
[-Freenode::WhileDiamondDefaultAssignment]

[InputOutput::ProhibitBacktickOperators]

[InputOutput::ProhibitBarewordFileHandles]

[InputOutput::ProhibitExplicitStdin]

[InputOutput::ProhibitInteractiveTest]

[InputOutput::ProhibitJoinedReadline]

[InputOutput::ProhibitOneArgSelect]

[InputOutput::ProhibitReadlineInForLoop]

[InputOutput::ProhibitTwoArgOpen]

[InputOutput::RequireBracedFileHandleWithPrint]

[-InputOutput::RequireBriefOpen]
# I can't find any explanation of what qualifies as "brief" and the
# diagnostic triggers on perfectly sensible code.

[InputOutput::RequireCheckedClose]

[InputOutput::RequireCheckedOpen]

[InputOutput::RequireCheckedSyscalls]
functions = :builtins
exclude_functions = print

[InputOutput::RequireEncodingWithUTF8Layer]

[Miscellanea::ProhibitFormats]

[Miscellanea::ProhibitTies]

[Miscellanea::ProhibitUnrestrictedNoCritic]

[Miscellanea::ProhibitUselessNoCritic]

[Miscellanea::TextDomainPlaceholders]

[Miscellanea::TextDomainUnused]

[Modules::ProhibitAutomaticExportation]

[Modules::ProhibitConditionalUseStatements]

[Modules::ProhibitEvilModules]

[Modules::ProhibitExcessMainComplexity]

[Modules::ProhibitModuleShebang]

[Modules::ProhibitMultiplePackages]

[Modules::ProhibitPOSIXimport]

[Modules::ProhibitUseQuotedVersion]

[Modules::RequireBarewordIncludes]

[Modules::RequireEndWithOne]

[Modules::RequireExplicitPackage]

[Modules::RequireFilenameMatchesPackage]

[Modules::RequireNoMatchVarsWithUseEnglish]

[-Modules::RequireVersionVar]
# This only makes sense for large libraries with lots of consumers.

[-NamingConventions::Capitalization]
# I don't agree with this style rule.

[NamingConventions::ProhibitAmbiguousNames]

[Objects::ProhibitIndirectSyntax]

[References::ProhibitDoubleSigils]

[RegularExpressions::ProhibitCaptureWithoutTest]

[-RegularExpressions::ProhibitComplexRegexes]
# The "complex" regexes are not that bad and splitting them up
# would only obscure the logic.

[-RegularExpressions::ProhibitEnumeratedClasses]
# I don't agree with this style rule.

[-RegularExpressions::ProhibitEscapedMetacharacters]
# I don't agree with this style rule.

[RegularExpressions::ProhibitFixedStringMatches]

[RegularExpressions::ProhibitSingleCharAlternation]

[RegularExpressions::ProhibitUnusedCapture]

[RegularExpressions::ProhibitUnusualDelimiters]

[RegularExpressions::ProhibitUselessTopic]

[RegularExpressions::RequireBracesForMultiline]

[-RegularExpressions::RequireDotMatchAnything]
# I don't agree with this style rule.

[-RegularExpressions::RequireExtendedFormatting]
# I don't agree with this style rule.

[-RegularExpressions::RequireLineBoundaryMatching]
# I don't agree with this style rule.

[Subroutines::ProhibitAmpersandSigils]

[Subroutines::ProhibitBuiltinHomonyms]

[-Subroutines::ProhibitExcessComplexity]
# The "complex" subroutines are not that bad and splitting them up
# would only obscure the logic.

[Subroutines::ProhibitExplicitReturnUndef]

[Subroutines::ProhibitManyArgs]

[Subroutines::ProhibitNestedSubs]

[Subroutines::ProhibitReturnSort]

[Subroutines::ProhibitSubroutinePrototypes]

[Subroutines::ProhibitUnusedPrivateSubroutines]

[Subroutines::ProtectPrivateSubs]

[Subroutines::RequireArgUnpacking]

[Subroutines::RequireFinalReturn]
terminal_funcs = fail skip error invocation_error subprocess_error

[TestingAndDebugging::ProhibitNoStrict]

[TestingAndDebugging::ProhibitNoWarnings]
allow = experimental::smartmatch experimental::re_strict

[TestingAndDebugging::ProhibitProlongedStrictureOverride]

[TestingAndDebugging::RequireTestLabels]

[TestingAndDebugging::RequireUseStrict]

[TestingAndDebugging::RequireUseWarnings]

[-TooMuchCode::ProhibitDuplicateLiteral]
# I don't agree with this style rule.

[TooMuchCode::ProhibitDuplicateSub]

[TooMuchCode::ProhibitExcessiveColons]

[TooMuchCode::ProhibitExtraStricture]

[TooMuchCode::ProhibitLargeBlock]

[TooMuchCode::ProhibitLargeTryBlock]

[TooMuchCode::ProhibitUnnecessaryScalarKeyword]

[-TooMuchCode::ProhibitUnnecessaryUTF8Pragma]
# We intentionally 'use utf8' in every file, regardless of whether it
# currently has non-ASCII characters in it.

[TooMuchCode::ProhibitUnusedConstant]

[TooMuchCode::ProhibitUnusedImport]

[TooMuchCode::ProhibitUnusedInclude]

[ValuesAndExpressions::ConstantBeforeLt]

[ValuesAndExpressions::NotWithCompare]

[ValuesAndExpressions::ProhibitArrayAssignAref]

[ValuesAndExpressions::ProhibitBarewordDoubleColon]

[ValuesAndExpressions::ProhibitCommaSeparatedStatements]

[ValuesAndExpressions::ProhibitComplexVersion]

[ValuesAndExpressions::ProhibitConstantPragma]

[ValuesAndExpressions::ProhibitDuplicateHashKeys]

[ValuesAndExpressions::ProhibitEmptyCommas]

[ValuesAndExpressions::ProhibitEmptyQuotes]

[ValuesAndExpressions::ProhibitEscapedCharacters]

[-ValuesAndExpressions::ProhibitFiletest_f]
# Doesn't understand the unusual, but unavoidable, uses of -f in this code
# (to identify executables without actually running them).

[ValuesAndExpressions::ProhibitImplicitNewlines]

[ValuesAndExpressions::ProhibitInterpolationOfLiterals]

[ValuesAndExpressions::ProhibitLeadingZeros]

[ValuesAndExpressions::ProhibitLongChainsOfMethodCalls]

[-ValuesAndExpressions::ProhibitMagicNumbers]
# I don't agree with this style rule.

[ValuesAndExpressions::ProhibitMismatchedOperators]

[ValuesAndExpressions::ProhibitMixedBooleanOperators]

[-ValuesAndExpressions::ProhibitNoisyQuotes]
# I don't agree with this style rule.

[ValuesAndExpressions::ProhibitNullStatements]

[ValuesAndExpressions::ProhibitQuotesAsQuotelikeOperatorDelimiters]

[ValuesAndExpressions::ProhibitSpecialLiteralHeredocTerminator]

[ValuesAndExpressions::ProhibitUnknownBackslash]

[-ValuesAndExpressions::ProhibitVersionStrings]
# Version strings were only problematic in versions of Perl older than
# our minimum.

[ValuesAndExpressions::RequireConstantVersion]

[ValuesAndExpressions::RequireInterpolationOfMetachars]

[ValuesAndExpressions::RequireNumberSeparators]

[ValuesAndExpressions::RequireNumericVersion]

[ValuesAndExpressions::RequireQuotedHeredocTerminator]

[ValuesAndExpressions::RequireUpperCaseHeredocTerminator]

[ValuesAndExpressions::UnexpandedSpecialLiteral]

[Variables::ProhibitAugmentedAssignmentInDeclaration]

[Variables::ProhibitConditionalDeclarations]

[Variables::ProhibitLocalVars]

[Variables::ProhibitLoopOnHash]

[Variables::ProhibitMatchVars]

[Variables::ProhibitPackageVars]

[Variables::ProhibitPerl4PackageNames]

[-Variables::ProhibitPunctuationVars]
# I don't agree with this style rule.

[Variables::ProhibitReusedNames]

[Variables::ProhibitUnusedVariables]

[Variables::ProtectPrivateVars]

[-Variables::RequireInitializationForLocalVars]
# I'd *like* to disable this *only* for $_, where the whole point is
# that it gets written to (and read from) implicitly, but that's not
# possible.

[Variables::RequireLexicalLoopIterators]

[Variables::RequireLocalizedPunctuationVars]

[Variables::RequireNegativeIndices]
