@@ -2,33 +2,28 @@ package com.codacy
2
2
3
3
import java .io .File
4
4
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
7
8
import com .codacy .parsers .CoberturaParser
8
- import com .codacy .vcs .GitClient
9
- import play .api .libs .json .Json
10
9
import sbt .Keys ._
11
10
import sbt ._
12
11
13
- import scala .util .Try
14
-
15
12
object CodacyCoveragePlugin extends AutoPlugin {
16
13
17
14
object autoImport {
18
15
val codacyCoverage = taskKey[Unit ](" Upload coverage reports to Codacy." )
19
16
val codacyProjectToken = settingKey[Option [String ]](" Your project token." )
20
- val codacyProjectTokenFile = settingKey[Option [String ]](" Path for file containing your project token." )
21
17
val coberturaFile = settingKey[File ](" Path for project Cobertura file." )
22
18
val codacyApiBaseUrl = settingKey[Option [String ]](" The base URL for the Codacy API." )
23
19
24
20
lazy val baseSettings : Seq [Def .Setting [_]] = Seq (
25
21
codacyCoverage := {
26
22
codacyCoverageCommand(state.value, baseDirectory.value, coberturaFile.value,
27
23
crossTarget.value / " coverage-report" / " codacy-coverage.json" ,
28
- codacyProjectToken.value, codacyProjectTokenFile.value, codacyApiBaseUrl.value)
24
+ codacyProjectToken.value, codacyApiBaseUrl.value)
29
25
},
30
26
codacyProjectToken := None ,
31
- codacyProjectTokenFile := None ,
32
27
codacyApiBaseUrl := None ,
33
28
coberturaFile := crossTarget.value / (" coverage-report" + File .separator + " cobertura.xml" )
34
29
)
@@ -45,64 +40,43 @@ object CodacyCoveragePlugin extends AutoPlugin {
45
40
private val publicApiBaseUrl = " https://www.codacy.com"
46
41
47
42
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 = {
49
44
implicit val logger : Logger = state.log
50
45
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)
90
65
}
66
+ } match {
67
+ case Left (error) =>
68
+ logger.error(error)
69
+ state.exit(ok = false )
70
+ case _ =>
91
71
}
92
72
}
93
73
94
- private def getApiBaseUrl (codacyApiBaseUrl : Option [String ]): String = {
74
+ private def getApiBaseUrl (codacyApiBaseUrl : Option [String ]): Option [ String ] = {
95
75
// Check for an environment variable to override the API URL.
96
76
// If it doesn't exist, try the build options or default to the public API.
97
77
sys.env.get(" CODACY_API_BASE_URL" )
98
78
.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))
106
80
}
107
81
108
82
}
0 commit comments