{"action":"created","comment":{"url":"https://api.github.com/repos/pydy/pydy/pulls/comments/34601962","id":34601962,"diff_hunk":"@@ -0,0 +1,275 @@\n+from sympy import Symbol, acos\n+from sympy.physics.vector import Point, dot, cross\n+from sympy.physics.mechanics import dynamicsymbols\n+\n+from ..bodies import Body\n+from ..joints import Joint, PinJoint, SlidingJoint, CylindricalJoint, SphericalJoint, PlanarJoint\n+\n+\n+class TestJoints():\n+    def setup(self):\n+        self.parent = Body('parent')\n+        self.child = Body('child')\n+        self.joint = Joint('joint', self.parent, self.parent.frame.x, self.child, 0)\n+\n+    def test_joint_init(self):\n+        assert self.joint.name == 'joint'\n+        assert self.joint.child == self.child\n+        assert self.joint.parent == self.parent\n+        assert self.joint.parent_joint_vector == self.parent.frame.x\n+        assert self.joint.child_joint_vector == 0\n+\n+    def test_joint_set_parent_child_rel(self):\n+        self.joint._set_parent_child_rel()\n+        assert self.child.parent == self.parent\n+        assert self.parent.child == self.child\n+\n+    def test_joint_locate_joint_point(self):\n+        self.joint._locate_joint_point()\n+        assert hasattr(self.joint, 'joint_point')\n+\n+        joint_point = self.parent.masscenter.locatenew(self.name + '_Point',\n+                                                       self.joint.parent_joint_vector)\n+        assert self.joint_point.name == joint_point\n+\n+        child_masscenter = Point(self.child.name + '_MassCenter')\n+        child_masscenter.set_pos(joint_point, self.joint.child_joint_vector)\n+        assert self.child.masscenter == child_masscenter\n+\n+    def test_joint_set_child_vel(self):\n+        # Note: this numeric and symbolic value implementation can be applied anywhere in joints\n+        # wherever symbol is used e.g. in set_joint_point_vel()\n+\n+        # 1. numeric value\n+        self.joint.set_child_vel(10 * self.parent.frame.x)\n+        assert self.child.masscenter.vel(self.parent.frame) == 10 * self.parent.frame.x\n+\n+        # 2. symbolic value\n+        v1 = dynamicsymbols('v1')\n+        self.joint.set_child_vel(v1 * self.parent.frame.x)\n+        assert self.child.masscenter.vel(self.parent.frame) == v1 * self.parent.frame.x\n+\n+    def test_joint_set_joint_point_vel(self):\n+        v2 = dynamicsymbols('v2')\n+        self.joint.set_joint_point_vel(v2 * self.parent.frame.x)\n+        assert self.joint.joint_point.vel(self.parent.frame) == v2 * self.parennt.frame.x\n+\n+    def test_joint_set_child_angular_velocity(self):\n+        v3 = dynamicsymbols('v3')\n+        self.joint.set_child_angular_vel(v3 * self.parent.frame.z)\n+        assert self.child.frame.ang_vel_in(self.parent.frame) == v3 * self.parent.frame.z\n+\n+    def test_joint_orient_child(self):\n+        q1 = Symbol('q1')\n+        self.joint.orient_child('Axis', [q1, self.parent.frame.x])\n+\n+        # TODO other similar frame.orient() tests can be done.\n+        # leaving more tests to discuss its necessity with others.\n+\n+\n+class TestPinJoint():\n+    def setup(self):\n+        self.parent = Body('parent')\n+        self.child = Body('child')\n+        self.pinjoint = PinJoint('pinjoint', self.parent, self.child)\n+\n+    def test_pinjoint_init(self):\n+        # default values\n+        assert self.pinjoint.parent_axis == self.parent.frame.x\n+        assert self.pinjoint.child_axis == self.child.frame.x\n+        assert self.pinjoint.parent_point == self.parent.masscenter\n+        assert self.pinjoint.child_point == self.child.masscenter\n+        assert self.pinjoint.parent_joint_vector == self.parent.frame.x\n+        assert self.pinjoint.child_joint_vector == self.child.frame.x\n+\n+        assert self.parent_point.vel(self.parent.frame) == 0\n+        assert self.child_point.vel(self.child.frame) == 0\n+\n+    def test_pinjoint_parameters(self):\n+        self.pinjoint = PinJoint('pinjoint', self.parent, self.child, par_point_vec_tuple=(1, 0, 0),\n+                                 child_point_vec_tuple=(0, 1, 0), parent_axis='x', child_axis='y')\n+        assert self.pinjoint.parent_axis == self.parent.frame.x\n+        assert self.pinjoint.child_axis == self.child.frame.y\n+        point1 = self.parent.masscenter.locatenew(self.parent.frame, self.parent.frame.x)\n+        point2 = self.child.masscenter.locatenew(self.child.frame, self.child.frame.y)\n+        assert self.pinjoint.parent_point == point1\n+        assert self.pinjoint.child_joint_piont == point2\n+        assert self.pinjoint.parent_joint_vector == self.parent.frame.x\n+        assert self.pinjoint.child_joint_vector == self.chidl.frame.y\n+\n+    def test_pinjoint_tuple_vector(self):\n+        a, b, c, d, e, f = symbols('a b c d e f')\n+        pinjoint = PinJoint('pinjoint', self.parent, self.child, par_point_vec_tuple=(a, b, c),\n+                            child_point_vec_tuple=(d, e, f), parent_axis='x', child_axis='y')\n+        assert pinjoint.parent_joint_vector == a * self.parent.frame.x + b * self.parent.frame.y + c * self.parent.frame.z\n+        assert pinjoint.child_joint_vector == d * self.child.frame.x + e * self.child.frame.y + f * self.child.frame.z\n+\n+    def test_pinjoint_functions(self):\n+\n+        # part 1 assining parent-child relationship\n+        self.pinjoint._set_parent_child_rel()\n+        assert self.child.parent == self.parent\n+        assert self.parent.child == self.child\n+\n+        # part 2 locating joint point in bodies\n+        self.pinjoint._locate_joint_point()\n+        child_masscenter = self.child.masscenter\n+        parent_masscenter = self.parent.masscenter\n+        parent_point = parent_masscenter.locatenew(self.name + '_Point', self.parent_joint_vector)\n+        child_point = child_masscenter.locatenew(self.name + '_Point', self.child_joint_vector)\n+        assert self.pinjoint.parent_joint_vector == parent_point\n+        assert self.pinjoint.child_joint_vector == child_point\n+\n+        # part 3 aligning parent_axis and child_axis\n+        self.join_frames()\n+        # sample implementation\n+        # self.child.frame.orient(self.parent.frame, 'Axis', [0, self.parent.frame.x])\n+        assert cross(self.pinjoint.parent_axis, self.pinjoint.child_axis) == self.child.frame.z\n+        assert cross(self.pinjoint.child_axis, self.pinjoint.parent_axis) == - self.parent.frame.z\n+        self.align_axes()\n+        parent_axis = self.pinjoint.parent_axis\n+        child_axis = self.pinjoint.child_axis\n+        # sample implementation\n+        # perpendicular_axis_in_parent = - cross(parent_axis, child_axis)\n+        # angle_between_axes = acos(dot(self.pinjoint.child_axis, self.pinjoint.parent_axis))\n+        # self.child.frame.orient(self.parent.frame, 'Axis',\n+        #                        [acos(dot(parent_axis, child_axis)/(parent_axis.magnitude() * child_axis.magnitude())),\n+        #                         cross(parent_axis, child_axis)])\n+        assert acos(dot(parent_axis, child_axis)/(parent_axis.magnitude() * child_axis.magnitude())) == 0\n+\n+        # part 4 adding angular velocity to child w.r.t parent.\n+        assert self.child.frame.ang_vel_in(self.parent.frame) != 0\n+\n+    def test_pinjoint_apply_joint(self):\n+        # apply_joint() should do everything done above by calling specific funtions\n+        self.new_pinjoint = PinJoint('pinjoint', self.parent, self.child)\n+        self.new_pinjoint._apply_joint()\n+        # part 1\n+        assert self.child.parent == self.parent\n+        assert self.parent.child == self.child\n+\n+        # part 2\n+        child_masscenter = self.child.masscenter\n+        parent_masscenter = self.parent.masscenter\n+        parent_point = parent_masscenter.locatenew(self.name + '_Point', self.parent_joint_vector)\n+        child_point = child_masscenter.locatenew(self.name + '_Point', self.child_joint_vector)\n+        assert self.pinjoint.parent_joint_vector == parent_point\n+        assert self.pinjoint.child_joint_vector == child_point\n+\n+        # part 4\n+        parent_axis = self.pinjoint.parent_axis\n+        child_axis = self.pinjoint.child_axis\n+        assert acos(dot(parent_axis, child_axis)/(parent_axis.magnitude() * child_axis.magnitude())) == 0\n+\n+\n+class TestSlidingJoint():\n+    def setup(self):\n+        self.parent = Body('parent')\n+        self.child = Body('child')\n+        self.slidingjoint = SlidingJoint('slidingjoint', self.parent, self.child)\n+\n+    def test_slidingjoint_init(self):\n+        # Default values\n+        assert self.slidingjoint.parent == self.parent\n+        assert self.slidingjoint.child == self.child\n+        assert self.slidingjoint.direction1 == self.parent.x\n+        assert self.slidingjoint.direction2 == self.child.x\n+        assert self.slidingjoint.parent_point == self.parent.masscenter\n+        assert self.slidingjoint.child_point == self.child.masscenter\n+\n+    def test_slidingjoint_paramters(self):\n+        # custom parameters\n+        self.slidingjoint = SlidingJoint('slidingjoint', self.parent, self.child, par_point_vec_tuple=(1,0,0),\n+                                         child_point_vec_tuple=(0,1,0), direction1='x', direction2='y')\n+        assert self.pinjoint.direction1 == self.parent.frame.x\n+        assert self.pinjoint.direction2 == self.child.frame.y\n+        point1 = self.parent.masscenter.locatenew(self.parent.frame, self.parent.frame.x)\n+        point2 = self.child.masscenter.locatenew(self.child.frame, self.child.frame.y)\n+        assert self.pinjoint.parent_point == point1\n+        assert self.pinjoint.child_joint_piont == point2\n+        assert self.pinjoint.parent_joint_vector == self.parent.frame.x\n+        assert self.pinjoint.child_joint_vector == self.child.frame.y\n+\n+    def test_slidingjoint_functions(self):\n+        self.slidingjoint._set_parent_child_rel()\n+        assert self.parent.child == self.child\n+        assert self.child.parent == self.parent\n+\n+        self.slidingjoint._locate_joint_point()\n+        child_masscenter = self.child.masscenter\n+        parent_masscenter = self.parent.masscenter\n+        parent_point = parent_masscenter.locatenew(self.name + '_Point', self.parent_joint_vector)\n+        child_point = child_masscenter.locatenew(self.name + '_Point', self.child_joint_vector)\n+        assert self.pinjoint.parent_joint_vector == parent_point\n+        assert self.pinjoint.child_joint_vector == child_point\n+\n+        self.join_frames()\n+        assert cross(self.pinjoint.parent_axis, self.pinjoint.child_axis) == self.child.frame.z\n+        assert cross(self.pinjoint.child_axis, self.pinjoint.parent_axis) == - self.parent.frame.z\n+\n+        self.align_axes()\n+        parent_axis = self.pinjoint.parent_axis\n+        child_axis = self.pinjoint.child_axis\n+        assert acos(dot(parent_axis, child_axis)/(parent_axis.magnitude() * child_axis.magnitude())) == 0\n+\n+        # Similar to Pinjoint but have a velocity instead of angular velocity.\n+        assert self.child_point.vel(self.parent.frame) != 0","path":"pydy/tests/test_joints.py","position":216,"original_position":216,"commit_id":"163de69da755a51b31d99aca3e555325db577c2f","original_commit_id":"163de69da755a51b31d99aca3e555325db577c2f","user":{"login":"moorepants","id":276007,"avatar_url":"https://avatars.githubusercontent.com/u/276007?v=3","gravatar_id":"","url":"https://api.github.com/users/moorepants","html_url":"https://github.com/moorepants","followers_url":"https://api.github.com/users/moorepants/followers","following_url":"https://api.github.com/users/moorepants/following{/other_user}","gists_url":"https://api.github.com/users/moorepants/gists{/gist_id}","starred_url":"https://api.github.com/users/moorepants/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/moorepants/subscriptions","organizations_url":"https://api.github.com/users/moorepants/orgs","repos_url":"https://api.github.com/users/moorepants/repos","events_url":"https://api.github.com/users/moorepants/events{/privacy}","received_events_url":"https://api.github.com/users/moorepants/received_events","type":"User","site_admin":false},"body":"This test is missing any all information about the velocities. You need tests that make sure the coordinate and velocity associated with this joint have been created properly.","created_at":"2015-07-14T18:28:20Z","updated_at":"2015-07-14T18:28:20Z","html_url":"https://github.com/pydy/pydy/pull/255#discussion_r34601962","pull_request_url":"https://api.github.com/repos/pydy/pydy/pulls/255","_links":{"self":{"href":"https://api.github.com/repos/pydy/pydy/pulls/comments/34601962"},"html":{"href":"https://github.com/pydy/pydy/pull/255#discussion_r34601962"},"pull_request":{"href":"https://api.github.com/repos/pydy/pydy/pulls/255"}}},"pull_request":{"url":"https://api.github.com/repos/pydy/pydy/pulls/255","id":39183003,"html_url":"https://github.com/pydy/pydy/pull/255","diff_url":"https://github.com/pydy/pydy/pull/255.diff","patch_url":"https://github.com/pydy/pydy/pull/255.patch","issue_url":"https://api.github.com/repos/pydy/pydy/issues/255","number":255,"state":"open","locked":false,"title":"Unit tests for Joint classes","user":{"login":"sahilshekhawat","id":5890452,"avatar_url":"https://avatars.githubusercontent.com/u/5890452?v=3","gravatar_id":"","url":"https://api.github.com/users/sahilshekhawat","html_url":"https://github.com/sahilshekhawat","followers_url":"https://api.github.com/users/sahilshekhawat/followers","following_url":"https://api.github.com/users/sahilshekhawat/following{/other_user}","gists_url":"https://api.github.com/users/sahilshekhawat/gists{/gist_id}","starred_url":"https://api.github.com/users/sahilshekhawat/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/sahilshekhawat/subscriptions","organizations_url":"https://api.github.com/users/sahilshekhawat/orgs","repos_url":"https://api.github.com/users/sahilshekhawat/repos","events_url":"https://api.github.com/users/sahilshekhawat/events{/privacy}","received_events_url":"https://api.github.com/users/sahilshekhawat/received_events","type":"User","site_admin":false},"body":"All the details are in docstrings of fucntions","created_at":"2015-07-03T15:18:03Z","updated_at":"2015-07-14T18:28:20Z","closed_at":null,"merged_at":null,"merge_commit_sha":"da90fb259eacd0da8c132ba618726067568ba493","assignee":null,"milestone":null,"commits_url":"https://api.github.com/repos/pydy/pydy/pulls/255/commits","review_comments_url":"https://api.github.com/repos/pydy/pydy/pulls/255/comments","review_comment_url":"https://api.github.com/repos/pydy/pydy/pulls/comments{/number}","comments_url":"https://api.github.com/repos/pydy/pydy/issues/255/comments","statuses_url":"https://api.github.com/repos/pydy/pydy/statuses/163de69da755a51b31d99aca3e555325db577c2f","head":{"label":"sahilshekhawat:system_joints_joints","ref":"system_joints_joints","sha":"163de69da755a51b31d99aca3e555325db577c2f","user":{"login":"sahilshekhawat","id":5890452,"avatar_url":"https://avatars.githubusercontent.com/u/5890452?v=3","gravatar_id":"","url":"https://api.github.com/users/sahilshekhawat","html_url":"https://github.com/sahilshekhawat","followers_url":"https://api.github.com/users/sahilshekhawat/followers","following_url":"https://api.github.com/users/sahilshekhawat/following{/other_user}","gists_url":"https://api.github.com/users/sahilshekhawat/gists{/gist_id}","starred_url":"https://api.github.com/users/sahilshekhawat/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/sahilshekhawat/subscriptions","organizations_url":"https://api.github.com/users/sahilshekhawat/orgs","repos_url":"https://api.github.com/users/sahilshekhawat/repos","events_url":"https://api.github.com/users/sahilshekhawat/events{/privacy}","received_events_url":"https://api.github.com/users/sahilshekhawat/received_events","type":"User","site_admin":false},"repo":{"id":30242917,"name":"pydy","full_name":"sahilshekhawat/pydy","owner":{"login":"sahilshekhawat","id":5890452,"avatar_url":"https://avatars.githubusercontent.com/u/5890452?v=3","gravatar_id":"","url":"https://api.github.com/users/sahilshekhawat","html_url":"https://github.com/sahilshekhawat","followers_url":"https://api.github.com/users/sahilshekhawat/followers","following_url":"https://api.github.com/users/sahilshekhawat/following{/other_user}","gists_url":"https://api.github.com/users/sahilshekhawat/gists{/gist_id}","starred_url":"https://api.github.com/users/sahilshekhawat/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/sahilshekhawat/subscriptions","organizations_url":"https://api.github.com/users/sahilshekhawat/orgs","repos_url":"https://api.github.com/users/sahilshekhawat/repos","events_url":"https://api.github.com/users/sahilshekhawat/events{/privacy}","received_events_url":"https://api.github.com/users/sahilshekhawat/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/sahilshekhawat/pydy","description":"Multibody dynamics tool kit.","fork":true,"url":"https://api.github.com/repos/sahilshekhawat/pydy","forks_url":"https://api.github.com/repos/sahilshekhawat/pydy/forks","keys_url":"https://api.github.com/repos/sahilshekhawat/pydy/keys{/key_id}","collaborators_url":"https://api.github.com/repos/sahilshekhawat/pydy/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/sahilshekhawat/pydy/teams","hooks_url":"https://api.github.com/repos/sahilshekhawat/pydy/hooks","issue_events_url":"https://api.github.com/repos/sahilshekhawat/pydy/issues/events{/number}","events_url":"https://api.github.com/repos/sahilshekhawat/pydy/events","assignees_url":"https://api.github.com/repos/sahilshekhawat/pydy/assignees{/user}","branches_url":"https://api.github.com/repos/sahilshekhawat/pydy/branches{/branch}","tags_url":"https://api.github.com/repos/sahilshekhawat/pydy/tags","blobs_url":"https://api.github.com/repos/sahilshekhawat/pydy/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/sahilshekhawat/pydy/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/sahilshekhawat/pydy/git/refs{/sha}","trees_url":"https://api.github.com/repos/sahilshekhawat/pydy/git/trees{/sha}","statuses_url":"https://api.github.com/repos/sahilshekhawat/pydy/statuses/{sha}","languages_url":"https://api.github.com/repos/sahilshekhawat/pydy/languages","stargazers_url":"https://api.github.com/repos/sahilshekhawat/pydy/stargazers","contributors_url":"https://api.github.com/repos/sahilshekhawat/pydy/contributors","subscribers_url":"https://api.github.com/repos/sahilshekhawat/pydy/subscribers","subscription_url":"https://api.github.com/repos/sahilshekhawat/pydy/subscription","commits_url":"https://api.github.com/repos/sahilshekhawat/pydy/commits{/sha}","git_commits_url":"https://api.github.com/repos/sahilshekhawat/pydy/git/commits{/sha}","comments_url":"https://api.github.com/repos/sahilshekhawat/pydy/comments{/number}","issue_comment_url":"https://api.github.com/repos/sahilshekhawat/pydy/issues/comments{/number}","contents_url":"https://api.github.com/repos/sahilshekhawat/pydy/contents/{+path}","compare_url":"https://api.github.com/repos/sahilshekhawat/pydy/compare/{base}...{head}","merges_url":"https://api.github.com/repos/sahilshekhawat/pydy/merges","archive_url":"https://api.github.com/repos/sahilshekhawat/pydy/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/sahilshekhawat/pydy/downloads","issues_url":"https://api.github.com/repos/sahilshekhawat/pydy/issues{/number}","pulls_url":"https://api.github.com/repos/sahilshekhawat/pydy/pulls{/number}","milestones_url":"https://api.github.com/repos/sahilshekhawat/pydy/milestones{/number}","notifications_url":"https://api.github.com/repos/sahilshekhawat/pydy/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/sahilshekhawat/pydy/labels{/name}","releases_url":"https://api.github.com/repos/sahilshekhawat/pydy/releases{/id}","created_at":"2015-02-03T13:02:45Z","updated_at":"2015-05-04T13:12:40Z","pushed_at":"2015-07-12T13:01:15Z","git_url":"git://github.com/sahilshekhawat/pydy.git","ssh_url":"git@github.com:sahilshekhawat/pydy.git","clone_url":"https://github.com/sahilshekhawat/pydy.git","svn_url":"https://github.com/sahilshekhawat/pydy","homepage":"http://pydy.org","size":9495,"stargazers_count":0,"watchers_count":0,"language":"Python","has_issues":false,"has_downloads":true,"has_wiki":true,"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":"pydy:master","ref":"master","sha":"c133def808554a8c59c92518f0fb670223b2f357","user":{"login":"pydy","id":5125293,"avatar_url":"https://avatars.githubusercontent.com/u/5125293?v=3","gravatar_id":"","url":"https://api.github.com/users/pydy","html_url":"https://github.com/pydy","followers_url":"https://api.github.com/users/pydy/followers","following_url":"https://api.github.com/users/pydy/following{/other_user}","gists_url":"https://api.github.com/users/pydy/gists{/gist_id}","starred_url":"https://api.github.com/users/pydy/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/pydy/subscriptions","organizations_url":"https://api.github.com/users/pydy/orgs","repos_url":"https://api.github.com/users/pydy/repos","events_url":"https://api.github.com/users/pydy/events{/privacy}","received_events_url":"https://api.github.com/users/pydy/received_events","type":"Organization","site_admin":false},"repo":{"id":12165060,"name":"pydy","full_name":"pydy/pydy","owner":{"login":"pydy","id":5125293,"avatar_url":"https://avatars.githubusercontent.com/u/5125293?v=3","gravatar_id":"","url":"https://api.github.com/users/pydy","html_url":"https://github.com/pydy","followers_url":"https://api.github.com/users/pydy/followers","following_url":"https://api.github.com/users/pydy/following{/other_user}","gists_url":"https://api.github.com/users/pydy/gists{/gist_id}","starred_url":"https://api.github.com/users/pydy/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/pydy/subscriptions","organizations_url":"https://api.github.com/users/pydy/orgs","repos_url":"https://api.github.com/users/pydy/repos","events_url":"https://api.github.com/users/pydy/events{/privacy}","received_events_url":"https://api.github.com/users/pydy/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/pydy/pydy","description":"Multibody dynamics tool kit.","fork":false,"url":"https://api.github.com/repos/pydy/pydy","forks_url":"https://api.github.com/repos/pydy/pydy/forks","keys_url":"https://api.github.com/repos/pydy/pydy/keys{/key_id}","collaborators_url":"https://api.github.com/repos/pydy/pydy/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/pydy/pydy/teams","hooks_url":"https://api.github.com/repos/pydy/pydy/hooks","issue_events_url":"https://api.github.com/repos/pydy/pydy/issues/events{/number}","events_url":"https://api.github.com/repos/pydy/pydy/events","assignees_url":"https://api.github.com/repos/pydy/pydy/assignees{/user}","branches_url":"https://api.github.com/repos/pydy/pydy/branches{/branch}","tags_url":"https://api.github.com/repos/pydy/pydy/tags","blobs_url":"https://api.github.com/repos/pydy/pydy/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/pydy/pydy/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/pydy/pydy/git/refs{/sha}","trees_url":"https://api.github.com/repos/pydy/pydy/git/trees{/sha}","statuses_url":"https://api.github.com/repos/pydy/pydy/statuses/{sha}","languages_url":"https://api.github.com/repos/pydy/pydy/languages","stargazers_url":"https://api.github.com/repos/pydy/pydy/stargazers","contributors_url":"https://api.github.com/repos/pydy/pydy/contributors","subscribers_url":"https://api.github.com/repos/pydy/pydy/subscribers","subscription_url":"https://api.github.com/repos/pydy/pydy/subscription","commits_url":"https://api.github.com/repos/pydy/pydy/commits{/sha}","git_commits_url":"https://api.github.com/repos/pydy/pydy/git/commits{/sha}","comments_url":"https://api.github.com/repos/pydy/pydy/comments{/number}","issue_comment_url":"https://api.github.com/repos/pydy/pydy/issues/comments{/number}","contents_url":"https://api.github.com/repos/pydy/pydy/contents/{+path}","compare_url":"https://api.github.com/repos/pydy/pydy/compare/{base}...{head}","merges_url":"https://api.github.com/repos/pydy/pydy/merges","archive_url":"https://api.github.com/repos/pydy/pydy/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/pydy/pydy/downloads","issues_url":"https://api.github.com/repos/pydy/pydy/issues{/number}","pulls_url":"https://api.github.com/repos/pydy/pydy/pulls{/number}","milestones_url":"https://api.github.com/repos/pydy/pydy/milestones{/number}","notifications_url":"https://api.github.com/repos/pydy/pydy/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/pydy/pydy/labels{/name}","releases_url":"https://api.github.com/repos/pydy/pydy/releases{/id}","created_at":"2013-08-16T18:16:29Z","updated_at":"2015-07-14T07:34:20Z","pushed_at":"2015-07-12T13:02:16Z","git_url":"git://github.com/pydy/pydy.git","ssh_url":"git@github.com:pydy/pydy.git","clone_url":"https://github.com/pydy/pydy.git","svn_url":"https://github.com/pydy/pydy","homepage":"http://www.pydy.org","size":13471,"stargazers_count":32,"watchers_count":32,"language":"Python","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":27,"mirror_url":null,"open_issues_count":60,"forks":27,"open_issues":60,"watchers":32,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/pydy/pydy/pulls/255"},"html":{"href":"https://github.com/pydy/pydy/pull/255"},"issue":{"href":"https://api.github.com/repos/pydy/pydy/issues/255"},"comments":{"href":"https://api.github.com/repos/pydy/pydy/issues/255/comments"},"review_comments":{"href":"https://api.github.com/repos/pydy/pydy/pulls/255/comments"},"review_comment":{"href":"https://api.github.com/repos/pydy/pydy/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/pydy/pydy/pulls/255/commits"},"statuses":{"href":"https://api.github.com/repos/pydy/pydy/statuses/163de69da755a51b31d99aca3e555325db577c2f"}}}}