GitHub PullRequestReviewCommentEvent at 2014-11-24 19:48:59
Repository: freeseer
Actor: wigglier
Payload: {"action":"created","comment":{"url":"https://api.github.com/repos/Freeseer/freeseer/pulls/comments/20816431","id":20816431,"diff_hunk":"@@ -0,0 +1,416 @@\n+#!/usr/bin/python\n+# -*- coding: utf-8 -*-\n+\n+# freeseer - vga/presentation capture software\n+#\n+# Copyright (C) 2014 Free and Open Source Software Learning Centre\n+# http://fosslc.org\n+#\n+# This program is free software: you can redistribute it and/or modify\n+# it under the terms of the GNU General Public License as published by\n+# the Free Software Foundation, either version 3 of the License, or\n+# (at your option) any later version.\n+#\n+# This program is distributed in the hope that it will be useful,\n+# but WITHOUT ANY WARRANTY; without even the implied warranty of\n+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n+# GNU General Public License for more details.\n+#\n+# You should have received a copy of the GNU General Public License\n+# along with this program. If not, see <http://www.gnu.org/licenses/>.\n+\n+# For support, questions, suggestions or any other inquiries, visit:\n+# http://wiki.github.com/Freeseer/freeseer/\n+\n+import os\n+\n+from PyQt4 import QtCore\n+from PyQt4 import QtSql\n+\n+from freeseer.framework.database import QtDBConnector\n+from freeseer.framework.presentation import Presentation\n+\n+\n+def test_first_talk_id(db, presentation):\n+    \"\"\"Assert the first presentation record id in the database is given the identity '1'\"\"\"\n+    no_ids = db.get_talk_ids()\n+    assert not no_ids.first()  # Assert that there are no ids in the database.\n+\n+    db.insert_presentation(presentation)\n+\n+    talk_ids = db.get_talk_ids()\n+    assert talk_ids.first()\n+    talk_id_record = talk_ids.record()\n+    talk_id = talk_ids.value(talk_id_record.indexOf('id')).toString()\n+    assert talk_id == '1'\n+    assert not talk_ids.next()  # there should be no additional records.\n+\n+\n+def test_get_presentation_id(db, presentation):\n+    \"\"\"Assert that a valid record id is returned for a given presntation object in the database\"\"\"\n+    assert not db.get_presentation_id(presentation)  # Test that None is returned when a record does not exist.\n+\n+    db.insert_presentation(presentation)\n+    talk_id = db.get_presentation_id(presentation)\n+    assert talk_id == '1'\n+\n+\n+def test_add_talks_from_csv(db):\n+    \"\"\"Assert that presentations can be loaded to the database from a csv file\"\"\"\n+    dirname = os.path.dirname(__file__)\n+    fname = os.path.join(dirname, os.pardir, 'sample_talks.csv')\n+\n+    presentation = Presentation('Building NetBSD', 'David Maxwell')\n+\n+    assert not db.presentation_exists(presentation)\n+    db.add_talks_from_csv(fname)\n+    assert db.presentation_exists(presentation)\n+\n+\n+def test_add_talks_from_empty_csv(db):\n+    \"\"\"Assert that no talks are added when an empty csv filename is passed to add_talks_from_csv()\"\"\"\n+    db.add_talks_from_csv('')  # This logs an exception.\n+    talk_ids = db.get_talk_ids()\n+    assert not talk_ids.first()\n+\n+\n+def test_export_talks_to_csv(db, tmpdir):\n+    \"\"\"Assert that presentations from the database can be exported to a csv file\"\"\"\n+    temp_csv = str(tmpdir.join('temp.csv'))\n+    presentation1 = Presentation('Managing map data in a database', 'Andrew Ross')\n+    presentation2 = Presentation('Building NetBSD', 'David Maxwell')\n+    presentation3 = Presentation('Faking it till you make it', 'John Doe')\n+    db.insert_presentation(presentation1)\n+    db.insert_presentation(presentation2)\n+    db.insert_presentation(presentation3)\n+    db.export_talks_to_csv(temp_csv)\n+\n+    expected_csv_lines = [\n+        'Title,Speaker,Abstract,Category,Event,Room,Date,StartTime,EndTime\\r\\n',\n+        'Managing map data in a database,Andrew Ross,,,Default,Default,,,\\r\\n',\n+        'Building NetBSD,David Maxwell,,,Default,Default,,,\\r\\n',\n+        'Faking it till you make it,John Doe,,,Default,Default,,,\\r\\n'\n+    ]\n+\n+    with open(temp_csv) as fd:\n+        assert fd.readlines() == expected_csv_lines\n+\n+\n+def test_insert_presentation(db, presentation):\n+    \"\"\"Assert that a presentation's fields are correctly inserted into the database\"\"\"\n+    assert not db.presentation_exists(presentation)\n+    db.insert_presentation(presentation)\n+\n+    talks = db.get_talks()\n+    assert talks.first()\n+\n+    record = talks.record()\n+    assert talks.value(record.indexOf('title')).toString() == presentation.title\n+    assert talks.value(record.indexOf('speaker')).toString() == presentation.speaker\n+    assert talks.value(record.indexOf('description')).toString() == presentation.description\n+    assert talks.value(record.indexOf('category')).toString() == presentation.category\n+    assert talks.value(record.indexOf('event')).toString() == presentation.event\n+    assert talks.value(record.indexOf('date')).toString() == presentation.date\n+    assert talks.value(record.indexOf('startTime')).toString() == presentation.startTime\n+    assert talks.value(record.indexOf('endTime')).toString() == presentation.endTime\n+\n+    # Check that no additional presentations were inserted.\n+    assert not talks.next()\n+\n+\n+def test_insert_presentation_empty_arguments(db):\n+    \"\"\"Test that the worst case input to the database insert_presentation() method does not throw exceptions\"\"\"\n+    db.insert_presentation(Presentation('', room='', event=''))\n+\n+\n+def test_update_presentation(db, presentation):\n+    \"\"\"Assert that a given presentation is updated with out side effects given its record id\"\"\"\n+    assert not db.presentation_exists(presentation)\n+    db.insert_presentation(presentation)\n+\n+    # Update the inserted presentation\n+    presentation.title = 'Presentation Title Redacted'\n+    db.update_presentation('1', presentation)\n+\n+    updated_talks = db.get_talks()\n+    updated_talks.first()\n+    new_record = updated_talks.record()\n+\n+    # Check the update worked.\n+    assert updated_talks.value(new_record.indexOf('title')).toString() == presentation.title\n+    assert updated_talks.value(new_record.indexOf('speaker')).toString() == presentation.speaker\n+    assert updated_talks.value(new_record.indexOf('room')).toString() == presentation.room\n+\n+\n+def test_update_fake_presentation(db, presentation):\n+    \"\"\"Try to update a fake presentation. Assert this does not insert anything into the database\"\"\"\n+    db.update_presentation('100', presentation)\n+    assert not db.get_presentation('100')\n+\n+    talks = db.get_talks()\n+    assert not talks.first()\n+\n+\n+def test_update_presentation_real_and_fake(db, presentation):\n+    \"\"\"\n+    Assert that a given presentation is updated with out side effects given its record id and that a fake\n+    presentation update does not impact the existing database presentation.\n+    \"\"\"\n+    assert not db.presentation_exists(presentation)\n+    db.insert_presentation(presentation)\n+\n+    # Update the inserted presentation\n+    presentation.title = 'Presentation Title Redacted'\n+    db.update_presentation('1', presentation)\n+\n+    updated_talks = db.get_talks()\n+    updated_talks.first()\n+    new_record = updated_talks.record()\n+\n+    # Check the update worked.\n+    assert updated_talks.value(new_record.indexOf('title')).toString() == presentation.title\n+    assert updated_talks.value(new_record.indexOf('speaker')).toString() == presentation.speaker\n+    assert updated_talks.value(new_record.indexOf('room')).toString() == presentation.room\n+\n+    # Try to update fake presentations, this case should never actually arise if the code is using the model objects\n+    db.update_presentation('100', presentation)\n+    assert not db.get_presentation('100')\n+\n+    # Make sure that the talk that was originally inserted has not changed and that no other rows have been added to the db.\n+    talks = db.get_talks()\n+    talks.first()\n+    record = talks.record()\n+    assert talks.value(record.indexOf('title')).toString() == presentation.title\n+    assert talks.value(record.indexOf('speaker')).toString() == presentation.speaker\n+    assert talks.value(record.indexOf('room')).toString() == presentation.room\n+    assert not talks.next()  # there should be no other presentations\n+\n+\n+def test_delete_presentation_valid(db, presentation):\n+    \"\"\"Assert that a presentation is removed with out side effects from the database\"\"\"\n+    # delete a valid presentation\n+    assert not db.presentation_exists(presentation)\n+    db.insert_presentation(presentation)\n+    assert db.presentation_exists(presentation)\n+    db.delete_presentation('1')","path":"src/freeseer/tests/framework/database/test_database.py","position":212,"original_position":195,"commit_id":"ce670f57f28622df8ab92f05c616924ace32e6c8","original_commit_id":"cebb0ce671f0da48fe3665a4fa150196e763a07e","user":{"login":"wigglier","id":8321642,"avatar_url":"https://avatars.githubusercontent.com/u/8321642?v=3","gravatar_id":"","url":"https://api.github.com/users/wigglier","html_url":"https://github.com/wigglier","followers_url":"https://api.github.com/users/wigglier/followers","following_url":"https://api.github.com/users/wigglier/following{/other_user}","gists_url":"https://api.github.com/users/wigglier/gists{/gist_id}","starred_url":"https://api.github.com/users/wigglier/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/wigglier/subscriptions","organizations_url":"https://api.github.com/users/wigglier/orgs","repos_url":"https://api.github.com/users/wigglier/repos","events_url":"https://api.github.com/users/wigglier/events{/privacy}","received_events_url":"https://api.github.com/users/wigglier/received_events","type":"User","site_admin":false},"body":"Sorry, could you explain what you mean? I don't understand.","created_at":"2014-11-24T19:48:59Z","updated_at":"2014-11-24T19:48:59Z","html_url":"https://github.com/Freeseer/freeseer/pull/619#discussion_r20816431","pull_request_url":"https://api.github.com/repos/Freeseer/freeseer/pulls/619","_links":{"self":{"href":"https://api.github.com/repos/Freeseer/freeseer/pulls/comments/20816431"},"html":{"href":"https://github.com/Freeseer/freeseer/pull/619#discussion_r20816431"},"pull_request":{"href":"https://api.github.com/repos/Freeseer/freeseer/pulls/619"}}},"pull_request":{"url":"https://api.github.com/repos/Freeseer/freeseer/pulls/619","id":22322470,"html_url":"https://github.com/Freeseer/freeseer/pull/619","diff_url":"https://github.com/Freeseer/freeseer/pull/619.diff","patch_url":"https://github.com/Freeseer/freeseer/pull/619.patch","issue_url":"https://api.github.com/repos/Freeseer/freeseer/issues/619","number":619,"state":"open","locked":false,"title":"unit test and refactor database.py","user":{"login":"wigglier","id":8321642,"avatar_url":"https://avatars.githubusercontent.com/u/8321642?v=3","gravatar_id":"","url":"https://api.github.com/users/wigglier","html_url":"https://github.com/wigglier","followers_url":"https://api.github.com/users/wigglier/followers","following_url":"https://api.github.com/users/wigglier/following{/other_user}","gists_url":"https://api.github.com/users/wigglier/gists{/gist_id}","starred_url":"https://api.github.com/users/wigglier/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/wigglier/subscriptions","organizations_url":"https://api.github.com/users/wigglier/orgs","repos_url":"https://api.github.com/users/wigglier/repos","events_url":"https://api.github.com/users/wigglier/events{/privacy}","received_events_url":"https://api.github.com/users/wigglier/received_events","type":"User","site_admin":false},"body":"Updates to ``tests/framework/test_database.py`` and ``framework/database.py``.\r\n\r\n- Replaced ``test_database.py`` ``unittest`` references with ``pytest`` references\r\n- Removed test methods that checked the return type of database functions\r\n- Added test methods that checked the return values of database functions\r\n- Modified database functions to handle python strings properly\r\n- Added bound values to the add_presentation and update_presentation database functions.\r\n- Removed dummy record inserted by default.\r\n\r\nRelated gh484","created_at":"2014-10-06T23:40:30Z","updated_at":"2014-11-24T19:48:59Z","closed_at":null,"merged_at":null,"merge_commit_sha":"a3a34bbead21c04830b57e88742bfe1f55848047","assignee":null,"milestone":{"url":"https://api.github.com/repos/Freeseer/freeseer/milestones/17","labels_url":"https://api.github.com/repos/Freeseer/freeseer/milestones/17/labels","id":563652,"number":17,"title":"2014 Fall - UCOSP","description":"UCOSP Projects for 2014 Fall term.","creator":{"login":"zxiiro","id":150177,"avatar_url":"https://avatars.githubusercontent.com/u/150177?v=3","gravatar_id":"","url":"https://api.github.com/users/zxiiro","html_url":"https://github.com/zxiiro","followers_url":"https://api.github.com/users/zxiiro/followers","following_url":"https://api.github.com/users/zxiiro/following{/other_user}","gists_url":"https://api.github.com/users/zxiiro/gists{/gist_id}","starred_url":"https://api.github.com/users/zxiiro/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/zxiiro/subscriptions","organizations_url":"https://api.github.com/users/zxiiro/orgs","repos_url":"https://api.github.com/users/zxiiro/repos","events_url":"https://api.github.com/users/zxiiro/events{/privacy}","received_events_url":"https://api.github.com/users/zxiiro/received_events","type":"User","site_admin":false},"open_issues":18,"closed_issues":46,"state":"open","created_at":"2014-02-09T17:41:03Z","updated_at":"2014-11-23T17:20:57Z","due_on":null,"closed_at":null},"commits_url":"https://api.github.com/repos/Freeseer/freeseer/pulls/619/commits","review_comments_url":"https://api.github.com/repos/Freeseer/freeseer/pulls/619/comments","review_comment_url":"https://api.github.com/repos/Freeseer/freeseer/pulls/comments/{number}","comments_url":"https://api.github.com/repos/Freeseer/freeseer/issues/619/comments","statuses_url":"https://api.github.com/repos/Freeseer/freeseer/statuses/ce670f57f28622df8ab92f05c616924ace32e6c8","head":{"label":"wigglier:484-unit-test-and-refactor","ref":"484-unit-test-and-refactor","sha":"ce670f57f28622df8ab92f05c616924ace32e6c8","user":{"login":"wigglier","id":8321642,"avatar_url":"https://avatars.githubusercontent.com/u/8321642?v=3","gravatar_id":"","url":"https://api.github.com/users/wigglier","html_url":"https://github.com/wigglier","followers_url":"https://api.github.com/users/wigglier/followers","following_url":"https://api.github.com/users/wigglier/following{/other_user}","gists_url":"https://api.github.com/users/wigglier/gists{/gist_id}","starred_url":"https://api.github.com/users/wigglier/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/wigglier/subscriptions","organizations_url":"https://api.github.com/users/wigglier/orgs","repos_url":"https://api.github.com/users/wigglier/repos","events_url":"https://api.github.com/users/wigglier/events{/privacy}","received_events_url":"https://api.github.com/users/wigglier/received_events","type":"User","site_admin":false},"repo":{"id":23132318,"name":"freeseer","full_name":"wigglier/freeseer","owner":{"login":"wigglier","id":8321642,"avatar_url":"https://avatars.githubusercontent.com/u/8321642?v=3","gravatar_id":"","url":"https://api.github.com/users/wigglier","html_url":"https://github.com/wigglier","followers_url":"https://api.github.com/users/wigglier/followers","following_url":"https://api.github.com/users/wigglier/following{/other_user}","gists_url":"https://api.github.com/users/wigglier/gists{/gist_id}","starred_url":"https://api.github.com/users/wigglier/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/wigglier/subscriptions","organizations_url":"https://api.github.com/users/wigglier/orgs","repos_url":"https://api.github.com/users/wigglier/repos","events_url":"https://api.github.com/users/wigglier/events{/privacy}","received_events_url":"https://api.github.com/users/wigglier/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/wigglier/freeseer","description":"A set of tools designed for capturing presentations. The main tool is capable of capturing VGA output and audio, and mixing them together to produce a video.","fork":true,"url":"https://api.github.com/repos/wigglier/freeseer","forks_url":"https://api.github.com/repos/wigglier/freeseer/forks","keys_url":"https://api.github.com/repos/wigglier/freeseer/keys{/key_id}","collaborators_url":"https://api.github.com/repos/wigglier/freeseer/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/wigglier/freeseer/teams","hooks_url":"https://api.github.com/repos/wigglier/freeseer/hooks","issue_events_url":"https://api.github.com/repos/wigglier/freeseer/issues/events{/number}","events_url":"https://api.github.com/repos/wigglier/freeseer/events","assignees_url":"https://api.github.com/repos/wigglier/freeseer/assignees{/user}","branches_url":"https://api.github.com/repos/wigglier/freeseer/branches{/branch}","tags_url":"https://api.github.com/repos/wigglier/freeseer/tags","blobs_url":"https://api.github.com/repos/wigglier/freeseer/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/wigglier/freeseer/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/wigglier/freeseer/git/refs{/sha}","trees_url":"https://api.github.com/repos/wigglier/freeseer/git/trees{/sha}","statuses_url":"https://api.github.com/repos/wigglier/freeseer/statuses/{sha}","languages_url":"https://api.github.com/repos/wigglier/freeseer/languages","stargazers_url":"https://api.github.com/repos/wigglier/freeseer/stargazers","contributors_url":"https://api.github.com/repos/wigglier/freeseer/contributors","subscribers_url":"https://api.github.com/repos/wigglier/freeseer/subscribers","subscription_url":"https://api.github.com/repos/wigglier/freeseer/subscription","commits_url":"https://api.github.com/repos/wigglier/freeseer/commits{/sha}","git_commits_url":"https://api.github.com/repos/wigglier/freeseer/git/commits{/sha}","comments_url":"https://api.github.com/repos/wigglier/freeseer/comments{/number}","issue_comment_url":"https://api.github.com/repos/wigglier/freeseer/issues/comments/{number}","contents_url":"https://api.github.com/repos/wigglier/freeseer/contents/{+path}","compare_url":"https://api.github.com/repos/wigglier/freeseer/compare/{base}...{head}","merges_url":"https://api.github.com/repos/wigglier/freeseer/merges","archive_url":"https://api.github.com/repos/wigglier/freeseer/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/wigglier/freeseer/downloads","issues_url":"https://api.github.com/repos/wigglier/freeseer/issues{/number}","pulls_url":"https://api.github.com/repos/wigglier/freeseer/pulls{/number}","milestones_url":"https://api.github.com/repos/wigglier/freeseer/milestones{/number}","notifications_url":"https://api.github.com/repos/wigglier/freeseer/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/wigglier/freeseer/labels{/name}","releases_url":"https://api.github.com/repos/wigglier/freeseer/releases{/id}","created_at":"2014-08-20T01:54:43Z","updated_at":"2014-11-21T22:34:17Z","pushed_at":"2014-11-24T07:09:29Z","git_url":"git://github.com/wigglier/freeseer.git","ssh_url":"git@github.com:wigglier/freeseer.git","clone_url":"https://github.com/wigglier/freeseer.git","svn_url":"https://github.com/wigglier/freeseer","homepage":"http://freeseer.github.io","size":118661,"stargazers_count":0,"watchers_count":0,"language":"Python","has_issues":false,"has_downloads":true,"has_wiki":false,"has_pages":false,"forks_count":0,"mirror_url":null,"open_issues_count":0,"forks":0,"open_issues":0,"watchers":0,"default_branch":"master"}},"base":{"label":"Freeseer:master","ref":"master","sha":"27e81f7ccac595bba9dc0dd1b762cc1b0a588437","user":{"login":"Freeseer","id":469374,"avatar_url":"https://avatars.githubusercontent.com/u/469374?v=3","gravatar_id":"","url":"https://api.github.com/users/Freeseer","html_url":"https://github.com/Freeseer","followers_url":"https://api.github.com/users/Freeseer/followers","following_url":"https://api.github.com/users/Freeseer/following{/other_user}","gists_url":"https://api.github.com/users/Freeseer/gists{/gist_id}","starred_url":"https://api.github.com/users/Freeseer/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Freeseer/subscriptions","organizations_url":"https://api.github.com/users/Freeseer/orgs","repos_url":"https://api.github.com/users/Freeseer/repos","events_url":"https://api.github.com/users/Freeseer/events{/privacy}","received_events_url":"https://api.github.com/users/Freeseer/received_events","type":"Organization","site_admin":false},"repo":{"id":391515,"name":"freeseer","full_name":"Freeseer/freeseer","owner":{"login":"Freeseer","id":469374,"avatar_url":"https://avatars.githubusercontent.com/u/469374?v=3","gravatar_id":"","url":"https://api.github.com/users/Freeseer","html_url":"https://github.com/Freeseer","followers_url":"https://api.github.com/users/Freeseer/followers","following_url":"https://api.github.com/users/Freeseer/following{/other_user}","gists_url":"https://api.github.com/users/Freeseer/gists{/gist_id}","starred_url":"https://api.github.com/users/Freeseer/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Freeseer/subscriptions","organizations_url":"https://api.github.com/users/Freeseer/orgs","repos_url":"https://api.github.com/users/Freeseer/repos","events_url":"https://api.github.com/users/Freeseer/events{/privacy}","received_events_url":"https://api.github.com/users/Freeseer/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/Freeseer/freeseer","description":"Designed for capturing presentations at conferences. Pre-fill a list of talks to record, record them, and upload them to YouTube with our YouTube Uploader.","fork":false,"url":"https://api.github.com/repos/Freeseer/freeseer","forks_url":"https://api.github.com/repos/Freeseer/freeseer/forks","keys_url":"https://api.github.com/repos/Freeseer/freeseer/keys{/key_id}","collaborators_url":"https://api.github.com/repos/Freeseer/freeseer/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/Freeseer/freeseer/teams","hooks_url":"https://api.github.com/repos/Freeseer/freeseer/hooks","issue_events_url":"https://api.github.com/repos/Freeseer/freeseer/issues/events{/number}","events_url":"https://api.github.com/repos/Freeseer/freeseer/events","assignees_url":"https://api.github.com/repos/Freeseer/freeseer/assignees{/user}","branches_url":"https://api.github.com/repos/Freeseer/freeseer/branches{/branch}","tags_url":"https://api.github.com/repos/Freeseer/freeseer/tags","blobs_url":"https://api.github.com/repos/Freeseer/freeseer/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/Freeseer/freeseer/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/Freeseer/freeseer/git/refs{/sha}","trees_url":"https://api.github.com/repos/Freeseer/freeseer/git/trees{/sha}","statuses_url":"https://api.github.com/repos/Freeseer/freeseer/statuses/{sha}","languages_url":"https://api.github.com/repos/Freeseer/freeseer/languages","stargazers_url":"https://api.github.com/repos/Freeseer/freeseer/stargazers","contributors_url":"https://api.github.com/repos/Freeseer/freeseer/contributors","subscribers_url":"https://api.github.com/repos/Freeseer/freeseer/subscribers","subscription_url":"https://api.github.com/repos/Freeseer/freeseer/subscription","commits_url":"https://api.github.com/repos/Freeseer/freeseer/commits{/sha}","git_commits_url":"https://api.github.com/repos/Freeseer/freeseer/git/commits{/sha}","comments_url":"https://api.github.com/repos/Freeseer/freeseer/comments{/number}","issue_comment_url":"https://api.github.com/repos/Freeseer/freeseer/issues/comments/{number}","contents_url":"https://api.github.com/repos/Freeseer/freeseer/contents/{+path}","compare_url":"https://api.github.com/repos/Freeseer/freeseer/compare/{base}...{head}","merges_url":"https://api.github.com/repos/Freeseer/freeseer/merges","archive_url":"https://api.github.com/repos/Freeseer/freeseer/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/Freeseer/freeseer/downloads","issues_url":"https://api.github.com/repos/Freeseer/freeseer/issues{/number}","pulls_url":"https://api.github.com/repos/Freeseer/freeseer/pulls{/number}","milestones_url":"https://api.github.com/repos/Freeseer/freeseer/milestones{/number}","notifications_url":"https://api.github.com/repos/Freeseer/freeseer/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/Freeseer/freeseer/labels{/name}","releases_url":"https://api.github.com/repos/Freeseer/freeseer/releases{/id}","created_at":"2009-12-01T14:17:15Z","updated_at":"2014-11-22T20:29:28Z","pushed_at":"2014-11-22T20:29:28Z","git_url":"git://github.com/Freeseer/freeseer.git","ssh_url":"git@github.com:Freeseer/freeseer.git","clone_url":"https://github.com/Freeseer/freeseer.git","svn_url":"https://github.com/Freeseer/freeseer","homepage":"http://freeseer.readthedocs.org","size":128365,"stargazers_count":174,"watchers_count":174,"language":"Python","has_issues":true,"has_downloads":true,"has_wiki":false,"has_pages":false,"forks_count":96,"mirror_url":null,"open_issues_count":139,"forks":96,"open_issues":139,"watchers":174,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/Freeseer/freeseer/pulls/619"},"html":{"href":"https://github.com/Freeseer/freeseer/pull/619"},"issue":{"href":"https://api.github.com/repos/Freeseer/freeseer/issues/619"},"comments":{"href":"https://api.github.com/repos/Freeseer/freeseer/issues/619/comments"},"review_comments":{"href":"https://api.github.com/repos/Freeseer/freeseer/pulls/619/comments"},"review_comment":{"href":"https://api.github.com/repos/Freeseer/freeseer/pulls/comments/{number}"},"commits":{"href":"https://api.github.com/repos/Freeseer/freeseer/pulls/619/commits"},"statuses":{"href":"https://api.github.com/repos/Freeseer/freeseer/statuses/ce670f57f28622df8ab92f05c616924ace32e6c8"}}}}