Skip to content

Commit ce20d9e

Browse files
committed
Add BuildStatusServices
Includes support for the following operations: * GET the build status for a commit * POST a build status for a commit * PUT a build status for a commit https://confluence.atlassian.com/bitbucket/buildstatus-resource-779295267.html
1 parent 5d22e3b commit ce20d9e

File tree

5 files changed

+78
-8
lines changed

5 files changed

+78
-8
lines changed

build.sbt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,8 @@ resolvers += "Typesafe maven repository" at "http://repo.typesafe.com/typesafe/m
1414

1515
libraryDependencies ++= Seq(
1616
jodaTime,
17-
playWS
17+
playWS,
18+
scalatest
1819
)
1920

2021
organization := "com.codacy"

project/Dependencies.scala

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ object Dependencies {
44

55
// Generic
66
lazy val jodaTime = "joda-time" % "joda-time" % "2.7"
7+
lazy val scalatest = "org.scalatest" %% "scalatest" % "2.2.6" % "test"
78

89
// Play framework
910
lazy val playWS = "com.typesafe.play" %% "play-ws" % "2.4.3"
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
package com.codacy.client.bitbucket
2+
3+
import play.api.libs.json._
4+
5+
case class BuildStatus(state: String, key: String, name: String, url: String, description: String)
6+
7+
object BuildStatus {
8+
implicit val fmt = Json.format[BuildStatus]
9+
}

src/main/scala/com/codacy/client/bitbucket/client/BitbucketClient.scala

Lines changed: 16 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,14 @@
11
package com.codacy.client.bitbucket.client
22

3+
import java.util.concurrent.{SynchronousQueue, ThreadPoolExecutor, TimeUnit}
4+
35
import com.codacy.client.bitbucket.util.HTTPStatusCodes
46
import com.ning.http.client.AsyncHttpClientConfig
5-
import java.util.concurrent.{SynchronousQueue, ThreadPoolExecutor, TimeUnit}
67
import play.api.http.{ContentTypeOf, Writeable}
78
import play.api.libs.json.{JsValue, Json, Reads}
89
import play.api.libs.oauth._
910
import play.api.libs.ws.ning.{NingAsyncHttpClientConfigBuilder, NingWSClient}
11+
1012
import scala.concurrent.Await
1113
import scala.concurrent.duration.{Duration, SECONDS}
1214
import scala.util.{Failure, Properties, Success, Try}
@@ -50,14 +52,13 @@ class BitbucketClient(key: String, secretKey: String, token: String, secretToken
5052
}
5153

5254
/*
53-
* Does an API post
55+
* Does an API request
5456
*/
55-
private def post[D,T](request: Request[T], values: D)(implicit reader: Reads[T], writer: Writeable[D], contentType: ContentTypeOf[D]): RequestResponse[T] = withClientRequest { client =>
56-
57+
private def performRequest[D, T](method: String, request: Request[T], values: D)(implicit reader: Reads[T], writer: Writeable[D], contentType: ContentTypeOf[D]): RequestResponse[T] = withClientRequest { client =>
5758
val jpromise = client.url(request.url)
5859
.sign(requestSigner)
5960
.withFollowRedirects(follow = true)
60-
.post(values)
61+
.withMethod(method).withBody(values).execute()
6162
val result = Await.result(jpromise, requestTimeout)
6263

6364
val value = if (Seq(HTTPStatusCodes.OK, HTTPStatusCodes.CREATED).contains(result.status)) {
@@ -78,11 +79,19 @@ class BitbucketClient(key: String, secretKey: String, token: String, secretToken
7879
}
7980

8081
def postForm[T](request: Request[T], values: Map[String, Seq[String]])(implicit reader: Reads[T]): RequestResponse[T] = {
81-
post(request, values)
82+
performRequest("POST", request, values)
8283
}
8384

8485
def postJson[T](request: Request[T], values: JsValue)(implicit reader: Reads[T]): RequestResponse[T] = {
85-
post(request, values)
86+
performRequest("POST", request, values)
87+
}
88+
89+
def putForm[T](request: Request[T], values: Map[String, Seq[String]])(implicit reader: Reads[T]): RequestResponse[T] = {
90+
performRequest("PUT", request, values)
91+
}
92+
93+
def putJson[T](request: Request[T], values: JsValue)(implicit reader: Reads[T]): RequestResponse[T] = {
94+
performRequest("PUT", request, values)
8695
}
8796

8897
/* copy paste from post ... */
Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
package com.codacy.client.bitbucket.service
2+
3+
import com.codacy.client.bitbucket.BuildStatus
4+
import com.codacy.client.bitbucket.client.{BitbucketClient, Request, RequestResponse}
5+
import play.api.libs.json.Json
6+
7+
class BuildStatusServices(client: BitbucketClient) {
8+
9+
/*
10+
* Gets a commit build status
11+
*
12+
*/
13+
def getBuildStatus(owner: String, repository: String, commit: String, key: String): RequestResponse[BuildStatus] = {
14+
val url = s"https://bitbucket.org/!api/2.0/repositories/$owner/$repository/commit/$commit/statuses/build/$key"
15+
16+
client.execute(Request(url, classOf[BuildStatus]))
17+
}
18+
19+
20+
/*
21+
* Create a build status for a commit
22+
*
23+
*/
24+
def createBuildStatus(owner: String, repository: String, commit: String, buildStatus: BuildStatus): RequestResponse[BuildStatus] = {
25+
val url = s"https://bitbucket.org/!api/2.0/repositories/$owner/$repository/commit/$commit/statuses/build"
26+
27+
val values = Map("state" -> Seq(buildStatus.state), "key" -> Seq(buildStatus.key),
28+
"name" -> Seq(buildStatus.name), "url" -> Seq(buildStatus.url),
29+
"description" -> Seq(buildStatus.description))
30+
31+
client.postForm(Request(url, classOf[BuildStatus]), values)
32+
}
33+
34+
/*
35+
* Update a build status for a commit
36+
*
37+
*/
38+
def updateBuildStatus(owner: String, repository: String, commit: String, buildStatus: BuildStatus): RequestResponse[BuildStatus] = {
39+
val url = s"https://bitbucket.org/!api/2.0/repositories/$owner/$repository/commit/$commit/statuses/build/${buildStatus.key}"
40+
41+
val payload = Json.obj(
42+
"state" -> buildStatus.state,
43+
"name" -> buildStatus.name, "url" -> buildStatus.url,
44+
"description" -> buildStatus.description
45+
)
46+
47+
client.putJson(Request(url, classOf[BuildStatus]), payload)
48+
}
49+
}
50+

0 commit comments

Comments
 (0)