@@ -2,33 +2,28 @@ package com.codacy
22
33import java .io .File
44
5- import com .codacy .api .CodacyAPIClient
6- import com .codacy .io .FileUtils
5+ import com .codacy .api .client .CodacyClient
6+ import com .codacy .api .helpers .FileHelper
7+ import com .codacy .api .service .CoverageServices
78import com .codacy .parsers .CoberturaParser
8- import com .codacy .vcs .GitClient
9- import play .api .libs .json .Json
109import sbt .Keys ._
1110import sbt ._
1211
13- import scala .util .Try
14-
1512object CodacyCoveragePlugin extends AutoPlugin {
1613
1714 object autoImport {
1815 val codacyCoverage = taskKey[Unit ](" Upload coverage reports to Codacy." )
1916 val codacyProjectToken = settingKey[Option [String ]](" Your project token." )
20- val codacyProjectTokenFile = settingKey[Option [String ]](" Path for file containing your project token." )
2117 val coberturaFile = settingKey[File ](" Path for project Cobertura file." )
2218 val codacyApiBaseUrl = settingKey[Option [String ]](" The base URL for the Codacy API." )
2319
2420 lazy val baseSettings : Seq [Def .Setting [_]] = Seq (
2521 codacyCoverage := {
2622 codacyCoverageCommand(state.value, baseDirectory.value, coberturaFile.value,
2723 crossTarget.value / " coverage-report" / " codacy-coverage.json" ,
28- codacyProjectToken.value, codacyProjectTokenFile.value, codacyApiBaseUrl.value)
24+ codacyProjectToken.value, codacyApiBaseUrl.value)
2925 },
3026 codacyProjectToken := None ,
31- codacyProjectTokenFile := None ,
3227 codacyApiBaseUrl := None ,
3328 coberturaFile := crossTarget.value / (" coverage-report" + File .separator + " cobertura.xml" )
3429 )
@@ -45,64 +40,43 @@ object CodacyCoveragePlugin extends AutoPlugin {
4540 private val publicApiBaseUrl = " https://www.codacy.com"
4641
4742 private def codacyCoverageCommand (state : State , rootProjectDir : File , coberturaFile : File , codacyCoverageFile : File ,
48- codacyToken : Option [String ], codacyTokenFile : Option [ String ], codacyApiBaseUrl : Option [String ]): Unit = {
43+ codacyToken : Option [String ], codacyApiBaseUrl : Option [String ]): Unit = {
4944 implicit val logger : Logger = state.log
5045
51- getProjectToken(codacyToken, codacyTokenFile).fold[State ] {
52- logger.error(" Project token not defined." )
53- state.exit(ok = false )
54- } {
55- projectToken =>
56- Try {
57- new GitClient (rootProjectDir).latestCommitUuid()
58- }.toOption.fold[State ] {
59- logger.error(" Could not get current commit." )
60- state.exit(ok = false )
61- } {
62- commitUuid =>
63-
64- logger.info(s " Preparing coverage data for commit ${commitUuid.take(7 )}... " )
65-
66- FileUtils .get(coberturaFile).fold[State ] {
67- state.exit(ok = false )
68- } {
69- coberturaFile =>
70-
71- val reader = new CoberturaParser (coberturaFile, rootProjectDir)
72- val report = reader.generateReport()
73- FileUtils .write(codacyCoverageFile, Json .toJson(report).toString())
74-
75- logger.info(s " Uploading coverage data... " )
76-
77- new CodacyAPIClient ().postCoverageFile(projectToken,
78- commitUuid,
79- codacyCoverageFile,
80- getApiBaseUrl(codacyApiBaseUrl)).fold[State ](
81- error => {
82- logger.error(s " Failed to upload data. Reason: $error" )
83- state.exit(ok = false )
84- },
85- response => {
86- logger.success(s " Coverage data uploaded. $response" )
87- state
88- })
89- }
46+ FileHelper .withTokenAndCommit(codacyToken) {
47+ case (projectToken, commitUUID) =>
48+
49+ val reader = new CoberturaParser (coberturaFile, rootProjectDir)
50+ val report = reader.generateReport()
51+
52+ FileHelper .writeJsonToFile(codacyCoverageFile, report)
53+
54+ val codacyClient = new CodacyClient (getApiBaseUrl(codacyApiBaseUrl), Some (projectToken))
55+ val coverageServices = new CoverageServices (codacyClient)
56+
57+ coverageServices.sendReport(commitUUID, report) match {
58+ case requestResponse if requestResponse.hasError =>
59+ logger.error(s " Failed to upload data. Reason: ${requestResponse.message}" )
60+ state.exit(ok = false )
61+ Left (requestResponse.message)
62+ case requestResponse =>
63+ logger.success(s " Coverage data uploaded. ${requestResponse.message}" )
64+ Right (state)
9065 }
66+ } match {
67+ case Left (error) =>
68+ logger.error(error)
69+ state.exit(ok = false )
70+ case _ =>
9171 }
9272 }
9373
94- private def getApiBaseUrl (codacyApiBaseUrl : Option [String ]): String = {
74+ private def getApiBaseUrl (codacyApiBaseUrl : Option [String ]): Option [ String ] = {
9575 // Check for an environment variable to override the API URL.
9676 // If it doesn't exist, try the build options or default to the public API.
9777 sys.env.get(" CODACY_API_BASE_URL" )
9878 .orElse(codacyApiBaseUrl)
99- .getOrElse(publicApiBaseUrl)
100- }
101-
102- private def getProjectToken (codacyProjectToken : Option [String ], codacyProjectTokenFile : Option [String ]) = {
103- sys.env.get(" CODACY_PROJECT_TOKEN" )
104- .orElse(codacyProjectToken)
105- .orElse(codacyProjectTokenFile.flatMap(FileUtils .read))
79+ .orElse(Some (publicApiBaseUrl))
10680 }
10781
10882}
0 commit comments