Skip to content

Commit cf8f926

Browse files
Francisco Duartelolgab
andauthored
feature: Add support for api tokens :breaking: (#153)
Instead of using a project token, users can use an api token and specify username and project name clean: Move sys.exit to program edge - Change abstract method run to return int in ConfigurationParsingApp - Make Components receive Configuration instead of CommandConfiguration Co-authored-by: Lorenzo Gabriele <lorenzolespaul@gmail.com>
1 parent d27c46e commit cf8f926

File tree

14 files changed

+427
-128
lines changed

14 files changed

+427
-128
lines changed

.gitignore

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,3 +25,5 @@ config
2525
.codacy.json
2626
codacy-coverage-reporter-linux-*
2727
codacy-coverage-reporter-darwin-*
28+
classes/
29+
src/test/resources/codacy-coverage.json

README.md

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,12 +17,28 @@ The supported coverage formats can be found [here](https://github.com/codacy/cov
1717

1818
1. Setup the project API token. You can find the token in Project -> Settings -> Integrations -> Project API.
1919

20-
Then set it in your terminal, replacing %Project_Token% with your own token:
20+
1. Set it in your terminal, replacing %Project_Token% with your own token:
2121

2222
```
2323
export CODACY_PROJECT_TOKEN=%Project_Token%
2424
```
2525

26+
##### Alternative: using an API Token
27+
28+
1. Setup the Account API token. You can find the token in Your account -> API tokens
29+
30+
1. Set it in your terminal, replacing the %API_Token% with your own token:
31+
32+
1. Set your project name in your terminal, replacing the %Project_Name%
33+
34+
1. Set your username in your terminal, replacing the %Username%
35+
36+
```
37+
export CODACY_API_TOKEN=%API_Token%
38+
export CODACY_PROJECT_NAME=%Project_Name%
39+
export CODACY_USERNAME=%Username%
40+
```
41+
2642
### Using the script
2743

2844
Additional requirements:

build.sbt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,14 +16,14 @@ scalacOptions := Seq(
1616

1717
// Runtime dependencies
1818
libraryDependencies ++= Seq(
19-
"com.codacy" %% "coverage-parser" % "2.5.0",
19+
"com.codacy" %% "coverage-parser" % "2.5.4",
2020
"com.github.alexarchambault" %% "case-app" % "1.2.0",
2121
logbackClassic,
2222
scalaLogging
2323
)
2424

2525
// Test dependencies
26-
libraryDependencies ++= Seq(scalatest).map(_ % "test")
26+
libraryDependencies ++= Seq(scalatest, mockitoScalaScalatest).map(_ % Test)
2727

2828
mainClass in assembly := Some("com.codacy.CodacyCoverageReporter")
2929
assemblyMergeStrategy in assembly := {

project/plugins.sbt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
resolvers := Seq(DefaultMavenRepository, Resolver.jcenterRepo, Resolver.sonatypeRepo("releases"))
22

3-
addSbtPlugin("com.codacy" % "codacy-sbt-plugin" % "14.0.1")
3+
addSbtPlugin("com.codacy" % "codacy-sbt-plugin" % "18.0.3")
44

55
// Publish
66
addSbtPlugin("com.eed3si9n" % "sbt-assembly" % "0.14.9")

src/main/scala/com/codacy/CodacyCoverageReporter.scala

Lines changed: 30 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -5,33 +5,44 @@ import com.codacy.di.Components
55
import com.codacy.helpers.LoggerHelper
66
import com.codacy.model.configuration.{FinalConfig, ReportConfig}
77
import com.typesafe.scalalogging.StrictLogging
8+
import com.codacy.rules.ConfigurationRules
89

910
object CodacyCoverageReporter extends ConfigurationParsingApp with StrictLogging {
1011

11-
def run(commandConfig: CommandConfiguration): Unit = {
12-
val components = new Components(commandConfig)
12+
def run(commandConfig: CommandConfiguration): Int = {
13+
val noAvailableTokens = commandConfig.baseConfig.projectToken.isEmpty && commandConfig.baseConfig.apiToken.isEmpty
14+
if (commandConfig.baseConfig.skipValue && noAvailableTokens) {
15+
logger.info("Skip reporting coverage")
16+
0
17+
} else {
18+
val result: Either[String, String] = sendReport(commandConfig)
19+
result match {
20+
case Right(message) =>
21+
logger.info(message)
22+
0
23+
case Left(message) =>
24+
logger.error(message)
25+
1
26+
}
27+
}
28+
}
1329

14-
val validatedConfig = components.validatedConfig
30+
private def sendReport(commandConfig: CommandConfiguration) = {
31+
val configRules = new ConfigurationRules(commandConfig)
1532

16-
LoggerHelper.setLoggerLevel(logger, validatedConfig.baseConfig.debug)
33+
configRules.validatedConfig.flatMap { validatedConfig =>
34+
val components = new Components(validatedConfig)
35+
LoggerHelper.setLoggerLevel(logger, validatedConfig.baseConfig.debug)
1736

18-
logger.debug(validatedConfig.toString)
37+
logger.debug(validatedConfig.toString)
1938

20-
val result = validatedConfig match {
21-
case config: ReportConfig =>
22-
components.reportRules.codacyCoverage(config)
39+
validatedConfig match {
40+
case config: ReportConfig =>
41+
components.reportRules.codacyCoverage(config)
2342

24-
case config: FinalConfig =>
25-
components.reportRules.finalReport(config)
43+
case config: FinalConfig =>
44+
components.reportRules.finalReport(config)
45+
}
2646
}
27-
28-
result.fold({ error =>
29-
logger.error(error)
30-
sys.exit(1)
31-
}, { successMessage =>
32-
logger.info(successMessage)
33-
sys.exit(0)
34-
})
3547
}
36-
3748
}

src/main/scala/com/codacy/configuration/parser/ConfigurationParser.scala

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,10 +10,10 @@ import com.codacy.configuration.parser.ConfigArgumentParsers._
1010

1111
abstract class ConfigurationParsingApp extends CommandAppWithPreCommand[BaseCommand, CommandConfiguration] {
1212
override final def run(options: CommandConfiguration, remainingArgs: RemainingArgs): Unit = {
13-
run(options)
13+
sys.exit(run(options))
1414
}
1515

16-
def run(config: CommandConfiguration): Unit
16+
def run(config: CommandConfiguration): Int
1717

1818
override def beforeCommand(options: BaseCommand, remainingArgs: Seq[String]): Unit = ()
1919
}
@@ -55,11 +55,17 @@ case class Report(
5555
case class BaseCommandConfig(
5656
@Name("t") @ValueDescription("your project API token")
5757
projectToken: Option[String],
58+
@Name("a") @ValueDescription("your api token")
59+
apiToken: Option[String],
60+
@Name("u") @ValueDescription("your username")
61+
username: Option[String],
62+
@Name("p") @ValueDescription("project name")
63+
projectName: Option[String],
5864
@ValueDescription("the base URL for the Codacy API")
5965
codacyApiBaseUrl: Option[String],
6066
@ValueDescription("your commitUUID")
6167
commitUUID: Option[String],
62-
@Name("s") @ValueDescription("skip if project token isn't defined")
68+
@Name("s") @ValueDescription("skip if token isn't defined")
6369
skip: Int @@ Counter = Tag.of(0),
6470
@Hidden
6571
debug: Int @@ Counter = Tag.of(0)

src/main/scala/com/codacy/di/Components.scala

Lines changed: 12 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -2,20 +2,21 @@ package com.codacy.di
22

33
import com.codacy.api.client.CodacyClient
44
import com.codacy.api.service.CoverageServices
5-
import com.codacy.configuration.parser.CommandConfiguration
6-
import com.codacy.model.configuration.Configuration
7-
import com.codacy.rules.{ConfigurationRules, ReportRules}
5+
import com.codacy.model.configuration.{ApiTokenAuthenticationConfig, Configuration, ProjectTokenAuthenticationConfig}
6+
import com.codacy.rules.ReportRules
87

9-
class Components(private val cmdConfig: CommandConfiguration) {
10-
lazy val validatedConfig: Configuration = configRules.validatedConfig
8+
class Components(private val validatedConfig: Configuration) {
9+
lazy val reportRules = new ReportRules(coverageServices)
1110

12-
lazy val configRules = new ConfigurationRules(cmdConfig)
13-
lazy val reportRules = new ReportRules(validatedConfig, coverageServices)
11+
lazy private val (projectToken, apiToken) = validatedConfig.baseConfig.authentication match {
12+
case ProjectTokenAuthenticationConfig(projectToken) =>
13+
(Some(projectToken), None)
14+
case ApiTokenAuthenticationConfig(apiToken, _, _) =>
15+
(None, Some(apiToken))
16+
}
17+
18+
lazy val codacyClient = new CodacyClient(Some(validatedConfig.baseConfig.codacyApiBaseUrl), apiToken, projectToken)
1419

15-
lazy val codacyClient = new CodacyClient(
16-
Some(validatedConfig.baseConfig.codacyApiBaseUrl),
17-
projectToken = Some(validatedConfig.baseConfig.projectToken)
18-
)
1920
lazy val coverageServices = new CoverageServices(codacyClient)
2021

2122
}

src/main/scala/com/codacy/model/configuration/Configuration.scala

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,18 @@ case class ReportConfig(
2222

2323
case class FinalConfig(baseConfig: BaseConfig) extends Configuration
2424

25-
case class BaseConfig(projectToken: String, codacyApiBaseUrl: String, commitUUID: Option[CommitUUID], debug: Boolean)
25+
sealed trait AuthenticationConfig
26+
27+
case class ProjectTokenAuthenticationConfig(projectToken: String) extends AuthenticationConfig
28+
29+
case class ApiTokenAuthenticationConfig(apiToken: String, username: String, projectName: String)
30+
extends AuthenticationConfig
31+
32+
case class BaseConfig(
33+
authentication: AuthenticationConfig,
34+
codacyApiBaseUrl: String,
35+
commitUUID: Option[CommitUUID],
36+
debug: Boolean
37+
)
2638

2739
case class CommitUUID(value: String) extends AnyVal

0 commit comments

Comments
 (0)