Skip to content

Commit d0929fe

Browse files
authored
Add ForgeSpecificCfg trait (#2922)
* Add `ForgeSpecificCfg` trait This adds the `Config.ForgeSpecificCfg` trait which allows us to only pass config options to `ForgeSelection` that are relevant for the different `ForgeApiAlg`s instead of the complete `Config` object. This simplifies the tests a little bit because we don't need create copies of `Config` to change forge specific configuration.
1 parent bf941ea commit d0929fe

File tree

10 files changed

+71
-79
lines changed

10 files changed

+71
-79
lines changed

modules/core/src/main/scala/org/scalasteward/core/application/Cli.scala

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -290,8 +290,8 @@ object Cli {
290290
"The Azure organization (required when --forge-type is azure-repos)"
291291
).orNone
292292

293-
private val azureReposConfig: Opts[AzureReposConfig] =
294-
azureReposOrganization.map(AzureReposConfig.apply)
293+
private val azureReposCfg: Opts[AzureReposCfg] =
294+
azureReposOrganization.map(AzureReposCfg.apply)
295295

296296
private val refreshBackoffPeriod: Opts[FiniteDuration] = {
297297
val default = 0.days
@@ -338,7 +338,7 @@ object Cli {
338338
bitbucketCfg,
339339
bitbucketServerCfg,
340340
gitLabCfg,
341-
azureReposConfig,
341+
azureReposCfg,
342342
gitHubApp,
343343
urlCheckerTestUrls,
344344
defaultMavenRepo,

modules/core/src/main/scala/org/scalasteward/core/application/Config.scala

Lines changed: 24 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,7 @@ final case class Config(
6565
bitbucketCfg: BitbucketCfg,
6666
bitbucketServerCfg: BitbucketServerCfg,
6767
gitLabCfg: GitLabCfg,
68-
azureReposConfig: AzureReposConfig,
68+
azureReposCfg: AzureReposCfg,
6969
githubApp: Option[GitHubApp],
7070
urlCheckerTestUrls: Nel[Uri],
7171
defaultResolver: Resolver,
@@ -84,6 +84,15 @@ final case class Config(
8484
prompt = s"Password for '$urlWithUser': "
8585
password <- processAlg.exec(Nel.of(gitCfg.gitAskPass.pathAsString, prompt), rootDir)
8686
} yield AuthenticatedUser(forgeCfg.login, password.mkString.trim)
87+
88+
def forgeSpecificCfg: ForgeSpecificCfg =
89+
forgeCfg.tpe match {
90+
case ForgeType.AzureRepos => azureReposCfg
91+
case ForgeType.Bitbucket => bitbucketCfg
92+
case ForgeType.BitbucketServer => bitbucketServerCfg
93+
case ForgeType.GitHub => GitHubCfg()
94+
case ForgeType.GitLab => gitLabCfg
95+
}
8796
}
8897

8998
object Config {
@@ -129,22 +138,27 @@ object Config {
129138
disableDefaults: Boolean
130139
)
131140

132-
final case class BitbucketServerCfg(
133-
useDefaultReviewers: Boolean
134-
)
141+
sealed trait ForgeSpecificCfg extends Product with Serializable
142+
143+
final case class AzureReposCfg(
144+
organization: Option[String]
145+
) extends ForgeSpecificCfg
135146

136147
final case class BitbucketCfg(
137148
useDefaultReviewers: Boolean
138-
)
149+
) extends ForgeSpecificCfg
150+
151+
final case class BitbucketServerCfg(
152+
useDefaultReviewers: Boolean
153+
) extends ForgeSpecificCfg
154+
155+
final case class GitHubCfg(
156+
) extends ForgeSpecificCfg
139157

140158
final case class GitLabCfg(
141159
mergeWhenPipelineSucceeds: Boolean,
142160
requiredReviewers: Option[Int]
143-
)
144-
145-
final case class AzureReposConfig(
146-
organization: Option[String]
147-
)
161+
) extends ForgeSpecificCfg
148162

149163
sealed trait StewardUsage
150164
object StewardUsage {

modules/core/src/main/scala/org/scalasteward/core/application/Context.scala

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -208,7 +208,8 @@ object Context {
208208
implicit val httpJsonClient: HttpJsonClient[F] = new HttpJsonClient[F]
209209
implicit val repoCacheRepository: RepoCacheRepository[F] =
210210
new RepoCacheRepository[F](repoCacheStore)
211-
implicit val forgeApiAlg: ForgeApiAlg[F] = ForgeSelection.forgeApiAlg[F](config, forgeUser)
211+
implicit val forgeApiAlg: ForgeApiAlg[F] =
212+
ForgeSelection.forgeApiAlg[F](config.forgeCfg, config.forgeSpecificCfg, forgeUser)
212213
implicit val forgeRepoAlg: ForgeRepoAlg[F] = new ForgeRepoAlg[F](config)
213214
implicit val updateInfoUrlFinder: UpdateInfoUrlFinder[F] =
214215
new UpdateInfoUrlFinder[F](config.forgeCfg)

modules/core/src/main/scala/org/scalasteward/core/forge/ForgeSelection.scala

Lines changed: 18 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ import cats.{Applicative, MonadThrow}
2121
import org.http4s.headers.Authorization
2222
import org.http4s.{BasicCredentials, Header, Request}
2323
import org.scalasteward.core.application.Config
24-
import org.scalasteward.core.application.Config.ForgeCfg
24+
import org.scalasteward.core.application.Config.{ForgeCfg, ForgeSpecificCfg}
2525
import org.scalasteward.core.forge.ForgeType._
2626
import org.scalasteward.core.forge.azurerepos.AzureReposApiAlg
2727
import org.scalasteward.core.forge.bitbucket.BitbucketApiAlg
@@ -34,23 +34,27 @@ import org.typelevel.ci._
3434
import org.typelevel.log4cats.Logger
3535

3636
object ForgeSelection {
37-
def forgeApiAlg[F[_]](config: Config, user: AuthenticatedUser)(implicit
37+
def forgeApiAlg[F[_]](
38+
forgeCfg: ForgeCfg,
39+
forgeSpecificCfg: ForgeSpecificCfg,
40+
user: AuthenticatedUser
41+
)(implicit
3842
httpJsonClient: HttpJsonClient[F],
3943
logger: Logger[F],
4044
F: MonadThrow[F]
4145
): ForgeApiAlg[F] = {
42-
val auth = (_: Any) => authenticate(config.forgeCfg.tpe, user)
43-
config.forgeCfg.tpe match {
44-
case AzureRepos =>
45-
new AzureReposApiAlg[F](config.forgeCfg.apiHost, config.azureReposConfig, auth)
46-
case Bitbucket =>
47-
new BitbucketApiAlg(config.forgeCfg, config.bitbucketCfg, auth)
48-
case BitbucketServer =>
49-
new BitbucketServerApiAlg[F](config.forgeCfg.apiHost, config.bitbucketServerCfg, auth)
50-
case GitHub =>
51-
new GitHubApiAlg[F](config.forgeCfg.apiHost, auth)
52-
case GitLab =>
53-
new GitLabApiAlg[F](config.forgeCfg, config.gitLabCfg, auth)
46+
val auth = (_: Any) => authenticate(forgeCfg.tpe, user)
47+
forgeSpecificCfg match {
48+
case specificCfg: Config.AzureReposCfg =>
49+
new AzureReposApiAlg(forgeCfg.apiHost, specificCfg, auth)
50+
case specificCfg: Config.BitbucketCfg =>
51+
new BitbucketApiAlg(forgeCfg, specificCfg, auth)
52+
case specificCfg: Config.BitbucketServerCfg =>
53+
new BitbucketServerApiAlg(forgeCfg.apiHost, specificCfg, auth)
54+
case _: Config.GitHubCfg =>
55+
new GitHubApiAlg(forgeCfg.apiHost, auth)
56+
case specificCfg: Config.GitLabCfg =>
57+
new GitLabApiAlg(forgeCfg, specificCfg, auth)
5458
}
5559
}
5660

modules/core/src/main/scala/org/scalasteward/core/forge/azurerepos/AzureReposApiAlg.scala

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ import cats.syntax.all._
2121
import io.circe.Json
2222
import io.circe.syntax.KeyOps
2323
import org.http4s.{Request, Uri}
24-
import org.scalasteward.core.application.Config.AzureReposConfig
24+
import org.scalasteward.core.application.Config.AzureReposCfg
2525
import org.scalasteward.core.data.Repo
2626
import org.scalasteward.core.forge.ForgeApiAlg
2727
import org.scalasteward.core.forge.azurerepos.JsonCodec._
@@ -31,7 +31,7 @@ import org.scalasteward.core.util.HttpJsonClient
3131

3232
final class AzureReposApiAlg[F[_]](
3333
azureAPiHost: Uri,
34-
config: AzureReposConfig,
34+
config: AzureReposCfg,
3535
modify: Repo => Request[F] => F[Request[F]]
3636
)(implicit client: HttpJsonClient[F], monadErrorF: MonadThrow[F])
3737
extends ForgeApiAlg[F] {

modules/core/src/test/scala/org/scalasteward/core/forge/azurerepos/AzureReposApiAlgTest.scala

Lines changed: 4 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ import org.http4s.headers.Authorization
77
import org.http4s.implicits._
88
import org.http4s.{BasicCredentials, HttpApp, Uri}
99
import org.scalasteward.core.TestInstances.ioLogger
10-
import org.scalasteward.core.application.Config.AzureReposConfig
10+
import org.scalasteward.core.application.Config.AzureReposCfg
1111
import org.scalasteward.core.data.Repo
1212
import org.scalasteward.core.forge.data._
1313
import org.scalasteward.core.forge.{ForgeSelection, ForgeType}
@@ -174,14 +174,9 @@ class AzureReposApiAlgTest extends CatsEffectSuite with Http4sDsl[MockEff] {
174174

175175
private val state = MockState.empty.copy(clientResponses = auth <+> httpApp)
176176

177-
private val azureRepoCfg = AzureReposConfig(organization = Some("azure-org"))
178-
private val azureReposApiAlg = ForgeSelection.forgeApiAlg[MockEff](
179-
config.copy(
180-
forgeCfg = config.forgeCfg.copy(apiHost = apiHost, tpe = ForgeType.AzureRepos),
181-
azureReposConfig = azureRepoCfg
182-
),
183-
user
184-
)
177+
private val forgeCfg = config.forgeCfg.copy(apiHost = apiHost, tpe = ForgeType.AzureRepos)
178+
private val azureReposCfg = AzureReposCfg(organization = Some("azure-org"))
179+
private val azureReposApiAlg = ForgeSelection.forgeApiAlg[MockEff](forgeCfg, azureReposCfg, user)
185180

186181
test("getRepo") {
187182
val obtained = azureReposApiAlg.getRepo(repo).runA(state)

modules/core/src/test/scala/org/scalasteward/core/forge/bitbucket/BitbucketApiAlgTest.scala

Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -186,13 +186,9 @@ class BitbucketApiAlgTest extends CatsEffectSuite with Http4sDsl[MockEff] {
186186
}
187187
private val state = MockState.empty.copy(clientResponses = auth <+> httpApp)
188188

189-
private val bitbucketApiAlg = ForgeSelection.forgeApiAlg[MockEff](
190-
config.copy(
191-
forgeCfg = config.forgeCfg.copy(tpe = ForgeType.Bitbucket),
192-
bitbucketCfg = BitbucketCfg(useDefaultReviewers = true)
193-
),
194-
user
195-
)
189+
private val forgeCfg = config.forgeCfg.copy(tpe = ForgeType.Bitbucket)
190+
private val bitbucketCfg = BitbucketCfg(useDefaultReviewers = true)
191+
private val bitbucketApiAlg = ForgeSelection.forgeApiAlg[MockEff](forgeCfg, bitbucketCfg, user)
196192

197193
private val prUrl = uri"https://bitbucket.org/fthomas/base.g8/pullrequests/2"
198194
private val repo = Repo("fthomas", "base.g8")

modules/core/src/test/scala/org/scalasteward/core/forge/bitbucketserver/BitbucketServerApiAlgTest.scala

Lines changed: 6 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -111,13 +111,9 @@ class BitbucketServerApiAlgTest extends CatsEffectSuite with Http4sDsl[MockEff]
111111
}
112112
private val state = MockState.empty.copy(clientResponses = auth <+> httpApp)
113113

114-
private val bitbucketServerApiAlg = ForgeSelection.forgeApiAlg[MockEff](
115-
config.copy(
116-
forgeCfg = config.forgeCfg.copy(tpe = ForgeType.BitbucketServer),
117-
bitbucketServerCfg = BitbucketServerCfg(useDefaultReviewers = false)
118-
),
119-
user
120-
)
114+
private val forgeCfg = config.forgeCfg.copy(tpe = ForgeType.BitbucketServer)
115+
private val bitbucketServerApiAlg = ForgeSelection
116+
.forgeApiAlg[MockEff](forgeCfg, BitbucketServerCfg(useDefaultReviewers = false), user)
121117

122118
test("createPullRequest") {
123119
val data = NewPullRequestData(
@@ -146,16 +142,9 @@ class BitbucketServerApiAlgTest extends CatsEffectSuite with Http4sDsl[MockEff]
146142
base = main,
147143
labels = Nil
148144
)
149-
val pr = ForgeSelection
150-
.forgeApiAlg[MockEff](
151-
config.copy(
152-
forgeCfg = config.forgeCfg.copy(tpe = ForgeType.BitbucketServer),
153-
bitbucketServerCfg = BitbucketServerCfg(useDefaultReviewers = false)
154-
),
155-
user
156-
)
157-
.createPullRequest(repo, data)
158-
.runA(state)
145+
val apiAlg = ForgeSelection
146+
.forgeApiAlg[MockEff](forgeCfg, BitbucketServerCfg(useDefaultReviewers = true), user)
147+
val pr = apiAlg.createPullRequest(repo, data).runA(state)
159148
val expected =
160149
PullRequestOut(
161150
html_url = uri"https://example.org/fthomas/base.g8/pullrequests/2",

modules/core/src/test/scala/org/scalasteward/core/forge/github/GitHubApiAlgTest.scala

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import org.http4s.headers.Authorization
99
import org.http4s.implicits._
1010
import org.http4s.{BasicCredentials, HttpApp}
1111
import org.scalasteward.core.TestInstances.ioLogger
12+
import org.scalasteward.core.application.Config.GitHubCfg
1213
import org.scalasteward.core.data.Repo
1314
import org.scalasteward.core.forge.data._
1415
import org.scalasteward.core.forge.{ForgeSelection, ForgeType}
@@ -124,10 +125,8 @@ class GitHubApiAlgTest extends CatsEffectSuite with Http4sDsl[MockEff] {
124125
}
125126
private val state = MockState.empty.copy(clientResponses = auth <+> httpApp)
126127

127-
private val gitHubApiAlg = ForgeSelection.forgeApiAlg[MockEff](
128-
config.copy(forgeCfg = config.forgeCfg.copy(tpe = ForgeType.GitHub)),
129-
user
130-
)
128+
private val forgeCfg = config.forgeCfg.copy(tpe = ForgeType.GitHub)
129+
private val gitHubApiAlg = ForgeSelection.forgeApiAlg[MockEff](forgeCfg, GitHubCfg(), user)
131130

132131
private val repo = Repo("fthomas", "base.g8")
133132

modules/core/src/test/scala/org/scalasteward/core/forge/gitlab/GitLabApiAlgTest.scala

Lines changed: 6 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -113,26 +113,20 @@ class GitLabApiAlgTest extends CatsEffectSuite with Http4sDsl[MockEff] {
113113
private val state = MockState.empty.copy(clientResponses = auth <+> httpApp)
114114

115115
private val gitlabApiAlg = ForgeSelection.forgeApiAlg[MockEff](
116-
config.copy(
117-
forgeCfg = config.forgeCfg.copy(tpe = ForgeType.GitLab),
118-
gitLabCfg = GitLabCfg(mergeWhenPipelineSucceeds = false, requiredReviewers = None)
119-
),
116+
config.forgeCfg.copy(tpe = ForgeType.GitLab),
117+
GitLabCfg(mergeWhenPipelineSucceeds = false, requiredReviewers = None),
120118
user
121119
)
122120

123121
private val gitlabApiAlgNoFork = ForgeSelection.forgeApiAlg[MockEff](
124-
config.copy(
125-
forgeCfg = config.forgeCfg.copy(tpe = ForgeType.GitLab, doNotFork = true),
126-
gitLabCfg = GitLabCfg(mergeWhenPipelineSucceeds = false, requiredReviewers = None)
127-
),
122+
config.forgeCfg.copy(tpe = ForgeType.GitLab, doNotFork = true),
123+
GitLabCfg(mergeWhenPipelineSucceeds = false, requiredReviewers = None),
128124
user
129125
)
130126

131127
private val gitlabApiAlgLessReviewersRequired = ForgeSelection.forgeApiAlg[MockEff](
132-
config.copy(
133-
forgeCfg = config.forgeCfg.copy(tpe = ForgeType.GitLab, doNotFork = true),
134-
gitLabCfg = GitLabCfg(mergeWhenPipelineSucceeds = true, requiredReviewers = Some(0))
135-
),
128+
config.forgeCfg.copy(tpe = ForgeType.GitLab, doNotFork = true),
129+
GitLabCfg(mergeWhenPipelineSucceeds = true, requiredReviewers = Some(0)),
136130
user
137131
)
138132

0 commit comments

Comments
 (0)