Skip to content

Commit 7deed0c

Browse files
Support listing releases (#492)
1 parent 7e27282 commit 7deed0c

5 files changed

Lines changed: 81 additions & 0 deletions

File tree

docs/docs/repository.md

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -354,6 +354,31 @@ See [the API doc](https://developer.github.com/v3/repos/contents/#delete-a-file)
354354

355355
## Releases
356356

357+
### List of releases
358+
359+
You can list releases using `listReleases`, it takes as arguments:
360+
361+
- the repository coordinates (`owner` and `name` of the repository).
362+
- `pagination` Limit and Offset for pagination, optional.
363+
364+
To list releases:
365+
366+
```scala mdoc:compile-only
367+
val listReleases =
368+
gh.repos.listReleases(
369+
"47deg",
370+
"github4s",
371+
None,
372+
Map.empty)
373+
val response = listReleases.unsafeRunSync()
374+
response.result match {
375+
case Left(e) => println(s"Something went wrong: ${e.getMessage}")
376+
case Right(r) => println(r)
377+
}
378+
```
379+
380+
The `result` on the right is the corresponding [List[Release]][repository-scala].
381+
357382
### Create a release
358383

359384
Users with push access to the repository can create a release using `createRelease`; it takes as arguments:

github4s/src/main/scala/github4s/algebras/Repositories.scala

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -271,6 +271,22 @@ trait Repositories[F[_]] {
271271
headers: Map[String, String] = Map()
272272
): F[GHResponse[List[User]]]
273273

274+
/**
275+
* List of releases
276+
*
277+
* @param owner of the repo
278+
* @param repo name of the repo
279+
* @param pagination Limit and Offset for pagination
280+
* @param headers optional user headers to include in the request
281+
* @return a GHResponse with List[Release]
282+
*/
283+
def listReleases(
284+
owner: String,
285+
repo: String,
286+
pagination: Option[Pagination],
287+
headers: Map[String, String]
288+
): F[GHResponse[List[Release]]]
289+
274290
/**
275291
* Create a new release
276292
*

github4s/src/main/scala/github4s/interpreters/RepositoriesInterpreter.scala

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -217,6 +217,20 @@ class RepositoriesInterpreter[F[_]](implicit client: HttpClient[F], accessToken:
217217
pagination
218218
)
219219

220+
override def listReleases(
221+
owner: String,
222+
repo: String,
223+
pagination: Option[Pagination],
224+
headers: Map[String, String]
225+
): F[GHResponse[List[Release]]] =
226+
client.get[List[Release]](
227+
accessToken,
228+
s"repos/$owner/$repo/releases",
229+
headers,
230+
Map.empty,
231+
pagination
232+
)
233+
220234
override def createRelease(
221235
owner: String,
222236
repo: String,

github4s/src/test/scala/github4s/integration/ReposSpec.scala

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,18 @@ trait ReposSpec extends BaseIntegrationSpec {
4949
response.statusCode shouldBe notFoundStatusCode
5050
}
5151

52+
"Repos >> ListReleases" should "return the expected repos when a valid org is provided" taggedAs Integration in {
53+
val response = clientResource
54+
.use { client =>
55+
Github[IO](client, accessToken).repos
56+
.listReleases(validRepoOwner, validRepoName, None, headers = headerUserAgent)
57+
}
58+
.unsafeRunSync()
59+
60+
testIsRight[List[Release]](response, r => r.nonEmpty shouldBe true)
61+
response.statusCode shouldBe okStatusCode
62+
}
63+
5264
"Repos >> ListOrgRepos" should "return the expected repos when a valid org is provided" taggedAs Integration in {
5365
val response = clientResource
5466
.use { client =>

github4s/src/test/scala/github4s/unit/ReposSpec.scala

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,20 @@ class ReposSpec extends BaseSpec {
4343
repos.get(validRepoOwner, validRepoName, headerUserAgent)
4444
}
4545

46+
"Repos.listReleases" should "call to httpClient.get with the right parameters" in {
47+
val response: IO[GHResponse[List[Release]]] =
48+
IO(GHResponse(List(release).asRight, okStatusCode, Map.empty))
49+
50+
implicit val httpClientMock = httpClientMockGet[List[Release]](
51+
url = s"repos/$validRepoOwner/$validRepoName/releases",
52+
response = response
53+
)
54+
55+
val repos = new RepositoriesInterpreter[IO]
56+
57+
repos.listReleases(validRepoOwner, validRepoName, None, headers = headerUserAgent)
58+
}
59+
4660
"Repos.listOrgRepos" should "call to httpClient.get with the right parameters" in {
4761
val response: IO[GHResponse[List[Repository]]] =
4862
IO(GHResponse(List(repo).asRight, okStatusCode, Map.empty))

0 commit comments

Comments
 (0)