module api
import github_curl
+intrude import json::serialization_read
# Client to Github API
#
ghcurl = new GithubCurl(auth, user_agent)
end
+ # Deserialize an object
+ fun deserialize(string: String): nullable Object do
+ var deserializer = new GithubDeserializer(string)
+ var res = deserializer.deserialize
+ # print deserializer.errors.join("\n") # DEBUG
+ return res
+ end
+
# Execute a GET request on Github API.
#
# This method returns raw json data.
# See other `load_*` methods to use more expressive types.
#
# var api = new GithubAPI(get_github_oauth)
- # var obj = api.get("repos/nitlang/nit")
+ # var obj = api.get("/repos/nitlang/nit")
# assert obj isa JsonObject
# assert obj["name"] == "nit"
#
# Returns `null` in case of `error`.
#
- # obj = api.get("foo/bar/baz")
+ # obj = api.get("/foo/bar/baz")
# assert obj == null
# assert api.was_error
# var err = api.last_error
# assert err.message == "Not Found"
fun get(path: String): nullable Jsonable do
path = sanitize_uri(path)
- var res = ghcurl.get_and_parse("{api_url}/{path}")
+ var res = ghcurl.get_and_parse("{api_url}{path}")
if res isa Error then
last_error = res
was_error = true
# Load the json object from Github.
# See `GithubEntity::load_from_github`.
- protected fun load_from_github(key: String): JsonObject do
+ protected fun load_from_github(key: String): nullable GithubEntity do
message(1, "Get {key} (github)")
var res = get(key)
- if was_error then return new JsonObject
- return res.as(JsonObject)
+ if was_error then return null
+ return deserialize(res.as(JsonObject).to_json).as(nullable GithubEntity)
+ end
+
+ # Get the Github logged user from `auth` token.
+ #
+ # Loads the `User` from the API or returns `null` if the user cannot be found.
+ #
+ # ~~~nitish
+ # var api = new GithubAPI(get_github_oauth)
+ # var user = api.load_auth_user
+ # assert user.login == "Morriar"
+ # ~~~
+ fun load_auth_user: nullable User do
+ var user = load_from_github("/user")
+ if was_error then return null
+ return user.as(nullable User)
end
# Get the Github user with `login`
#
# var api = new GithubAPI(get_github_oauth)
# var user = api.load_user("Morriar")
+ # print user or else "null"
# assert user.login == "Morriar"
fun load_user(login: String): nullable User do
- var user = new User(self, login)
- return user.load_from_github
+ return load_from_github("/users/{login}").as(nullable User)
end
# Get the Github repo with `full_name`.
# var repo = api.load_repo("nitlang/nit")
# assert repo.name == "nit"
# assert repo.owner.login == "nitlang"
- # assert repo.default_branch.name == "master"
+ # assert repo.default_branch == "master"
fun load_repo(full_name: String): nullable Repo do
- var repo = new Repo(self, full_name)
- return repo.load_from_github
+ return load_from_github("/repos/{full_name}").as(nullable Repo)
+ end
+
+ # List of branches associated with their names.
+ fun load_repo_branches(repo: Repo): Array[Branch] do
+ message(1, "Get branches for {repo.full_name}")
+ var array = get("/repos/{repo.full_name}/branches")
+ var res = new Array[Branch]
+ if not array isa JsonArray then return res
+ var deser = deserialize(array.to_json)
+ if deser isa Array[Object] then return res # empty array
+ return deser.as(Array[Branch])
+ end
+
+ # List of issues associated with their ids.
+ fun load_repo_issues(repo: Repo): Array[Issue] do
+ message(1, "Get issues for {repo.full_name}")
+ var res = new Array[Issue]
+ var issue = load_repo_last_issue(repo)
+ if issue == null then return res
+ res.add issue
+ while issue != null and issue.number > 1 do
+ issue = load_issue(repo, issue.number - 1)
+ if issue == null then continue
+ res.add issue
+ end
+ return res
+ end
+
+ # Search issues in this repo form an advanced query.
+ #
+ # Example:
+ #
+ # ~~~nitish
+ # var issues = repo.search_issues("is:open label:need_review")
+ # ~~~
+ #
+ # See <https://developer.github.com/v3/search/#search-issues>.
+ fun search_repo_issues(repo: Repo, query: String): Array[Issue] do
+ query = "/search/issues?q={query} repo:{repo.full_name}"
+ var res = new Array[Issue]
+ var response = get(query)
+ if was_error then return res
+ var arr = response.as(JsonObject)["items"].as(JsonArray)
+ return deserialize(arr.to_json).as(Array[Issue])
+ end
+
+ # Get the last published issue.
+ fun load_repo_last_issue(repo: Repo): nullable Issue do
+ var array = get("/repos/{repo.full_name}/issues")
+ if not array isa JsonArray then return null
+ if array.is_empty then return null
+ var obj = array.first
+ if not obj isa JsonObject then return null
+ return deserialize(obj.to_json).as(nullable Issue)
+ end
+
+ # List of labels associated with their names.
+ fun load_repo_labels(repo: Repo): Array[Label] do
+ message(1, "Get labels for {repo.full_name}")
+ var array = get("repos/{repo.full_name}/labels")
+ if not array isa JsonArray then return new Array[Label]
+ return deserialize(array.to_json).as(Array[Label])
+ end
+
+ # List of milestones associated with their ids.
+ fun load_repo_milestones(repo: Repo): Array[Milestone] do
+ message(1, "Get milestones for {repo.full_name}")
+ var array = get("/repos/{repo.full_name}/milestones")
+ if not array isa JsonArray then return new Array[Milestone]
+ return deserialize(array.to_json).as(Array[Milestone])
+ end
+
+ # List of pull-requests associated with their ids.
+ #
+ # Implementation notes: because PR numbers are not consecutive,
+ # PR are loaded from pages.
+ # See: https://developer.github.com/v3/pulls/#list-pull-requests
+ fun load_repo_pulls(repo: Repo): Array[PullRequest] do
+ message(1, "Get pulls for {repo.full_name}")
+ var key = "/repos/{repo.full_name}"
+ var res = new Array[PullRequest]
+ var page = 1
+ loop
+ var array = get("{key}/pulls?page={page}").as(JsonArray)
+ if array.is_empty then break
+ for obj in array do
+ if not obj isa JsonObject then continue
+ var pr = deserialize(array.to_json).as(nullable PullRequest)
+ if pr == null then continue
+ res.add pr
+ end
+ page += 1
+ end
+ return res
+ end
+
+ # List of contributor related statistics.
+ fun load_repo_contrib_stats(repo: Repo): Array[ContributorStats] do
+ message(1, "Get contributor stats for {repo.full_name}")
+ var res = new Array[ContributorStats]
+ var array = get("/repos/{repo.full_name}/stats/contributors")
+ if not array isa JsonArray then return res
+ return deserialize(array.to_json).as(Array[ContributorStats])
end
# Get the Github branch with `name`.
# assert branch.name == "master"
# assert branch.commit isa Commit
fun load_branch(repo: Repo, name: String): nullable Branch do
- var branch = new Branch(self, repo, name)
- return branch.load_from_github
+ return load_from_github("/repos/{repo.full_name}/branches/{name}").as(nullable Branch)
+ end
+
+ # List all commits in `self`.
+ #
+ # This can be long depending on the branch size.
+ # Commit are returned in an unspecified order.
+ fun load_branch_commits(branch: Branch): Array[Commit] do
+ var res = new Array[Commit]
+ var done = new HashSet[String]
+ var todos = new Array[Commit]
+ todos.add branch.commit
+ loop
+ if todos.is_empty then break
+ var commit = todos.pop
+ if done.has(commit.sha) then continue
+ done.add commit.sha
+ res.add commit
+ var parents = commit.parents
+ if parents == null then continue
+ for parent in parents do
+ todos.add parent
+ end
+ end
+ return res
end
# Get the Github commit with `sha`.
# var commit = api.load_commit(repo, "64ce1f")
# assert commit isa Commit
fun load_commit(repo: Repo, sha: String): nullable Commit do
- var commit = new Commit(self, repo, sha)
- return commit.load_from_github
+ return load_from_github("/repos/{repo.full_name}/commits/{sha}").as(nullable Commit)
end
# Get the Github issue #`number`.
# var issue = api.load_issue(repo, 1)
# assert issue.title == "Doc"
fun load_issue(repo: Repo, number: Int): nullable Issue do
- var issue = new Issue(self, repo, number)
- return issue.load_from_github
+ return load_from_github("/repos/{repo.full_name}/issues/{number}").as(nullable Issue)
+ end
+
+ # List of event on this issue.
+ fun load_issue_comments(repo: Repo, issue: Issue): Array[IssueComment] do
+ var res = new Array[IssueComment]
+ var count = issue.comments or else 0
+ var page = 1
+ loop
+ var array = get("/repos/{repo.full_name}/issues/{issue.number}/comments?page={page}")
+ if not array isa JsonArray then break
+ if array.is_empty then break
+ for obj in array do
+ if not obj isa JsonObject then continue
+ var id = obj["id"].as(Int)
+ var comment = load_issue_comment(repo, id)
+ if comment == null then continue
+ res.add(comment)
+ end
+ if res.length >= count then break
+ page += 1
+ end
+ return res
+ end
+
+ # List of events on this issue.
+ fun load_issue_events(repo: Repo, issue: Issue): Array[IssueEvent] do
+ var res = new Array[IssueEvent]
+ var key = "/repos/{repo.full_name}/issues/{issue.number}"
+ var page = 1
+ loop
+ var array = get("{key}/events?page={page}")
+ if not array isa JsonArray or array.is_empty then break
+ for obj in array do
+ if not obj isa JsonObject then continue
+ var event = deserialize(obj.to_json).as(nullable IssueEvent)
+ if event == null then continue
+ res.add event
+ end
+ page += 1
+ end
+ return res
end
# Get the Github pull request #`number`.
# assert pull.title == "Doc"
# assert pull.user.login == "Morriar"
fun load_pull(repo: Repo, number: Int): nullable PullRequest do
- var pull = new PullRequest(self, repo, number)
- return pull.load_from_github
+ return load_from_github("/repos/{repo.full_name}/pulls/{number}").as(nullable PullRequest)
end
# Get the Github label with `name`.
# var labl = api.load_label(repo, "ok_will_merge")
# assert labl != null
fun load_label(repo: Repo, name: String): nullable Label do
- var labl = new Label(self, repo, name)
- return labl.load_from_github
+ return load_from_github("/repos/{repo.full_name}/labels/{name}").as(nullable Label)
end
# Get the Github milestone with `id`.
# var stone = api.load_milestone(repo, 4)
# assert stone.title == "v1.0prealpha"
fun load_milestone(repo: Repo, id: Int): nullable Milestone do
- var milestone = new Milestone(self, repo, id)
- return milestone.load_from_github
+ return load_from_github("/repos/{repo.full_name}/milestones/{id}").as(nullable Milestone)
end
# Get the Github issue event with `id`.
# var repo = api.load_repo("nitlang/nit")
# assert repo isa Repo
# var event = api.load_issue_event(repo, 199674194)
+ # assert event isa IssueEvent
# assert event.actor.login == "privat"
# assert event.event == "labeled"
+ # assert event.labl isa Label
# assert event.labl.name == "need_review"
- # assert event.issue.number == 945
fun load_issue_event(repo: Repo, id: Int): nullable IssueEvent do
- var event = new IssueEvent(self, repo, id)
- return event.load_from_github
+ return load_from_github("/repos/{repo.full_name}/issues/events/{id}").as(nullable IssueEvent)
end
# Get the Github commit comment with `id`.
# assert repo != null
# var comment = api.load_commit_comment(repo, 8982707)
# assert comment.user.login == "Morriar"
- # assert comment.body == "For testing purposes..."
- # assert comment.commit.sha == "7eacb86d1e24b7e72bc9ac869bf7182c0300ceca"
+ # assert comment.body == "For testing purposes...\n"
+ # assert comment.commit_id == "7eacb86d1e24b7e72bc9ac869bf7182c0300ceca"
fun load_commit_comment(repo: Repo, id: Int): nullable CommitComment do
- var comment = new CommitComment(self, repo, id)
- return comment.load_from_github
+ return load_from_github("/repos/{repo.full_name}/comments/{id}").as(nullable CommitComment)
end
# Get the Github issue comment with `id`.
# var comment = api.load_issue_comment(repo, 6020149)
# assert comment.user.login == "privat"
# assert comment.created_at.to_s == "2012-05-30T20:16:54Z"
- # assert comment.issue.number == 10
+ # assert comment.issue_number == 10
fun load_issue_comment(repo: Repo, id: Int): nullable IssueComment do
- var comment = new IssueComment(self, repo, id)
- return comment.load_from_github
+ return load_from_github("/repos/{repo.full_name}/issues/comments/{id}").as(nullable IssueComment)
end
# Get the Github diff comment with `id`.
# var comment = api.load_review_comment(repo, 21010363)
# assert comment.path == "src/modelize/modelize_property.nit"
# assert comment.original_position == 26
- # assert comment.pull.number == 945
+ # assert comment.pull_number == 945
fun load_review_comment(repo: Repo, id: Int): nullable ReviewComment do
- var comment = new ReviewComment(self, repo, id)
- return comment.load_from_github
+ return load_from_github("/repos/{repo.full_name}/pulls/comments/{id}").as(nullable ReviewComment)
end
end
#
# Mainly a Nit wrapper around a JSON objet.
abstract class GithubEntity
-
- # Github API instance.
- var api: GithubAPI
-
- # FIXME constructor should be private
-
- # Key used to access this entity from Github api base.
- fun key: String is abstract
-
- # JSON representation of `self`.
- #
- # This is the same json structure than used by Github API.
- var json: JsonObject is noinit, protected writable
-
- # Load `json` from Github API.
- private fun load_from_github: nullable SELF do
- json = api.load_from_github(key)
- if api.was_error then return null
- return self
- end
-
- redef fun to_s do return json.to_json
+ super Jsonable
+ serialize
# Github page url.
- fun html_url: String do return json["html_url"].as(String)
-
- # Set page url.
- fun html_url=(url: String) do json["html_url"] = url
+ var html_url: nullable String is writable
end
# A Github user
# Provides access to [Github user data](https://developer.github.com/v3/users/).
# Should be accessed from `GithubAPI::load_user`.
class User
- super GithubEntity
-
- redef var key is lazy do return "users/{login}"
+ super GitUser
+ serialize
# Github login.
- var login: String
-
- # Init `self` from a `json` object.
- init from_json(api: GithubAPI, json: JsonObject) do
- init(api, json["login"].as(String))
- self.json = json
- end
+ var login: String is writable
# Avatar image url for this user.
- fun avatar_url: String do return json["avatar_url"].as(String)
+ var avatar_url: nullable String is writable
- # Set avatar url.
- fun avatar_url=(url: String) do json["avatar_url"] = url
+ # User public name if any.
+ var name: nullable String is writable
+
+ # User public email if any.
+ var email: nullable String is writable
+
+ # User public blog if any.
+ var blog: nullable String is writable
end
# A Github repository.
# Should be accessed from `GithubAPI::load_repo`.
class Repo
super GithubEntity
-
- redef var key is lazy do return "repos/{full_name}"
+ serialize
# Repo full name on Github.
- var full_name: String
-
- # Init `self` from a `json` object.
- init from_json(api: GithubAPI, json: JsonObject) do
- init(api, json["full_name"].as(String))
- self.json = json
- end
+ var full_name: String is writable
# Repo short name on Github.
- fun name: String do return json["name"].as(String)
-
- # Set repo full name
- fun name=(name: String) do json["name"] = name
+ var name: String is writable
# Get the repo owner.
- fun owner: User do return new User.from_json(api, json["owner"].as(JsonObject))
-
- # Set repo owner
- fun owner=(owner: User) do json["owner"] = owner.json
-
- # List of branches associated with their names.
- fun branches: Map[String, Branch] do
- api.message(1, "Get branches for {full_name}")
- var array = api.get("repos/{full_name}/branches")
- var res = new HashMap[String, Branch]
- if not array isa JsonArray then return res
- for obj in array do
- if not obj isa JsonObject then continue
- var name = obj["name"].as(String)
- res[name] = new Branch.from_json(api, self, obj)
- end
- return res
- end
-
- # List of issues associated with their ids.
- fun issues: Map[Int, Issue] do
- api.message(1, "Get issues for {full_name}")
- var res = new HashMap[Int, Issue]
- var issue = last_issue
- if issue == null then return res
- res[issue.number] = issue
- while issue.number > 1 do
- issue = api.load_issue(self, issue.number - 1)
- assert issue isa Issue
- res[issue.number] = issue
- end
- return res
- end
-
- # Search issues in this repo form an advanced query.
- #
- # Example:
- #
- # ~~~nitish
- # var issues = repo.search_issues("is:open label:need_review")
- # ~~~
- #
- # See <https://developer.github.com/v3/search/#search-issues>.
- fun search_issues(query: String): nullable Array[Issue] do
- query = "search/issues?q={query} repo:{full_name}"
- var response = api.get(query)
- if api.was_error then return null
- var arr = response.as(JsonObject)["items"].as(JsonArray)
- var res = new Array[Issue]
- for obj in arr do
- res.add new Issue.from_json(api, self, obj.as(JsonObject))
- end
- return res
- end
-
- # Get the last published issue.
- fun last_issue: nullable Issue do
- var array = api.get("repos/{full_name}/issues")
- if not array isa JsonArray then return null
- if array.is_empty then return null
- var obj = array.first
- if not obj isa JsonObject then return null
- return new Issue.from_json(api, self, obj)
- end
-
- # List of labels associated with their names.
- fun labels: Map[String, Label] do
- api.message(1, "Get labels for {full_name}")
- var array = api.get("repos/{full_name}/labels")
- var res = new HashMap[String, Label]
- if not array isa JsonArray then return res
- for obj in array do
- if not obj isa JsonObject then continue
- var name = obj["name"].as(String)
- res[name] = new Label.from_json(api, self, obj)
- end
- return res
- end
+ var owner: User is writable
- # List of milestones associated with their ids.
- fun milestones: Map[Int, Milestone] do
- api.message(1, "Get milestones for {full_name}")
- var array = api.get("repos/{full_name}/milestones")
- var res = new HashMap[Int, Milestone]
- if array isa JsonArray then
- for obj in array do
- if not obj isa JsonObject then continue
- var number = obj["number"].as(Int)
- res[number] = new Milestone.from_json(api, self, obj)
- end
- end
- return res
- end
-
- # List of pull-requests associated with their ids.
- #
- # Implementation notes: because PR numbers are not consecutive,
- # PR are loaded from pages.
- # See: https://developer.github.com/v3/pulls/#list-pull-requests
- fun pulls: Map[Int, PullRequest] do
- api.message(1, "Get pulls for {full_name}")
- var res = new HashMap[Int, PullRequest]
- var page = 1
- var array = api.get("{key}/pulls?page={page}").as(JsonArray)
- while not array.is_empty do
- for obj in array do
- if not obj isa JsonObject then continue
- var number = obj["number"].as(Int)
- res[number] = new PullRequest.from_json(api, self, obj)
- end
- page += 1
- array = api.get("{key}/pulls?page={page}").as(JsonArray)
- end
- return res
- end
-
- # List of contributor related statistics.
- fun contrib_stats: Array[ContributorStats] do
- api.message(1, "Get contributor stats for {full_name}")
- var res = new Array[ContributorStats]
- var array = api.get("{key}/stats/contributors")
- if array isa JsonArray then
- for obj in array do
- res.add new ContributorStats.from_json(api, obj.as(JsonObject))
- end
- end
- return res
- end
-
- # Repo default branch.
- fun default_branch: Branch do
- var name = json["default_branch"].as(String)
- var branch = api.load_branch(self, name)
- assert branch isa Branch
- return branch
- end
-
- # Set the default branch
- fun default_branch=(branch: Branch) do json["default_branch"] = branch.json
-end
-
-# A `RepoEntity` is something contained in a `Repo`.
-abstract class RepoEntity
- super GithubEntity
-
- # Repo that contains `self`.
- var repo: Repo
-
- # Init `self` from a `json` object.
- init from_json(api: GithubAPI, repo: Repo, json: JsonObject) do
- self.api = api
- self.repo = repo
- self.json = json
- end
+ # Repo default branch name.
+ var default_branch: String is writable
end
# A Github branch.
#
# See <https://developer.github.com/v3/repos/#list-branches>.
class Branch
- super RepoEntity
-
- redef var key is lazy do return "{repo.key}/branches/{name}"
+ super GithubEntity
+ serialize
# Branch name.
- var name: String
-
- redef init from_json(api, repo, json) do
- self.name = json["name"].as(String)
- super
- end
+ var name: String is writable
# Get the last commit of `self`.
- fun commit: Commit do return new Commit.from_json(api, repo, json["commit"].as(JsonObject))
-
- # Set the last commit
- fun commit=(commit: Commit) do json["commit"] = commit.json
-
- # List all commits in `self`.
- #
- # This can be long depending on the branch size.
- # Commit are returned in an unspecified order.
- fun commits: Array[Commit] do
- var res = new Array[Commit]
- var done = new HashSet[String]
- var todos = new Array[Commit]
- todos.add commit
- while not todos.is_empty do
- var commit = todos.pop
- if done.has(commit.sha) then continue
- done.add commit.sha
- res.add commit
- for parent in commit.parents do
- todos.add parent
- end
- end
- return res
- end
+ var commit: Commit is writable
end
# A Github commit.
#
# See <https://developer.github.com/v3/repos/commits/>.
class Commit
- super RepoEntity
-
- redef var key is lazy do return "{repo.key}/commits/{sha}"
+ super GithubEntity
+ serialize
# Commit SHA.
- var sha: String
-
- redef init from_json(api, repo, json) do
- self.sha = json["sha"].as(String)
- super
- end
+ var sha: String is writable
# Parent commits of `self`.
- fun parents: Array[Commit] do
- var res = new Array[Commit]
- var parents = json.get_or_null("parents")
- if not parents isa JsonArray then return res
- for obj in parents do
- if not obj isa JsonObject then continue
- res.add(api.load_commit(repo, obj["sha"].as(String)).as(not null))
- end
- return res
- end
-
- # Set parent commits.
- fun parents=(parents: Array[Commit]) do
- var res = new JsonArray
- for parent in parents do res.add parent.json
- json["parents"] = res
- end
+ var parents: nullable Array[Commit] = null is writable
# Author of the commit.
- fun author: nullable User do
- var user = json.get_or_null("author")
- if user isa JsonObject then return new User.from_json(api, user)
- return null
- end
-
- # Set commit author.
- fun author=(user: nullable User) do
- if user == null then
- json["author"] = null
- else
- json["author"] = user.json
- end
- end
+ var author: nullable GitUser is writable
# Committer of the commit.
- fun committer: nullable User do
- var user = json.get_or_null("author")
- if user isa JsonObject then return new User.from_json(api, user)
- return null
- end
+ var committer: nullable GitUser is writable
- # Set commit committer.
- fun committer=(user: nullable User) do
- if user == null then
- json["committer"] = null
- else
- json["committer"] = user.json
- end
- end
+ # Authoring date as String.
+ var author_date: nullable String is writable
# Authoring date as ISODate.
- fun author_date: ISODate do
- var commit = json["commit"].as(JsonObject)
- var author = commit["author"].as(JsonObject)
- return new ISODate.from_string(author["date"].as(String))
+ fun iso_author_date: nullable ISODate do
+ var author_date = self.author_date
+ if author_date == null then return null
+ return new ISODate.from_string(author_date)
end
+ # Commit date as String.
+ var commit_date: nullable String is writable
+
# Commit date as ISODate.
- fun commit_date: ISODate do
- var commit = json["commit"].as(JsonObject)
- var author = commit["committer"].as(JsonObject)
- return new ISODate.from_string(author["date"].as(String))
+ fun iso_commit_date: nullable ISODate do
+ var commit_date = self.commit_date
+ if commit_date == null then return null
+ return new ISODate.from_string(commit_date)
end
# List files staged in this commit.
- fun files: Array[GithubFile] do
- var res = new Array[GithubFile]
- var files = json.get_or_null("files")
- if not files isa JsonArray then return res
- for obj in files do
- res.add(new GithubFile(obj.as(JsonObject)))
- end
- return res
- end
+ var files: nullable Array[GithubFile] = null is optional, writable
- # Set commit files.
- fun files=(files: Array[GithubFile]) do
- var res = new JsonArray
- for file in files do res.add file.json
- json["files"] = res
- end
+ # Commit message.
+ var message: nullable String is writable
+
+ # Git commit representation linked to this commit.
+ var commit: nullable GitCommit
+end
+
+# A Git Commit representation
+class GitCommit
+ super GithubEntity
+ serialize
+
+ # Commit SHA.
+ var sha: nullable String is writable
+
+ # Parent commits of `self`.
+ var parents: nullable Array[GitCommit] = null is writable
+
+ # Author of the commit.
+ var author: nullable GitUser is writable
+
+ # Committer of the commit.
+ var committer: nullable GitUser is writable
# Commit message.
- fun message: String do return json["commit"].as(JsonObject)["message"].as(String)
+ var message: nullable String is writable
+end
+
+# Git user authoring data
+class GitUser
+ super GithubEntity
+ serialize
+
+ # Authoring date.
+ var date: nullable String = null is writable
+
+ # Authoring date as ISODate.
+ fun iso_date: nullable ISODate do
+ var date = self.date
+ if date == null then return null
+ return new ISODate.from_string(date)
+ end
end
# A Github issue.
#
# See <https://developer.github.com/v3/issues/>.
class Issue
- super RepoEntity
-
- redef var key is lazy do return "{repo.key}/issues/{number}"
+ super GithubEntity
+ serialize
# Issue Github ID.
- var number: Int
-
- redef init from_json(api, repo, json) do
- self.number = json["number"].as(Int)
- super
- end
+ var number: Int is writable
# Issue id.
- fun id: Int do return json["id"].as(Int)
-
- # Set issue id.
- fun id=(id: Int) do json["id"] = id
+ var id: nullable Int is writable
# Issue title.
- fun title: String do return json["title"].as(String)
-
- # Set issue title
- fun title=(title: String) do json["title"] = title
+ var title: String is writable
# User that created this issue.
- fun user: User do return new User.from_json(api, json["user"].as(JsonObject))
-
- # Set issue creator.
- fun user=(user: User) do json["user"] = user.json
+ var user: nullable User is writable
# List of labels on this issue associated to their names.
- fun labels: Map[String, Label] do
- var res = new HashMap[String, Label]
- var lbls = json.get_or_null("labels")
- if not lbls isa JsonArray then return res
- for obj in lbls do
- if not obj isa JsonObject then continue
- var name = obj["name"].as(String)
- res[name] = new Label.from_json(api, repo, obj)
- end
- return res
- end
+ var labels: nullable Array[Label] is writable
# State of the issue on Github.
- fun state: String do return json["state"].as(String)
-
- # Set the state of this issue.
- fun state=(state: String) do json["state"] = state
+ var state: String is writable
# Is the issue locked?
- fun locked: Bool do return json["locked"].as(Bool)
-
- # Set issue locked state.
- fun locked=(locked: Bool) do json["locked"] = locked
+ var locked: nullable Bool is writable
# Assigned `User` (if any).
- fun assignee: nullable User do
- var assignee = json.get_or_null("assignee")
- if assignee isa JsonObject then return new User.from_json(api, assignee)
- return null
- end
-
- # Set issue assignee.
- fun assignee=(user: nullable User) do
- if user == null then
- json["assignee"] = null
- else
- json["assignee"] = user.json
- end
- end
+ var assignee: nullable User is writable
# `Milestone` (if any).
- fun milestone: nullable Milestone do
- var milestone = json.get_or_null("milestone")
- if milestone isa JsonObject then return new Milestone.from_json(api, repo, milestone)
- return null
- end
-
- # Set issue milestone.
- fun milestone=(milestone: nullable Milestone) do
- if milestone == null then
- json["milestone"] = null
- else
- json["milestone"] = milestone.json
- end
- end
-
- # List of comments made on this issue.
- fun comments: Array[IssueComment] do
- var res = new Array[IssueComment]
- var count = comments_count
- var page = 1
- var array = api.get("{key}/comments?page={page}")
- if not array isa JsonArray then
- return res
- end
- while not array.is_empty and res.length < count do
- for obj in array do
- if not obj isa JsonObject then continue
- var id = obj["id"].as(Int)
- var comment = api.load_issue_comment(repo, id)
- if comment == null then continue
- res.add(comment)
- end
- page += 1
- var json = api.get("{key}/comments?page={page}")
- if not json isa JsonArray then
- return res
- end
- array = json
- end
- return res
- end
+ var milestone: nullable Milestone is writable
# Number of comments on this issue.
- fun comments_count: Int do return json["comments"].as(Int)
+ var comments: nullable Int is writable
- # Creation time in ISODate format.
- fun created_at: ISODate do return new ISODate.from_string(json["created_at"].as(String))
+ # Creation time as String.
+ var created_at: String is writable
- # Set issue creation time.
- fun created_at=(created_at: nullable ISODate) do
- if created_at == null then
- json["created_at"] = null
- else
- json["created_at"] = created_at.to_s
- end
+ # Creation time as ISODate.
+ fun iso_created_at: ISODate do
+ return new ISODate.from_string(created_at)
end
- # Last update time in ISODate format (if any).
- fun updated_at: nullable ISODate do
- var res = json.get_or_null("updated_at")
- if res isa String then return new ISODate.from_string(res)
- return null
- end
+ # Last update time as String (if any).
+ var updated_at: nullable String is writable
- # Set issue last update time.
- fun updated_at=(updated_at: nullable ISODate) do
- if updated_at == null then
- json["updated_at"] = null
- else
- json["updated_at"] = updated_at.to_s
- end
+ # Last update date as ISODate.
+ fun iso_updated_at: nullable ISODate do
+ var updated_at = self.updated_at
+ if updated_at == null then return null
+ return new ISODate.from_string(updated_at)
end
- # Close time in ISODate format (if any).
- fun closed_at: nullable ISODate do
- var res = json.get_or_null("closed_at")
- if res isa String then return new ISODate.from_string(res)
- return null
- end
+ # Close time as String (if any).
+ var closed_at: nullable String is writable
- # Set issue close time.
- fun closed_at=(closed_at: nullable ISODate) do
- if closed_at == null then
- json["closed_at"] = null
- else
- json["closed_at"] = closed_at.to_s
- end
+ # Close time as ISODate.
+ fun iso_closed_at: nullable ISODate do
+ var closed_at = self.closed_at
+ if closed_at == null then return null
+ return new ISODate.from_string(closed_at)
end
- # TODO link to pull request
-
# Full description of the issue.
- fun body: String do return json["body"].as(String)
-
- # Set description body
- fun body=(body: String) do json["body"] = body
-
- # List of events on this issue.
- fun events: Array[IssueEvent] do
- var res = new Array[IssueEvent]
- var page = 1
- var array = api.get("{key}/events?page={page}")
- if not array isa JsonArray then return res
- while not array.is_empty do
- for obj in array do
- if not obj isa JsonObject then continue
- res.add new IssueEvent.from_json(api, repo, obj)
- end
- page += 1
- array = api.get("{key}/events?page={page}").as(JsonArray)
- end
- return res
- end
+ var body: nullable String is writable
# User that closed this issue (if any).
- fun closed_by: nullable User do
- var closer = json.get_or_null("closed_by")
- if closer isa JsonObject then return new User.from_json(api, closer)
- return null
- end
-
- # Set user that closed the issue.
- fun closed_by=(user: nullable User) do
- if user == null then
- json["closed_by"] = null
- else
- json["closed_by"] = user.json
- end
- end
+ var closed_by: nullable User is writable
# Is this issue linked to a pull request?
- fun is_pull_request: Bool do return json.has_key("pull_request")
+ var is_pull_request: Bool = false is writable
end
# A Github pull request.
# See <https://developer.github.com/v3/pulls/>.
class PullRequest
super Issue
+ serialize
- redef var key is lazy do return "{repo.key}/pulls/{number}"
+ # Merge time as String (if any).
+ var merged_at: nullable String is writable
- # Merge time in ISODate format (if any).
- fun merged_at: nullable ISODate do
- var res = json.get_or_null("merged_at")
- if res isa String then return new ISODate.from_string(res)
- return null
- end
-
- # Set pull request merge time.
- fun merged_at=(merged_at: nullable ISODate) do
- if merged_at == null then
- json["merged_at"] = null
- else
- json["merged_at"] = merged_at.to_s
- end
+ # Merge time as ISODate.
+ fun iso_merged_at: nullable ISODate do
+ var merged_at = self.merged_at
+ if merged_at == null then return null
+ return new ISODate.from_string(merged_at)
end
# Merge commit SHA.
- fun merge_commit_sha: String do return json["merge_commit_sha"].as(String)
-
- # Set merge_commit_sha
- fun merge_commit_sha=(sha: String) do json["merge_commit_sha"] = sha
+ var merge_commit_sha: nullable String is writable
# Count of comments made on the pull request diff.
- fun review_comments: Int do return json["review_comments"].as(Int)
-
- # Set review_comments
- fun review_comments=(count: Int) do json["review_comments"] = count
+ var review_comments: Int is writable
# Pull request head (can be a commit SHA or a branch name).
- fun head: PullRef do
- var json = json["head"].as(JsonObject)
- return new PullRef(api, json)
- end
-
- # Set head
- fun head=(head: PullRef) do json["head"] = head.json
+ var head: PullRef is writable
# Pull request base (can be a commit SHA or a branch name).
- fun base: PullRef do
- var json = json["base"].as(JsonObject)
- return new PullRef(api, json)
- end
-
- # Set base
- fun base=(base: PullRef) do json["base"] = base.json
+ var base: PullRef is writable
# Is this pull request merged?
- fun merged: Bool do return json["merged"].as(Bool)
-
- # Set merged
- fun merged=(merged: Bool) do json["merged"] = merged
+ var merged: Bool is writable
# Is this pull request mergeable?
- fun mergeable: Bool do return json["mergeable"].as(Bool)
-
- # Set mergeable
- fun mergeable=(mergeable: Bool) do json["mergeable"] = mergeable
+ var mergeable: nullable Bool is writable
# Mergeable state of this pull request.
#
# See <https://developer.github.com/v3/pulls/#list-pull-requests>.
- fun mergeable_state: Int do return json["mergeable_state"].as(Int)
-
- # Set mergeable_state
- fun mergeable_state=(mergeable_state: Int) do json["mergeable_state"] = mergeable_state
+ var mergeable_state: String is writable
# User that merged this pull request (if any).
- fun merged_by: nullable User do
- var merger = json.get_or_null("merged_by")
- if merger isa JsonObject then return new User.from_json(api, merger)
- return null
- end
-
- # Set merged_by.
- fun merged_by=(merged_by: nullable User) do
- if merged_by == null then
- json["merged_by"] = null
- else
- json["merged_by"] = merged_by.json
- end
- end
+ var merged_by: nullable User is writable
# Count of commits in this pull request.
- fun commits: Int do return json["commits"].as(Int)
-
- # Set commits
- fun commits=(commits: Int) do json["commits"] = commits
+ var commits: Int is writable
# Added line count.
- fun additions: Int do return json["additions"].as(Int)
-
- # Set additions
- fun additions=(additions: Int) do json["additions"] = additions
+ var additions: Int is writable
# Deleted line count.
- fun deletions: Int do return json["deletions"].as(Int)
-
- # Set deletions
- fun deletions=(deletions: Int) do json["deletions"] = deletions
+ var deletions: Int is writable
# Changed files count.
- fun changed_files: Int do return json["changed_files"].as(Int)
+ var changed_files: Int is writable
- # Set changed_files
- fun changed_files=(changed_files: Int) do json["changed_files"] = changed_files
+ # URL to patch file
+ var patch_url: nullable String is writable
end
# A pull request reference (used for head and base).
class PullRef
-
- # Api instance that maintains self.
- var api: GithubAPI
-
- # JSON representation.
- var json: JsonObject
+ serialize
# Label pointed by `self`.
- fun labl: String do return json["label"].as(String)
-
- # Set labl
- fun labl=(labl: String) do json["label"] = labl
+ var labl: String is writable, serialize_as("label")
# Reference pointed by `self`.
- fun ref: String do return json["ref"].as(String)
-
- # Set ref
- fun ref=(ref: String) do json["ref"] = ref
+ var ref: String is writable
# Commit SHA pointed by `self`.
- fun sha: String do return json["sha"].as(String)
-
- # Set sha
- fun sha=(sha: String) do json["sha"] = sha
+ var sha: String is writable
# User pointed by `self`.
- fun user: User do
- return new User.from_json(api, json["user"].as(JsonObject))
- end
-
- # Set user
- fun user=(user: User) do json["user"] = user.json
+ var user: User is writable
- # Repo pointed by `self`.
- fun repo: Repo do
- return new Repo.from_json(api, json["repo"].as(JsonObject))
- end
-
- # Set repo
- fun repo=(repo: Repo) do json["repo"] = repo.json
+ # Repo pointed by `self` (if any).
+ #
+ # A `null` value means the `repo` was deleted.
+ var repo: nullable Repo is writable
end
# A Github label.
#
# See <https://developer.github.com/v3/issues/labels/>.
class Label
- super RepoEntity
-
- redef var key is lazy do return "{repo.key}/labels/{name}"
+ super GithubEntity
+ serialize
# Label name.
- var name: String
-
- redef init from_json(api, repo, json) do
- self.name = json["name"].as(String)
- super
- end
+ var name: String is writable
# Label color code.
- fun color: String do return json["color"].as(String)
-
- # Set color
- fun color=(color: String) do json["color"] = color
+ var color: String is writable
end
# A Github milestone.
#
# See <https://developer.github.com/v3/issues/milestones/>.
class Milestone
- super RepoEntity
-
- redef var key is lazy do return "{repo.key}/milestones/{number}"
+ super GithubEntity
+ serialize
# The milestone id on Github.
- var number: Int
-
- redef init from_json(api, repo, json) do
- super
- self.number = json["number"].as(Int)
- end
+ var number: nullable Int = null is writable
# Milestone title.
- fun title: String do return json["title"].as(String)
-
- # Set title
- fun title=(title: String) do json["title"] = title
+ var title: String is writable
# Milestone long description.
- fun description: String do return json["description"].as(String)
-
- # Set description
- fun description=(description: String) do json["description"] = description
+ var description: nullable String is writable
# Count of opened issues linked to this milestone.
- fun open_issues: Int do return json["open_issues"].as(Int)
-
- # Set open_issues
- fun open_issues=(open_issues: Int) do json["open_issues"] = open_issues
+ var open_issues: nullable Int = null is writable
# Count of closed issues linked to this milestone.
- fun closed_issues: Int do return json["closed_issues"].as(Int)
-
- # Set closed_issues
- fun closed_issues=(closed_issues: Int) do json["closed_issues"] = closed_issues
+ var closed_issues: nullable Int = null is writable
# Milestone state.
- fun state: String do return json["state"].as(String)
+ var state: nullable String is writable
- # Set state
- fun state=(state: String) do json["state"] = state
+ # Creation time as String.
+ var created_at: nullable String is writable
- # Creation time in ISODate format.
- fun created_at: ISODate do
- return new ISODate.from_string(json["created_at"].as(String))
+ # Creation time as ISODate.
+ fun iso_created_at: nullable ISODate do
+ var created_at = self.created_at
+ if created_at == null then return null
+ return new ISODate.from_string(created_at)
end
- # Set created_at
- fun created_at=(created_at: ISODate) do json["created_at"] = created_at.to_s
-
# User that created this milestone.
- fun creator: User do
- return new User.from_json(api, json["creator"].as(JsonObject))
- end
+ var creator: nullable User is writable
- # Set creator
- fun creator=(creator: User) do json["creator"] = creator.json
+ # Due time as String (if any).
+ var due_on: nullable String is writable
# Due time in ISODate format (if any).
- fun due_on: nullable ISODate do
- var res = json.get_or_null("updated_at")
- if res isa String then return new ISODate.from_string(res)
- return null
+ fun iso_due_on: nullable ISODate do
+ var due_on = self.due_on
+ if due_on == null then return null
+ return new ISODate.from_string(due_on)
end
- # Set due_on.
- fun due_on=(due_on: nullable ISODate) do
- if due_on == null then
- json["due_on"] = null
- else
- json["due_on"] = due_on.to_s
- end
- end
+ # Last update time as String (if any).
+ var updated_at: nullable String is writable
- # Update time in ISODate format (if any).
- fun updated_at: nullable ISODate do
- var res = json.get_or_null("updated_at")
- if res isa String then return new ISODate.from_string(res)
- return null
+ # Last update date as ISODate.
+ fun iso_updated_at: nullable ISODate do
+ var updated_at = self.updated_at
+ if updated_at == null then return null
+ return new ISODate.from_string(updated_at)
end
- # Set updated_at.
- fun updated_at=(updated_at: nullable ISODate) do
- if updated_at == null then
- json["updated_at"] = null
- else
- json["updated_at"] = updated_at.to_s
- end
- end
+ # Close time as String (if any).
+ var closed_at: nullable String is writable
- # Close time in ISODate format (if any).
- fun closed_at: nullable ISODate do
- var res = json.get_or_null("closed_at")
- if res isa String then return new ISODate.from_string(res)
- return null
- end
-
- # Set closed_at.
- fun closed_at=(closed_at: nullable ISODate) do
- if closed_at == null then
- json["closed_at"] = null
- else
- json["closed_at"] = closed_at.to_s
- end
+ # Close time as ISODate.
+ fun iso_closed_at: nullable ISODate do
+ var closed_at = self.closed_at
+ if closed_at == null then return null
+ return new ISODate.from_string(closed_at)
end
end
# * `IssueComment` are made on an issue or pull request page.
# * `ReviewComment` are made on the diff associated to a pull request.
abstract class Comment
- super RepoEntity
+ super GithubEntity
+ serialize
# Identifier of this comment.
- var id: Int
-
- redef init from_json(api, repo, json) do
- self.id = json["id"].as(Int)
- super
- end
+ var id: Int is writable
# User that made this comment.
- fun user: User do
- return new User.from_json(api, json["user"].as(JsonObject))
- end
+ var user: User is writable
- # Set user
- fun user=(user: User) do json["user"] = user.json
+ # Creation time as String.
+ var created_at: String is writable
- # Creation time in ISODate format.
- fun created_at: ISODate do
- return new ISODate.from_string(json["created_at"].as(String))
+ # Creation time as ISODate.
+ fun iso_created_at: nullable ISODate do
+ return new ISODate.from_string(created_at)
end
- # Set created_at
- fun created_at=(created_at: ISODate) do json["created_at"] = created_at.to_s
+ # Last update time as String (if any).
+ var updated_at: nullable String is writable
- # Last update time in ISODate format (if any).
- fun updated_at: nullable ISODate do
- var res = json.get_or_null("updated_at")
- if res isa String then return new ISODate.from_string(res)
- return null
- end
-
- # Set updated_at.
- fun updated_at=(updated_at: nullable ISODate) do
- if updated_at == null then
- json["updated_at"] = null
- else
- json["updated_at"] = updated_at.to_s
- end
+ # Last update date as ISODate.
+ fun iso_updated_at: nullable ISODate do
+ var updated_at = self.updated_at
+ if updated_at == null then return null
+ return new ISODate.from_string(updated_at)
end
# Comment body text.
- fun body: String do return json["body"].as(String)
-
- # Set body
- fun body=(body: String) do json["body"] = body
+ var body: String is writable
# Does the comment contain an acknowledgement (+1)
- fun is_ack: Bool
- do
+ fun is_ack: Bool do
return body.has("\\+1\\b".to_re) or body.has(":+1:") or body.has(":shipit:")
end
end
# A comment made on a commit.
class CommitComment
super Comment
-
- redef var key is lazy do return "{repo.key}/comments/{id}"
+ serialize
# Commented commit.
- fun commit: Commit do
- return api.load_commit(repo, json["commit_id"].as(String)).as(not null)
- end
-
- # Set commit
- fun commit=(commit: Commit) do json["commit_id"] = commit.json
+ var commit_id: String is writable
# Position of the comment on the line.
- fun position: nullable String do
- var res = json.get_or_null("position")
- if res isa String then return res
- return null
- end
-
- # Set position.
- fun position=(position: nullable String) do json["position"] = position
+ var position: nullable Int is writable
# Line of the comment.
- fun line: nullable String do
- var res = json.get_or_null("line")
- if res isa String then return res
- return null
- end
-
- # Set line.
- fun line=(line: nullable String) do json["line"] = line
+ var line: nullable Int is writable
# Path of the commented file.
- fun path: String do return json["path"].as(String)
-
- # Set path.
- fun path=(path: String) do json["path"] = path
+ var path: nullable String is writable
end
# Comments made on Github issue and pull request pages.
# See <https://developer.github.com/v3/issues/comments/>.
class IssueComment
super Comment
-
- redef var key is lazy do return "{repo.key}/issues/comments/{id}"
+ serialize
# Issue that contains `self`.
- fun issue: Issue do
- var number = issue_url.split("/").last.to_i
- return api.load_issue(repo, number).as(not null)
- end
+ fun issue_number: Int do return issue_url.split("/").last.to_i
# Link to the issue document on API.
- fun issue_url: String do return json["issue_url"].as(String)
-
- # Set issue_url.
- fun issue_url=(issue_url: String) do json["issue_url"] = issue_url
+ var issue_url: String is writable
end
# Comments made on Github pull request diffs.
# See <https://developer.github.com/v3/pulls/comments/>.
class ReviewComment
super Comment
-
- redef var key is lazy do return "{repo.key}/pulls/comments/{id}"
+ serialize
# Pull request that contains `self`.
- fun pull: PullRequest do
- var number = pull_request_url.split("/").last.to_i
- return api.load_pull(repo, number).as(not null)
- end
+ fun pull_number: Int do return pull_request_url.split("/").last.to_i
# Link to the pull request on API.
- fun pull_request_url: String do return json["pull_request_url"].as(String)
-
- # Set pull_request_url.
- fun pull_request_url=(pull_request_url: String) do json["pull_request_url"] = pull_request_url
+ var pull_request_url: String is writable
# Diff hunk.
- fun diff_hunk: String do return json["diff_hunk"].as(String)
-
- # Set diff_hunk.
- fun diff_hunk=(diff_hunk: String) do json["diff_hunk"] = diff_hunk
+ var diff_hunk: String is writable
# Path of commented file.
- fun path: String do return json["path"].as(String)
-
- # Set path.
- fun path=(path: String) do json["path"] = path
+ var path: String is writable
# Position of the comment on the file.
- fun position: Int do return json["position"].as(Int)
-
- # Set position.
- fun position=(position: Int) do json["position"] = position
+ var position: nullable Int is writable
# Original position in the diff.
- fun original_position: Int do return json["original_position"].as(Int)
-
- # Set original_position.
- fun original_position=(original_position: Int) do json["original_position"] = original_position
+ var original_position: Int is writable
# Commit referenced by this comment.
- fun commit_id: String do return json["commit_id"].as(String)
-
- # Set commit_id.
- fun commit_id=(commit_id: String) do json["commit_id"] = commit_id
+ var commit_id: String is writable
# Original commit id.
- fun original_commit_id: String do return json["original_commit_id"].as(String)
-
- # Set original_commit_id.
- fun original_commit_id=(commit_id: String) do json["original_commit_id"] = commit_id
+ var original_commit_id: String is writable
end
# An event that occurs on a Github `Issue`.
#
# See <https://developer.github.com/v3/issues/events/>.
class IssueEvent
- super RepoEntity
-
- redef var key is lazy do return "{repo.key}/issues/events/{id}"
+ super GithubEntity
+ serialize
# Event id on Github.
- var id: Int
-
- redef init from_json(api, repo, json) do
- self.id = json["id"].as(Int)
- super
- end
-
- # Issue that contains `self`.
- fun issue: Issue do
- return new Issue.from_json(api, repo, json["issue"].as(JsonObject))
- end
-
- # Set issue.
- fun issue=(issue: Issue) do json["issue"] = issue.json
+ var id: Int is writable
# User that initiated the event.
- fun actor: User do
- return new User.from_json(api, json["actor"].as(JsonObject))
- end
+ var actor: User is writable
- # Set actor.
- fun actor=(actor: User) do json["actor"] = actor.json
+ # Creation time as String.
+ var created_at: String is writable
- # Creation time in ISODate format.
- fun created_at: ISODate do
- return new ISODate.from_string(json["created_at"].as(String))
+ # Creation time as ISODate.
+ fun iso_created_at: nullable ISODate do
+ return new ISODate.from_string(created_at)
end
- # Set created_at.
- fun created_at=(created_at: ISODate) do json["created_at"] = created_at.to_s
-
# Event descriptor.
- fun event: String do return json["event"].as(String)
-
- # Set event.
- fun event=(event: String) do json["event"] = event
+ var event: String is writable
# Commit linked to this event (if any).
- fun commit_id: nullable String do
- var res = json.get_or_null("commit_id")
- if res isa String then return res
- return null
- end
-
- # Set commit_id.
- fun commit_id=(commit_id: nullable String) do json["commit_id"] = commit_id
+ var commit_id: nullable String is writable
# Label linked to this event (if any).
- fun labl: nullable Label do
- var res = json.get_or_null("label")
- if res isa JsonObject then return new Label.from_json(api, repo, res)
- return null
- end
-
- # Set labl.
- fun labl=(labl: nullable Label) do
- if labl == null then
- json["labl"] = null
- else
- json["labl"] = labl.json
- end
- end
+ var labl: nullable Label is writable, serialize_as("label")
# User linked to this event (if any).
- fun assignee: nullable User do
- var res = json.get_or_null("assignee")
- if res isa JsonObject then return new User.from_json(api, res)
- return null
- end
-
- # Set assignee.
- fun assignee=(assignee: nullable User) do
- if assignee == null then
- json["assignee"] = null
- else
- json["assignee"] = assignee.json
- end
- end
+ var assignee: nullable User is writable
# Milestone linked to this event (if any).
- fun milestone: nullable Milestone do
- var res = json.get_or_null("milestone")
- if res isa JsonObject then return new Milestone.from_json(api, repo, res)
- return null
- end
-
- # Set milestone.
- fun milestone=(milestone: nullable User) do
- if milestone == null then
- json["milestone"] = null
- else
- json["milestone"] = milestone.json
- end
- end
+ var milestone: nullable Milestone is writable
# Rename linked to this event (if any).
- fun rename: nullable RenameAction do
- var res = json.get_or_null("rename")
- if res isa JsonObject then return new RenameAction(res)
- return null
- end
-
- # Set rename.
- fun rename=(rename: nullable User) do
- if rename == null then
- json["rename"] = null
- else
- json["rename"] = rename.json
- end
- end
+ var rename: nullable RenameAction is writable
end
# A rename action maintains the name before and after a renaming action.
class RenameAction
-
- # JSON content.
- var json: JsonObject
+ serialize
# Name before renaming.
- fun from: String do return json["from"].as(String)
-
- # Set from.
- fun from=(from: String) do json["from"] = from
+ var from: String is writable
# Name after renaming.
- fun to: String do return json["to"].as(String)
-
- # Set to.
- fun to=(to: String) do json["to"] = to
+ var to: String is writable
end
-# Contributors list with additions, deletions, and commit counts.
#
# Should be accessed from `Repo::contrib_stats`.
#
# See <https://developer.github.com/v3/repos/statistics/>.
class ContributorStats
super Comparable
+ serialize
redef type OTHER: ContributorStats
# Github API client.
- var api: GithubAPI
-
- # Json content.
- var json: JsonObject
-
- # Init `self` from a `json` object.
- init from_json(api: GithubAPI, json: JsonObject) do
- self.api = api
- self.json = json
- end
+ var api: GithubAPI is writable
# User these statistics are about.
- fun author: User do
- return new User.from_json(api, json["author"].as(JsonObject))
- end
-
- # Set author.
- fun author=(author: User) do json["author"] = author.json
+ var author: User is writable
# Total number of commit.
- fun total: Int do return json["total"].as(Int)
-
- # Set total.
- fun total=(total: Int) do json["total"] = total
+ var total: Int is writable
# Are of weeks of activity with detailed statistics.
- fun weeks: JsonArray do return json["weeks"].as(JsonArray)
-
- # Set weeks.
- fun weeks=(weeks: JsonArray) do json["weeks"] = weeks
+ var weeks: JsonArray is writable
# ContributorStats can be compared on the total amount of commits.
redef fun <(o) do return total < o.total
#
# Mostly a wrapper around a json object.
class GithubFile
-
- # Json content.
- var json: JsonObject
+ serialize
# File name.
- fun filename: String do return json["filename"].as(String)
+ var filename: String is writable
+end
+
+# Make ISO Datew serilizable
+redef class ISODate
+ super Jsonable
+ serialize
+end
- # Set filename.
- fun filename=(filename: String) do json["filename"] = filename
+# JsonDeserializer specific for Github objects.
+class GithubDeserializer
+ super JsonDeserializer
+
+ redef fun class_name_heuristic(json_object) do
+ if json_object.has_key("login") then
+ return "User"
+ else if json_object.has_key("full_name") then
+ return "Repo"
+ else if json_object.has_key("name") and json_object.has_key("commit") then
+ return "Branch"
+ else if json_object.has_key("sha") and json_object.has_key("ref") then
+ return "PullRef"
+ else if (json_object.has_key("sha") and json_object.has_key("commit")) or (json_object.has_key("id") and json_object.has_key("tree_id")) then
+ return "Commit"
+ else if json_object.has_key("sha") and json_object.has_key("tree") then
+ return "GitCommit"
+ else if json_object.has_key("name") and json_object.has_key("date") then
+ return "GitUser"
+ else if json_object.has_key("number") and json_object.has_key("patch_url") then
+ return "PullRequest"
+ else if json_object.has_key("open_issues") and json_object.has_key("closed_issues") then
+ return "Milestone"
+ else if json_object.has_key("number") and json_object.has_key("title") then
+ return "Issue"
+ else if json_object.has_key("color") then
+ return "Label"
+ else if json_object.has_key("event") then
+ return "IssueEvent"
+ else if json_object.has_key("original_commit_id") then
+ return "ReviewComment"
+ else if json_object.has_key("commit_id") then
+ return "CommitComment"
+ else if json_object.has_key("issue_url") then
+ return "IssueComment"
+ end
+ return null
+ end
+
+ redef fun deserialize_class(name) do
+ if name == "Issue" then
+ var issue = super.as(Issue)
+ if path.last.has_key("pull_request") then
+ issue.is_pull_request = true
+ end
+ return issue
+ else if name == "Commit" then
+ var commit = super.as(Commit)
+ var git_commit = commit.commit
+ if git_commit != null then commit.message = git_commit.message
+ return commit
+ end
+ return super
+ end
end