build:
  maxIssues: 0
  excludeCorrectable: false
  weights:
  # complexity: 2
  # LongParameterList: 1
  # style: 1
  # comments: 1

config:
  validation: true
  warningsAsErrors: false
  checkExhaustiveness: false
  # when writing own rules with new properties, exclude the property path e.g.: 'my_rule_set,.*>.*>[my_property]'
  excludes: ""

processors:
  active: true
  exclude:
    - "DetektProgressListener"
  # - 'KtFileCountProcessor'
  # - 'PackageCountProcessor'
  # - 'ClassCountProcessor'
  # - 'FunctionCountProcessor'
  # - 'PropertyCountProcessor'
  # - 'ProjectComplexityProcessor'
  # - 'ProjectCognitiveComplexityProcessor'
  # - 'ProjectLLOCProcessor'
  # - 'ProjectCLOCProcessor'
  # - 'ProjectLOCProcessor'
  # - 'ProjectSLOCProcessor'
  # - 'LicenseHeaderLoaderExtension'

console-reports:
  active: true
  exclude:
    - "ProjectStatisticsReport"
    - "ComplexityReport"
    - "NotificationReport"
    - "FindingsReport"
    - "FileBasedFindingsReport"
  #  - 'LiteFindingsReport'

output-reports:
  active: true
  exclude:
  # - 'TxtOutputReport'
  # - 'XmlOutputReport'
  # - 'HtmlOutputReport'
  # - 'MdOutputReport'
  # - 'SarifOutputReport'

comments:
  active: true
  AbsentOrWrongFileLicense:
    active: false
    licenseTemplateFile: "license.template"
    licenseTemplateIsRegex: false
  CommentOverPrivateFunction:
    active: false
  CommentOverPrivateProperty:
    active: false
  DeprecatedBlockTag:
    active: false
  EndOfSentenceFormat:
    active: false
    endOfSentenceFormat: '([.?!][ \t\n\r\f<])|([.?!:]$)'
  KDocReferencesNonPublicProperty:
    active: false
    excludes:
      [
        "**/test/**",
        "**/androidTest/**",
        "**/commonTest/**",
        "**/jvmTest/**",
        "**/androidUnitTest/**",
        "**/androidInstrumentedTest/**",
        "**/jsTest/**",
        "**/iosTest/**",
      ]
  OutdatedDocumentation:
    active: false
    matchTypeParameters: true
    matchDeclarationsOrder: true
    allowParamOnConstructorProperties: false
  UndocumentedPublicClass:
    active: false
    excludes:
      [
        "**/test/**",
        "**/androidTest/**",
        "**/commonTest/**",
        "**/jvmTest/**",
        "**/androidUnitTest/**",
        "**/androidInstrumentedTest/**",
        "**/jsTest/**",
        "**/iosTest/**",
      ]
    searchInNestedClass: true
    searchInInnerClass: true
    searchInInnerObject: true
    searchInInnerInterface: true
    searchInProtectedClass: false
  UndocumentedPublicFunction:
    active: false
    excludes:
      [
        "**/test/**",
        "**/androidTest/**",
        "**/commonTest/**",
        "**/jvmTest/**",
        "**/androidUnitTest/**",
        "**/androidInstrumentedTest/**",
        "**/jsTest/**",
        "**/iosTest/**",
      ]
    searchProtectedFunction: false
  UndocumentedPublicProperty:
    active: false
    excludes:
      [
        "**/test/**",
        "**/androidTest/**",
        "**/commonTest/**",
        "**/jvmTest/**",
        "**/androidUnitTest/**",
        "**/androidInstrumentedTest/**",
        "**/jsTest/**",
        "**/iosTest/**",
      ]
    searchProtectedProperty: false

complexity:
  active: true
  CognitiveComplexMethod:
    active: false
    threshold: 15
  ComplexCondition:
    active: true
    threshold: 4
  ComplexInterface:
    active: false
    threshold: 10
    includeStaticDeclarations: false
    includePrivateDeclarations: false
    ignoreOverloaded: false
  CyclomaticComplexMethod:
    active: true
    threshold: 15
    ignoreSingleWhenExpression: true
    ignoreSimpleWhenEntries: true
    ignoreNestingFunctions: false
    nestingFunctions:
      - "also"
      - "apply"
      - "forEach"
      - "isNotNull"
      - "ifNull"
      - "let"
      - "run"
      - "use"
      - "with"
  LabeledExpression:
    active: false
    ignoredLabels: []
  LargeClass:
    active: true
    threshold: 600
  LongMethod:
    active: true
    threshold: 200
  LongParameterList:
    active: true
    functionThreshold: 20
    constructorThreshold: 20
    ignoreDefaultParameters: true
    ignoreDataClasses: true
    ignoreAnnotatedParameter: []
  MethodOverloading:
    active: false
    threshold: 6
  NamedArguments:
    active: false
    threshold: 2
    ignoreArgumentsMatchingNames: false
  NestedBlockDepth:
    active: true
    threshold: 4
  NestedScopeFunctions:
    active: false
    threshold: 1
    functions:
      - "kotlin.apply"
      - "kotlin.run"
      - "kotlin.with"
      - "kotlin.let"
      - "kotlin.also"
  ReplaceSafeCallChainWithRun:
    active: false
  StringLiteralDuplication:
    active: false
    excludes:
      [
        "**/test/**",
        "**/androidTest/**",
        "**/commonTest/**",
        "**/jvmTest/**",
        "**/androidUnitTest/**",
        "**/androidInstrumentedTest/**",
        "**/jsTest/**",
        "**/iosTest/**",
      ]
    threshold: 3
    ignoreAnnotation: true
    excludeStringsWithLessThan5Characters: true
    ignoreStringsRegex: "$^"
  TooManyFunctions:
    active: false

coroutines:
  active: true
  GlobalCoroutineUsage:
    active: false
  InjectDispatcher:
    active: true
    dispatcherNames:
      - "IO"
      - "Default"
      - "Unconfined"
  RedundantSuspendModifier:
    active: true
  SleepInsteadOfDelay:
    active: true
  SuspendFunSwallowedCancellation:
    active: false
  SuspendFunWithCoroutineScopeReceiver:
    active: false
  SuspendFunWithFlowReturnType:
    active: true

empty-blocks:
  active: true
  EmptyCatchBlock:
    active: true
    allowedExceptionNameRegex: "_|(ignore|expected).*"
  EmptyClassBlock:
    active: true
  EmptyDefaultConstructor:
    active: true
  EmptyDoWhileBlock:
    active: true
  EmptyElseBlock:
    active: true
  EmptyFinallyBlock:
    active: true
  EmptyForBlock:
    active: true
  EmptyFunctionBlock:
    active: true
    ignoreOverridden: false
  EmptyIfBlock:
    active: true
  EmptyInitBlock:
    active: true
  EmptyKtFile:
    active: true
  EmptySecondaryConstructor:
    active: true
  EmptyTryBlock:
    active: true
  EmptyWhenBlock:
    active: true
  EmptyWhileBlock:
    active: true

exceptions:
  active: true
  ExceptionRaisedInUnexpectedLocation:
    active: true
    methodNames:
      - "equals"
      - "finalize"
      - "hashCode"
      - "toString"
  InstanceOfCheckForException:
    active: true
    excludes:
      [
        "**/test/**",
        "**/androidTest/**",
        "**/commonTest/**",
        "**/jvmTest/**",
        "**/androidUnitTest/**",
        "**/androidInstrumentedTest/**",
        "**/jsTest/**",
        "**/iosTest/**",
      ]
  NotImplementedDeclaration:
    active: false
  ObjectExtendsThrowable:
    active: false
  PrintStackTrace:
    active: true
  RethrowCaughtException:
    active: true
  ReturnFromFinally:
    active: true
    ignoreLabeled: false
  SwallowedException:
    active: true
    ignoredExceptionTypes:
      - "InterruptedException"
      - "MalformedURLException"
      - "NumberFormatException"
      - "ParseException"
    allowedExceptionNameRegex: "_|(ignore|expected).*"
  ThrowingExceptionFromFinally:
    active: true
  ThrowingExceptionInMain:
    active: false
  ThrowingExceptionsWithoutMessageOrCause:
    active: true
    excludes:
      [
        "**/test/**",
        "**/androidTest/**",
        "**/commonTest/**",
        "**/jvmTest/**",
        "**/androidUnitTest/**",
        "**/androidInstrumentedTest/**",
        "**/jsTest/**",
        "**/iosTest/**",
      ]
    exceptions:
      - "ArrayIndexOutOfBoundsException"
      - "Exception"
      - "IllegalArgumentException"
      - "IllegalMonitorStateException"
      - "IllegalStateException"
      - "IndexOutOfBoundsException"
      - "NullPointerException"
      - "RuntimeException"
      - "Throwable"
  ThrowingNewInstanceOfSameException:
    active: true
  TooGenericExceptionCaught:
    active: true
    excludes:
      [
        "**/test/**",
        "**/androidTest/**",
        "**/commonTest/**",
        "**/jvmTest/**",
        "**/androidUnitTest/**",
        "**/androidInstrumentedTest/**",
        "**/jsTest/**",
        "**/iosTest/**",
      ]
    exceptionNames:
      - "ArrayIndexOutOfBoundsException"
      - "Error"
      - "Exception"
      - "IllegalMonitorStateException"
      - "IndexOutOfBoundsException"
      - "NullPointerException"
      - "RuntimeException"
      - "Throwable"
    allowedExceptionNameRegex: "_|(ignore|expected).*"
  TooGenericExceptionThrown:
    active: true
    exceptionNames:
      - "Error"
      - "Exception"
      - "RuntimeException"
      - "Throwable"

naming:
  active: true
  BooleanPropertyNaming:
    active: false
    allowedPattern: "^(is|has|are)"
  ClassNaming:
    active: true
    classPattern: "[A-Z][a-zA-Z0-9]*"
  ConstructorParameterNaming:
    active: true
    parameterPattern: "[a-z][A-Za-z0-9]*"
    privateParameterPattern: "[a-z][A-Za-z0-9]*"
    excludeClassPattern: "$^"
  EnumNaming:
    active: true
    enumEntryPattern: "[A-Z][_a-zA-Z0-9]*"
  ForbiddenClassName:
    active: false
    forbiddenName: []
  FunctionMaxLength:
    active: false
    maximumFunctionNameLength: 30
  FunctionMinLength:
    active: false
    minimumFunctionNameLength: 3
  FunctionNaming:
    active: true
    excludes:
      [
        "**/test/**",
        "**/androidTest/**",
        "**/commonTest/**",
        "**/jvmTest/**",
        "**/androidUnitTest/**",
        "**/androidInstrumentedTest/**",
        "**/jsTest/**",
        "**/iosTest/**",
      ]
    functionPattern: "[a-zA-Z][a-zA-Z0-9]*"
    excludeClassPattern: "$^"
    ignoreAnnotated: ["Composable"]
  FunctionParameterNaming:
    active: true
    parameterPattern: "[a-z][A-Za-z0-9]*"
    excludeClassPattern: "$^"
  InvalidPackageDeclaration:
    active: true
    rootPackage: ""
    requireRootInDeclaration: false
  LambdaParameterNaming:
    active: false
    parameterPattern: "[a-z][A-Za-z0-9]*|_"
  MatchingDeclarationName:
    active: true
    mustBeFirst: true
  MemberNameEqualsClassName:
    active: true
    ignoreOverridden: true
  NoNameShadowing:
    active: true
  NonBooleanPropertyPrefixedWithIs:
    active: false
  ObjectPropertyNaming:
    active: true
    constantPattern: "[A-Za-z][_A-Za-z0-9]*"
    propertyPattern: "[A-Za-z][_A-Za-z0-9]*"
    privatePropertyPattern: "(_)?[A-Za-z][_A-Za-z0-9]*"
  PackageNaming:
    active: true
    packagePattern: '[a-z]+(\.[a-z][A-Za-z0-9_]*)*'
  TopLevelPropertyNaming:
    active: true
    constantPattern: "[A-Z][_A-Z0-9]*"
    propertyPattern: "[A-Za-z][_A-Za-z0-9]*"
    privatePropertyPattern: "_?[A-Za-z][_A-Za-z0-9]*"
  VariableMaxLength:
    active: false
    maximumVariableNameLength: 64
  VariableMinLength:
    active: false
    minimumVariableNameLength: 1
  VariableNaming:
    active: true
    variablePattern: "[a-z][A-Za-z0-9]*"
    privateVariablePattern: "(_)?[a-z][A-Za-z0-9]*"
    excludeClassPattern: "$^"

performance:
  active: true
  ArrayPrimitive:
    active: true
  CouldBeSequence:
    active: false
    threshold: 3
  ForEachOnRange:
    active: true
    excludes:
      [
        "**/test/**",
        "**/androidTest/**",
        "**/commonTest/**",
        "**/jvmTest/**",
        "**/androidUnitTest/**",
        "**/androidInstrumentedTest/**",
        "**/jsTest/**",
        "**/iosTest/**",
      ]
  SpreadOperator:
    active: true
    excludes:
      [
        "**/test/**",
        "**/androidTest/**",
        "**/commonTest/**",
        "**/jvmTest/**",
        "**/androidUnitTest/**",
        "**/androidInstrumentedTest/**",
        "**/jsTest/**",
        "**/iosTest/**",
      ]
  UnnecessaryPartOfBinaryExpression:
    active: false
  UnnecessaryTemporaryInstantiation:
    active: true

potential-bugs:
  active: true
  AvoidReferentialEquality:
    active: true
    forbiddenTypePatterns:
      - "kotlin.String"
  CastNullableToNonNullableType:
    active: false
  CastToNullableType:
    active: false
  Deprecation:
    active: false
  DontDowncastCollectionTypes:
    active: false
  DoubleMutabilityForCollection:
    active: true
    mutableTypes:
      - "kotlin.collections.MutableList"
      - "kotlin.collections.MutableMap"
      - "kotlin.collections.MutableSet"
      - "java.util.ArrayList"
      - "java.util.LinkedHashSet"
      - "java.util.HashSet"
      - "java.util.LinkedHashMap"
      - "java.util.HashMap"
  ElseCaseInsteadOfExhaustiveWhen:
    active: false
    ignoredSubjectTypes: []
  EqualsAlwaysReturnsTrueOrFalse:
    active: true
  EqualsWithHashCodeExist:
    active: true
  ExitOutsideMain:
    active: false
  ExplicitGarbageCollectionCall:
    active: true
  HasPlatformType:
    active: true
  IgnoredReturnValue:
    active: true
    restrictToConfig: true
    returnValueAnnotations:
      - "CheckResult"
      - "*.CheckResult"
      - "CheckReturnValue"
      - "*.CheckReturnValue"
    ignoreReturnValueAnnotations:
      - "CanIgnoreReturnValue"
      - "*.CanIgnoreReturnValue"
    returnValueTypes:
      - "kotlin.sequences.Sequence"
      - "kotlinx.coroutines.flow.*Flow"
      - "java.util.stream.*Stream"
    ignoreFunctionCall: []
  ImplicitDefaultLocale:
    active: true
  ImplicitUnitReturnType:
    active: false
    allowExplicitReturnType: true
  InvalidRange:
    active: true
  IteratorHasNextCallsNextMethod:
    active: true
  IteratorNotThrowingNoSuchElementException:
    active: true
  LateinitUsage:
    active: false
    excludes:
      [
        "**/test/**",
        "**/androidTest/**",
        "**/commonTest/**",
        "**/jvmTest/**",
        "**/androidUnitTest/**",
        "**/androidInstrumentedTest/**",
        "**/jsTest/**",
        "**/iosTest/**",
      ]
    ignoreOnClassesPattern: ""
  MapGetWithNotNullAssertionOperator:
    active: true
  MissingPackageDeclaration:
    active: false
    excludes: ["**/*.kts"]
  NullCheckOnMutableProperty:
    active: false
  NullableToStringCall:
    active: false
  PropertyUsedBeforeDeclaration:
    active: false
  UnconditionalJumpStatementInLoop:
    active: false
  UnnecessaryNotNullCheck:
    active: false
  UnnecessaryNotNullOperator:
    active: true
  UnnecessarySafeCall:
    active: true
  UnreachableCatchBlock:
    active: true
  UnreachableCode:
    active: true
  UnsafeCallOnNullableType:
    active: true
    excludes:
      [
        "**/test/**",
        "**/androidTest/**",
        "**/commonTest/**",
        "**/jvmTest/**",
        "**/androidUnitTest/**",
        "**/androidInstrumentedTest/**",
        "**/jsTest/**",
        "**/iosTest/**",
      ]
  UnsafeCast:
    active: true
  UnusedUnaryOperator:
    active: true
  UselessPostfixExpression:
    active: true
  WrongEqualsTypeParameter:
    active: true

style:
  active: true
  AlsoCouldBeApply:
    active: false
  BracesOnIfStatements:
    active: false
    singleLine: "never"
    multiLine: "always"
  BracesOnWhenStatements:
    active: false
    singleLine: "necessary"
    multiLine: "consistent"
  CanBeNonNullable:
    active: false
  CascadingCallWrapping:
    active: false
    includeElvis: true
  ClassOrdering:
    active: false
  CollapsibleIfStatements:
    active: false
  DataClassContainsFunctions:
    active: false
    conversionFunctionPrefix:
      - "to"
    allowOperators: false
  DataClassShouldBeImmutable:
    active: false
  DestructuringDeclarationWithTooManyEntries:
    active: true
    maxDestructuringEntries: 3
  DoubleNegativeLambda:
    active: false
    negativeFunctions:
      - reason: "Use `takeIf` instead."
        value: "takeUnless"
      - reason: "Use `all` instead."
        value: "none"
    negativeFunctionNameParts:
      - "not"
      - "non"
  EqualsNullCall:
    active: true
  EqualsOnSignatureLine:
    active: false
  ExplicitCollectionElementAccessMethod:
    active: false
  ExplicitItLambdaParameter:
    active: true
  ExpressionBodySyntax:
    active: false
    includeLineWrapping: false
  ForbiddenAnnotation:
    active: false
    annotations:
      - reason: "it is a java annotation. Use `Suppress` instead."
        value: "java.lang.SuppressWarnings"
      - reason: "it is a java annotation. Use `kotlin.Deprecated` instead."
        value: "java.lang.Deprecated"
      - reason: "it is a java annotation. Use `kotlin.annotation.MustBeDocumented` instead."
        value: "java.lang.annotation.Documented"
      - reason: "it is a java annotation. Use `kotlin.annotation.Target` instead."
        value: "java.lang.annotation.Target"
      - reason: "it is a java annotation. Use `kotlin.annotation.Retention` instead."
        value: "java.lang.annotation.Retention"
      - reason: "it is a java annotation. Use `kotlin.annotation.Repeatable` instead."
        value: "java.lang.annotation.Repeatable"
      - reason: "Kotlin does not support @Inherited annotation, see https://youtrack.jetbrains.com/issue/KT-22265"
        value: "java.lang.annotation.Inherited"
  ForbiddenComment:
    active: true
    comments:
      - reason: "Forbidden FIXME todo marker in comment, please fix the problem."
        value: "FIXME:"
      - reason: "Forbidden STOPSHIP todo marker in comment, please address the problem before shipping the code."
        value: "STOPSHIP:"
      - reason: "Forbidden TODO todo marker in comment, please do the changes."
        value: "TODO:"
    allowedPatterns: ""
  ForbiddenImport:
    active: false
    imports: []
    forbiddenPatterns: ""
  ForbiddenMethodCall:
    active: false
    methods:
      - reason: "print does not allow you to configure the output stream. Use a logger instead."
        value: "kotlin.io.print"
      - reason: "println does not allow you to configure the output stream. Use a logger instead."
        value: "kotlin.io.println"
  ForbiddenSuppress:
    active: false
    rules: []
  ForbiddenVoid:
    active: true
    ignoreOverridden: false
    ignoreUsageInGenerics: false
  FunctionOnlyReturningConstant:
    active: true
    ignoreOverridableFunction: true
    ignoreActualFunction: true
    excludedFunctions: []
  LoopWithTooManyJumpStatements:
    active: true
    maxJumpCount: 1
  MagicNumber:
    active: true
    excludes:
      [
        "**/test/**",
        "**/androidTest/**",
        "**/commonTest/**",
        "**/jvmTest/**",
        "**/androidUnitTest/**",
        "**/androidInstrumentedTest/**",
        "**/jsTest/**",
        "**/iosTest/**",
        "**/*.kts",
      ]
    ignoreNumbers:
      - "-1"
      - "0"
      - "1"
      - "2"
    ignoreHashCodeFunction: true
    ignorePropertyDeclaration: false
    ignoreLocalVariableDeclaration: false
    ignoreConstantDeclaration: true
    ignoreCompanionObjectPropertyDeclaration: true
    ignoreAnnotation: false
    ignoreNamedArgument: true
    ignoreEnums: false
    ignoreRanges: false
    ignoreExtensionFunctions: true
  MandatoryBracesLoops:
    active: false
  MaxChainedCallsOnSameLine:
    active: false
    maxChainedCalls: 5
  MaxLineLength:
    active: true
    maxLineLength: 120
    excludePackageStatements: true
    excludeImportStatements: true
    excludeCommentStatements: false
    excludeRawStrings: true
  MayBeConst:
    active: true
  ModifierOrder:
    active: true
  MultilineLambdaItParameter:
    active: false
  MultilineRawStringIndentation:
    active: false
    indentSize: 4
    trimmingMethods:
      - "trimIndent"
      - "trimMargin"
  NestedClassesVisibility:
    active: true
  NewLineAtEndOfFile:
    active: true
  NoTabs:
    active: false
  NullableBooleanCheck:
    active: false
  ObjectLiteralToLambda:
    active: true
  OptionalAbstractKeyword:
    active: true
  OptionalUnit:
    active: false
  PreferToOverPairSyntax:
    active: false
  ProtectedMemberInFinalClass:
    active: true
  RedundantExplicitType:
    active: false
  RedundantHigherOrderMapUsage:
    active: true
  RedundantVisibilityModifierRule:
    active: false
  ReturnCount:
    active: true
    max: 2
    excludedFunctions:
      - "equals"
    excludeLabeled: false
    excludeReturnFromLambda: true
    excludeGuardClauses: false
  SafeCast:
    active: true
  SerialVersionUIDInSerializableClass:
    active: true
  SpacingBetweenPackageAndImports:
    active: false
  StringShouldBeRawString:
    active: false
    maxEscapedCharacterCount: 2
    ignoredCharacters: []
  ThrowsCount:
    active: true
    max: 2
    excludeGuardClauses: false
  TrailingWhitespace:
    active: false
  TrimMultilineRawString:
    active: false
    trimmingMethods:
      - "trimIndent"
      - "trimMargin"
  UnderscoresInNumericLiterals:
    active: false
    acceptableLength: 4
    allowNonStandardGrouping: false
  UnnecessaryAbstractClass:
    active: true
  UnnecessaryAnnotationUseSiteTarget:
    active: false
  UnnecessaryApply:
    active: true
  UnnecessaryBackticks:
    active: false
  UnnecessaryBracesAroundTrailingLambda:
    active: false
  UnnecessaryFilter:
    active: true
  UnnecessaryInheritance:
    active: true
  UnnecessaryInnerClass:
    active: false
  UnnecessaryLet:
    active: false
  UnnecessaryParentheses:
    active: false
    allowForUnclearPrecedence: false
  UntilInsteadOfRangeTo:
    active: false
  UnusedImports:
    active: false
  UnusedParameter:
    active: true
    allowedNames: "ignored|expected"
  UnusedPrivateClass:
    active: true
  UnusedPrivateMember:
    active: true
    allowedNames: ""
    ignoreAnnotated: ["Preview", "Composable"]
  UnusedPrivateProperty:
    active: true
    allowedNames: "_|ignored|expected|serialVersionUID"
  UseAnyOrNoneInsteadOfFind:
    active: true
  UseArrayLiteralsInAnnotations:
    active: true
  UseCheckNotNull:
    active: true
  UseCheckOrError:
    active: true
  UseDataClass:
    active: false
    allowVars: false
  UseEmptyCounterpart:
    active: false
  UseIfEmptyOrIfBlank:
    active: false
  UseIfInsteadOfWhen:
    active: false
    ignoreWhenContainingVariableDeclaration: false
  UseIsNullOrEmpty:
    active: true
  UseLet:
    active: false
  UseOrEmpty:
    active: true
  UseRequire:
    active: true
  UseRequireNotNull:
    active: true
  UseSumOfInsteadOfFlatMapSize:
    active: false
  UselessCallOnNotNull:
    active: true
  UtilityClassWithPublicConstructor:
    active: true
  VarCouldBeVal:
    active: true
    ignoreLateinitVar: false
  WildcardImport:
    active: true
    excludeImports:
      - "java.util.*"
