From 956bac455d31ada047ba4f1de5cbd613280d6fac Mon Sep 17 00:00:00 2001 From: Alexandre Terrasa Date: Fri, 16 Jan 2015 01:23:00 +0100 Subject: [PATCH] lib/github: introduces Github hook events Signed-off-by: Alexandre Terrasa --- lib/github/events.nit | 302 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 302 insertions(+) create mode 100644 lib/github/events.nit diff --git a/lib/github/events.nit b/lib/github/events.nit new file mode 100644 index 0000000..b6e5af3 --- /dev/null +++ b/lib/github/events.nit @@ -0,0 +1,302 @@ +# This file is part of NIT ( http://www.nitlanguage.org ). +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# Events are emitted by Github Hooks. +# +# See +module events + +import api + +# Github event stub. +class GithubEvent + + # Github API client. + var api: GithubAPI + + # Json representation of `self`. + var json: JsonObject is noinit + + init do + json = new JsonObject + end + + # Init `self` from a `json` object. + init from_json(api: GithubAPI, json: JsonObject) do + self.api = api + self.json = json + end + + # Action performed by the event. + fun action: String do return json["action"].to_s + + # Repo where this event occured. + fun repo: Repo do + return new Repo.from_json(api, json["repository"].as(JsonObject)) + end +end + +# Triggered when a commit comment is created. +class CommitCommentEvent + super GithubEvent + + # The `Comment` itself. + fun comment: CommitComment do + return new CommitComment.from_json(api, repo, json["comment"].as(JsonObject)) + end +end + +# Triggered when a repository, branch, or tag is created. +class CreateEvent + super GithubEvent + + # Oject type that was created. + # + # Can be one of `repository`, `branch`, or `tag`. + fun ref_type: String do return json["ref_type"].to_s + + # Git ref (or null if only a repository was created). + fun ref: String do return json["ref"].to_s + + # Name of the repo's default branch (usually master). + fun master_branch: String do return json["master_branch"].to_s + + # Repo's current description. + fun description: String do return json["description"].to_s +end + +# Triggered when a branch or a tag is deleted. +class DeleteEvent + super GithubEvent + + # Object type that was deleted. + # + # Can be one of `repository`, `branch`, or `tag`. + fun ref_type: String do return json["ref_type"].to_s + + # Git ref (or null if only a repository was deleted). + fun ref: String do return json["ref"].to_s +end + +# Triggered when a new snapshot is deployed. +# +# Deployement are mainly used with integration testing servers. +class DeploymentEvent + super GithubEvent + + # Commit SHA for which this deployment was created. + fun sha: String do return json["sha"].to_s + + # Name of repository for this deployment, formatted as :owner/:repo. + fun name: String do return json["name"].to_s + + # Optional extra information for this deployment. + fun payload: nullable String do + if not json.has_key("payload") then return null + return json["payload"].to_s + end + + # Optional environment to deploy to. + # Default: "production" + fun environment: nullable String do + if not json.has_key("environment") then return null + return json["environment"].to_s + end + + # Optional human-readable description added to the deployment. + fun description: nullable String do + if not json.has_key("description") then return null + return json["description"].to_s + end +end + +# Triggered when a deployement's status changes. +class DeploymentStatusEvent + super GithubEvent + + # New deployment state. + # + # Can be `pending`, `success`, `failure`, or `error`. + fun state: String do return json["state"].to_s + + # Optional link added to the status. + fun target_url: nullable String do + if not json.has_key("target_url") then return null + return json["target_url"].to_s + end + + # Deployment hash that this status is associated with. + fun deployment: String do return json["deployment"].to_s + + # Optional human-readable description added to the status. + fun description: nullable String do + if not json.has_key("description") then return null + return json["description"].to_s + end +end + +# Triggered when a user forks a repository. +class ForkEvent + super GithubEvent + + # Created repository. + fun forkee: Repo do return new Repo.from_json(api, json["forkee"].as(JsonObject)) +end + +# Triggered when an issue comment is created. +class IssueCommentEvent + super GithubEvent + + # `Issue` the comment belongs to. + fun issue: Issue do + return new Issue.from_json(api, repo, json["issue"].as(JsonObject)) + end + + # The `Comment` itself. + fun comment: IssueComment do + return new IssueComment.from_json(api, repo, json["comment"].as(JsonObject)) + end +end + +# Triggered when an event occurs on an issue. +# +# Triggered when an issue is assigned, unassigned, labeled, unlabeled, +# opened, closed or reopened. +class IssuesEvent + super GithubEvent + + # The `Issue` itself. + fun issue: Issue do return new Issue.from_json(api, repo, json["issue"].as(JsonObject)) + + # Optional `Label` that was added or removed from the issue. + fun lbl: nullable Label do + if not json.has_key("label") then return null + return new Label.from_json(api, repo, json["label"].as(JsonObject)) + end + + # Optional `User` that was assigned or unassigned from the issue. + fun assignee: nullable User do + if not json.has_key("assignee") then return null + return new User.from_json(api, json["assignee"].as(JsonObject)) + end +end + +# Triggered when a user is added as a collaborator to a repository. +class MemberEvent + super GithubEvent + + # `User` that was added. + fun member: User do return new User.from_json(api, json["member"].as(JsonObject)) +end + +# Triggered when an event occurs on a pull request. +# +# Triggered when a pull request is assigned, unassigned, +# labeled, unlabeled, opened, closed, reopened, or synchronized. +class PullRequestEvent + super GithubEvent + + # The pull request number. + fun number: Int do return json["number"].as(Int) + + # The `PullRequest` itself. + fun pull: PullRequest do + return new PullRequest.from_json(api, repo, json["pull_request"].as(JsonObject)) + end +end + +# Triggered when a comment is created on a pull request diff. +class PullRequestReviewCommentEvent + super GithubEvent + + # The `Comment` itself. + fun comment: ReviewComment do + return new ReviewComment.from_json(api, repo, json["comment"].as(JsonObject)) + end + + # `PullRequest` the `comment` belongs to. + fun pull: PullRequest do + return new PullRequest.from_json(api, repo, json["pull_request"].as(JsonObject)) + end +end + +# Triggered when a repository branch is pushed to. +class PushEvent + super GithubEvent + + # SHA of the HEAD commit on the repository. + fun head: String do return json["head"].to_s + + # Full Git ref that was pushed. + # + # Example: “refs/heads/master” + fun ref: String do return json["ref"].to_s + + # Number of commits in the push. + fun size: Int do return json["size"].as(Int) + + # Array of pushed commits. + fun commits: Array[Commit] do + var res = new Array[Commit] + var arr = json["commits"].as(JsonArray) + for obj in arr do + if not obj isa JsonObject then continue + res.add api.load_commit(repo, obj["sha"].to_s).as(not null) + end + return res + end +end + +# Triggered when the status of a Git commit changes. +class StatusEvent + super GithubEvent + + # The `Commit` itself. + fun commit: Commit do + return api.load_commit(repo, json["sha"].to_s).as(not null) + end + + # New state. + # + # Can be `pending`, `success`, `failure`, or `error`. + fun state: String do return json["state"].to_s + + # Optional human-readable description added to the status. + fun description: nullable String do + if not json.has_key("description") then return null + return json["description"].to_s + end + + # Optional link added to the status. + fun target_url: nullable String do + if not json.has_key("target_url") then return null + return json["target_url"].to_s + end + + # Array of branches containing the status' SHA. + # + # Each branch contains the given SHA, + # but the SHA may or may not be the head of the branch. + # + # The array includes a maximum of 10 branches. + fun branches: Array[Branch] do + var res = new Array[Branch] + var arr = json["branches"].as(JsonArray) + for obj in arr do + if not obj isa JsonObject then continue + res.add api.load_branch(repo, obj["name"].to_s).as(not null) + end + return res + end +end -- 1.7.9.5