Merge: Safe call operator
[nit.git] / lib / github / events.nit
index df7c8c3..952ee62 100644 (file)
 module events
 
 import api
+intrude import json
 
 # Github event stub.
 class GithubEvent
+       serialize
 
-       # 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
+       # Event ID from Github.
+       var id: nullable String is writable
 
        # Action performed by the event.
-       fun action: String do return json["action"].as(String)
-
-       # Set action.
-       fun action=(action: String) do json["action"] = action
+       var action: nullable String is writable
 
        # Repo where this event occured.
-       fun repo: Repo do
-               return new Repo.from_json(api, json["repository"].as(JsonObject))
-       end
-
-       # Set repo.
-       fun repo=(repo: Repo) do json["repository"] = repo.json
+       var repo: Repo is writable
 end
 
 # Triggered when a commit comment is created.
 class CommitCommentEvent
        super GithubEvent
+       serialize
 
        # The `Comment` itself.
-       fun comment: CommitComment do
-               return new CommitComment.from_json(api, repo, json["comment"].as(JsonObject))
-       end
-
-       # Set comment.
-       fun comment=(comment: CommitComment) do json["comment"] = comment.json
+       var comment: CommitComment is writable
 end
 
 # Triggered when a repository, branch, or tag is created.
 class CreateEvent
        super GithubEvent
+       serialize
 
        # Oject type that was created.
        #
        # Can be one of `repository`, `branch`, or `tag`.
-       fun ref_type: String do return json["ref_type"].as(String)
-
-       # Set ref_type.
-       fun ref_type=(ref_type: String) do json["ref_type"] = ref_type
+       var ref_type: String is writable
 
        # Git ref (or null if only a repository was created).
-       fun ref: String do return json["ref"].as(String)
-
-       # Set ref.
-       fun ref=(ref: String) do json["ref"] = ref
+       var ref: String is writable
 
        # Name of the repo's default branch (usually master).
-       fun master_branch: String do return json["master_branch"].as(String)
-
-       # Set master_branch.
-       fun master_branch=(master_branch: String) do json["master_branch"] = master_branch
+       var master_branch: String is writable
 
        # Repo's current 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
 end
 
 # Triggered when a branch or a tag is deleted.
 class DeleteEvent
        super GithubEvent
+       serialize
 
        # Object type that was deleted.
        #
        # Can be one of `repository`, `branch`, or `tag`.
-       fun ref_type: String do return json["ref_type"].as(String)
-
-       # Set ref_type.
-       fun ref_type=(ref_type: String) do json["ref_type"] = ref_type
+       var ref_type: String is writable
 
        # Git ref (or null if only a repository was deleted).
-       fun ref: String do return json["ref"].as(String)
-
-       # Set ref.
-       fun ref=(ref: String) do json["ref"] = ref
+       var ref: String is writable
 end
 
 # Triggered when a new snapshot is deployed.
@@ -121,112 +82,64 @@ end
 # Deployement are mainly used with integration testing servers.
 class DeploymentEvent
        super GithubEvent
+       serialize
 
        # Commit SHA for which this deployment was created.
-       fun sha: String do return json["sha"].as(String)
-
-       # Set sha.
-       fun sha=(sha: String) do json["sha"] = sha
+       var sha: String is writable
 
        # Name of repository for this deployment, formatted as :owner/:repo.
-       fun name: String do return json["name"].as(String)
-
-       # Set name.
-       fun name=(name: String) do json["name"] = name
+       var name: String is writable
 
        # Optional extra information for this deployment.
-       fun payload: nullable String do
-               var res = json.get_or_null("payload")
-               if res isa String then return res else return null
-       end
-
-       # Set payload.
-       fun payload=(payload: nullable String) do json["payload"] = payload
+       var payload: nullable String is writable
 
        # Optional environment to deploy to.
        # Default: "production"
-       fun environment: nullable String do
-               var res = json.get_or_null("environment")
-               if res isa String then return res else return null
-       end
-
-       # Set environment.
-       fun environment=(environment: nullable String) do json["environment"] = environment
+       var environment: nullable String is writable
 
        # Optional human-readable description added to the deployment.
-       fun description: nullable String do
-               var res = json.get_or_null("description")
-               if res isa String then return res else return null
-       end
-
-       # Set description.
-       fun description=(description: nullable String) do json["description"] = description
+       var description: nullable String is writable
 end
 
 # Triggered when a deployement's status changes.
 class DeploymentStatusEvent
        super GithubEvent
+       serialize
 
        # New deployment state.
        #
        # Can be `pending`, `success`, `failure`, or `error`.
-       fun state: String do return json["state"].as(String)
+       var state: String is writable
 
        # Optional link added to the status.
-       fun target_url: nullable String do
-               var res = json.get_or_null("target_url")
-               if res isa String then return res else return null
-       end
-
-       # Set target_url.
-       fun target_url=(target_url: nullable String) do json["target_url"] = target_url
+       var target_url: nullable String is writable
 
        # Deployment hash that this status is associated with.
-       fun deployment: String do return json["deployment"].as(String)
-
-       # Set deployment.
-       fun deployment=(deployment: String) do json["deployment"] = deployment
+       var deployment: String is writable
 
        # Optional human-readable description added to the status.
-       fun description: nullable String do
-               var res = json.get_or_null("description")
-               if res isa String then return res else return null
-       end
-
-       # Set description.
-       fun description=(description: nullable String) do json["description"] = description
+       var description: nullable String is writable
 end
 
 # Triggered when a user forks a repository.
 class ForkEvent
        super GithubEvent
+       serialize
 
        # Created repository.
-       fun forkee: Repo do return new Repo.from_json(api, json["forkee"].as(JsonObject))
-
-       # Set forkee.
-       fun forkee=(forkee: Repo) do json["forkee"] = forkee.json
+       var forkee: Repo is writable
 end
 
 # Triggered when an issue comment is created.
 class IssueCommentEvent
        super GithubEvent
+       serialize
 
        # `Issue` the comment belongs to.
-       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 issue: Issue is writable
 
        # The `Comment` itself.
-       fun comment: IssueComment do
-               return new IssueComment.from_json(api, repo, json["comment"].as(JsonObject))
-       end
-
-       # Set comment.
-       fun comment=(comment: IssueComment) do json["comment"] = comment.json
+       var comment: IssueComment is writable
 end
 
 # Triggered when an event occurs on an issue.
@@ -235,53 +148,25 @@ end
 # opened, closed or reopened.
 class IssuesEvent
        super GithubEvent
+       serialize
 
        # The `Issue` itself.
-       fun issue: Issue do return new Issue.from_json(api, repo, json["issue"].as(JsonObject))
-
-       # Set issue.
-       fun issue=(issue: Issue) do json["issue"] = issue.json
+       var issue: Issue is writable
 
        # Optional `Label` that was added or removed from the issue.
-       fun lbl: nullable Label do
-               var res = json.get_or_null("label")
-               if res isa JsonObject then return new Label.from_json(api, repo, res) else return null
-       end
-
-       # Set lbl.
-       fun lbl=(lbl: nullable Label) do
-               if lbl == null then
-                       json["lbl"] = null
-               else
-                       json["lbl"] = lbl.json
-               end
-       end
+       var lbl: nullable Label is writable, serialize_as("label")
 
        # Optional `User` that was assigned or unassigned from the issue.
-       fun assignee: nullable User do
-               var res = json.get_or_null("assignee")
-               if res isa JsonObject then return new User.from_json(api, res) else 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
 end
 
 # Triggered when a user is added as a collaborator to a repository.
 class MemberEvent
        super GithubEvent
+       serialize
 
        # `User` that was added.
-       fun member: User do return new User.from_json(api, json["member"].as(JsonObject))
-
-       # Set member.
-       fun member=(member: User) do json["member"] = member.json
+       var member: User is writable
 end
 
 # Triggered when an event occurs on a pull request.
@@ -290,123 +175,65 @@ end
 # labeled, unlabeled, opened, closed, reopened, or synchronized.
 class PullRequestEvent
        super GithubEvent
+       serialize
 
        # The pull request number.
-       fun number: Int do return json["number"].as(Int)
-
-       # Set number.
-       fun number=(number: Int) do json["number"] = number
+       var number: Int is writable
 
        # The `PullRequest` itself.
-       fun pull: PullRequest do
-               return new PullRequest.from_json(api, repo, json["pull_request"].as(JsonObject))
-       end
-
-       # Set pull.
-       fun pull=(pull: PullRequest) do json["pull_request"] = pull.json
+       var pull: PullRequest is writable
 end
 
 # Triggered when a comment is created on a pull request diff.
-class PullRequestReviewCommentEvent
+class PullRequestPullCommentEvent
        super GithubEvent
+       serialize
 
        # The `Comment` itself.
-       fun comment: ReviewComment do
-               return new ReviewComment.from_json(api, repo, json["comment"].as(JsonObject))
-       end
-
-       # Set comment.
-       fun comment=(comment: ReviewComment) do json["comment"] = comment.json
+       var comment: PullComment is writable
 
        # `PullRequest` the `comment` belongs to.
-       fun pull: PullRequest do
-               return new PullRequest.from_json(api, repo, json["pull_request"].as(JsonObject))
-       end
-
-       # Set pull.
-       fun pull=(pull: PullRequest) do json["pull_request"] = pull.json
+       var pull: PullRequest is writable
 end
 
 # Triggered when a repository branch is pushed to.
 class PushEvent
        super GithubEvent
+       serialize
 
        # SHA of the HEAD commit on the repository.
-       fun head: String do return json["head"].as(String)
-
-       # Set head.
-       fun head=(head: String) do json["head"] = head
+       var head_commit: Commit is writable
 
        # Full Git ref that was pushed.
        #
        # Example: “refs/heads/master”
-       fun ref: String do return json["ref"].as(String)
-
-       # Set ref.
-       fun ref=(ref: String) do json["ref"] = ref
+       var ref: String is writable
 
        # Number of commits in the push.
-       fun size: Int do return json["size"].as(Int)
-
-       # Set size.
-       fun size=(size: Int) do json["size"] = size
+       var size: nullable Int is writable
 
        # 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"].as(String)).as(not null)
-               end
-               return res
-       end
-
-       # Set commits.
-       fun commits=(commits: Array[Commit]) do
-               var arr = new JsonArray
-               for commit in commits do arr.add commit.json
-               json["commits"] = arr
-       end
+       var commits = new Array[Commit] is writable, optional
 end
 
 # Triggered when the status of a Git commit changes.
 class StatusEvent
        super GithubEvent
+       serialize
 
        # The `Commit` itself.
-       fun commit: Commit do
-               return api.load_commit(repo, json["sha"].as(String)).as(not null)
-       end
-
-       # Set commit.
-       fun commit=(commit: Commit) do json["sha"] = commit.sha
+       var sha: String is writable
 
        # New state.
        #
        # Can be `pending`, `success`, `failure`, or `error`.
-       fun state: String do return json["state"].as(String)
-
-       # Set state.
-       fun state=(state: String) do json["state"] = state
+       var state: String is writable
 
        # Optional human-readable description added to the status.
-       fun description: nullable String do
-               var res = json.get_or_null("description")
-               if res isa String then return res else return null
-       end
-
-       # Set description.
-       fun description=(description: nullable String) do json["description"] = description
+       var description: nullable String is writable
 
        # Optional link added to the status.
-       fun target_url: nullable String do
-               var res = json.get_or_null("target_url")
-               if res isa String then return res else return null
-       end
-
-       # Set target_url.
-       fun target_url=(target_url: nullable String) do json["target_url"] = target_url
+       var target_url: nullable String is writable
 
        # Array of branches containing the status' SHA.
        #
@@ -414,20 +241,41 @@ class StatusEvent
        # 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"].as(String)).as(not null)
-               end
-               return res
-       end
+       var branches = new Array[Branch] is writable, optional
+end
 
-       # Set branches.
-       fun branches=(branches: Array[Commit]) do
-               var arr = new JsonArray
-               for branch in branches do arr.add branch.json
-               json["branches"] = arr
+redef class GithubDeserializer
+
+       redef fun class_name_heuristic(json_object) do
+               if json_object.has_key("action") and json_object.has_key("commit") and json_object.has_key("comment") then
+                       return "CommitCommentEvent"
+               else if json_object.has_key("ref") and json_object.has_key("master_branch") then
+                       return "CreateEvent"
+               else if json_object.has_key("ref") and json_object.has_key("ref_type") then
+                       return "DeleteEvent"
+               else if json_object.has_key("action") and json_object.has_key("sha") then
+                       return "DeploymentEvent"
+               else if json_object.has_key("action") and json_object.has_key("state") then
+                       return "DeploymentStatusEvent"
+               else if json_object.has_key("action") and json_object.has_key("forkee") then
+                       return "ForkEvent"
+               else if json_object.has_key("action") and json_object.has_key("issue") and json_object.has_key("comment") then
+                       return "IssueCommentEvent"
+               else if json_object.has_key("action") and json_object.has_key("issue") then
+                       return "IssuesEvent"
+               else if json_object.has_key("action") and json_object.has_key("member") then
+                       return "MemberEvent"
+               else if json_object.has_key("action") and json_object.has_key("number") then
+                       return "PullRequestEvent"
+               else if json_object.has_key("action") and json_object.has_key("pull") and json_object.has_key("comment") then
+                       return "PullRequestPullCommentEvent"
+               else if json_object.has_key("head_commit") and json_object.has_key("commits") then
+                       return "PushEvent"
+               else if json_object.has_key("action") and json_object.has_key("branches") then
+                       return "StatusEvent"
+               else if json_object.has_key("action") and json_object.has_key("issue") then
+                       return "GithubEvent"
+               end
+               return super
        end
 end