From 07c2bfaeaf73529a06deba0edf060b3f19f66909 Mon Sep 17 00:00:00 2001 From: Yahor Berdnikau Date: Sun, 30 Jul 2017 17:05:57 +0200 Subject: [PATCH 1/3] Add detekt - static code analysis tool for Kotlin. Signed-off-by: Yahor Berdnikau --- build.gradle | 15 +++- dependencies.gradle | 4 +- detekt-config.yml | 111 +++++++++++++++++++++++++++++ gradle_scripts/code_quality.gradle | 18 +++++ 4 files changed, 144 insertions(+), 4 deletions(-) create mode 100644 detekt-config.yml 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 From 317ccd2ed8453e1c77daaf27d329ce6034ee32bb Mon Sep 17 00:00:00 2001 From: Yahor Berdnikau Date: Sun, 30 Jul 2017 22:23:20 +0200 Subject: [PATCH 2/3] Fix detekt issues. Signed-off-by: Yahor Berdnikau --- .../ultrasonic/api/subsonic/SubsonicAPIClientTest.kt | 9 +++++---- .../ultrasonic/api/subsonic/rules/MockWebServerRule.kt | 2 +- .../moire/ultrasonic/api/subsonic/SubsonicAPIClient.kt | 2 +- .../ultrasonic/api/subsonic/SubsonicAPIDefinition.kt | 2 +- .../moire/ultrasonic/api/subsonic/SubsonicAPIVersions.kt | 2 +- .../org/moire/ultrasonic/api/subsonic/SubsonicError.kt | 2 +- .../org/moire/ultrasonic/api/subsonic/models/Artist.kt | 2 +- .../org/moire/ultrasonic/api/subsonic/models/Index.kt | 2 +- .../org/moire/ultrasonic/api/subsonic/models/Indexes.kt | 2 +- .../org/moire/ultrasonic/api/subsonic/models/License.kt | 2 +- .../ultrasonic/api/subsonic/models/MusicDirectory.kt | 2 +- .../api/subsonic/models/MusicDirectoryChild.kt | 2 +- .../moire/ultrasonic/api/subsonic/models/MusicFolder.kt | 2 +- .../api/subsonic/response/GetIndexesResponse.kt | 2 +- .../api/subsonic/response/GetMusicDirectoryResponse.kt | 2 +- .../ultrasonic/api/subsonic/response/LicenseResponse.kt | 2 +- .../api/subsonic/response/MusicFoldersResponse.kt | 2 +- .../ultrasonic/api/subsonic/response/SubsonicResponse.kt | 2 +- .../api/subsonic/SubsonicAPIVersionsDeserializerTest.kt | 2 +- .../ultrasonic/api/subsonic/SubsonicAPIVersionsTest.kt | 2 +- .../moire/ultrasonic/api/subsonic/SubsonicErrorTest.kt | 2 +- .../moire/ultrasonic/api/subsonic/models/StatusTest.kt | 2 +- .../org/moire/ultrasonic/data/SubsonicAPIConverter.kt | 2 +- .../kotlin/org/moire/ultrasonic/data/APIConverterTest.kt | 2 +- 24 files changed, 28 insertions(+), 27 deletions(-) diff --git a/subsonic-api/src/integrationTest/kotlin/org/moire/ultrasonic/api/subsonic/SubsonicAPIClientTest.kt b/subsonic-api/src/integrationTest/kotlin/org/moire/ultrasonic/api/subsonic/SubsonicAPIClientTest.kt index 41d1dd63..0ef9c981 100644 --- a/subsonic-api/src/integrationTest/kotlin/org/moire/ultrasonic/api/subsonic/SubsonicAPIClientTest.kt +++ b/subsonic-api/src/integrationTest/kotlin/org/moire/ultrasonic/api/subsonic/SubsonicAPIClientTest.kt @@ -30,6 +30,7 @@ import java.util.TimeZone /** * Integration test for [SubsonicAPIClient] class. */ +@Suppress("TooManyFunctions") class SubsonicAPIClientTest { companion object { const val USERNAME = "some-user" @@ -49,7 +50,7 @@ class SubsonicAPIClientTest { } @Test - fun `Should pass password hash and salt in query params for api version 1_13_0`() { + fun `Should pass password hash and salt in query params for api version 1 13 0`() { val clientV12 = SubsonicAPIClient(mockWebServerRule.mockWebServer.url("/").toString(), USERNAME, PASSWORD, SubsonicAPIVersions.V1_14_0, CLIENT_ID) enqueueResponse("ping_ok.json") @@ -70,7 +71,7 @@ class SubsonicAPIClientTest { } @Test - fun `Should pass hex encoded password in query params for api version 1_12_0`() { + fun `Should pass hex encoded password in query params for api version 1 12 0`() { val clientV11 = SubsonicAPIClient(mockWebServerRule.mockWebServer.url("/").toString(), USERNAME, PASSWORD, SubsonicAPIVersions.V1_12_0, CLIENT_ID) enqueueResponse("ping_ok.json") @@ -153,7 +154,7 @@ class SubsonicAPIClientTest { @Test fun `Should parse get indexes ok response`() { - // TODO: check for shortcut parsing + // check for shortcut parsing enqueueResponse("get_indexes_ok.json") val response = client.api.getIndexes(null, null).execute() @@ -303,4 +304,4 @@ class SubsonicAPIClientTest { version `should be` SubsonicAPIVersions.V1_13_0 error `should be` null } -} \ No newline at end of file +} diff --git a/subsonic-api/src/integrationTest/kotlin/org/moire/ultrasonic/api/subsonic/rules/MockWebServerRule.kt b/subsonic-api/src/integrationTest/kotlin/org/moire/ultrasonic/api/subsonic/rules/MockWebServerRule.kt index 022457f5..0be7a746 100644 --- a/subsonic-api/src/integrationTest/kotlin/org/moire/ultrasonic/api/subsonic/rules/MockWebServerRule.kt +++ b/subsonic-api/src/integrationTest/kotlin/org/moire/ultrasonic/api/subsonic/rules/MockWebServerRule.kt @@ -24,4 +24,4 @@ class MockWebServerRule : TestRule { } return ruleStatement } -} \ No newline at end of file +} diff --git a/subsonic-api/src/main/kotlin/org/moire/ultrasonic/api/subsonic/SubsonicAPIClient.kt b/subsonic-api/src/main/kotlin/org/moire/ultrasonic/api/subsonic/SubsonicAPIClient.kt index 24bf597a..3fb739ed 100644 --- a/subsonic-api/src/main/kotlin/org/moire/ultrasonic/api/subsonic/SubsonicAPIClient.kt +++ b/subsonic-api/src/main/kotlin/org/moire/ultrasonic/api/subsonic/SubsonicAPIClient.kt @@ -110,4 +110,4 @@ class SubsonicAPIClient(baseUrl: String, this.addQueryParameter("s", salt) } } -} \ No newline at end of file +} diff --git a/subsonic-api/src/main/kotlin/org/moire/ultrasonic/api/subsonic/SubsonicAPIDefinition.kt b/subsonic-api/src/main/kotlin/org/moire/ultrasonic/api/subsonic/SubsonicAPIDefinition.kt index 9a5c3ef5..59d06f6c 100644 --- a/subsonic-api/src/main/kotlin/org/moire/ultrasonic/api/subsonic/SubsonicAPIDefinition.kt +++ b/subsonic-api/src/main/kotlin/org/moire/ultrasonic/api/subsonic/SubsonicAPIDefinition.kt @@ -30,4 +30,4 @@ interface SubsonicAPIDefinition { @GET("getMusicDirectory.view") fun getMusicDirectory(@Query("id") id: Long): Call -} \ No newline at end of file +} diff --git a/subsonic-api/src/main/kotlin/org/moire/ultrasonic/api/subsonic/SubsonicAPIVersions.kt b/subsonic-api/src/main/kotlin/org/moire/ultrasonic/api/subsonic/SubsonicAPIVersions.kt index 27a8421a..2fad147c 100644 --- a/subsonic-api/src/main/kotlin/org/moire/ultrasonic/api/subsonic/SubsonicAPIVersions.kt +++ b/subsonic-api/src/main/kotlin/org/moire/ultrasonic/api/subsonic/SubsonicAPIVersions.kt @@ -61,4 +61,4 @@ enum class SubsonicAPIVersions(val subsonicVersions: String, val restApiVersion: } } } -} \ No newline at end of file +} diff --git a/subsonic-api/src/main/kotlin/org/moire/ultrasonic/api/subsonic/SubsonicError.kt b/subsonic-api/src/main/kotlin/org/moire/ultrasonic/api/subsonic/SubsonicError.kt index d6b7160a..06bbd508 100644 --- a/subsonic-api/src/main/kotlin/org/moire/ultrasonic/api/subsonic/SubsonicError.kt +++ b/subsonic-api/src/main/kotlin/org/moire/ultrasonic/api/subsonic/SubsonicError.kt @@ -35,4 +35,4 @@ enum class SubsonicError(val code: Int) { } } } -} \ No newline at end of file +} diff --git a/subsonic-api/src/main/kotlin/org/moire/ultrasonic/api/subsonic/models/Artist.kt b/subsonic-api/src/main/kotlin/org/moire/ultrasonic/api/subsonic/models/Artist.kt index c1ca8d42..47210bb5 100644 --- a/subsonic-api/src/main/kotlin/org/moire/ultrasonic/api/subsonic/models/Artist.kt +++ b/subsonic-api/src/main/kotlin/org/moire/ultrasonic/api/subsonic/models/Artist.kt @@ -4,4 +4,4 @@ import java.util.Calendar data class Artist(val id: Long, val name: String, - val starred: Calendar?) \ No newline at end of file + val starred: Calendar?) diff --git a/subsonic-api/src/main/kotlin/org/moire/ultrasonic/api/subsonic/models/Index.kt b/subsonic-api/src/main/kotlin/org/moire/ultrasonic/api/subsonic/models/Index.kt index fd42a465..4a31bdec 100644 --- a/subsonic-api/src/main/kotlin/org/moire/ultrasonic/api/subsonic/models/Index.kt +++ b/subsonic-api/src/main/kotlin/org/moire/ultrasonic/api/subsonic/models/Index.kt @@ -4,4 +4,4 @@ import com.fasterxml.jackson.annotation.JsonProperty data class Index(val name: String, @JsonProperty("artist") - val artists: List) \ No newline at end of file + val artists: List) diff --git a/subsonic-api/src/main/kotlin/org/moire/ultrasonic/api/subsonic/models/Indexes.kt b/subsonic-api/src/main/kotlin/org/moire/ultrasonic/api/subsonic/models/Indexes.kt index 93c74297..963aea4f 100644 --- a/subsonic-api/src/main/kotlin/org/moire/ultrasonic/api/subsonic/models/Indexes.kt +++ b/subsonic-api/src/main/kotlin/org/moire/ultrasonic/api/subsonic/models/Indexes.kt @@ -6,4 +6,4 @@ data class Indexes(val lastModified: Long, val ignoredArticles: String?, @JsonProperty("index") val indexList: List, - val shortcuts: List?) \ No newline at end of file + val shortcuts: List?) diff --git a/subsonic-api/src/main/kotlin/org/moire/ultrasonic/api/subsonic/models/License.kt b/subsonic-api/src/main/kotlin/org/moire/ultrasonic/api/subsonic/models/License.kt index d323ff74..efe819d4 100644 --- a/subsonic-api/src/main/kotlin/org/moire/ultrasonic/api/subsonic/models/License.kt +++ b/subsonic-api/src/main/kotlin/org/moire/ultrasonic/api/subsonic/models/License.kt @@ -6,4 +6,4 @@ data class License( val valid: Boolean = false, val email: String = "", val trialExpires: Calendar = Calendar.getInstance(), - val licenseExpires: Calendar = Calendar.getInstance()) \ No newline at end of file + val licenseExpires: Calendar = Calendar.getInstance()) diff --git a/subsonic-api/src/main/kotlin/org/moire/ultrasonic/api/subsonic/models/MusicDirectory.kt b/subsonic-api/src/main/kotlin/org/moire/ultrasonic/api/subsonic/models/MusicDirectory.kt index 10d0d0eb..1a6f1ea6 100644 --- a/subsonic-api/src/main/kotlin/org/moire/ultrasonic/api/subsonic/models/MusicDirectory.kt +++ b/subsonic-api/src/main/kotlin/org/moire/ultrasonic/api/subsonic/models/MusicDirectory.kt @@ -7,4 +7,4 @@ data class MusicDirectory(val id: Long, val name: String, val starred: Calendar?, @JsonProperty("child") - val childList: List = emptyList()) \ No newline at end of file + val childList: List = emptyList()) diff --git a/subsonic-api/src/main/kotlin/org/moire/ultrasonic/api/subsonic/models/MusicDirectoryChild.kt b/subsonic-api/src/main/kotlin/org/moire/ultrasonic/api/subsonic/models/MusicDirectoryChild.kt index d4eb331d..28aeffb1 100644 --- a/subsonic-api/src/main/kotlin/org/moire/ultrasonic/api/subsonic/models/MusicDirectoryChild.kt +++ b/subsonic-api/src/main/kotlin/org/moire/ultrasonic/api/subsonic/models/MusicDirectoryChild.kt @@ -6,4 +6,4 @@ data class MusicDirectoryChild(val id: Long, val parent: Long, val isDir: Boolea val title: String = "", val album: String = "", val artist: String = "", val year: Int?, val genre: String = "", val coverArt: Long = -1, - val created: Calendar, val starred: Calendar?) \ No newline at end of file + val created: Calendar, val starred: Calendar?) diff --git a/subsonic-api/src/main/kotlin/org/moire/ultrasonic/api/subsonic/models/MusicFolder.kt b/subsonic-api/src/main/kotlin/org/moire/ultrasonic/api/subsonic/models/MusicFolder.kt index 291a55e1..66c68f48 100644 --- a/subsonic-api/src/main/kotlin/org/moire/ultrasonic/api/subsonic/models/MusicFolder.kt +++ b/subsonic-api/src/main/kotlin/org/moire/ultrasonic/api/subsonic/models/MusicFolder.kt @@ -1,3 +1,3 @@ package org.moire.ultrasonic.api.subsonic.models -data class MusicFolder(val id: Long = -1, val name: String = "") \ No newline at end of file +data class MusicFolder(val id: Long = -1, val name: String = "") diff --git a/subsonic-api/src/main/kotlin/org/moire/ultrasonic/api/subsonic/response/GetIndexesResponse.kt b/subsonic-api/src/main/kotlin/org/moire/ultrasonic/api/subsonic/response/GetIndexesResponse.kt index 0224def3..331f147f 100644 --- a/subsonic-api/src/main/kotlin/org/moire/ultrasonic/api/subsonic/response/GetIndexesResponse.kt +++ b/subsonic-api/src/main/kotlin/org/moire/ultrasonic/api/subsonic/response/GetIndexesResponse.kt @@ -8,4 +8,4 @@ class GetIndexesResponse(status: Status, version: SubsonicAPIVersions, error: SubsonicError?, val indexes: Indexes?) : - SubsonicResponse(status, version, error) \ No newline at end of file + SubsonicResponse(status, version, error) diff --git a/subsonic-api/src/main/kotlin/org/moire/ultrasonic/api/subsonic/response/GetMusicDirectoryResponse.kt b/subsonic-api/src/main/kotlin/org/moire/ultrasonic/api/subsonic/response/GetMusicDirectoryResponse.kt index a79cc1c3..4b57455c 100644 --- a/subsonic-api/src/main/kotlin/org/moire/ultrasonic/api/subsonic/response/GetMusicDirectoryResponse.kt +++ b/subsonic-api/src/main/kotlin/org/moire/ultrasonic/api/subsonic/response/GetMusicDirectoryResponse.kt @@ -10,4 +10,4 @@ class GetMusicDirectoryResponse(status: Status, error: SubsonicError?, @JsonProperty("directory") val musicDirectory: MusicDirectory?) : - SubsonicResponse(status, version, error) \ No newline at end of file + SubsonicResponse(status, version, error) diff --git a/subsonic-api/src/main/kotlin/org/moire/ultrasonic/api/subsonic/response/LicenseResponse.kt b/subsonic-api/src/main/kotlin/org/moire/ultrasonic/api/subsonic/response/LicenseResponse.kt index 5cecbc8e..f5b7567b 100644 --- a/subsonic-api/src/main/kotlin/org/moire/ultrasonic/api/subsonic/response/LicenseResponse.kt +++ b/subsonic-api/src/main/kotlin/org/moire/ultrasonic/api/subsonic/response/LicenseResponse.kt @@ -8,4 +8,4 @@ class LicenseResponse(val license: License = License(), status: Status, version: SubsonicAPIVersions, error: SubsonicError?) : - SubsonicResponse(status, version, error) \ No newline at end of file + SubsonicResponse(status, version, error) diff --git a/subsonic-api/src/main/kotlin/org/moire/ultrasonic/api/subsonic/response/MusicFoldersResponse.kt b/subsonic-api/src/main/kotlin/org/moire/ultrasonic/api/subsonic/response/MusicFoldersResponse.kt index 5f7bf796..bbbda243 100644 --- a/subsonic-api/src/main/kotlin/org/moire/ultrasonic/api/subsonic/response/MusicFoldersResponse.kt +++ b/subsonic-api/src/main/kotlin/org/moire/ultrasonic/api/subsonic/response/MusicFoldersResponse.kt @@ -30,4 +30,4 @@ class MusicFoldersResponse(status: Status, } } } -} \ No newline at end of file +} diff --git a/subsonic-api/src/main/kotlin/org/moire/ultrasonic/api/subsonic/response/SubsonicResponse.kt b/subsonic-api/src/main/kotlin/org/moire/ultrasonic/api/subsonic/response/SubsonicResponse.kt index 2681ad04..55156217 100644 --- a/subsonic-api/src/main/kotlin/org/moire/ultrasonic/api/subsonic/response/SubsonicResponse.kt +++ b/subsonic-api/src/main/kotlin/org/moire/ultrasonic/api/subsonic/response/SubsonicResponse.kt @@ -36,4 +36,4 @@ open class SubsonicResponse(val status: Status, } } } -} \ No newline at end of file +} diff --git a/subsonic-api/src/test/kotlin/org/moire/ultrasonic/api/subsonic/SubsonicAPIVersionsDeserializerTest.kt b/subsonic-api/src/test/kotlin/org/moire/ultrasonic/api/subsonic/SubsonicAPIVersionsDeserializerTest.kt index c74135a7..4c1c7643 100644 --- a/subsonic-api/src/test/kotlin/org/moire/ultrasonic/api/subsonic/SubsonicAPIVersionsDeserializerTest.kt +++ b/subsonic-api/src/test/kotlin/org/moire/ultrasonic/api/subsonic/SubsonicAPIVersionsDeserializerTest.kt @@ -41,4 +41,4 @@ class SubsonicAPIVersionsDeserializerTest { parsedVersion `should be` SubsonicAPIVersions.V1_13_0 } -} \ No newline at end of file +} diff --git a/subsonic-api/src/test/kotlin/org/moire/ultrasonic/api/subsonic/SubsonicAPIVersionsTest.kt b/subsonic-api/src/test/kotlin/org/moire/ultrasonic/api/subsonic/SubsonicAPIVersionsTest.kt index 50a5c9b9..d6159ff9 100644 --- a/subsonic-api/src/test/kotlin/org/moire/ultrasonic/api/subsonic/SubsonicAPIVersionsTest.kt +++ b/subsonic-api/src/test/kotlin/org/moire/ultrasonic/api/subsonic/SubsonicAPIVersionsTest.kt @@ -25,4 +25,4 @@ class SubsonicAPIVersionsTest(private val apiVersion: SubsonicAPIVersions) { fun `Should throw IllegalArgumentException for unknown api version`() { SubsonicAPIVersions.fromApiVersion(apiVersion.restApiVersion.substring(0, 2)) } -} \ No newline at end of file +} diff --git a/subsonic-api/src/test/kotlin/org/moire/ultrasonic/api/subsonic/SubsonicErrorTest.kt b/subsonic-api/src/test/kotlin/org/moire/ultrasonic/api/subsonic/SubsonicErrorTest.kt index ccce3b2e..28258de9 100644 --- a/subsonic-api/src/test/kotlin/org/moire/ultrasonic/api/subsonic/SubsonicErrorTest.kt +++ b/subsonic-api/src/test/kotlin/org/moire/ultrasonic/api/subsonic/SubsonicErrorTest.kt @@ -25,4 +25,4 @@ class SubsonicErrorTest(private val error: SubsonicError) { fun `Should throw IllegalArgumentException from unknown error code`() { SubsonicError.parseErrorFromJson(error.code + 10000) } -} \ No newline at end of file +} diff --git a/subsonic-api/src/test/kotlin/org/moire/ultrasonic/api/subsonic/models/StatusTest.kt b/subsonic-api/src/test/kotlin/org/moire/ultrasonic/api/subsonic/models/StatusTest.kt index b5cb4a84..be97c0aa 100644 --- a/subsonic-api/src/test/kotlin/org/moire/ultrasonic/api/subsonic/models/StatusTest.kt +++ b/subsonic-api/src/test/kotlin/org/moire/ultrasonic/api/subsonic/models/StatusTest.kt @@ -26,4 +26,4 @@ class StatusTest(private val status: SubsonicResponse.Status) { fun `Should throw IllegalArgumentException on unknown status`() { SubsonicResponse.Status.getStatusFromJson(status.jsonValue.plus("-some")) } -} \ No newline at end of file +} diff --git a/ultrasonic/src/main/kotlin/org/moire/ultrasonic/data/SubsonicAPIConverter.kt b/ultrasonic/src/main/kotlin/org/moire/ultrasonic/data/SubsonicAPIConverter.kt index 93a2935e..624b435d 100644 --- a/ultrasonic/src/main/kotlin/org/moire/ultrasonic/data/SubsonicAPIConverter.kt +++ b/ultrasonic/src/main/kotlin/org/moire/ultrasonic/data/SubsonicAPIConverter.kt @@ -12,4 +12,4 @@ fun convertMusicFolder(entity: APIMusicFolder): MusicFolder { fun convertMusicFolderList(entitiesList: List): List { return entitiesList.map { convertMusicFolder(it) } -} \ No newline at end of file +} diff --git a/ultrasonic/src/test/kotlin/org/moire/ultrasonic/data/APIConverterTest.kt b/ultrasonic/src/test/kotlin/org/moire/ultrasonic/data/APIConverterTest.kt index 63b49026..8d55cf9c 100644 --- a/ultrasonic/src/test/kotlin/org/moire/ultrasonic/data/APIConverterTest.kt +++ b/ultrasonic/src/test/kotlin/org/moire/ultrasonic/data/APIConverterTest.kt @@ -40,4 +40,4 @@ class APIConverterTest { private fun createMusicFolder(id: Long = 0, name: String = ""): MusicFolder = MusicFolder(id, name) -} \ No newline at end of file +} From 52278975802ad8addc9645c0fe016ff7444857ef Mon Sep 17 00:00:00 2001 From: Yahor Berdnikau Date: Sun, 30 Jul 2017 22:26:41 +0200 Subject: [PATCH 3/3] Add detekt job to CI config. Signed-off-by: Yahor Berdnikau --- .circleci/config.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.circleci/config.yml b/.circleci/config.yml index bc93da97..c37e547c 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -19,6 +19,9 @@ jobs: - run: name: unit-tests command: ./gradlew test + - run: + name: static analysis + command: ./gradlew -Pqc detektCheck - save_cache: paths: - ~/.gradle