github: Decouple API from responses instances
authorAlexandre Terrasa <alexandre@moz-code.org>
Fri, 21 Jun 2019 02:56:22 +0000 (22:56 -0400)
committerAlexandre Terrasa <alexandre@moz-code.org>
Thu, 11 Jul 2019 01:42:16 +0000 (21:42 -0400)
Signed-off-by: Alexandre Terrasa <alexandre@moz-code.org>

lib/github/api.nit
lib/github/loader.nit
lib/github/tests/test_api.nit

index c1fa99f..67a9fac 100644 (file)
@@ -225,8 +225,8 @@ class GithubAPI
        # assert repo.owner.login == "nitlang"
        # assert repo.default_branch == "master"
        # ~~~
-       fun get_repo(full_name: String): nullable Repo do
-               return get("/repos/{full_name}").as(nullable Repo)
+       fun get_repo(repo_slug: String): nullable Repo do
+               return get("/repos/{repo_slug}").as(nullable Repo)
        end
 
        # List of repo branches.
@@ -234,15 +234,15 @@ class GithubAPI
        # Pagination:
        #       * `page`: page to fetch (default: 1)
        #       * `per_page`: number of branches by page (default: 30)
-       fun get_repo_branches(repo: Repo, page, per_page: nullable Int): Array[Branch] do
+       fun get_repo_branches(repo_slug: String, page, per_page: nullable Int): Array[Branch] do
                return new GithubArray[Branch].from(get(
-                       "/repos/{repo.full_name}/branches?{pagination(page, per_page)}"))
+                       "/repos/{repo_slug}/branches?{pagination(page, per_page)}"))
        end
 
        # List of issues associated with their ids.
-       fun get_repo_issues(repo: Repo, page, per_page: nullable Int): Array[Issue] do
+       fun get_repo_issues(repo_slug: String, page, per_page: nullable Int): Array[Issue] do
                return new GithubArray[Issue].from(get(
-                       "/repos/{repo.full_name}/issues?{pagination(page, per_page)}"))
+                       "/repos/{repo_slug}/issues?{pagination(page, per_page)}"))
        end
 
        # Search issues in this repo form an advanced query.
@@ -254,20 +254,20 @@ class GithubAPI
        # ~~~
        #
        # See <https://developer.github.com/v3/search/#search-issues>.
-       fun search_repo_issues(repo: Repo, query: String, page, per_page: nullable Int): nullable SearchResults do
-               return get("/search/issues?q={query} repo:{repo.full_name}&{pagination(page, per_page)}").as(nullable SearchResults)
+       fun search_repo_issues(repo_slug: String, query: String, page, per_page: nullable Int): nullable SearchResults do
+               return get("/search/issues?q={query} repo:{repo_slug}&{pagination(page, per_page)}").as(nullable SearchResults)
        end
 
        # List of labels associated with their names.
-       fun get_repo_labels(repo: Repo, page, per_page: nullable Int): Array[Label] do
+       fun get_repo_labels(repo_slug: String, page, per_page: nullable Int): Array[Label] do
                return new GithubArray[Label].from(get(
-                       "/repos/{repo.full_name}/labels?{pagination(page, per_page)}"))
+                       "/repos/{repo_slug}/labels?{pagination(page, per_page)}"))
        end
 
        # List of milestones associated with their ids.
-       fun get_repo_milestones(repo: Repo, page, per_page: nullable Int): Array[Milestone] do
+       fun get_repo_milestones(repo_slug: String, page, per_page: nullable Int): Array[Milestone] do
                return new GithubArray[Milestone].from(get(
-                       "/repos/{repo.full_name}/milestones?{pagination(page, per_page)}"))
+                       "/repos/{repo_slug}/milestones?{pagination(page, per_page)}"))
        end
 
        # List of pull-requests associated with their ids.
@@ -275,16 +275,16 @@ class GithubAPI
        # Implementation notes: because PR numbers are not consecutive,
        # PR are loaded from pages.
        # See: https://developer.github.com/v3/pulls/#list-pull-requests
-       fun get_repo_pulls(repo: Repo, page, per_page: nullable Int): Array[PullRequest] do
+       fun get_repo_pulls(repo_slug: String, page, per_page: nullable Int): Array[PullRequest] do
                return new GithubArray[PullRequest].from(get(
-                       "/repos/{repo.full_name}/pulls?{pagination(page, per_page)}"))
+                       "/repos/{repo_slug}/pulls?{pagination(page, per_page)}"))
        end
 
        # List of contributor related statistics.
-       fun get_repo_contrib_stats(repo: Repo): Array[ContributorStats] do
-               message(1, "Get contributor stats for {repo.full_name}")
+       fun get_repo_contrib_stats(repo_slug: String): Array[ContributorStats] do
+               message(1, "Get contributor stats for {repo_slug}")
                var res = new Array[ContributorStats]
-               var array = get("/repos/{repo.full_name}/stats/contributors")
+               var array = get("/repos/{repo_slug}/stats/contributors")
                if not array isa JsonArray then return res
                return deserialize(array.to_json).as(Array[ContributorStats])
        end
@@ -301,8 +301,8 @@ class GithubAPI
        # assert branch.name == "master"
        # assert branch.commit isa Commit
        # ~~~
-       fun get_branch(repo: Repo, name: String): nullable Branch do
-               return get("/repos/{repo.full_name}/branches/{name}").as(nullable Branch)
+       fun get_branch(repo_slug: String, name: String): nullable Branch do
+               return get("/repos/{repo_slug}/branches/{name}").as(nullable Branch)
        end
 
        # Get the Github commit with `sha`.
@@ -316,8 +316,8 @@ class GithubAPI
        # var commit = api.get_commit(repo, "64ce1f")
        # assert commit isa Commit
        # ~~~
-       fun get_commit(repo: Repo, sha: String): nullable Commit do
-               return get("/repos/{repo.full_name}/commits/{sha}").as(nullable Commit)
+       fun get_commit(repo_slug: String, sha: String): nullable Commit do
+               return get("/repos/{repo_slug}/commits/{sha}").as(nullable Commit)
        end
 
        # Get the Github issue #`number`.
@@ -331,20 +331,20 @@ class GithubAPI
        # var issue = api.get_issue(repo, 1)
        # assert issue.title == "Doc"
        # ~~~
-       fun get_issue(repo: Repo, number: Int): nullable Issue do
-               return get("/repos/{repo.full_name}/issues/{number}").as(nullable Issue)
+       fun get_issue(repo_slug: String, number: Int): nullable Issue do
+               return get("/repos/{repo_slug}/issues/{number}").as(nullable Issue)
        end
 
        # List of event on this issue.
-       fun get_issue_comments(repo: Repo, issue: Issue, page, per_page: nullable Int): Array[IssueComment] do
+       fun get_issue_comments(repo_slug: String, issue_number: Int, page, per_page: nullable Int): Array[IssueComment] do
                return new GithubArray[IssueComment].from(get(
-                       "/repos/{repo.full_name}/issues/{issue.number}/comments?{pagination(page, per_page)}"))
+                       "/repos/{repo_slug}/issues/{issue_number}/comments?{pagination(page, per_page)}"))
        end
 
        # List of events on this issue.
-       fun get_issue_events(repo: Repo, issue: Issue, page, per_page: nullable Int): Array[IssueEvent] do
+       fun get_issue_events(repo_slug: String, issue_number: Int, page, per_page: nullable Int): Array[IssueEvent] do
                return new GithubArray[IssueEvent].from(get(
-                       "/repos/{repo.full_name}/issues/{issue.number}/events?{pagination(page, per_page)}"))
+                       "/repos/{repo_slug}/issues/{issue_number}/events?{pagination(page, per_page)}"))
        end
 
        # Get the Github pull request #`number`.
@@ -359,8 +359,8 @@ class GithubAPI
        # assert pull.title == "Doc"
        # assert pull.user.login == "Morriar"
        # ~~~
-       fun get_pull(repo: Repo, number: Int): nullable PullRequest do
-               return get("/repos/{repo.full_name}/pulls/{number}").as(nullable PullRequest)
+       fun get_pull(repo_slug: String, number: Int): nullable PullRequest do
+               return get("/repos/{repo_slug}/pulls/{number}").as(nullable PullRequest)
        end
 
        # Get the Github label with `name`.
@@ -374,8 +374,8 @@ class GithubAPI
        # var labl = api.get_label(repo, "ok_will_merge")
        # assert labl != null
        # ~~~
-       fun get_label(repo: Repo, name: String): nullable Label do
-               return get("/repos/{repo.full_name}/labels/{name}").as(nullable Label)
+       fun get_label(repo_slug: String, name: String): nullable Label do
+               return get("/repos/{repo_slug}/labels/{name}").as(nullable Label)
        end
 
        # Get the Github milestone with `id`.
@@ -389,8 +389,8 @@ class GithubAPI
        # var stone = api.get_milestone(repo, 4)
        # assert stone.title == "v1.0prealpha"
        # ~~~
-       fun get_milestone(repo: Repo, id: Int): nullable Milestone do
-               return get("/repos/{repo.full_name}/milestones/{id}").as(nullable Milestone)
+       fun get_milestone(repo_slug: String, id: Int): nullable Milestone do
+               return get("/repos/{repo_slug}/milestones/{id}").as(nullable Milestone)
        end
 
        # Get the Github issue event with `id`.
@@ -408,8 +408,8 @@ class GithubAPI
        # assert event.labl isa Label
        # assert event.labl.name == "need_review"
        # ~~~
-       fun get_issue_event(repo: Repo, id: Int): nullable IssueEvent do
-               return get("/repos/{repo.full_name}/issues/events/{id}").as(nullable IssueEvent)
+       fun get_issue_event(repo_slug: String, id: Int): nullable IssueEvent do
+               return get("/repos/{repo_slug}/issues/events/{id}").as(nullable IssueEvent)
        end
 
        # Get the Github commit comment with `id`.
@@ -425,8 +425,8 @@ class GithubAPI
        # assert comment.body == "For testing purposes...\n"
        # assert comment.commit_id == "7eacb86d1e24b7e72bc9ac869bf7182c0300ceca"
        # ~~~
-       fun get_commit_comment(repo: Repo, id: Int): nullable CommitComment do
-               return get("/repos/{repo.full_name}/comments/{id}").as(nullable CommitComment)
+       fun get_commit_comment(repo_slug: String, id: Int): nullable CommitComment do
+               return get("/repos/{repo_slug}/comments/{id}").as(nullable CommitComment)
        end
 
        # Get the Github issue comment with `id`.
@@ -442,8 +442,8 @@ class GithubAPI
        # assert comment.created_at.to_s == "2012-05-30T20:16:54Z"
        # assert comment.issue_number == 10
        # ~~~
-       fun get_issue_comment(repo: Repo, id: Int): nullable IssueComment do
-               return get("/repos/{repo.full_name}/issues/comments/{id}").as(nullable IssueComment)
+       fun get_issue_comment(repo_slug: String, id: Int): nullable IssueComment do
+               return get("/repos/{repo_slug}/issues/comments/{id}").as(nullable IssueComment)
        end
 
        # Get the Github diff comment with `id`.
@@ -459,8 +459,8 @@ class GithubAPI
        # assert comment.original_position == 26
        # assert comment.pull_number == 945
        # ~~~
-       fun get_review_comment(repo: Repo, id: Int): nullable ReviewComment do
-               return get("/repos/{repo.full_name}/pulls/comments/{id}").as(nullable ReviewComment)
+       fun get_review_comment(repo_slug: String, id: Int): nullable ReviewComment do
+               return get("/repos/{repo_slug}/pulls/comments/{id}").as(nullable ReviewComment)
        end
 
        private fun pagination(page, per_page: nullable Int): String do
index a58e25e..c20529b 100644 (file)
@@ -236,13 +236,13 @@ class Loader
                return new IssueEventRepo(config.db.collection("issue_events"))
        end
 
-       fun start(repo_full_name: String) do
-               var job = jobs.find_by_id(repo_full_name)
+       fun start(repo_slug: String) do
+               var job = jobs.find_by_id(repo_slug)
                if job == null then
-                       log.info "Creating new job for `{repo_full_name}`"
-                       job = add_job(repo_full_name)
+                       log.info "Creating new job for `{repo_slug}`"
+                       job = add_job(repo_slug)
                else
-                       log.info "Resuming pending job for `{repo_full_name}`"
+                       log.info "Resuming pending job for `{repo_slug}`"
                end
                print "Load history for {job}..."
                get_branches(job)
@@ -250,13 +250,13 @@ class Loader
                finish_job(job)
        end
 
-       fun remove(repo_full_name: String) do
-               var job = jobs.find_by_id(repo_full_name)
+       fun remove(repo_slug: String) do
+               var job = jobs.find_by_id(repo_slug)
                if job == null then
-                       log.info "No job found for `{repo_full_name}`"
+                       log.info "No job found for `{repo_slug}`"
                else
-                       jobs.remove_by_id(repo_full_name)
-                       log.info "Deleted job for `{repo_full_name}`"
+                       jobs.remove_by_id(repo_slug)
+                       log.info "Deleted job for `{repo_slug}`"
                end
        end
 
@@ -274,10 +274,10 @@ class Loader
        end
 
        # Add a new job
-       fun add_job(repo_full_name: String): LoaderJob do
-               var repo = config.wallet.api.get_repo(repo_full_name)
+       fun add_job(repo_slug: String): LoaderJob do
+               var repo = config.wallet.api.get_repo(repo_slug)
                assert repo != null else
-                       error "Repository `{repo_full_name}` not found"
+                       error "Repository `{repo_slug}` not found"
                end
                repos.save repo
                var job = new LoaderJob(repo, config.start_from_issue)
@@ -296,7 +296,7 @@ class Loader
 
                var api = config.wallet.api
                var repo = job.repo
-               for branch in api.get_repo_branches(repo) do
+               for branch in api.get_repo_branches(repo.full_name) do
                        branch.repo = repo
                        branches.save branch
                        get_commits(job, branch)
@@ -311,7 +311,7 @@ class Loader
        fun get_commit(job: LoaderJob, commit_sha: String) do
                if commits.find_by_id(commit_sha) != null then return
                var api = config.wallet.api
-               var commit = api.get_commit(job.repo, commit_sha)
+               var commit = api.get_commit(job.repo.full_name, commit_sha)
                # print commit or else "NULL"
                if commit == null then return
                var message = commit.message or else "no message"
@@ -346,7 +346,7 @@ class Loader
                if issues.find_by_id("{job.repo.mongo_id}/{issue_number}") != null then return
 
                var api = config.wallet.api
-               var issue = api.get_issue(job.repo, issue_number)
+               var issue = api.get_issue(job.repo.full_name, issue_number)
                assert issue != null else
                        check_error(api, "Issue #{issue_number} not found")
                end
@@ -365,7 +365,7 @@ class Loader
        private fun get_issue_comments(job: LoaderJob, issue: Issue) do
                if config.no_comments then return
                var api = config.wallet.api
-               for comment in api.get_issue_comments(job.repo, issue) do
+               for comment in api.get_issue_comments(job.repo.full_name, issue.number) do
                        comment.repo = job.repo
                        issue_comments.save comment
                end
@@ -376,7 +376,7 @@ class Loader
                if config.no_events then return
 
                var api = config.wallet.api
-               for event in api.get_issue_events(job.repo, issue) do
+               for event in api.get_issue_events(job.repo.full_name, issue.number) do
                        event.repo = job.repo
                        issue_events.save event
                end
@@ -385,7 +385,7 @@ class Loader
        # Load a pull request or abort.
        private fun get_pull(job: LoaderJob, issue: Issue): PullRequest do
                var api = config.wallet.api
-               var pr = api.get_pull(job.repo, issue.number)
+               var pr = api.get_pull(job.repo.full_name, issue.number)
                assert pr != null else
                        check_error(api, "Pull request #{issue.number} not found")
                end
@@ -401,7 +401,7 @@ class Loader
                if config.no_events then return
 
                var api = config.wallet.api
-               for event in api.get_issue_events(job.repo, pull) do
+               for event in api.get_issue_events(job.repo.full_name, pull.number) do
                        event.repo = job.repo
                        issue_events.save event
                end
index 235a170..dd53cee 100644 (file)
@@ -219,24 +219,22 @@ class TestGithubAPI
                assert repo.default_branch == "master"
        end
 
-       private var repo: Repo is lazy do return api.get_repo("nitlang/nit").as(not null)
-
        fun test_get_branches is test do
-               var branches = api.get_repo_branches(repo, 1, 2)
+               var branches = api.get_repo_branches("nitlang/nit", 1, 2)
                assert branches.length == 2
                assert branches.first.name == "master"
                assert branches.last.name == "next"
        end
 
        fun test_get_issues is test do
-               var issues = api.get_repo_issues(repo, 1, 3)
+               var issues = api.get_repo_issues("nitlang/nit", 1, 3)
                assert issues.length == 3
                assert issues.first.title == "nitrpg: Move `nitrpg` to its own repository"
                assert issues.last.title == "Mock Github API tests"
        end
 
        fun test_search_issues is test do
-               var results = api.search_repo_issues(repo, "foo", 1, 3)
+               var results = api.search_repo_issues("nitlang/nit", "foo", 1, 3)
                assert results isa SearchResults
                assert results.items.length == 3
                assert results.items.first.as(Issue).title == "Introduction of contracts in Nit"
@@ -244,21 +242,21 @@ class TestGithubAPI
        end
 
        fun test_get_labels is test do
-               var labels = api.get_repo_labels(repo, 1, 3)
+               var labels = api.get_repo_labels("nitlang/nit", 1, 3)
                assert labels.length == 3
                assert labels.first.name == "API"
                assert labels.last.name == "NEP"
        end
 
        fun test_get_milestones is test do
-               var milestones = api.get_repo_milestones(repo, 1, 3)
+               var milestones = api.get_repo_milestones("nitlang/nit", 1, 3)
                assert milestones.length == 3
                assert milestones.first.title == "v1.0prealpha"
                assert milestones.last.title == "nitdoc - Abstraction levels"
        end
 
        fun test_get_pulls is test do
-               var pulls = api.get_repo_pulls(repo, 1, 3)
+               var pulls = api.get_repo_pulls("nitlang/nit", 1, 3)
                assert pulls.length == 3
                assert pulls.first.title == "nitrpg: Move `nitrpg` to its own repository"
                assert pulls.last.title == "Mock Github API tests"
@@ -267,20 +265,20 @@ class TestGithubAPI
        # TODO contrib_stats
 
        fun test_get_branch is test do
-               var branch = api.get_branch(repo, "master")
+               var branch = api.get_branch("nitlang/nit", "master")
                assert branch isa Branch
                assert branch.name == "master"
        end
 
        fun test_get_commit is test do
-               var commit = api.get_commit(repo, "64ce1f")
+               var commit = api.get_commit("nitlang/nit", "64ce1f")
                assert commit isa Commit
                assert commit.sha == "64ce1f587209024f5de46d06c70526a569ff537f"
                # TODO other fields
        end
 
        fun test_get_issue is test do
-               var issue = api.get_issue(repo, 1000)
+               var issue = api.get_issue("nitlang/nit", 1000)
                assert issue isa Issue
                assert issue.number == 1000
                assert issue.title == "Raise nitc from the dead"
@@ -294,25 +292,21 @@ class TestGithubAPI
        end
 
        fun test_get_issue_comments is test do
-               var issue = api.get_issue(repo, 1000)
-               assert issue isa Issue
-               var comments = api.get_issue_comments(repo, issue, 1, 3)
+               var comments = api.get_issue_comments("nitlang/nit", 1000, 1, 3)
                assert comments.length == 3
                assert comments.first.user.login == "R4PaSs"
                assert comments.last.user.login == "xymus"
        end
 
        fun test_get_issue_events is test do
-               var issue = api.get_issue(repo, 1000)
-               assert issue isa Issue
-               var events = api.get_issue_events(repo, issue, 1, 3)
+               var events = api.get_issue_events("nitlang/nit", 1000, 1, 3)
                assert events.length == 3
                assert events.first.actor.login == "privat"
                assert events.last.actor.login == "xymus"
        end
 
        fun test_get_pull is test do
-               var pull = api.get_pull(repo, 1000)
+               var pull = api.get_pull("nitlang/nit", 1000)
                assert pull isa Issue
                assert pull.number == 1000
                assert pull.title == "Raise nitc from the dead"
@@ -325,20 +319,20 @@ class TestGithubAPI
        end
 
        fun test_get_label is test do
-               var labl = api.get_label(repo, "ok_will_merge")
+               var labl = api.get_label("nitlang/nit", "ok_will_merge")
                assert labl isa Label
                assert labl.name == "ok_will_merge"
        end
 
        fun test_get_milestone is test do
-               var milestone = api.get_milestone(repo, 4)
+               var milestone = api.get_milestone("nitlang/nit", 4)
                assert milestone isa Milestone
                assert milestone.title == "v1.0prealpha"
                # TODO other fields
        end
 
        fun test_get_issue_event is test do
-               var event = api.get_issue_event(repo, 199674194)
+               var event = api.get_issue_event("nitlang/nit", 199674194)
                assert event isa IssueEvent
                assert event.actor.login == "privat"
                assert event.event == "labeled"
@@ -346,7 +340,7 @@ class TestGithubAPI
        end
 
        fun test_get_issue_comment is test do
-               var comment = api.get_issue_comment(repo, 6020149)
+               var comment = api.get_issue_comment("nitlang/nit", 6020149)
                assert comment isa IssueComment
                assert comment.user.login == "privat"
                assert comment.created_at.to_s == "2012-05-30T20:16:54Z"
@@ -354,7 +348,7 @@ class TestGithubAPI
        end
 
        fun test_get_comment is test do
-               var comment = api.get_commit_comment(repo, 8982707)
+               var comment = api.get_commit_comment("nitlang/nit", 8982707)
                assert comment isa CommitComment
                assert comment.user.login == "Morriar"
                assert comment.body == "For testing purposes...\n"
@@ -362,7 +356,7 @@ class TestGithubAPI
        end
 
        fun test_get_review_comments is test do
-               var comment = api.get_review_comment(repo, 21010363)
+               var comment = api.get_review_comment("nitlang/nit", 21010363)
                assert comment isa ReviewComment
                assert comment.path == "src/modelize/modelize_property.nit"
                assert comment.original_position == 26