Skip to content

Commit 2728553

Browse files
authored
Rework GHResponse to incorporate useful data on unhappy path (#367)
1 parent fc805c2 commit 2728553

40 files changed

Lines changed: 497 additions & 534 deletions

docs/docs/activity.md

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -49,9 +49,10 @@ You can subscribe or unsubscribe using `setThreadSub`; it takes as arguments:
4949

5050
```scala mdoc:compile-only
5151
val threadSub = Github[IO](accessToken).activities.setThreadSub(5, true, false)
52-
threadSub.unsafeRunSync match {
52+
val response = threadSub.unsafeRunSync()
53+
response.result match {
5354
case Left(e) => println(s"Something went wrong: ${e.getMessage}")
54-
case Right(r) => println(r.result)
55+
case Right(r) => println(r)
5556
}
5657
```
5758

@@ -73,9 +74,10 @@ To list the stargazers of 47deg/github4s:
7374

7475
```scala mdoc:compile-only
7576
val listStargazers = Github[IO](accessToken).activities.listStargazers("47deg", "github4s", true)
76-
listStargazers.unsafeRunSync match {
77+
val response = listStargazers.unsafeRunSync()
78+
response.result match {
7779
case Left(e) => println(s"Something went wrong: ${e.getMessage}")
78-
case Right(r) => println(r.result)
80+
case Right(r) => println(r)
7981
}
8082
```
8183

@@ -100,9 +102,10 @@ To list the starred repositories for user `rafaparadela`:
100102

101103
```scala mdoc:compile-only
102104
val listStarredRepositories = Github[IO](accessToken).activities.listStarredRepositories("rafaparadela", true)
103-
listStarredRepositories.unsafeRunSync match {
105+
val response = listStarredRepositories.unsafeRunSync()
106+
response.result match {
104107
case Left(e) => println(s"Something went wrong: ${e.getMessage}")
105-
case Right(r) => println(r.result)
108+
case Right(r) => println(r)
106109
}
107110
```
108111

docs/docs/auth.md

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -50,9 +50,10 @@ val newAuth = Github[IO](None).auth.newAuth(
5050
"New access token",
5151
"e8e39175648c9db8c280",
5252
"1234567890")
53-
newAuth.unsafeRunSync match {
53+
val response = newAuth.unsafeRunSync()
54+
response.result match {
5455
case Left(e) => println(s"Something went wrong: ${e.getMessage}")
55-
case Right(r) => println(r.result)
56+
case Right(r) => println(r)
5657
}
5758
```
5859

@@ -76,9 +77,10 @@ val authorizeUrl = Github[IO](None).auth.authorizeUrl(
7677
"e8e39175648c9db8c280",
7778
"http://localhost:9000/_oauth-callback",
7879
List("public_repo"))
79-
authorizeUrl.unsafeRunSync match {
80+
val response = authorizeUrl.unsafeRunSync()
81+
response.result match {
8082
case Left(e) => println(s"Something went wrong: ${e.getMessage}")
81-
case Right(r) => println(r.result)
83+
case Right(r) => println(r)
8284
}
8385
```
8486

@@ -106,9 +108,10 @@ val getAccessToken = Github[IO](None).auth.getAccessToken(
106108
"code",
107109
"http://localhost:9000/_oauth-callback",
108110
"status")
109-
getAccessToken.unsafeRunSync match {
111+
val response = getAccessToken.unsafeRunSync()
112+
response.result match {
110113
case Left(e) => println(s"Something went wrong: ${e.getMessage}")
111-
case Right(r) => println(r.result)
114+
case Right(r) => println(r)
112115
}
113116
```
114117

docs/docs/contributing.md

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -144,16 +144,17 @@ we'll be writing our tests in [GHReposSpec][repos-integ-spec]:
144144
.unsafeRunSync()
145145

146146
testIsRight[List[Status]](response, { r =>
147-
r.result.nonEmpty shouldBe true
148-
r.statusCode shouldBe okStatusCode
147+
r.nonEmpty shouldBe true
149148
})
149+
response.statusCode shouldBe okStatusCode
150150
}
151151

152152
it should "return an error when an invalid ref is provided" taggedAs Integration in {
153153
val response = Github[IO](accessToken).repos
154154
.listStatuses(validRepoOwner, validRepoName, invalidRef, headers = headerUserAgent)
155155
.unsafeRunSync()
156156
testIsLeft(response)
157+
response.statusCode shouldBe notFoundStatusCode
157158
}
158159
```
159160

@@ -174,7 +175,7 @@ We're just checking that our API defined above hits the right endpoint, here:
174175
```scala
175176
"Repos.listStatuses" should "call htppClient.get with the right parameters" in {
176177
val response: IO[GHResponse[List[Status]]] =
177-
IO(Right(GHResult(List(status), okStatusCode, Map.empty)))
178+
IO(GHResult(List(status).asRight, okStatusCode, Map.empty))
178179

179180
implicit val httpClientMock = httpClientMockGet[List[Status]](
180181
url = s"repos/$validRepoOwner/$validRepoName/commits/$validRefSingle/statuses",
@@ -184,7 +185,6 @@ We're just checking that our API defined above hits the right endpoint, here:
184185
val repos = new RepositoriesInterpreter[IO]
185186

186187
repos.listStatuses(validRepoOwner, validRepoName, validRefSingle, headerUserAgent)
187-
188188
}
189189
```
190190

@@ -211,9 +211,10 @@ To list the statuses for a specific ref:
211211
val listStatuses =
212212
Github[IO](accessToken).repos.listStatuses("47deg", "github4s", "heads/master")
213213
214-
listStatuses.unsafeRunSync match {
214+
val response = listStatuses.unsafeRunSync()
215+
response.result match {
215216
case Left(e) => println(s"Something went wrong: ${e.getMessage}")
216-
case Right(r) => println(r.result)
217+
case Right(r) => println(r)
217218
}
218219
{triple backtick}
219220
@@ -241,4 +242,4 @@ cd docs/target/site/ && jekyll serve
241242
[repos-integ-spec]: https://github.com/47deg/github4s/blob/master/github4s/src/test/scala/github4s/integration/GHReposSpec.scala
242243
[unit-pkg]: https://github.com/47deg/github4s/tree/master/github4s/src/test/scala/github4s/unit
243244
[repos-interpreter-spec]: https://github.com/47deg/github4s/blob/master/github4s/src/test/scala/github4s/unit/ReposSpec.scala
244-
[repos-md]: https://github.com/47deg/github4s/blob/master/docs/docs/repository.md
245+
[repos-md]: https://github.com/47deg/github4s/blob/master/docs/docs/repository.md

docs/docs/docs.md

Lines changed: 17 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -29,13 +29,15 @@ Github4s uses [Tagless Final encoding](https://typelevel.org/blog/2017/12/27/opt
2929

3030
Every Github4s API call returns an `F[GHResponse[A]]` where `F` has an instance of [cats.effect.ConcurrentEffect][cats-concurrent-effect].
3131

32-
`GHResponse[A]` is, in turn, a type alias for `Either[GHException, GHResult[A]]`.
33-
34-
`GHResult` contains the result `A` given by Github as well as the status code and headers of the
35-
response:
32+
`GHResponse[A]` contains the result `A` given by Github (or an error) as well as the status code and
33+
headers of the response:
3634

3735
```scala
38-
case class GHResult[A](result: A, statusCode: Int, headers: Map[String, String])
36+
final case class GHResponse[A](
37+
result: Either[GHException, A],
38+
statusCode: Int,
39+
headers: Map[String, String]
40+
)
3941
```
4042

4143
As an introductory example, we can get a user with the following:
@@ -69,11 +71,11 @@ object ProgramIO {
6971
import cats.effect.IO.contextShift
7072
import scala.concurrent.ExecutionContext.Implicits.global
7173
import github4s.Github
72-
74+
7375
implicit val IOContextShift = IO.contextShift(global)
7476

7577
val u1 = Github[IO](accessToken).users.get("juanpedromoreno")
76-
u1.unsafeRunSync
78+
u1.unsafeRunSync()
7779
}
7880
```
7981

@@ -84,21 +86,19 @@ object ProgramTask {
8486
import monix.execution.Scheduler.Implicits.global
8587
import monix.eval.Task
8688
import github4s.Github
87-
89+
8890
val u2 = Github[Task](accessToken).users.get("rafaparadela")
8991
}
9092
```
9193

92-
As mentioned above, `u2` should have an `Task[GHResponse[User]]`
94+
As mentioned above, `u2` should be a `Task[GHResponse[User]]`
9395

9496
```scala mdoc:silent:fail
9597
import github4s.GithubResponses.GHResult
9698

97-
ProgramTask.u2.runAsync { result =>
98-
result match {
99-
case Right(GHResult(result, status@_, headers@_)) => doSomething
100-
case Left(e) => doSomething
101-
}
99+
ProgramTask.u2.runAsync() {
100+
case GHResult(Right(result), status@_, headers@_) => doSomething
101+
case GHResult(Left(error), status@_, headers@_) => doSomethingElse
102102
}
103103

104104
```
@@ -114,7 +114,7 @@ object ProgramId {
114114
import scala.concurrent.ExecutionContext.Implicits.global
115115
import github4s.Github
116116
import github4s.GithubIOSyntax._
117-
117+
118118
implicit val IOContextShift = IO.contextShift(global)
119119

120120
val u3 = Github[IO](accessToken).users.get("rafaparadela").toId
@@ -150,9 +150,9 @@ object ProgramEvalWithHeaders {
150150
import monix.execution.Scheduler.Implicits.global
151151
import monix.eval.Task
152152
import github4s.Github
153-
153+
154154
val userHeaders = Map("user-agent" -> "github4s")
155-
val u5 = Github[Task](accessToken).users.get("rafaparadela", userHeaders)
155+
val u5 = Github[Task](accessToken).users.get("rafaparadela", userHeaders)
156156
}
157157
```
158158

docs/docs/gist.md

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -46,10 +46,10 @@ val gistfiles = Map(
4646
"gh4s.scala" -> GistFile("val gh = Github(accessToken)")
4747
)
4848
val newGist = Github[IO](accessToken).gists.newGist("Github4s entry point", public = true, gistfiles)
49-
50-
newGist.unsafeRunSync match {
49+
val response = newGist.unsafeRunSync()
50+
response.result match {
5151
case Left(e) => println(s"Something went wrong: ${e.getMessage}")
52-
case Right(r) => println(r.result)
52+
case Right(r) => println(r)
5353
}
5454
```
5555

@@ -68,21 +68,21 @@ To get a single gist:
6868

6969
```scala mdoc:compile-only
7070
val singleGist = Github[IO](accessToken).gists.getGist("aa5a315d61ae9438b18d")
71-
72-
singleGist.unsafeRunSync match {
71+
val response = singleGist.unsafeRunSync()
72+
response.result match {
7373
case Left(e) => println(s"Something went wrong: ${e.getMessage}")
74-
case Right(r) => println(r.result)
74+
case Right(r) => println(r)
7575
}
7676
```
7777

7878
Similarly, to get a specific revision of a gist:
7979

8080
```scala mdoc:compile-only
8181
val sepcificRevisionGist = Github[IO](accessToken).gists.getGist("aa5a315d61ae9438b18d", Some("4e481528046a016fc11d6e7d8d623b55ea11e372"))
82-
83-
sepcificRevisionGist.unsafeRunSync match {
82+
val response = sepcificRevisionGist.unsafeRunSync()
83+
response.result match {
8484
case Left(e) => println(s"Something went wrong: ${e.getMessage}")
85-
case Right(r) => println(r.result)
85+
case Right(r) => println(r)
8686
}
8787
```
8888

@@ -110,10 +110,10 @@ val editfiles = Map(
110110
)
111111

112112
val updatedGist = Github[IO](accessToken).gists.editGist("aa5a315d61ae9438b18d", "Updated github4s entry point", editfiles)
113-
114-
updatedGist.unsafeRunSync match {
113+
val response = updatedGist.unsafeRunSync()
114+
response.result match {
115115
case Left(e) => println(s"Something went wrong: ${e.getMessage}")
116-
case Right(r) => println(r.result)
116+
case Right(r) => println(r)
117117
}
118118
```
119119

docs/docs/git_data.md

Lines changed: 27 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -58,10 +58,10 @@ You can get a reference using `getReference`, it takes as arguments:
5858

5959
```scala mdoc:compile-only
6060
val getReference = Github[IO](accessToken).gitData.getReference("47deg", "github4s", "heads/master")
61-
62-
getReference.unsafeRunSync match {
61+
val response = getReference.unsafeRunSync()
62+
response.result match {
6363
case Left(e) => println(s"Something went wrong: ${e.getMessage}")
64-
case Right(r) => println(r.result)
64+
case Right(r) => println(r)
6565
}
6666
```
6767

@@ -88,10 +88,10 @@ val createReference = Github[IO](accessToken).gitData.createReference(
8888
"github4s",
8989
"refs/heads/master",
9090
"d3b048c1f500ee5450e5d7b3d1921ed3e7645891")
91-
92-
createReference.unsafeRunSync match {
91+
val response = createReference.unsafeRunSync()
92+
response.result match {
9393
case Left(e) => println(s"Something went wrong: ${e.getMessage}")
94-
case Right(r) => println(r.result)
94+
case Right(r) => println(r)
9595
}
9696
```
9797

@@ -117,10 +117,10 @@ val updateReference = Github[IO](accessToken).gitData.updateReference(
117117
"heads/master",
118118
"d3b048c1f500ee5450e5d7b3d1921ed3e7645891",
119119
false)
120-
121-
updateReference.unsafeRunSync match {
120+
val response = updateReference.unsafeRunSync()
121+
response.result match {
122122
case Left(e) => println(s"Something went wrong: ${e.getMessage}")
123-
case Right(r) => println(r.result)
123+
case Right(r) => println(r)
124124
}
125125
```
126126

@@ -139,10 +139,10 @@ You can get a commit using `getCommit`; it takes as arguments:
139139

140140
```scala mdoc:compile-only
141141
val getCommit = Github[IO](accessToken).gitData.getCommit("47deg", "github4s", "d3b048c1f500ee5450e5d7b3d1921ed3e7645891")
142-
143-
getCommit.unsafeRunSync match {
142+
val response = getCommit.unsafeRunSync()
143+
response.result match {
144144
case Left(e) => println(s"Something went wrong: ${e.getMessage}")
145-
case Right(r) => println(r.result)
145+
case Right(r) => println(r)
146146
}
147147
```
148148

@@ -171,10 +171,10 @@ val createCommit = Github[IO](accessToken).gitData.createCommit(
171171
"827efc6d56897b048c772eb4087f854f46256132",
172172
List("d3b048c1f500ee5450e5d7b3d1921ed3e7645891"),
173173
None)
174-
175-
createCommit.unsafeRunSync match {
174+
val response = createCommit.unsafeRunSync()
175+
response.result match {
176176
case Left(e) => println(s"Something went wrong: ${e.getMessage}")
177-
case Right(r) => println(r.result)
177+
case Right(r) => println(r)
178178
}
179179
```
180180

@@ -194,10 +194,10 @@ You can create a blob using `createBlob`; it takes as arguments:
194194

195195
```scala mdoc:compile-only
196196
val createBlob = Github[IO](accessToken).gitData.createBlob("47deg", "github4s", "New access token", Some("utf-8"))
197-
198-
createBlob.unsafeRunSync match {
197+
val response = createBlob.unsafeRunSync()
198+
response.result match {
199199
case Left(e) => println(s"Something went wrong: ${e.getMessage}")
200-
case Right(r) => println(r.result)
200+
case Right(r) => println(r)
201201
}
202202
```
203203

@@ -225,10 +225,10 @@ You can get a tree using `getTree`; it takes as arguments:
225225

226226
```scala mdoc:compile-only
227227
val getTree = Github[IO](accessToken).gitData.getTree("47deg", "github4s", "d3b048c1f500ee5450e5d7b3d1921ed3e7645891", true)
228-
229-
getTree.unsafeRunSync match {
228+
val response = getTree.unsafeRunSync()
229+
response.result match {
230230
case Left(e) => println(s"Something went wrong: ${e.getMessage}")
231-
case Right(r) => println(r.result)
231+
case Right(r) => println(r)
232232
}
233233
```
234234

@@ -270,10 +270,10 @@ val createTree = Github[IO](accessToken).gitData.createTree(
270270
"100644",
271271
"blob",
272272
"827efc6d56897b048c772eb4087f854f46256132")))
273-
274-
createTree.unsafeRunSync match {
273+
val response = createTree.unsafeRunSync()
274+
response.result match {
275275
case Left(e) => println(s"Something went wrong: ${e.getMessage}")
276-
case Right(r) => println(r.result)
276+
case Right(r) => println(r)
277277
}
278278
```
279279

@@ -305,10 +305,10 @@ val createTag = Github[IO](accessToken).gitData.createTag(
305305
"d3b048c1f500ee5450e5d7b3d1921ed3e7645891",
306306
"commit",
307307
Some(RefAuthor("2014-11-07T22:01:45Z", "rafaparadela", "developer@47deg.com")))
308-
309-
createTag.unsafeRunSync match {
308+
val response = createTag.unsafeRunSync()
309+
response.result match {
310310
case Left(e) => println(s"Something went wrong: ${e.getMessage}")
311-
case Right(r) => println(r.result)
311+
case Right(r) => println(r)
312312
}
313313
```
314314

0 commit comments

Comments
 (0)