diff --git a/build.gradle b/build.gradle index 9a8fdc44..f5474216 100644 --- a/build.gradle +++ b/build.gradle @@ -4,18 +4,27 @@ buildscript { repositories { jcenter() - maven { - url "https://plugins.gradle.org/m2/" - } + maven { url "https://plugins.gradle.org/m2/" } } dependencies { classpath gradlePlugins.androidTools classpath gradlePlugins.kotlin classpath gradlePlugins.ktlintGradle + classpath(gradlePlugins.detekt) { + exclude module: 'kotlin-compiler-embeddable' + exclude module: 'kotlin-stdlib' + } } } allprojects { + // Buildscript here is required by detekt + buildscript { + repositories { + jcenter() + } + } + repositories { jcenter() } diff --git a/dependencies.gradle b/dependencies.gradle index b4802ddc..62480c11 100644 --- a/dependencies.gradle +++ b/dependencies.gradle @@ -7,6 +7,7 @@ ext.versions = [ androidTools : "2.3.3", ktlint : "0.9.0", ktlintGradle : "2.1.0", + detekt : "1.0.0.M13.2", androidSupport : "22.2.1", @@ -26,6 +27,7 @@ ext.gradlePlugins = [ androidTools : "com.android.tools.build:gradle:$versions.androidTools", kotlin : "org.jetbrains.kotlin:kotlin-gradle-plugin:$versions.kotlin", ktlintGradle : "gradle.plugin.org.jlleitschuh.gradle:ktlint-gradle:$versions.ktlintGradle", + detekt : "io.gitlab.arturbosch.detekt:detekt-gradle-plugin:$versions.detekt", ] ext.androidSupport = [ @@ -45,7 +47,7 @@ ext.other = [ ext.testing = [ junit : "junit:junit:$versions.junit", kotlinJunit : "org.jetbrains.kotlin:kotlin-test-junit:$versions.kotlin", - kotlinReflect : "org.jetbrains.kotlin:kotlin-reflect:$versions.kotlin", + kotlinReflect : "org.jetbrains.kotlin:kotlin-reflect:$versions.kotlin", mockitoKotlin : "com.nhaarman:mockito-kotlin:$versions.mockitoKotlin", kluent : "org.amshove.kluent:kluent:$versions.kluent", mockWebServer : "com.squareup.okhttp3:mockwebserver:$versions.okhttp", diff --git a/detekt-config.yml b/detekt-config.yml new file mode 100644 index 00000000..985b704c --- /dev/null +++ b/detekt-config.yml @@ -0,0 +1,111 @@ +autoCorrect: true +failFast: false + +build: + warningThreshold: 0 + failThreshold: 0 + weights: + complexity: 2 + formatting: 1 + LongParameterList: 1 + comments: 1 + +potential-bugs: + active: true + DuplicateCaseInWhenExpression: + active: true + EqualsWithHashCodeExist: + active: true + ExplicitGarbageCollectionCall: + active: true + LateinitUsage: + active: false + UnsafeCallOnNullableType: + active: false + UnsafeCast: + active: false + +performance: + active: true + ForEachOnRange: + active: true + SpreadOperator: + active: true + +exceptions: + active: true + +empty-blocks: + active: true + +complexity: + active: true + LongMethod: + threshold: 20 + LongParameterList: + threshold: 5 + LargeClass: + threshold: 150 + ComplexMethod: + threshold: 10 + TooManyFunctions: + threshold: 10 + ComplexCondition: + threshold: 3 + LabeledExpression: + active: false + +code-smell: + active: true + FeatureEnvy: + threshold: 0.5 + weight: 0.45 + base: 0.5 + +formatting: + active: false + +style: + active: true + NewLineAtEndOfFile: + active: true + ForbiddenComment: + active: true + values: 'TODO:,FIXME:,STOPSHIP:' + WildcardImport: + active: true + MaxLineLength: + active: true + maxLineLength: 120 + excludePackageStatements: false + excludeImportStatements: false + NamingConventionViolation: + active: true + variablePattern: '^(_)?[a-z$][a-zA-Z$0-9]*$' + constantPattern: '^([A-Z_]*|serialVersionUID)$' + methodPattern: '^[a-z\s`$][a-zA-Z\s$0-9`]*$' + classPattern: '[A-Z$][a-zA-Z$]*' + enumEntryPattern: '^[A-Z$][a-zA-Z_$0-9]*$' + +comments: + active: true + CommentOverPrivateMethod: + active: true + CommentOverPrivateProperty: + active: true + UndocumentedPublicClass: + active: false + searchInNestedClass: true + searchInInnerClass: true + searchInInnerInterface: true + UndocumentedPublicFunction: + active: false + +# *experimental feature* +# Migration rules can be defined in the same config file or a new one +migration: + active: false + imports: + # your.package.Class: new.package.or.Class + # for example: + # io.gitlab.arturbosch.detekt.api.Rule: io.gitlab.arturbosch.detekt.rule.Rule diff --git a/gradle_scripts/code_quality.gradle b/gradle_scripts/code_quality.gradle index df65df11..1954d03f 100644 --- a/gradle_scripts/code_quality.gradle +++ b/gradle_scripts/code_quality.gradle @@ -1,10 +1,28 @@ // Applies code quality plugins when -Pqc is passed to the gradle def isCodeQualityEnabled = project.hasProperty('qc') +// KtLint if (isCodeQualityEnabled) { apply plugin: "org.jlleitschuh.gradle.ktlint" ktlint { version = versions.ktlint } +} + +// Detekt +if (isCodeQualityEnabled) { + if (!project.rootProject.plugins.hasPlugin("io.gitlab.arturbosch.detekt")) { + Project rootProject = project.rootProject + rootProject.apply { + apply plugin: "io.gitlab.arturbosch.detekt" + + detekt { + version = versions.detekt + profile("main") { + config = "${rootProject.projectDir}/detekt-config.yml" + } + } + } + } } \ No newline at end of file