X-Git-Url: http://nitlanguage.org diff --git a/lib/github/api.nit b/lib/github/api.nit index 8684c29..bd01519 100644 --- a/lib/github/api.nit +++ b/lib/github/api.nit @@ -20,7 +20,6 @@ module api intrude import json::serialization_read -import json::static import base64 import curl @@ -92,12 +91,6 @@ class GithubAPI # Default is `https://api.github.com` and should not be changed. var api_url = "https://api.github.com" - # Verbosity level. - # - # * `0`: only errors (default) - # * `1`: verbose - var verbose_lvl = 0 is public writable - # Send a HTTPRequest to the Github API fun send(method, path: String, headers: nullable HeaderMap, body: nullable String): nullable String do last_error = null @@ -144,11 +137,6 @@ class GithubAPI return res end - # Display a message depending on `verbose_lvl`. - fun message(lvl: Int, message: String) do - if lvl <= verbose_lvl then print message - end - # Escape `uri` in an acceptable format for Github. private fun sanitize_uri(uri: String): String do # TODO better URI escape. @@ -281,11 +269,7 @@ class GithubAPI # List of contributor related statistics. 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_slug}/stats/contributors") - if not array isa JsonArray then return res - return deserialize(array.to_json).as(Array[ContributorStats]) + return new GithubArray[ContributorStats].from(get("/repos/{repo_slug}/stats/contributors")) end # Get the Github branch with `name`. @@ -319,6 +303,13 @@ class GithubAPI return get("/repos/{repo_slug}/commits/{sha}").as(nullable Commit) end + # Get the status of a commit + # + # The status holds the result of each check ran on a commit like CI, reviews etc. + fun get_commit_status(repo_slug: String, sha: String): nullable CommitStatus do + return get("/repos/{repo_slug}/commits/{sha}/status").as(nullable CommitStatus) + end + # Get the Github issue #`number`. # # Returns `null` if the issue cannot be found. @@ -362,6 +353,17 @@ class GithubAPI return get("/repos/{repo_slug}/pulls/{number}").as(nullable PullRequest) end + # List of comments on a pull request + fun get_pull_comments(repo_slug: String, pull_number: Int, page, per_page: nullable Int): Array[PullComment] do + return new GithubArray[PullComment].from(get( + "/repos/{repo_slug}/pulls/{pull_number}/comments?{pagination(page, per_page)}")) + end + + # Get a specific pull request comment + fun get_pull_comment(repo_slug: String, id: Int): nullable PullComment do + return get("/repos/{repo_slug}/pulls/comments/{id}").as(nullable PullComment) + end + # Get the Github label with `name`. # # Returns `null` if the label cannot be found. @@ -445,23 +447,6 @@ class GithubAPI return get("/repos/{repo_slug}/issues/comments/{id}").as(nullable IssueComment) end - # Get the Github diff comment with `id`. - # - # Returns `null` if the comment cannot be found. - # - # ~~~nitish - # var api = new GithubAPI(get_github_oauth) - # var repo = api.get_repo("nitlang/nit") - # assert repo != null - # var comment = api.get_review_comment(repo, 21010363) - # assert comment.path == "src/modelize/modelize_property.nit" - # assert comment.original_position == 26 - # assert comment.pull_number == 945 - # ~~~ - 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 return "page={page or else 1}&per_page={per_page or else 30}" end @@ -555,7 +540,7 @@ class Repo var owner: User is writable # Repo default branch name. - var default_branch: String is writable + var default_branch: nullable String = null is optional, writable end # A Github branch. @@ -834,7 +819,7 @@ end # # * `CommitComment` are made on a commit page. # * `IssueComment` are made on an issue or pull request page. -# * `ReviewComment` are made on the diff associated to a pull request. +# * `PullComment` are made on the diff associated to a pull request. abstract class Comment serialize @@ -877,6 +862,55 @@ class CommitComment var path: nullable String is writable end +# Status of a commit +# +# Can contain sub-status for reviews, CI etc. +class CommitStatus + serialize + + # Global state of this commit + var state: nullable String = null is optional, writable + + # Sha of the commit this status is for + var sha: nullable String = null is optional, writable + + # Repository the commit belongs to + var repository: nullable Repo = null is optional, writable + + # All sub statuses (one for each check) + var statuses = new Array[RepoStatus] is optional, writable + + # Total count of sub statuses + var total_count: nullable Int = null is optional, writable +end + +# Sub status of a CommitStatus +# +# Represents a check applied to a commit (reviews, CI, ...). +class RepoStatus + serialize + + # State of this check + var state: nullable String = null is optional, writable + + # Description of this check + var description: nullable String = null is optional, writable + + # External URL + var target_url: nullable String = null is optional, writable + + # Context this status is related to + # + # Used to hold the name of the check applied. + var context: nullable String = null is optional, writable + + # Date when this status was created + var created_at: nullable String = null is optional, writable + + # Last date this status was updated + var updated_at: nullable String = null is optional, writable +end + # Comments made on Github issue and pull request pages. # # Should be accessed from `GithubAPI::get_issue_comment`. @@ -898,7 +932,7 @@ end # Should be accessed from `GithubAPI::get_diff_comment`. # # See . -class ReviewComment +class PullComment super Comment serialize @@ -984,22 +1018,36 @@ class ContributorStats redef type OTHER: ContributorStats - # Github API client. - var api: GithubAPI is writable - # User these statistics are about. var author: User is writable # Total number of commit. var total: Int is writable - # Are of weeks of activity with detailed statistics. - var weeks: JsonArray is writable + # Array of weeks of activity with detailed statistics. + var weeks: Array[ContributorWeek] is writable # ContributorStats can be compared on the total amount of commits. redef fun <(o) do return total < o.total end +# Contributor stats weekly hash +class ContributorWeek + serialize + + # Start of week given a Unix timestamp + var w: Int + + # Number of additions + var a: Int + + # Number of deletions + var d: Int + + # Number of commits + var c: Int +end + # A Github file representation. # # Mostly a wrapper around a json object. @@ -1041,9 +1089,11 @@ class GithubDeserializer map["{pattern_base}/repos/[^/]*/[^/]*/issues/comments/[0-9]+$".to_re] = "IssueComment" map["{pattern_base}/repos/[^/]*/[^/]*/issues/events/[0-9]+$".to_re] = "IssueEvent" map["{pattern_base}/repos/[^/]*/[^/]*/pulls/[0-9]+$".to_re] = "PullRequest" - map["{pattern_base}/repos/[^/]*/[^/]*/pulls/comments/[0-9]+$".to_re] = "ReviewComment" + map["{pattern_base}/repos/[^/]*/[^/]*/pulls/comments/[0-9]+$".to_re] = "PullComment" map["{pattern_base}/repos/[^/]*/[^/]*/comments/[0-9]+$".to_re] = "CommitComment" map["{pattern_base}/repos/[^/]*/[^/]*/commits/[a-f0-9]+$".to_re] = "Commit" + map["{pattern_base}/repos/[^/]*/[^/]*/commits/[a-f0-9]+/status$".to_re] = "CommitStatus" + map["{pattern_base}/repos/[^/]*/[^/]*/statuses/[a-f0-9]+$".to_re] = "RepoStatus" return map end @@ -1070,6 +1120,10 @@ class GithubDeserializer return "Branch" else if raw.has_key("total_count") and raw.has_key("items") then return "SearchResults" + else if raw.has_key("total") and raw.has_key("weeks") then + return "ContributorStats" + else if raw.has_key("a") and raw.has_key("d") and raw.has_key("c") then + return "ContributorWeek" end return null end