contrib/nitrpg: nitrpg use github serialization
authorAlexandre Terrasa <alexandre@moz-code.org>
Mon, 15 Aug 2016 04:22:58 +0000 (00:22 -0400)
committerAlexandre Terrasa <alexandre@moz-code.org>
Mon, 15 Aug 2016 04:22:58 +0000 (00:22 -0400)
Signed-off-by: Alexandre Terrasa <alexandre@moz-code.org>

contrib/nitrpg/src/achievements.nit
contrib/nitrpg/src/events_generator.nit
contrib/nitrpg/src/reactors.nit
contrib/nitrpg/src/templates/panels.nit
contrib/nitrpg/src/templates/templates_base.nit
contrib/nitrpg/src/templates/templates_events.nit
contrib/nitrpg/src/test_listener.nit

index 24fac20..9055b22 100644 (file)
@@ -156,7 +156,7 @@ redef class Player
                obj["player"] = name
                obj["reward"] = achievement.reward
                obj["achievement"] = achievement.id
-               obj["github_event"] = event.json
+               obj["github_event"] = event
                var ge = new GameEvent(game, "achievement_unlocked", obj)
                add_event(ge)
                game.add_event(ge)
index cc8b6a4..9e5bf30 100644 (file)
@@ -29,66 +29,65 @@ class EventsGenerator
        # API client used to get github data.
        var api: GithubAPI
 
+       # Gen a fake id for events
+       fun gen_event_id: String do return get_time.to_s
+
        # Issues
 
        # Generate a new IssuesEvent from an issue.
-       fun issues_event(action: String, issue: Issue): IssuesEvent do
-               var e = new IssuesEvent(api)
-               e.action = action
-               e.repo = issue.repo
-               e.issue = issue
-               return e
+       fun issues_event(repo: Repo, action: String, issue: Issue): IssuesEvent do
+               return new IssuesEvent(gen_event_id, action, repo, issue)
        end
 
        # Generate a new IssuesEvent with an `opened` action.
-       fun issue_open(issue: Issue): IssuesEvent do return issues_event("opened", issue)
+       fun issue_open(repo: Repo, issue: Issue): IssuesEvent do
+               return issues_event(repo, "opened", issue)
+       end
 
        # Generate a new IssuesEvent with an `closed` action.
-       fun issue_close(issue: Issue): IssuesEvent do return issues_event("closed", issue)
+       fun issue_close(repo: Repo, issue: Issue): IssuesEvent do
+               return issues_event(repo, "closed", issue)
+       end
 
        # Generate a new IssuesEvent with an `reopened` action.
-       fun issue_reopen(issue: Issue): IssuesEvent do return issues_event("reopened", issue)
+       fun issue_reopen(repo: Repo, issue: Issue): IssuesEvent do
+               return issues_event(repo, "reopened", issue)
+       end
 
        # Generate a new IssuesEvent from a IssueEvent.
-       fun issue_raw_event(issue: Issue, event: IssueEvent): IssuesEvent do
-               var e = issues_event(event.event, issue)
-               e.lbl = event.labl
-               e.assignee = event.assignee
-               return e
+       fun issue_raw_event(repo: Repo, issue: Issue, event: IssueEvent): IssuesEvent do
+               return new IssuesEvent(event.id.to_s, event.event, repo, issue, event.labl, event.assignee)
+       end
+
+       # Generate a new IssueCommentEvent from a IssueComment.
+       fun issue_comment_event(repo: Repo, issue: Issue, comment: IssueComment): IssueCommentEvent do
+               return new IssueCommentEvent(gen_event_id, "created", repo, issue, comment)
        end
 
        # Pull requests
 
        # Generate a new PullRequestEvent from a `pull` request.
-       fun pull_event(action: String, pull: PullRequest): PullRequestEvent do
-               var e = new PullRequestEvent(api)
-               e.action = action
-               e.repo = pull.repo
-               e.pull = pull
-               return e
+       fun pull_event(repo: Repo, action: String, pull: PullRequest): PullRequestEvent do
+               return new PullRequestEvent(gen_event_id, action, repo, pull.number, pull)
        end
 
        # Generate a new PullRequestEvent with an `opened` action.
-       fun pull_open(pull: PullRequest): PullRequestEvent do return pull_event("opened", pull)
+       fun pull_open(repo: Repo, pull: PullRequest): PullRequestEvent do
+               return pull_event(repo, "opened", pull)
+       end
 
        # Generate a new PullRequestEvent with an `closed` action.
-       fun pull_close(pull: PullRequest): PullRequestEvent do return pull_event("closed", pull)
+       fun pull_close(repo: Repo, pull: PullRequest): PullRequestEvent do
+               return pull_event(repo, "closed", pull)
+       end
 
        # Generate a new PullRequestEvent with an `reopened` action.
-       fun pull_reopen(pull: PullRequest): PullRequestEvent do return pull_event("reopened", pull)
-
-       # Generate a new PullRequestEvent from a IssueEvent.
-       fun pull_raw_event(pull: PullRequest, event: IssueEvent): PullRequestEvent do
-               return pull_event(event.event, pull)
+       fun pull_reopen(repo: Repo, pull: PullRequest): PullRequestEvent do
+               return pull_event(repo, "reopened", pull)
        end
 
-       # Generate a new IssueCommentEvent from a IssueComment.
-       fun issue_comment_event(issue: Issue, comment: IssueComment): IssueCommentEvent do
-               var e = new IssueCommentEvent(api)
-               e.action = "created"
-               e.repo = issue.repo
-               e.issue = issue
-               e.comment = comment
-               return e
+       # Generate a new PullRequestEvent from a IssueEvent.
+       fun pull_raw_event(repo: Repo, pull: PullRequest, event: IssueEvent): PullRequestEvent do
+               return new PullRequestEvent(event.id.to_s, event.event, repo, pull.number, pull)
        end
 end
index e2717f4..616bd8a 100644 (file)
@@ -47,7 +47,7 @@ redef class GithubEvent
                var obj = new JsonObject
                obj["player"] = player.name
                obj["reward"] = reward
-               obj["github_event"] = json
+               obj["github_event"] = self
                var event = new GameEvent(player.game, kind, obj)
                player.game.add_event(event)
                return event
index 6d5e339..8f27a5f 100644 (file)
@@ -217,7 +217,7 @@ class PlayerStatusPanel
        redef fun render_title do
                add "<a href=\"{player.url}\">"
                add " <img class=\"img-circle\" style=\"width: 30px\""
-               add "   src=\"{player.user.avatar_url}\" alt=\"{player.name}\">"
+               add "   src=\"{player.user.avatar_url or else "#"}\" alt=\"{player.name}\">"
                add "</a>&nbsp;&nbsp;{player.link}"
        end
 
@@ -333,7 +333,7 @@ class PodiumPanel
                                        <p>
                                                <a href="{{{player.url}}}">
                                                        <img class="img-circle" style="width: 80px"
-                                                               src="{{{player.user.avatar_url}}}" alt="{{{player.name}}}">
+                                                               src="{{{player.user.avatar_url or else "#"}}}" alt="{{{player.name}}}">
                                                </a>
                                        </p>
                                        <p>{{{player.link}}}</p>
@@ -371,10 +371,8 @@ class PlayerReviewsPanel
                        "-involves:{player.name}"
 
                var issues = new ArraySet[Issue]
-               var rq = game.repo.search_issues(q)
-               if rq != null then issues.add_all rq
-               var rq2 = game.repo.search_issues(q2)
-               if rq2 != null then issues.add_all rq2
+               issues.add_all game.api.search_repo_issues(game.repo, q)
+               issues.add_all game.api.search_repo_issues(game.repo, q2)
                if issues.is_empty then
                        add "<em>No pull request or issue to review yet...</em>"
                        return
@@ -385,7 +383,7 @@ class PlayerReviewsPanel
                        add """<div class="media">
                                <a class="media-left" href="{{{uplay.url}}}">
                                         <img class=\"img-circle\" style="width:50px"
-                                          src="{{{user.avatar_url}}}" alt="{{{uplay.name}}}">
+                                                src="{{{user.avatar_url or else "#"}}}" alt="{{{uplay.name}}}">
                                        </a>
                                        <div class="media-body">
                                         <h4 class="media-heading">
@@ -419,10 +417,8 @@ class PlayerWorkPanel
                var q2 = "is:open sort:updated-asc assignee:{player.name}"
 
                var issues = new ArraySet[Issue]
-               var rq = game.repo.search_issues(q)
-               if rq != null then issues.add_all rq
-               var rq2 = game.repo.search_issues(q2)
-               if rq2 != null then issues.add_all rq2
+               issues.add_all game.api.search_repo_issues(game.repo, q)
+               issues.add_all game.api.search_repo_issues(game.repo, q2)
                if issues.is_empty then
                        add "<em>No work to do yet...</em>"
                        return
@@ -433,7 +429,7 @@ class PlayerWorkPanel
                        add """<div class="media">
                                <a class="media-left" href="{{{uplay.url}}}">
                                         <img class=\"img-circle\" style="width:50px"
-                                          src="{{{user.avatar_url}}}" alt="{{{uplay.name}}}">
+                                                src="{{{user.avatar_url or else "#"}}}" alt="{{{uplay.name}}}">
                                        </a>
                                        <div class="media-body">
                                         <h4 class="media-heading">
@@ -557,7 +553,7 @@ class AchievementPanel
                        <a class="media-left" href="{{{player.url}}}">
                                 <span class="badge progress-bar-warning" style="position: absolute">#1</span>
                         <img class=\"img-circle\" style="width:50px"
-                         src="{{{player.user.avatar_url}}}" alt="{{{player.name}}}">
+                                        src="{{{player.user.avatar_url or else "#"}}}" alt="{{{player.name}}}">
                        </a>
                                <div class="media-body">
                                 <h4 class="media-heading">Unlocked first by {{{player.link}}}</h4>
index 470160b..fe9efd8 100644 (file)
@@ -48,13 +48,14 @@ end
 
 redef class Issue
        # Return a HTML link to this Issue.
-       fun link: String do return "<a href=\"{html_url}\">#{number}</a>"
+       fun link: String do return "<a href=\"{html_url or else "#"}\">#{number}</a>"
 end
 
 redef class Achievement
        # Return a HTML link to this Issue.
        fun link: String do return "<a href=\"{url}\">{name}</a>"
 
+       # Render self as a media item.
        fun list_item: String do
                return """<div class="media">
                               <div class="media-left" style="width: 50px">
index 234c9e5..3e141b9 100644 (file)
@@ -55,14 +55,12 @@ class TplEvent
 
        # Load `github_event` data key as a PullRequestEvent.
        var pull_event: PullRequestEvent is lazy do
-               var obj = event.data["github_event"].as(JsonObject)
-               return new PullRequestEvent.from_json(event.game.api, obj)
+               return event.game.api.deserialize(event.data["github_event"].as(JsonObject).to_json).as(PullRequestEvent)
        end
 
        # Load `github_event` data key as a IssueCommentEvent.
        var issue_comment_event: IssueCommentEvent is lazy do
-               var obj = event.data["github_event"].as(JsonObject)
-               return new IssueCommentEvent.from_json(event.game.api, obj)
+               return event.game.api.deserialize(event.data["github_event"].as(JsonObject).to_json).as(IssueCommentEvent)
        end
 
        # Load `achievement` data key as an Achievement.
@@ -77,7 +75,7 @@ class TplEvent
                                 <span class="badge progress-bar-success"
                                  style=\"position: absolute\">+{{{reward}}}</span>
                                 <img class=\"img-circle\" style="width:50px"
-                                  src="{{{player.user.avatar_url}}}" alt="{{{player.name}}}">
+                                src="{{{player.user.avatar_url or else "#"}}}" alt="{{{player.name}}}">
                                </a>
                                <div class="media-body">
                                 <h4 class="media-heading">{{{title}}}</h4>
index ee6d13b..9cfa059 100644 (file)
@@ -52,15 +52,15 @@ class TestListener
                var issue = api.load_issue(repo, 322)
                assert issue != null
 
-               l.apply_event(generator.issue_open(issue), db)
+               l.apply_event(generator.issue_open(repo, issue), db)
                var game = load_game("Morriar/nit", db)
                assert game.stats.overall["issues"] == 1
                assert game.stats.overall["issues_open"] == 1
-               l.apply_event(generator.issue_close(issue), db)
+               l.apply_event(generator.issue_close(repo, issue), db)
                game = load_game("Morriar/nit", db)
                assert game.stats.overall["issues"] == 1
                assert game.stats.overall["issues_open"] == 0
-               l.apply_event(generator.issue_reopen(issue), db)
+               l.apply_event(generator.issue_reopen(repo, issue), db)
                game = load_game("Morriar/nit", db)
                assert game.stats.overall["issues"] == 1
                assert game.stats.overall["issues_open"] == 1
@@ -75,15 +75,15 @@ class TestListener
                var issue = api.load_issue(repo, 322)
                assert issue != null
 
-               l.apply_event(generator.issue_open(issue), db)
+               l.apply_event(generator.issue_open(repo, issue), db)
                var player = new Player(game, "Morriar")
                assert player.stats.overall["issues"] == 1
                assert player.stats.overall["issues_open"] == 1
-               l.apply_event(generator.issue_close(issue), db)
+               l.apply_event(generator.issue_close(repo, issue), db)
                player = new Player(game, "Morriar")
                assert player.stats.overall["issues"] == 1
                assert player.stats.overall["issues_open"] == 0
-               l.apply_event(generator.issue_reopen(issue), db)
+               l.apply_event(generator.issue_reopen(repo, issue), db)
                player = new Player(game, "Morriar")
                assert player.stats.overall["issues"] == 1
                assert player.stats.overall["issues_open"] == 1
@@ -97,24 +97,24 @@ class TestListener
                var pr = api.load_pull(repo, 275)
                assert pr != null
 
-               l.apply_event(generator.pull_open(pr), db)
+               l.apply_event(generator.pull_open(repo, pr), db)
                var game = load_game("Morriar/nit", db)
                assert game.stats.overall["pulls"] == 1
                assert game.stats.overall["pulls_open"] == 1
                assert game.stats.overall["commits"] == 0
                pr.merged = false
-               l.apply_event(generator.pull_close(pr), db)
+               l.apply_event(generator.pull_close(repo, pr), db)
                game = load_game("Morriar/nit", db)
                assert game.stats.overall["pulls"] == 1
                assert game.stats.overall["pulls_open"] == 0
                assert game.stats.overall["commits"] == 0
-               l.apply_event(generator.pull_reopen(pr), db)
+               l.apply_event(generator.pull_reopen(repo, pr), db)
                game = load_game("Morriar/nit", db)
                assert game.stats.overall["pulls"] == 1
                assert game.stats.overall["pulls_open"] == 1
                assert game.stats.overall["commits"] == 0
                pr.merged = true
-               l.apply_event(generator.pull_close(pr), db)
+               l.apply_event(generator.pull_close(repo, pr), db)
                game = load_game("Morriar/nit", db)
                assert game.stats.overall["pulls"] == 1
                assert game.stats.overall["pulls_open"] == 0
@@ -132,12 +132,12 @@ class TestListener
                assert comment != null
 
                comment.body = "foo bar"
-               l.apply_event(generator.issue_comment_event(issue, comment), db)
+               l.apply_event(generator.issue_comment_event(repo, issue, comment), db)
                var game = load_game("Morriar/nit", db)
                assert game.stats.overall["comments"] == 1
                assert game.stats.overall["reviews"] == 0
                comment.body = "foo +1 bar"
-               l.apply_event(generator.issue_comment_event(issue, comment), db)
+               l.apply_event(generator.issue_comment_event(repo, issue, comment), db)
                game = load_game("Morriar/nit", db)
                assert game.stats.overall["comments"] == 2
                assert game.stats.overall["reviews"] == 1
@@ -152,18 +152,18 @@ class TestListener
                var pull = api.load_pull(repo, 275)
                assert pull != null
 
-               l.apply_event(generator.pull_open(pull), db)
+               l.apply_event(generator.pull_open(repo, pull), db)
                var player = new Player(game, "itch76")
                assert player.stats.overall["nitcoins"] == 10
                pull.merged = false
-               l.apply_event(generator.pull_close(pull), db)
+               l.apply_event(generator.pull_close(repo, pull), db)
                player = new Player(game, "itch76")
                assert player.stats.overall["nitcoins"] == 0
-               l.apply_event(generator.pull_reopen(pull), db)
+               l.apply_event(generator.pull_reopen(repo, pull), db)
                player = new Player(game, "itch76")
                assert player.stats.overall["nitcoins"] == 10
                pull.merged = true
-               l.apply_event(generator.pull_close(pull), db)
+               l.apply_event(generator.pull_close(repo, pull), db)
                player = new Player(game, "itch76")
                assert player.stats.overall["nitcoins"] == 12
        end
@@ -184,14 +184,14 @@ class TestListener
                # no review in opened issue
                pull.state = "open"
                comment.body = "foo bar"
-               l.apply_event(generator.issue_comment_event(pull, comment), db)
+               l.apply_event(generator.issue_comment_event(repo, pull, comment), db)
                var player = new Player(game, "Morriar")
                assert player.stats.overall["nitcoins"] == 0
 
                # review in opened issue
                pull.state = "open"
                comment.body = "foo +1 bar"
-               l.apply_event(generator.issue_comment_event(pull, comment), db)
+               l.apply_event(generator.issue_comment_event(repo, pull, comment), db)
                player = new Player(game, "Morriar")
                print player.stats.overall["nitcoins"]
                assert player.stats.overall["nitcoins"] == 2
@@ -199,14 +199,14 @@ class TestListener
                # review in closed issue
                pull.state = "closed"
                comment.body = "foo +1 bar"
-               l.apply_event(generator.issue_comment_event(pull, comment), db)
+               l.apply_event(generator.issue_comment_event(repo, pull, comment), db)
                player = new Player(game, "Morriar")
                assert player.stats.overall["nitcoins"] == 2
 
                # review in reopened issue
                pull.state = "open"
                comment.body = "foo +1 bar"
-               l.apply_event(generator.issue_comment_event(pull, comment), db)
+               l.apply_event(generator.issue_comment_event(repo, pull, comment), db)
                player = new Player(game, "Morriar")
                assert player.stats.overall["nitcoins"] == 4
        end
@@ -227,7 +227,7 @@ class TestListener
                        var player = new Player(game, "Morriar")
                        player.stats["issues"] = i
                        player.save
-                       l.apply_event(generator.issue_open(issue), db)
+                       l.apply_event(generator.issue_open(repo, issue), db)
                        assert player.load_achievements.has_key(id)
                end
                var player = new Player(game, "Morriar")
@@ -250,7 +250,7 @@ class TestListener
                        var player = new Player(game, "itch76")
                        player.stats["pulls"] = i
                        player.save
-                       l.apply_event(generator.pull_open(pull), db)
+                       l.apply_event(generator.pull_open(repo, pull), db)
                        assert player.load_achievements.has_key(id)
                end
                var player = new Player(game, "itch76")
@@ -276,7 +276,7 @@ class TestListener
                        var player = new Player(game, "itch76")
                        player.stats["commits"] = i
                        player.save
-                       l.apply_event(generator.pull_close(pull), db)
+                       l.apply_event(generator.pull_close(repo, pull), db)
                        assert player.load_achievements.has_key(id)
                end
                var player = new Player(game, "itch76")
@@ -301,7 +301,7 @@ class TestListener
                        var player = new Player(game, "Morriar")
                        player.stats["comments"] = i
                        player.save
-                       l.apply_event(generator.issue_comment_event(pull, comment), db)
+                       l.apply_event(generator.issue_comment_event(repo, pull, comment), db)
                        assert player.load_achievements.has_key(id)
                end
                var player = new Player(game, "Morriar")
@@ -318,7 +318,7 @@ class TestListener
                assert issue != null
 
                issue.title = "nitdoc ffi"
-               l.apply_event(generator.issue_open(issue), db)
+               l.apply_event(generator.issue_open(repo, issue), db)
                var player = new Player(game, "Morriar")
                assert player.load_achievements.has_key("issue_about_nitdoc")
                assert player.load_achievements.has_key("issue_about_ffi")
@@ -337,19 +337,19 @@ class TestListener
                assert comment != null
 
                comment.body = "@{game.repo.owner.login}"
-               l.apply_event(generator.issue_comment_event(pull, comment), db)
+               l.apply_event(generator.issue_comment_event(repo, pull, comment), db)
                var player = new Player(game, "Morriar")
                assert player.load_achievements.has_key("player_ping_god")
                assert player.stats.overall["nitcoins"] == 50
 
                comment.body = "+1"
-               l.apply_event(generator.issue_comment_event(pull, comment), db)
+               l.apply_event(generator.issue_comment_event(repo, pull, comment), db)
                player = new Player(game, "Morriar")
                assert player.load_achievements.has_key("player_first_review")
                assert player.stats.overall["nitcoins"] == 60
 
                comment.body = "Nitcoins"
-               l.apply_event(generator.issue_comment_event(pull, comment), db)
+               l.apply_event(generator.issue_comment_event(repo, pull, comment), db)
                player = new Player(game, "Morriar")
                assert player.load_achievements.has_key("player_says_nitcoin")
                assert player.stats.overall["nitcoins"] == 70