Skip to content

Commit

Permalink
Support listing releases (#492)
Browse files Browse the repository at this point in the history
  • Loading branch information
georgeorfanidi committed May 19, 2020
1 parent 7e27282 commit 7deed0c
Show file tree
Hide file tree
Showing 5 changed files with 81 additions and 0 deletions.
25 changes: 25 additions & 0 deletions docs/docs/repository.md
Original file line number Diff line number Diff line change
Expand Up @@ -354,6 +354,31 @@ See [the API doc](https://developer.github.com/v3/repos/contents/#delete-a-file)

## Releases

### List of releases

You can list releases using `listReleases`, it takes as arguments:

- the repository coordinates (`owner` and `name` of the repository).
- `pagination` Limit and Offset for pagination, optional.

To list releases:

```scala mdoc:compile-only
val listReleases =
gh.repos.listReleases(
"47deg",
"github4s",
None,
Map.empty)
val response = listReleases.unsafeRunSync()
response.result match {
case Left(e) => println(s"Something went wrong: ${e.getMessage}")
case Right(r) => println(r)
}
```

The `result` on the right is the corresponding [List[Release]][repository-scala].

### Create a release

Users with push access to the repository can create a release using `createRelease`; it takes as arguments:
Expand Down
16 changes: 16 additions & 0 deletions github4s/src/main/scala/github4s/algebras/Repositories.scala
Original file line number Diff line number Diff line change
Expand Up @@ -271,6 +271,22 @@ trait Repositories[F[_]] {
headers: Map[String, String] = Map()
): F[GHResponse[List[User]]]

/**
* List of releases
*
* @param owner of the repo
* @param repo name of the repo
* @param pagination Limit and Offset for pagination
* @param headers optional user headers to include in the request
* @return a GHResponse with List[Release]
*/
def listReleases(
owner: String,
repo: String,
pagination: Option[Pagination],
headers: Map[String, String]
): F[GHResponse[List[Release]]]

/**
* Create a new release
*
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -217,6 +217,20 @@ class RepositoriesInterpreter[F[_]](implicit client: HttpClient[F], accessToken:
pagination
)

override def listReleases(
owner: String,
repo: String,
pagination: Option[Pagination],
headers: Map[String, String]
): F[GHResponse[List[Release]]] =
client.get[List[Release]](
accessToken,
s"repos/$owner/$repo/releases",
headers,
Map.empty,
pagination
)

override def createRelease(
owner: String,
repo: String,
Expand Down
12 changes: 12 additions & 0 deletions github4s/src/test/scala/github4s/integration/ReposSpec.scala
Original file line number Diff line number Diff line change
Expand Up @@ -49,6 +49,18 @@ trait ReposSpec extends BaseIntegrationSpec {
response.statusCode shouldBe notFoundStatusCode
}

"Repos >> ListReleases" should "return the expected repos when a valid org is provided" taggedAs Integration in {
val response = clientResource
.use { client =>
Github[IO](client, accessToken).repos
.listReleases(validRepoOwner, validRepoName, None, headers = headerUserAgent)
}
.unsafeRunSync()

testIsRight[List[Release]](response, r => r.nonEmpty shouldBe true)
response.statusCode shouldBe okStatusCode
}

"Repos >> ListOrgRepos" should "return the expected repos when a valid org is provided" taggedAs Integration in {
val response = clientResource
.use { client =>
Expand Down
14 changes: 14 additions & 0 deletions github4s/src/test/scala/github4s/unit/ReposSpec.scala
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,20 @@ class ReposSpec extends BaseSpec {
repos.get(validRepoOwner, validRepoName, headerUserAgent)
}

"Repos.listReleases" should "call to httpClient.get with the right parameters" in {
val response: IO[GHResponse[List[Release]]] =
IO(GHResponse(List(release).asRight, okStatusCode, Map.empty))

implicit val httpClientMock = httpClientMockGet[List[Release]](
url = s"repos/$validRepoOwner/$validRepoName/releases",
response = response
)

val repos = new RepositoriesInterpreter[IO]

repos.listReleases(validRepoOwner, validRepoName, None, headers = headerUserAgent)
}

"Repos.listOrgRepos" should "call to httpClient.get with the right parameters" in {
val response: IO[GHResponse[List[Repository]]] =
IO(GHResponse(List(repo).asRight, okStatusCode, Map.empty))
Expand Down

0 comments on commit 7deed0c

Please sign in to comment.