{"action":"created","comment":{"url":"https://api.github.com/repos/SpineEventEngine/todo-list/pulls/comments/94756149","pull_request_review_id":15291284,"id":94756149,"diff_hunk":"@@ -0,0 +1,445 @@\n+/*\n+ * Copyright 2016, TeamDev Ltd. All rights reserved.\n+ *\n+ * Redistribution and use in source and/or binary forms, with or without\n+ * modification, must retain the above copyright notice and the following\n+ * disclaimer.\n+ *\n+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n+ * \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n+ */\n+\n+package org.spine3.examples.todolist.aggregate;\n+\n+import com.google.protobuf.Message;\n+import com.google.protobuf.Timestamp;\n+import org.spine3.examples.todolist.AssignLabelToTask;\n+import org.spine3.examples.todolist.CompleteTask;\n+import org.spine3.examples.todolist.CreateBasicTask;\n+import org.spine3.examples.todolist.CreateDraft;\n+import org.spine3.examples.todolist.DeleteTask;\n+import org.spine3.examples.todolist.DeletedTaskRestored;\n+import org.spine3.examples.todolist.FinalizeDraft;\n+import org.spine3.examples.todolist.LabelAssignedToTask;\n+import org.spine3.examples.todolist.LabelRemovedFromTask;\n+import org.spine3.examples.todolist.LabelledTaskCompleted;\n+import org.spine3.examples.todolist.LabelledTaskDeleted;\n+import org.spine3.examples.todolist.LabelledTaskDescriptionUpdated;\n+import org.spine3.examples.todolist.LabelledTaskDueDateUpdated;\n+import org.spine3.examples.todolist.LabelledTaskPriorityUpdated;\n+import org.spine3.examples.todolist.LabelledTaskReopened;\n+import org.spine3.examples.todolist.LabelledTaskRestored;\n+import org.spine3.examples.todolist.RemoveLabelFromTask;\n+import org.spine3.examples.todolist.ReopenTask;\n+import org.spine3.examples.todolist.RestoreDeletedTask;\n+import org.spine3.examples.todolist.Task;\n+import org.spine3.examples.todolist.TaskCompleted;\n+import org.spine3.examples.todolist.TaskCreated;\n+import org.spine3.examples.todolist.TaskDeleted;\n+import org.spine3.examples.todolist.TaskDescriptionUpdated;\n+import org.spine3.examples.todolist.TaskDetails;\n+import org.spine3.examples.todolist.TaskDraftCreated;\n+import org.spine3.examples.todolist.TaskDraftFinalized;\n+import org.spine3.examples.todolist.TaskDueDateUpdated;\n+import org.spine3.examples.todolist.TaskId;\n+import org.spine3.examples.todolist.TaskLabelId;\n+import org.spine3.examples.todolist.TaskPriority;\n+import org.spine3.examples.todolist.TaskPriorityUpdated;\n+import org.spine3.examples.todolist.TaskReopened;\n+import org.spine3.examples.todolist.TaskStatus;\n+import org.spine3.examples.todolist.UpdateTaskDescription;\n+import org.spine3.examples.todolist.UpdateTaskDueDate;\n+import org.spine3.examples.todolist.UpdateTaskPriority;\n+import org.spine3.protobuf.Timestamps;\n+import org.spine3.server.aggregate.Aggregate;\n+import org.spine3.server.aggregate.Apply;\n+import org.spine3.server.command.Assign;\n+\n+import java.util.Collections;\n+import java.util.List;\n+import java.util.stream.Collectors;\n+\n+import static com.google.common.base.Preconditions.checkNotNull;\n+import static com.google.common.collect.Lists.newLinkedList;\n+import static org.spine3.examples.todolist.aggregate.TaskFlowValidator.ensureNeitherCompletedNorDeleted;\n+import static org.spine3.examples.todolist.aggregate.TaskFlowValidator.validateAssignLabelToTaskCommand;\n+import static org.spine3.examples.todolist.aggregate.TaskFlowValidator.validateCreateDraftCommand;\n+import static org.spine3.examples.todolist.aggregate.TaskFlowValidator.validateRemoveLabelFromTaskCommand;\n+import static org.spine3.examples.todolist.aggregate.TaskFlowValidator.validateTransition;\n+import static org.spine3.examples.todolist.aggregate.TaskFlowValidator.validateUpdateTaskDueDateCommand;\n+import static org.spine3.examples.todolist.aggregate.TaskFlowValidator.validateUpdateTaskPriorityCommand;\n+\n+/**\n+ * The aggregate managing the state of a {@link Task}.\n+ *\n+ * @author Illia Shepilov\n+ */\n+public class TaskAggregate extends Aggregate<TaskId, Task, Task.Builder> {\n+\n+    private static final int MIN_DESCRIPTION_LENGTH = 3;\n+    private static final String SHORT_DESCRIPTION_EXCEPTION_MESSAGE =\n+            \"Description should contain at least 3 alphanumeric symbols.\";\n+    private static final String NULL_DESCRIPTION_EXCEPTION_MESSAGE = \"Description cannot be null.\";\n+\n+    /**\n+     * Creates a new aggregate instance.\n+     *\n+     * @param id the ID for the new aggregate.\n+     * @throws IllegalArgumentException if the ID is not of one of the supported types.\n+     */\n+    public TaskAggregate(TaskId id) {\n+        super(id);\n+    }\n+\n+    @Assign\n+    public List<? extends Message> handle(CreateBasicTask cmd) {\n+        validateCommand(cmd);\n+        final TaskDetails.Builder taskDetails = TaskDetails.newBuilder()\n+                                                           .setDescription(cmd.getDescription());\n+        final TaskCreated result = TaskCreated.newBuilder()\n+                                              .setId(cmd.getId())\n+                                              .setDetails(taskDetails)\n+                                              .build();\n+        return Collections.singletonList(result);\n+    }\n+\n+    @Assign\n+    public List<? extends Message> handle(UpdateTaskDescription cmd) {\n+        validateCommand(cmd);\n+        final Task state = getState();\n+        final String previousDescription = state.getDescription();\n+        final TaskDescriptionUpdated taskUpdated = TaskDescriptionUpdated.newBuilder()\n+                                                                         .setId(cmd.getId())\n+                                                                         .setPreviousDescription(previousDescription)\n+                                                                         .setNewDescription(cmd.getUpdatedDescription())\n+                                                                         .build();\n+        final List<Message> result = newLinkedList();\n+        result.add(taskUpdated);\n+        for (TaskLabelId labelId : state.getLabelIdsList()) {\n+            final LabelledTaskDescriptionUpdated labelledTaskUpdated =\n+                    LabelledTaskDescriptionUpdated.newBuilder()\n+                                                  .setTaskId(cmd.getId())\n+                                                  .setLabelId(labelId)\n+                                                  .setPreviousDescription(previousDescription)\n+                                                  .setNewDescription(cmd.getUpdatedDescription())\n+                                                  .build();\n+            result.add(labelledTaskUpdated);\n+        }\n+        return result;\n+    }\n+\n+    @Assign\n+    public List<? extends Message> handle(UpdateTaskDueDate cmd) {\n+        final Task state = getState();\n+        validateUpdateTaskDueDateCommand(getState().getTaskStatus());\n+        final Timestamp previousDueDate = getState().getDueDate();\n+        final TaskDueDateUpdated taskUpdated = TaskDueDateUpdated.newBuilder()\n+                                                                 .setId(cmd.getId())\n+                                                                 .setPreviousDueDate(previousDueDate)\n+                                                                 .setNewDueDate(cmd.getUpdatedDueDate())\n+                                                                 .build();\n+        final List<Message> result = newLinkedList();\n+        result.add(taskUpdated);\n+\n+        for (TaskLabelId labelId : getState().getLabelIdsList()) {\n+            final LabelledTaskDueDateUpdated labelledTaskUpdated =\n+                    LabelledTaskDueDateUpdated.newBuilder()\n+                                              .setTaskId(cmd.getId())\n+                                              .setLabelId(labelId)\n+                                              .setPreviousDueDate(state.getDueDate())\n+                                              .setNewDueDate(cmd.getUpdatedDueDate())\n+                                              .build();\n+            result.add(labelledTaskUpdated);\n+        }\n+        return result;\n+    }\n+\n+    @Assign\n+    public List<? extends Message> handle(UpdateTaskPriority cmd) {\n+        final Task state = getState();\n+        validateUpdateTaskPriorityCommand(state.getTaskStatus());\n+        final TaskPriority previousPriority = state.getPriority();\n+        final TaskPriorityUpdated taskPriorityUpdated = TaskPriorityUpdated.newBuilder()\n+                                                                           .setId(cmd.getId())\n+                                                                           .setPreviousPriority(previousPriority)\n+                                                                           .setNewPriority(cmd.getUpdatedPriority())\n+                                                                           .build();\n+        final List<Message> result = newLinkedList();\n+        result.add(taskPriorityUpdated);\n+\n+        for (TaskLabelId labelId : state.getLabelIdsList()) {\n+            final LabelledTaskPriorityUpdated labelledTaskUpdated =\n+                    LabelledTaskPriorityUpdated.newBuilder()\n+                                               .setTaskId(cmd.getId())\n+                                               .setLabelId(labelId)\n+                                               .setPreviousPriority(previousPriority)\n+                                               .setNewPriority(cmd.getUpdatedPriority())\n+                                               .build();\n+            result.add(labelledTaskUpdated);\n+        }\n+        return result;\n+    }\n+\n+    @Assign\n+    public List<? extends Message> handle(ReopenTask cmd) {\n+        final Task state = getState();\n+        validateTransition(state.getTaskStatus(), TaskStatus.OPEN);\n+        final TaskReopened taskReopened = TaskReopened.newBuilder()\n+                                                      .setId(cmd.getId())\n+                                                      .build();\n+        final List<Message> result = newLinkedList();\n+        result.add(taskReopened);\n+\n+        for (TaskLabelId labelId : state.getLabelIdsList()) {\n+            final LabelledTaskReopened labelledTaskReopened = LabelledTaskReopened.newBuilder()\n+                                                                                  .setTaskId(cmd.getId())\n+                                                                                  .setLabelId(labelId)\n+                                                                                  .build();\n+            result.add(labelledTaskReopened);\n+        }\n+        return result;\n+    }\n+\n+    @Assign\n+    public List<? extends Message> handle(DeleteTask cmd) {\n+        final Task state = getState();\n+        validateTransition(state.getTaskStatus(), TaskStatus.DELETED);\n+        final TaskDeleted taskDeleted = TaskDeleted.newBuilder()\n+                                                   .setId(cmd.getId())\n+                                                   .build();\n+        final List<Message> result = newLinkedList();\n+        result.add(taskDeleted);\n+        for (TaskLabelId labelId : state.getLabelIdsList()) {\n+            final LabelledTaskDeleted labelledTaskDeleted = LabelledTaskDeleted.newBuilder()\n+                                                                               .setTaskId(cmd.getId())\n+                                                                               .setLabelId(labelId)\n+                                                                               .build();\n+            result.add(labelledTaskDeleted);\n+        }\n+        return result;\n+    }\n+\n+    @Assign\n+    public List<? extends Message> handle(RestoreDeletedTask cmd) {\n+        final Task state = getState();\n+        validateTransition(state.getTaskStatus(), TaskStatus.OPEN);\n+        final DeletedTaskRestored deletedTaskRestored = DeletedTaskRestored.newBuilder()\n+                                                                           .setId(cmd.getId())\n+                                                                           .build();\n+        final List<Message> result = newLinkedList();\n+        result.add(deletedTaskRestored);\n+        for (TaskLabelId labelId : state.getLabelIdsList()) {\n+            final LabelledTaskRestored labelledTaskRestored = LabelledTaskRestored.newBuilder()\n+                                                                                  .setTaskId(cmd.getId())\n+                                                                                  .setLabelId(labelId)\n+                                                                                  .build();\n+            result.add(labelledTaskRestored);\n+        }\n+        return result;\n+    }\n+\n+    @Assign\n+    public List<? extends Message> handle(CompleteTask cmd) {\n+        final Task state = getState();\n+        validateTransition(state.getTaskStatus(), TaskStatus.COMPLETED);\n+        final TaskCompleted taskCompleted = TaskCompleted.newBuilder()\n+                                                         .setId(cmd.getId())\n+                                                         .build();\n+        final List<Message> result = newLinkedList();\n+        result.add(taskCompleted);\n+        for (TaskLabelId labelId : state.getLabelIdsList()) {\n+            final LabelledTaskCompleted labelledTaskCompleted = LabelledTaskCompleted.newBuilder()\n+                                                                                     .setTaskId(cmd.getId())\n+                                                                                     .setLabelId(labelId)\n+                                                                                     .build();\n+            result.add(labelledTaskCompleted);\n+        }\n+        return result;\n+    }\n+\n+    @Assign\n+    public List<? extends Message> handle(FinalizeDraft cmd) {\n+        validateTransition(getState().getTaskStatus(), TaskStatus.FINALIZED);\n+        final TaskDraftFinalized result = TaskDraftFinalized.newBuilder()\n+                                                            .setId(cmd.getId())\n+                                                            .build();\n+        return Collections.singletonList(result);\n+    }\n+\n+    @Assign\n+    public List<? extends Message> handle(RemoveLabelFromTask cmd) {\n+        validateRemoveLabelFromTaskCommand(getState().getTaskStatus());\n+        final LabelRemovedFromTask result = LabelRemovedFromTask.newBuilder()\n+                                                                .setId(cmd.getId())\n+                                                                .setLabelId(cmd.getLabelId())\n+                                                                .build();\n+        return Collections.singletonList(result);\n+    }\n+\n+    @Assign\n+    public List<? extends Message> handle(AssignLabelToTask cmd) {\n+        validateAssignLabelToTaskCommand(getState().getTaskStatus());\n+        final LabelAssignedToTask result = LabelAssignedToTask.newBuilder()\n+                                                              .setId(cmd.getId())\n+                                                              .setLabelId(cmd.getLabelId())\n+                                                              .build();\n+        return Collections.singletonList(result);\n+    }\n+\n+    @Assign\n+    public List<? extends Message> handle(CreateDraft cmd) {\n+        validateCreateDraftCommand(getState().getTaskStatus());\n+        final TaskDraftCreated result = TaskDraftCreated.newBuilder()\n+                                                        .setId(cmd.getId())\n+                                                        .setDraftCreationTime(Timestamps.getCurrentTime())\n+                                                        .build();\n+        return Collections.singletonList(result);\n+    }\n+\n+    /*\n+     * Event appliers\n+     *****************/\n+\n+    @Apply\n+    private void taskCreated(TaskCreated event) {\n+        final TaskDetails taskDetails = event.getDetails();\n+        getBuilder().setId(event.getId())\n+                    .setCreated(Timestamps.getCurrentTime())\n+                    .setDescription(taskDetails.getDescription())\n+                    .setPriority(taskDetails.getPriority())\n+                    .setTaskStatus(TaskStatus.FINALIZED);\n+    }\n+\n+    @Apply\n+    private void taskDescriptionUpdated(TaskDescriptionUpdated event) {\n+        getBuilder().setDescription(event.getNewDescription());\n+    }\n+\n+    @Apply\n+    private void labelledTaskDescriptionUpdated(LabelledTaskDescriptionUpdated event) {\n+        getBuilder().setDescription(event.getNewDescription());\n+    }\n+\n+    @Apply\n+    private void taskDueDateUpdated(TaskDueDateUpdated event) {\n+        getBuilder().setDueDate(event.getNewDueDate());\n+    }\n+\n+    @Apply\n+    private void labelledTaskDueDateUpdated(LabelledTaskDueDateUpdated event) {\n+        getBuilder().setDueDate(event.getNewDueDate());\n+    }\n+\n+    @Apply\n+    private void taskPriorityUpdated(TaskPriorityUpdated event) {\n+        getBuilder().setPriority(event.getNewPriority());\n+    }\n+\n+    @Apply\n+    private void labelledTaskPriorityUpdated(LabelledTaskPriorityUpdated event) {\n+        getBuilder().setPriority(event.getNewPriority());\n+    }\n+\n+    @Apply\n+    private void taskReopened(TaskReopened event) {\n+        getBuilder().setTaskStatus(TaskStatus.OPEN);\n+    }\n+\n+    @Apply\n+    private void labelledTaskReopened(LabelledTaskReopened event) {\n+        getBuilder().setTaskStatus(TaskStatus.OPEN);\n+    }\n+\n+    @Apply\n+    private void taskDeleted(TaskDeleted event) {\n+        getBuilder().setTaskStatus(TaskStatus.DELETED);\n+    }\n+\n+    @Apply\n+    private void labelledTaskDeleted(LabelledTaskDeleted event) {\n+        getBuilder().setTaskStatus(TaskStatus.DELETED);\n+    }\n+\n+    @Apply\n+    private void deletedTaskRestored(DeletedTaskRestored event) {\n+        getBuilder().setTaskStatus(TaskStatus.OPEN);\n+    }\n+\n+    @Apply\n+    private void labelledTaskRestored(LabelledTaskRestored event) {","path":"api-java/src/main/java/org/spine3/examples/todolist/aggregate/TaskAggregate.java","position":378,"original_position":378,"commit_id":"e19297df3769fdf7df9936ea897ca0d31ac02b75","original_commit_id":"e19297df3769fdf7df9936ea897ca0d31ac02b75","user":{"login":"codacy-bot","id":19940114,"avatar_url":"https://avatars.githubusercontent.com/u/19940114?v=3","gravatar_id":"","url":"https://api.github.com/users/codacy-bot","html_url":"https://github.com/codacy-bot","followers_url":"https://api.github.com/users/codacy-bot/followers","following_url":"https://api.github.com/users/codacy-bot/following{/other_user}","gists_url":"https://api.github.com/users/codacy-bot/gists{/gist_id}","starred_url":"https://api.github.com/users/codacy-bot/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/codacy-bot/subscriptions","organizations_url":"https://api.github.com/users/codacy-bot/orgs","repos_url":"https://api.github.com/users/codacy-bot/repos","events_url":"https://api.github.com/users/codacy-bot/events{/privacy}","received_events_url":"https://api.github.com/users/codacy-bot/received_events","type":"User","site_admin":false},"body":"![Codacy](https://www.codacy.com/assets/images/favicon.png) Issue found: [Avoid unused method parameters such as 'event'.](https://www.codacy.com/app/SpineEventEngine/todo-list/file/4878013956/issues/source?bid=4047262&fileBranchId=4047265#l378)","created_at":"2017-01-05T11:58:58Z","updated_at":"2017-01-05T11:58:58Z","html_url":"https://github.com/SpineEventEngine/todo-list/pull/2#discussion_r94756149","pull_request_url":"https://api.github.com/repos/SpineEventEngine/todo-list/pulls/2","_links":{"self":{"href":"https://api.github.com/repos/SpineEventEngine/todo-list/pulls/comments/94756149"},"html":{"href":"https://github.com/SpineEventEngine/todo-list/pull/2#discussion_r94756149"},"pull_request":{"href":"https://api.github.com/repos/SpineEventEngine/todo-list/pulls/2"}}},"pull_request":{"url":"https://api.github.com/repos/SpineEventEngine/todo-list/pulls/2","id":97109010,"html_url":"https://github.com/SpineEventEngine/todo-list/pull/2","diff_url":"https://github.com/SpineEventEngine/todo-list/pull/2.diff","patch_url":"https://github.com/SpineEventEngine/todo-list/pull/2.patch","issue_url":"https://api.github.com/repos/SpineEventEngine/todo-list/issues/2","number":2,"state":"open","locked":false,"title":"Projections and aggregates definition","user":{"login":"IlliaShepilov","id":24410839,"avatar_url":"https://avatars.githubusercontent.com/u/24410839?v=3","gravatar_id":"","url":"https://api.github.com/users/IlliaShepilov","html_url":"https://github.com/IlliaShepilov","followers_url":"https://api.github.com/users/IlliaShepilov/followers","following_url":"https://api.github.com/users/IlliaShepilov/following{/other_user}","gists_url":"https://api.github.com/users/IlliaShepilov/gists{/gist_id}","starred_url":"https://api.github.com/users/IlliaShepilov/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/IlliaShepilov/subscriptions","organizations_url":"https://api.github.com/users/IlliaShepilov/orgs","repos_url":"https://api.github.com/users/IlliaShepilov/repos","events_url":"https://api.github.com/users/IlliaShepilov/events{/privacy}","received_events_url":"https://api.github.com/users/IlliaShepilov/received_events","type":"User","site_admin":false},"body":"Summary of changes:\r\n\r\n- Created TaskAggregate\r\n- Implemented tests for TaskAggregate\r\n- Created TaskLabelAggregate\r\n- Implemented tests for TaskLabelAggregate\r\n- Created draft version for Projections \r\n- Projections partially covered by tests","created_at":"2016-12-08T11:59:14Z","updated_at":"2017-01-05T11:58:58Z","closed_at":null,"merged_at":null,"merge_commit_sha":"eaf8dfa6eb1bdb92e533a081630d69458976b614","assignee":{"login":"armiol","id":82468,"avatar_url":"https://avatars.githubusercontent.com/u/82468?v=3","gravatar_id":"","url":"https://api.github.com/users/armiol","html_url":"https://github.com/armiol","followers_url":"https://api.github.com/users/armiol/followers","following_url":"https://api.github.com/users/armiol/following{/other_user}","gists_url":"https://api.github.com/users/armiol/gists{/gist_id}","starred_url":"https://api.github.com/users/armiol/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/armiol/subscriptions","organizations_url":"https://api.github.com/users/armiol/orgs","repos_url":"https://api.github.com/users/armiol/repos","events_url":"https://api.github.com/users/armiol/events{/privacy}","received_events_url":"https://api.github.com/users/armiol/received_events","type":"User","site_admin":false},"assignees":[{"login":"armiol","id":82468,"avatar_url":"https://avatars.githubusercontent.com/u/82468?v=3","gravatar_id":"","url":"https://api.github.com/users/armiol","html_url":"https://github.com/armiol","followers_url":"https://api.github.com/users/armiol/followers","following_url":"https://api.github.com/users/armiol/following{/other_user}","gists_url":"https://api.github.com/users/armiol/gists{/gist_id}","starred_url":"https://api.github.com/users/armiol/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/armiol/subscriptions","organizations_url":"https://api.github.com/users/armiol/orgs","repos_url":"https://api.github.com/users/armiol/repos","events_url":"https://api.github.com/users/armiol/events{/privacy}","received_events_url":"https://api.github.com/users/armiol/received_events","type":"User","site_admin":false}],"milestone":null,"commits_url":"https://api.github.com/repos/SpineEventEngine/todo-list/pulls/2/commits","review_comments_url":"https://api.github.com/repos/SpineEventEngine/todo-list/pulls/2/comments","review_comment_url":"https://api.github.com/repos/SpineEventEngine/todo-list/pulls/comments{/number}","comments_url":"https://api.github.com/repos/SpineEventEngine/todo-list/issues/2/comments","statuses_url":"https://api.github.com/repos/SpineEventEngine/todo-list/statuses/e19297df3769fdf7df9936ea897ca0d31ac02b75","head":{"label":"SpineEventEngine:projections_and_aggregates_definition","ref":"projections_and_aggregates_definition","sha":"e19297df3769fdf7df9936ea897ca0d31ac02b75","user":{"login":"SpineEventEngine","id":12821626,"avatar_url":"https://avatars.githubusercontent.com/u/12821626?v=3","gravatar_id":"","url":"https://api.github.com/users/SpineEventEngine","html_url":"https://github.com/SpineEventEngine","followers_url":"https://api.github.com/users/SpineEventEngine/followers","following_url":"https://api.github.com/users/SpineEventEngine/following{/other_user}","gists_url":"https://api.github.com/users/SpineEventEngine/gists{/gist_id}","starred_url":"https://api.github.com/users/SpineEventEngine/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/SpineEventEngine/subscriptions","organizations_url":"https://api.github.com/users/SpineEventEngine/orgs","repos_url":"https://api.github.com/users/SpineEventEngine/repos","events_url":"https://api.github.com/users/SpineEventEngine/events{/privacy}","received_events_url":"https://api.github.com/users/SpineEventEngine/received_events","type":"Organization","site_admin":false},"repo":{"id":75753953,"name":"todo-list","full_name":"SpineEventEngine/todo-list","owner":{"login":"SpineEventEngine","id":12821626,"avatar_url":"https://avatars.githubusercontent.com/u/12821626?v=3","gravatar_id":"","url":"https://api.github.com/users/SpineEventEngine","html_url":"https://github.com/SpineEventEngine","followers_url":"https://api.github.com/users/SpineEventEngine/followers","following_url":"https://api.github.com/users/SpineEventEngine/following{/other_user}","gists_url":"https://api.github.com/users/SpineEventEngine/gists{/gist_id}","starred_url":"https://api.github.com/users/SpineEventEngine/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/SpineEventEngine/subscriptions","organizations_url":"https://api.github.com/users/SpineEventEngine/orgs","repos_url":"https://api.github.com/users/SpineEventEngine/repos","events_url":"https://api.github.com/users/SpineEventEngine/events{/privacy}","received_events_url":"https://api.github.com/users/SpineEventEngine/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/SpineEventEngine/todo-list","description":"ToDo List example application","fork":false,"url":"https://api.github.com/repos/SpineEventEngine/todo-list","forks_url":"https://api.github.com/repos/SpineEventEngine/todo-list/forks","keys_url":"https://api.github.com/repos/SpineEventEngine/todo-list/keys{/key_id}","collaborators_url":"https://api.github.com/repos/SpineEventEngine/todo-list/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/SpineEventEngine/todo-list/teams","hooks_url":"https://api.github.com/repos/SpineEventEngine/todo-list/hooks","issue_events_url":"https://api.github.com/repos/SpineEventEngine/todo-list/issues/events{/number}","events_url":"https://api.github.com/repos/SpineEventEngine/todo-list/events","assignees_url":"https://api.github.com/repos/SpineEventEngine/todo-list/assignees{/user}","branches_url":"https://api.github.com/repos/SpineEventEngine/todo-list/branches{/branch}","tags_url":"https://api.github.com/repos/SpineEventEngine/todo-list/tags","blobs_url":"https://api.github.com/repos/SpineEventEngine/todo-list/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/SpineEventEngine/todo-list/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/SpineEventEngine/todo-list/git/refs{/sha}","trees_url":"https://api.github.com/repos/SpineEventEngine/todo-list/git/trees{/sha}","statuses_url":"https://api.github.com/repos/SpineEventEngine/todo-list/statuses/{sha}","languages_url":"https://api.github.com/repos/SpineEventEngine/todo-list/languages","stargazers_url":"https://api.github.com/repos/SpineEventEngine/todo-list/stargazers","contributors_url":"https://api.github.com/repos/SpineEventEngine/todo-list/contributors","subscribers_url":"https://api.github.com/repos/SpineEventEngine/todo-list/subscribers","subscription_url":"https://api.github.com/repos/SpineEventEngine/todo-list/subscription","commits_url":"https://api.github.com/repos/SpineEventEngine/todo-list/commits{/sha}","git_commits_url":"https://api.github.com/repos/SpineEventEngine/todo-list/git/commits{/sha}","comments_url":"https://api.github.com/repos/SpineEventEngine/todo-list/comments{/number}","issue_comment_url":"https://api.github.com/repos/SpineEventEngine/todo-list/issues/comments{/number}","contents_url":"https://api.github.com/repos/SpineEventEngine/todo-list/contents/{+path}","compare_url":"https://api.github.com/repos/SpineEventEngine/todo-list/compare/{base}...{head}","merges_url":"https://api.github.com/repos/SpineEventEngine/todo-list/merges","archive_url":"https://api.github.com/repos/SpineEventEngine/todo-list/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/SpineEventEngine/todo-list/downloads","issues_url":"https://api.github.com/repos/SpineEventEngine/todo-list/issues{/number}","pulls_url":"https://api.github.com/repos/SpineEventEngine/todo-list/pulls{/number}","milestones_url":"https://api.github.com/repos/SpineEventEngine/todo-list/milestones{/number}","notifications_url":"https://api.github.com/repos/SpineEventEngine/todo-list/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/SpineEventEngine/todo-list/labels{/name}","releases_url":"https://api.github.com/repos/SpineEventEngine/todo-list/releases{/id}","deployments_url":"https://api.github.com/repos/SpineEventEngine/todo-list/deployments","created_at":"2016-12-06T17:17:33Z","updated_at":"2016-12-07T10:00:53Z","pushed_at":"2017-01-05T11:54:51Z","git_url":"git://github.com/SpineEventEngine/todo-list.git","ssh_url":"git@github.com:SpineEventEngine/todo-list.git","clone_url":"https://github.com/SpineEventEngine/todo-list.git","svn_url":"https://github.com/SpineEventEngine/todo-list","homepage":null,"size":354,"stargazers_count":0,"watchers_count":0,"language":"Protocol Buffer","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":1,"mirror_url":null,"open_issues_count":2,"forks":1,"open_issues":2,"watchers":0,"default_branch":"master"}},"base":{"label":"SpineEventEngine:master","ref":"master","sha":"689c2a61aea5d3e4cc1cb270f3a4ffb0a1222f4b","user":{"login":"SpineEventEngine","id":12821626,"avatar_url":"https://avatars.githubusercontent.com/u/12821626?v=3","gravatar_id":"","url":"https://api.github.com/users/SpineEventEngine","html_url":"https://github.com/SpineEventEngine","followers_url":"https://api.github.com/users/SpineEventEngine/followers","following_url":"https://api.github.com/users/SpineEventEngine/following{/other_user}","gists_url":"https://api.github.com/users/SpineEventEngine/gists{/gist_id}","starred_url":"https://api.github.com/users/SpineEventEngine/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/SpineEventEngine/subscriptions","organizations_url":"https://api.github.com/users/SpineEventEngine/orgs","repos_url":"https://api.github.com/users/SpineEventEngine/repos","events_url":"https://api.github.com/users/SpineEventEngine/events{/privacy}","received_events_url":"https://api.github.com/users/SpineEventEngine/received_events","type":"Organization","site_admin":false},"repo":{"id":75753953,"name":"todo-list","full_name":"SpineEventEngine/todo-list","owner":{"login":"SpineEventEngine","id":12821626,"avatar_url":"https://avatars.githubusercontent.com/u/12821626?v=3","gravatar_id":"","url":"https://api.github.com/users/SpineEventEngine","html_url":"https://github.com/SpineEventEngine","followers_url":"https://api.github.com/users/SpineEventEngine/followers","following_url":"https://api.github.com/users/SpineEventEngine/following{/other_user}","gists_url":"https://api.github.com/users/SpineEventEngine/gists{/gist_id}","starred_url":"https://api.github.com/users/SpineEventEngine/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/SpineEventEngine/subscriptions","organizations_url":"https://api.github.com/users/SpineEventEngine/orgs","repos_url":"https://api.github.com/users/SpineEventEngine/repos","events_url":"https://api.github.com/users/SpineEventEngine/events{/privacy}","received_events_url":"https://api.github.com/users/SpineEventEngine/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/SpineEventEngine/todo-list","description":"ToDo List example application","fork":false,"url":"https://api.github.com/repos/SpineEventEngine/todo-list","forks_url":"https://api.github.com/repos/SpineEventEngine/todo-list/forks","keys_url":"https://api.github.com/repos/SpineEventEngine/todo-list/keys{/key_id}","collaborators_url":"https://api.github.com/repos/SpineEventEngine/todo-list/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/SpineEventEngine/todo-list/teams","hooks_url":"https://api.github.com/repos/SpineEventEngine/todo-list/hooks","issue_events_url":"https://api.github.com/repos/SpineEventEngine/todo-list/issues/events{/number}","events_url":"https://api.github.com/repos/SpineEventEngine/todo-list/events","assignees_url":"https://api.github.com/repos/SpineEventEngine/todo-list/assignees{/user}","branches_url":"https://api.github.com/repos/SpineEventEngine/todo-list/branches{/branch}","tags_url":"https://api.github.com/repos/SpineEventEngine/todo-list/tags","blobs_url":"https://api.github.com/repos/SpineEventEngine/todo-list/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/SpineEventEngine/todo-list/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/SpineEventEngine/todo-list/git/refs{/sha}","trees_url":"https://api.github.com/repos/SpineEventEngine/todo-list/git/trees{/sha}","statuses_url":"https://api.github.com/repos/SpineEventEngine/todo-list/statuses/{sha}","languages_url":"https://api.github.com/repos/SpineEventEngine/todo-list/languages","stargazers_url":"https://api.github.com/repos/SpineEventEngine/todo-list/stargazers","contributors_url":"https://api.github.com/repos/SpineEventEngine/todo-list/contributors","subscribers_url":"https://api.github.com/repos/SpineEventEngine/todo-list/subscribers","subscription_url":"https://api.github.com/repos/SpineEventEngine/todo-list/subscription","commits_url":"https://api.github.com/repos/SpineEventEngine/todo-list/commits{/sha}","git_commits_url":"https://api.github.com/repos/SpineEventEngine/todo-list/git/commits{/sha}","comments_url":"https://api.github.com/repos/SpineEventEngine/todo-list/comments{/number}","issue_comment_url":"https://api.github.com/repos/SpineEventEngine/todo-list/issues/comments{/number}","contents_url":"https://api.github.com/repos/SpineEventEngine/todo-list/contents/{+path}","compare_url":"https://api.github.com/repos/SpineEventEngine/todo-list/compare/{base}...{head}","merges_url":"https://api.github.com/repos/SpineEventEngine/todo-list/merges","archive_url":"https://api.github.com/repos/SpineEventEngine/todo-list/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/SpineEventEngine/todo-list/downloads","issues_url":"https://api.github.com/repos/SpineEventEngine/todo-list/issues{/number}","pulls_url":"https://api.github.com/repos/SpineEventEngine/todo-list/pulls{/number}","milestones_url":"https://api.github.com/repos/SpineEventEngine/todo-list/milestones{/number}","notifications_url":"https://api.github.com/repos/SpineEventEngine/todo-list/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/SpineEventEngine/todo-list/labels{/name}","releases_url":"https://api.github.com/repos/SpineEventEngine/todo-list/releases{/id}","deployments_url":"https://api.github.com/repos/SpineEventEngine/todo-list/deployments","created_at":"2016-12-06T17:17:33Z","updated_at":"2016-12-07T10:00:53Z","pushed_at":"2017-01-05T11:54:51Z","git_url":"git://github.com/SpineEventEngine/todo-list.git","ssh_url":"git@github.com:SpineEventEngine/todo-list.git","clone_url":"https://github.com/SpineEventEngine/todo-list.git","svn_url":"https://github.com/SpineEventEngine/todo-list","homepage":null,"size":354,"stargazers_count":0,"watchers_count":0,"language":"Protocol Buffer","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":1,"mirror_url":null,"open_issues_count":2,"forks":1,"open_issues":2,"watchers":0,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/SpineEventEngine/todo-list/pulls/2"},"html":{"href":"https://github.com/SpineEventEngine/todo-list/pull/2"},"issue":{"href":"https://api.github.com/repos/SpineEventEngine/todo-list/issues/2"},"comments":{"href":"https://api.github.com/repos/SpineEventEngine/todo-list/issues/2/comments"},"review_comments":{"href":"https://api.github.com/repos/SpineEventEngine/todo-list/pulls/2/comments"},"review_comment":{"href":"https://api.github.com/repos/SpineEventEngine/todo-list/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/SpineEventEngine/todo-list/pulls/2/commits"},"statuses":{"href":"https://api.github.com/repos/SpineEventEngine/todo-list/statuses/e19297df3769fdf7df9936ea897ca0d31ac02b75"}}}}
{"actor":{"display_login":"codacy-bot"}}