Skip to content

Commit ca1e15c

Browse files
sukeshniashawley
authored andcommitted
code-check#36 Implemented searchRepositories v1
1 parent 0fdf0af commit ca1e15c

File tree

4 files changed

+69
-0
lines changed

4 files changed

+69
-0
lines changed

src/main/scala/codecheck/github/api/GitHubAPI.scala

+1
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ class GitHubAPI(token: String, client: Transport, tokenType: String = "token", d
2828
with WebhookOp
2929
with CollaboratorOp
3030
with BranchOp
31+
with SearchOp
3132
{
3233

3334
private val endpoint = "https://api.github.com"
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
package codecheck.github.models
2+
3+
import org.json4s.JValue
4+
import codecheck.github.models.SortDirection
5+
6+
sealed abstract class SearchSort(val name: String) {
7+
override def toString = name
8+
}
9+
object SearchSort {
10+
case object stars extends SearchSort("stars")
11+
case object forks extends SearchSort("forks")
12+
case object updated extends SearchSort("updated")
13+
}
14+
15+
case class SearchInput (
16+
q: String,
17+
sort: Option[SearchSort] = None,
18+
order: SortDirection = SortDirection.desc
19+
) extends AbstractInput
20+
21+
case class SearchRepositoryResult(value: JValue) extends AbstractJson(value) {
22+
def total_count: Long = get("total_count").toLong
23+
def incomplete_results: Boolean = boolean("incomplete_results")
24+
lazy val items = Repository(value \ "items")
25+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
package codecheck.github.operations
2+
3+
import scala.concurrent.Future
4+
import scala.concurrent.ExecutionContext.Implicits.global
5+
6+
import codecheck.github.api.GitHubAPI
7+
import codecheck.github.models.SearchInput
8+
import codecheck.github.models.SearchRepositoryResult
9+
10+
trait SearchOp {
11+
self: GitHubAPI =>
12+
13+
def searchRepositories(input: SearchInput): Future[Option[SearchRepositoryResult]] = {
14+
val path = s"/search/repositories?q=${input.q}&sort=${input.sort}&order=${input.order}"
15+
exec("GET", path ).map { res =>
16+
res.statusCode match {
17+
case 200 => Some(SearchRepositoryResult(res.body))
18+
case 404 => None
19+
}
20+
}
21+
}
22+
}

src/test/scala/SearchOpSpec.scala

+21
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
import org.scalatest.path.FunSpec
2+
import scala.concurrent.Await
3+
import scala.concurrent.ExecutionContext.Implicits.global
4+
import codecheck.github.models.SortDirection
5+
import codecheck.github.models.SearchInput
6+
import codecheck.github.models.SearchSort
7+
import codecheck.github.models.SearchRepositoryResult
8+
9+
class SearchOpSpec extends FunSpec
10+
with Constants
11+
{
12+
val input = SearchInput("tetris",sort=Some(SearchSort.stars),order=SortDirection.desc)
13+
describe("searchRepositories") {
14+
it("with valid SearchInput should succeed") {
15+
Await.result(api.searchRepositories(input), TIMEOUT).map { res =>
16+
assert(res.total_count >= 1)
17+
println("RESULT" + res)
18+
}
19+
}
20+
}
21+
}

0 commit comments

Comments
 (0)