{"action":"created","comment":{"url":"https://api.github.com/repos/sorgerlab/minerva-lib-python/pulls/comments/186772355","pull_request_review_id":118417502,"id":186772355,"diff_hunk":"@@ -1,102 +1,87 @@\n import numpy as np\n+import skimage.exposure\n \n \n-def to_f32(img):\n-    '''Scale the dynamic range to 0.0 - 1.0\n+def clip_image(channel):\n+    ''' Clip an image from min, max to 0,1\n \n     Arguments:\n-    img: An integer image\n+        channel: Dict to blend with rendering settings:\n+            {\n+                image: Numpy 2D image data\n+                color: r, g, b float32 array within 0, 1\n+                min: Range minimum, float32 range 0, 1\n+                max: Range maximum, float32 range 0, 1\n+            }\n+\n+    Returns:\n+        Threshholded float32 image normalzied within 0, 1\n+        r, g, b float32 array color within 0, 1\n     '''\n \n-    # No well-defined behavior for decimal values or values less than 0\n-    try:\n-        dtype_info = np.iinfo(img.dtype)\n-        assert dtype_info.min is 0\n-    except (ValueError, AssertionError):\n-        raise ValueError('Scaling to 0,1 requires unsigned integers')\n+    f32_range = (channel['min'], channel['max'])\n+    f32_image = skimage.img_as_float(channel['image'])\n \n-    one = dtype_info.max\n-    return np.float32(img / one)\n+    # Return rescaled image and color for additive blending\n+    f32_image = skimage.exposure.rescale_intensity(f32_image, f32_range)\n+    return f32_image, channel['color']\n \n \n-def f32_to_bgr(f_img, color=[1, 1, 1]):\n-    '''Reshape into a color image\n+def make_rgb(image, color):\n+    ''' Yield 3 image channels for r, g, b\n \n     Arguments:\n-    f_img: float32 image to reshape\n+        image: Numpy 2D image data\n+        color: r, g, b float32 array within 0, 1\n+\n+    Yields:\n+        Numpy 2D image data for r, g, b channels\n     '''\n \n-    # All inputs should be normalized between 0 and 1\n-    try:\n-        assert np.all((f_img >= 0) & (f_img <= 1))\n-    except AssertionError:\n-        raise ValueError('Color image requires values from 0,1')\n+    for scalar in color:\n+        yield image * scalar\n \n-    # Give the image a color dimension\n-    f_vol = f_img[:, :, np.newaxis]\n-    f_bgr = np.repeat(f_vol, 3, 2) * color\n-    return np.round(255 * f_bgr).astype(np.uint8)\n \n+def linear_rgb(channels):\n+    '''Blend all channels into one normalized image\n \n-def linear_bgr(channels):\n-    '''Blend all channels given\n     Arguments:\n         channels: List of dicts of channels to blend with rendering settings:\n             {\n                 image: Numpy image data\n-                color: N-channel by b, g, r float32 color\n-                min: Range minimum, float32 range\n-                max: Range maximum, float32 range\n+                color: r, g, b float32 array within 0, 1\n+                min: Range minimum, float32 range 0, 1\n+                max: Range maximum, float32 range 0, 1\n             }\n \n     Returns:\n-        uint8 y by x by 3 color BGR image\n+        float32 y by x by r, g, b color image within 0, 1\n     '''\n \n-    # Get the number of channels\n-    num_channels = len(channels)\n-\n-    # Must be at least one channel\n-    if num_channels < 1:\n-        raise ValueError('At least one channel must be specified')\n-\n-    # Ensure that dimensions of all channels are equal\n-    shape = channels[0]['image'].shape\n-    for channel in channels:\n-        if channel['image'].shape != shape:\n-            raise ValueError('All channel images must have equal dimensions')\n-\n-    # Shape of 3 color image\n-    shape_color = shape + (3,)\n-\n-    # Final buffer for blending\n-    image_buffer = np.zeros(shape_color, dtype=np.float32)\n+    num_channels = 0\n \n-    # Process all channels\n-    for channel in channels:\n+    # rescaled images and normalized colors\n+    for image, color in map(clip_image, channels):\n \n-        image = channel['image']\n-        color = channel['color']\n-        min_ = channel['min']\n-        max_ = channel['max']\n+        num_channels += 1\n+        if num_channels == 1:","path":"src/minerva_lib/blend.py","position":null,"original_position":120,"commit_id":"a9737baae9314b87c7ea876ac8dd070ef43594fd","original_commit_id":"6a3dc2da8cfcb4d2306afd894ce0c36326a87718","user":{"login":"thejohnhoffer","id":9781588,"avatar_url":"https://avatars2.githubusercontent.com/u/9781588?v=4","gravatar_id":"","url":"https://api.github.com/users/thejohnhoffer","html_url":"https://github.com/thejohnhoffer","followers_url":"https://api.github.com/users/thejohnhoffer/followers","following_url":"https://api.github.com/users/thejohnhoffer/following{/other_user}","gists_url":"https://api.github.com/users/thejohnhoffer/gists{/gist_id}","starred_url":"https://api.github.com/users/thejohnhoffer/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/thejohnhoffer/subscriptions","organizations_url":"https://api.github.com/users/thejohnhoffer/orgs","repos_url":"https://api.github.com/users/thejohnhoffer/repos","events_url":"https://api.github.com/users/thejohnhoffer/events{/privacy}","received_events_url":"https://api.github.com/users/thejohnhoffer/received_events","type":"User","site_admin":false},"body":"done `refactor composite_image for single channel`\r\n","created_at":"2018-05-08T15:37:01Z","updated_at":"2018-05-08T15:37:01Z","html_url":"https://github.com/sorgerlab/minerva-lib-python/pull/17#discussion_r186772355","pull_request_url":"https://api.github.com/repos/sorgerlab/minerva-lib-python/pulls/17","author_association":"CONTRIBUTOR","_links":{"self":{"href":"https://api.github.com/repos/sorgerlab/minerva-lib-python/pulls/comments/186772355"},"html":{"href":"https://github.com/sorgerlab/minerva-lib-python/pull/17#discussion_r186772355"},"pull_request":{"href":"https://api.github.com/repos/sorgerlab/minerva-lib-python/pulls/17"}},"in_reply_to_id":186203935},"pull_request":{"url":"https://api.github.com/repos/sorgerlab/minerva-lib-python/pulls/17","id":184140117,"html_url":"https://github.com/sorgerlab/minerva-lib-python/pull/17","diff_url":"https://github.com/sorgerlab/minerva-lib-python/pull/17.diff","patch_url":"https://github.com/sorgerlab/minerva-lib-python/pull/17.patch","issue_url":"https://api.github.com/repos/sorgerlab/minerva-lib-python/issues/17","number":17,"state":"open","locked":false,"title":"Fix clipping, additive blending, color order","user":{"login":"thejohnhoffer","id":9781588,"avatar_url":"https://avatars2.githubusercontent.com/u/9781588?v=4","gravatar_id":"","url":"https://api.github.com/users/thejohnhoffer","html_url":"https://github.com/thejohnhoffer","followers_url":"https://api.github.com/users/thejohnhoffer/followers","following_url":"https://api.github.com/users/thejohnhoffer/following{/other_user}","gists_url":"https://api.github.com/users/thejohnhoffer/gists{/gist_id}","starred_url":"https://api.github.com/users/thejohnhoffer/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/thejohnhoffer/subscriptions","organizations_url":"https://api.github.com/users/thejohnhoffer/orgs","repos_url":"https://api.github.com/users/thejohnhoffer/repos","events_url":"https://api.github.com/users/thejohnhoffer/events{/privacy}","received_events_url":"https://api.github.com/users/thejohnhoffer/received_events","type":"User","site_admin":false},"body":"This pull request address changes to `linear_bgr` implementation, interface, and tests. This pull request renames `linear_bgr` to `composite_channels`. \r\n\r\n- The tests reflect the name-change by [defining colors][0] as RBG triplets instead of BGR triplets. \r\n- The tests also now [expect the output][1] to be a float32 RGB array with values between 0 and 1. \r\n- The tests have been updated for [addition instead of averaging][2] when blending channels. \r\n- The tests now expect [values above the maximum][3] to be clipped at 1 instead of 0.\r\n\r\nThis fixes #16 \r\n    - Values above the maximum are now set to the maximum, not zero\r\n\r\nThis fixes #15 \r\n    - Our tests document skimage [RBG order][0] and depend on skimage for threshholding/normalization\r\n\r\nThis fixes #14 \r\n    - All the input ranges and colors are clearly documented as within 0, 1\r\n\r\nThis fixes #18 \r\n    - All tests construct typed arrays using `np.array(*, dtype=*)`\r\n\r\nWhile the input argument `channels` must be a list, the function `composite_channel` can be used in a custom implementation of a function such as `composite_channels` to handle iterators and queues. \r\n \r\n[0]: https://github.com/sorgerlab/minerva-lib-python/pull/17/commits/30cf6178ef824d12a020e23251c55531958bb4c0#diff-4438daa1ceea9cdeeef65ab8cfb5075dL46\r\n[1]: https://github.com/sorgerlab/minerva-lib-python/pull/17/commits/30cf6178ef824d12a020e23251c55531958bb4c0#diff-4438daa1ceea9cdeeef65ab8cfb5075dL159\r\n[2]: https://github.com/sorgerlab/minerva-lib-python/pull/17/commits/0b1f59c260dc182da4fde1c30a42867fab1b1b4b#diff-4438daa1ceea9cdeeef65ab8cfb5075dL237\r\n[3]: https://github.com/sorgerlab/minerva-lib-python/pull/17/commits/0e6f4b0d4138100679bae738abf5dfb41bc6bc73#diff-4438daa1ceea9cdeeef65ab8cfb5075dL258","created_at":"2018-04-25T19:31:49Z","updated_at":"2018-05-08T15:37:01Z","closed_at":null,"merged_at":null,"merge_commit_sha":"d84cfe99038ecf8d3f35a9a30ef173dbfda97d21","assignee":null,"assignees":[],"requested_reviewers":[{"login":"jmuhlich","id":277154,"avatar_url":"https://avatars1.githubusercontent.com/u/277154?v=4","gravatar_id":"","url":"https://api.github.com/users/jmuhlich","html_url":"https://github.com/jmuhlich","followers_url":"https://api.github.com/users/jmuhlich/followers","following_url":"https://api.github.com/users/jmuhlich/following{/other_user}","gists_url":"https://api.github.com/users/jmuhlich/gists{/gist_id}","starred_url":"https://api.github.com/users/jmuhlich/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/jmuhlich/subscriptions","organizations_url":"https://api.github.com/users/jmuhlich/orgs","repos_url":"https://api.github.com/users/jmuhlich/repos","events_url":"https://api.github.com/users/jmuhlich/events{/privacy}","received_events_url":"https://api.github.com/users/jmuhlich/received_events","type":"User","site_admin":false}],"requested_teams":[],"labels":[],"milestone":null,"commits_url":"https://api.github.com/repos/sorgerlab/minerva-lib-python/pulls/17/commits","review_comments_url":"https://api.github.com/repos/sorgerlab/minerva-lib-python/pulls/17/comments","review_comment_url":"https://api.github.com/repos/sorgerlab/minerva-lib-python/pulls/comments{/number}","comments_url":"https://api.github.com/repos/sorgerlab/minerva-lib-python/issues/17/comments","statuses_url":"https://api.github.com/repos/sorgerlab/minerva-lib-python/statuses/a9737baae9314b87c7ea876ac8dd070ef43594fd","head":{"label":"thejohnhoffer:fix_clipping","ref":"fix_clipping","sha":"a9737baae9314b87c7ea876ac8dd070ef43594fd","user":{"login":"thejohnhoffer","id":9781588,"avatar_url":"https://avatars2.githubusercontent.com/u/9781588?v=4","gravatar_id":"","url":"https://api.github.com/users/thejohnhoffer","html_url":"https://github.com/thejohnhoffer","followers_url":"https://api.github.com/users/thejohnhoffer/followers","following_url":"https://api.github.com/users/thejohnhoffer/following{/other_user}","gists_url":"https://api.github.com/users/thejohnhoffer/gists{/gist_id}","starred_url":"https://api.github.com/users/thejohnhoffer/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/thejohnhoffer/subscriptions","organizations_url":"https://api.github.com/users/thejohnhoffer/orgs","repos_url":"https://api.github.com/users/thejohnhoffer/repos","events_url":"https://api.github.com/users/thejohnhoffer/events{/privacy}","received_events_url":"https://api.github.com/users/thejohnhoffer/received_events","type":"User","site_admin":false},"repo":{"id":130416083,"name":"minerva-lib-python","full_name":"thejohnhoffer/minerva-lib-python","owner":{"login":"thejohnhoffer","id":9781588,"avatar_url":"https://avatars2.githubusercontent.com/u/9781588?v=4","gravatar_id":"","url":"https://api.github.com/users/thejohnhoffer","html_url":"https://github.com/thejohnhoffer","followers_url":"https://api.github.com/users/thejohnhoffer/followers","following_url":"https://api.github.com/users/thejohnhoffer/following{/other_user}","gists_url":"https://api.github.com/users/thejohnhoffer/gists{/gist_id}","starred_url":"https://api.github.com/users/thejohnhoffer/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/thejohnhoffer/subscriptions","organizations_url":"https://api.github.com/users/thejohnhoffer/orgs","repos_url":"https://api.github.com/users/thejohnhoffer/repos","events_url":"https://api.github.com/users/thejohnhoffer/events{/privacy}","received_events_url":"https://api.github.com/users/thejohnhoffer/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/thejohnhoffer/minerva-lib-python","description":"Minerva Python Library","fork":true,"url":"https://api.github.com/repos/thejohnhoffer/minerva-lib-python","forks_url":"https://api.github.com/repos/thejohnhoffer/minerva-lib-python/forks","keys_url":"https://api.github.com/repos/thejohnhoffer/minerva-lib-python/keys{/key_id}","collaborators_url":"https://api.github.com/repos/thejohnhoffer/minerva-lib-python/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/thejohnhoffer/minerva-lib-python/teams","hooks_url":"https://api.github.com/repos/thejohnhoffer/minerva-lib-python/hooks","issue_events_url":"https://api.github.com/repos/thejohnhoffer/minerva-lib-python/issues/events{/number}","events_url":"https://api.github.com/repos/thejohnhoffer/minerva-lib-python/events","assignees_url":"https://api.github.com/repos/thejohnhoffer/minerva-lib-python/assignees{/user}","branches_url":"https://api.github.com/repos/thejohnhoffer/minerva-lib-python/branches{/branch}","tags_url":"https://api.github.com/repos/thejohnhoffer/minerva-lib-python/tags","blobs_url":"https://api.github.com/repos/thejohnhoffer/minerva-lib-python/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/thejohnhoffer/minerva-lib-python/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/thejohnhoffer/minerva-lib-python/git/refs{/sha}","trees_url":"https://api.github.com/repos/thejohnhoffer/minerva-lib-python/git/trees{/sha}","statuses_url":"https://api.github.com/repos/thejohnhoffer/minerva-lib-python/statuses/{sha}","languages_url":"https://api.github.com/repos/thejohnhoffer/minerva-lib-python/languages","stargazers_url":"https://api.github.com/repos/thejohnhoffer/minerva-lib-python/stargazers","contributors_url":"https://api.github.com/repos/thejohnhoffer/minerva-lib-python/contributors","subscribers_url":"https://api.github.com/repos/thejohnhoffer/minerva-lib-python/subscribers","subscription_url":"https://api.github.com/repos/thejohnhoffer/minerva-lib-python/subscription","commits_url":"https://api.github.com/repos/thejohnhoffer/minerva-lib-python/commits{/sha}","git_commits_url":"https://api.github.com/repos/thejohnhoffer/minerva-lib-python/git/commits{/sha}","comments_url":"https://api.github.com/repos/thejohnhoffer/minerva-lib-python/comments{/number}","issue_comment_url":"https://api.github.com/repos/thejohnhoffer/minerva-lib-python/issues/comments{/number}","contents_url":"https://api.github.com/repos/thejohnhoffer/minerva-lib-python/contents/{+path}","compare_url":"https://api.github.com/repos/thejohnhoffer/minerva-lib-python/compare/{base}...{head}","merges_url":"https://api.github.com/repos/thejohnhoffer/minerva-lib-python/merges","archive_url":"https://api.github.com/repos/thejohnhoffer/minerva-lib-python/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/thejohnhoffer/minerva-lib-python/downloads","issues_url":"https://api.github.com/repos/thejohnhoffer/minerva-lib-python/issues{/number}","pulls_url":"https://api.github.com/repos/thejohnhoffer/minerva-lib-python/pulls{/number}","milestones_url":"https://api.github.com/repos/thejohnhoffer/minerva-lib-python/milestones{/number}","notifications_url":"https://api.github.com/repos/thejohnhoffer/minerva-lib-python/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/thejohnhoffer/minerva-lib-python/labels{/name}","releases_url":"https://api.github.com/repos/thejohnhoffer/minerva-lib-python/releases{/id}","deployments_url":"https://api.github.com/repos/thejohnhoffer/minerva-lib-python/deployments","created_at":"2018-04-20T21:35:55Z","updated_at":"2018-04-21T17:05:52Z","pushed_at":"2018-05-08T15:36:26Z","git_url":"git://github.com/thejohnhoffer/minerva-lib-python.git","ssh_url":"git@github.com:thejohnhoffer/minerva-lib-python.git","clone_url":"https://github.com/thejohnhoffer/minerva-lib-python.git","svn_url":"https://github.com/thejohnhoffer/minerva-lib-python","homepage":null,"size":38,"stargazers_count":0,"watchers_count":0,"language":"Python","has_issues":false,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":0,"mirror_url":null,"archived":false,"open_issues_count":0,"license":{"key":"gpl-3.0","name":"GNU General Public License v3.0","spdx_id":"GPL-3.0","url":"https://api.github.com/licenses/gpl-3.0"},"forks":0,"open_issues":0,"watchers":0,"default_branch":"master"}},"base":{"label":"sorgerlab:master","ref":"master","sha":"4207e2aa717796a2f63a231d034c8a23db15bbcc","user":{"login":"sorgerlab","id":432619,"avatar_url":"https://avatars3.githubusercontent.com/u/432619?v=4","gravatar_id":"","url":"https://api.github.com/users/sorgerlab","html_url":"https://github.com/sorgerlab","followers_url":"https://api.github.com/users/sorgerlab/followers","following_url":"https://api.github.com/users/sorgerlab/following{/other_user}","gists_url":"https://api.github.com/users/sorgerlab/gists{/gist_id}","starred_url":"https://api.github.com/users/sorgerlab/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/sorgerlab/subscriptions","organizations_url":"https://api.github.com/users/sorgerlab/orgs","repos_url":"https://api.github.com/users/sorgerlab/repos","events_url":"https://api.github.com/users/sorgerlab/events{/privacy}","received_events_url":"https://api.github.com/users/sorgerlab/received_events","type":"Organization","site_admin":false},"repo":{"id":129948201,"name":"minerva-lib-python","full_name":"sorgerlab/minerva-lib-python","owner":{"login":"sorgerlab","id":432619,"avatar_url":"https://avatars3.githubusercontent.com/u/432619?v=4","gravatar_id":"","url":"https://api.github.com/users/sorgerlab","html_url":"https://github.com/sorgerlab","followers_url":"https://api.github.com/users/sorgerlab/followers","following_url":"https://api.github.com/users/sorgerlab/following{/other_user}","gists_url":"https://api.github.com/users/sorgerlab/gists{/gist_id}","starred_url":"https://api.github.com/users/sorgerlab/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/sorgerlab/subscriptions","organizations_url":"https://api.github.com/users/sorgerlab/orgs","repos_url":"https://api.github.com/users/sorgerlab/repos","events_url":"https://api.github.com/users/sorgerlab/events{/privacy}","received_events_url":"https://api.github.com/users/sorgerlab/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/sorgerlab/minerva-lib-python","description":"Minerva Python Library","fork":false,"url":"https://api.github.com/repos/sorgerlab/minerva-lib-python","forks_url":"https://api.github.com/repos/sorgerlab/minerva-lib-python/forks","keys_url":"https://api.github.com/repos/sorgerlab/minerva-lib-python/keys{/key_id}","collaborators_url":"https://api.github.com/repos/sorgerlab/minerva-lib-python/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/sorgerlab/minerva-lib-python/teams","hooks_url":"https://api.github.com/repos/sorgerlab/minerva-lib-python/hooks","issue_events_url":"https://api.github.com/repos/sorgerlab/minerva-lib-python/issues/events{/number}","events_url":"https://api.github.com/repos/sorgerlab/minerva-lib-python/events","assignees_url":"https://api.github.com/repos/sorgerlab/minerva-lib-python/assignees{/user}","branches_url":"https://api.github.com/repos/sorgerlab/minerva-lib-python/branches{/branch}","tags_url":"https://api.github.com/repos/sorgerlab/minerva-lib-python/tags","blobs_url":"https://api.github.com/repos/sorgerlab/minerva-lib-python/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/sorgerlab/minerva-lib-python/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/sorgerlab/minerva-lib-python/git/refs{/sha}","trees_url":"https://api.github.com/repos/sorgerlab/minerva-lib-python/git/trees{/sha}","statuses_url":"https://api.github.com/repos/sorgerlab/minerva-lib-python/statuses/{sha}","languages_url":"https://api.github.com/repos/sorgerlab/minerva-lib-python/languages","stargazers_url":"https://api.github.com/repos/sorgerlab/minerva-lib-python/stargazers","contributors_url":"https://api.github.com/repos/sorgerlab/minerva-lib-python/contributors","subscribers_url":"https://api.github.com/repos/sorgerlab/minerva-lib-python/subscribers","subscription_url":"https://api.github.com/repos/sorgerlab/minerva-lib-python/subscription","commits_url":"https://api.github.com/repos/sorgerlab/minerva-lib-python/commits{/sha}","git_commits_url":"https://api.github.com/repos/sorgerlab/minerva-lib-python/git/commits{/sha}","comments_url":"https://api.github.com/repos/sorgerlab/minerva-lib-python/comments{/number}","issue_comment_url":"https://api.github.com/repos/sorgerlab/minerva-lib-python/issues/comments{/number}","contents_url":"https://api.github.com/repos/sorgerlab/minerva-lib-python/contents/{+path}","compare_url":"https://api.github.com/repos/sorgerlab/minerva-lib-python/compare/{base}...{head}","merges_url":"https://api.github.com/repos/sorgerlab/minerva-lib-python/merges","archive_url":"https://api.github.com/repos/sorgerlab/minerva-lib-python/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/sorgerlab/minerva-lib-python/downloads","issues_url":"https://api.github.com/repos/sorgerlab/minerva-lib-python/issues{/number}","pulls_url":"https://api.github.com/repos/sorgerlab/minerva-lib-python/pulls{/number}","milestones_url":"https://api.github.com/repos/sorgerlab/minerva-lib-python/milestones{/number}","notifications_url":"https://api.github.com/repos/sorgerlab/minerva-lib-python/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/sorgerlab/minerva-lib-python/labels{/name}","releases_url":"https://api.github.com/repos/sorgerlab/minerva-lib-python/releases{/id}","deployments_url":"https://api.github.com/repos/sorgerlab/minerva-lib-python/deployments","created_at":"2018-04-17T18:27:43Z","updated_at":"2018-04-21T16:25:29Z","pushed_at":"2018-05-08T15:36:28Z","git_url":"git://github.com/sorgerlab/minerva-lib-python.git","ssh_url":"git@github.com:sorgerlab/minerva-lib-python.git","clone_url":"https://github.com/sorgerlab/minerva-lib-python.git","svn_url":"https://github.com/sorgerlab/minerva-lib-python","homepage":null,"size":23,"stargazers_count":0,"watchers_count":0,"language":"Python","has_issues":true,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":3,"mirror_url":null,"archived":false,"open_issues_count":5,"license":{"key":"gpl-3.0","name":"GNU General Public License v3.0","spdx_id":"GPL-3.0","url":"https://api.github.com/licenses/gpl-3.0"},"forks":3,"open_issues":5,"watchers":0,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/sorgerlab/minerva-lib-python/pulls/17"},"html":{"href":"https://github.com/sorgerlab/minerva-lib-python/pull/17"},"issue":{"href":"https://api.github.com/repos/sorgerlab/minerva-lib-python/issues/17"},"comments":{"href":"https://api.github.com/repos/sorgerlab/minerva-lib-python/issues/17/comments"},"review_comments":{"href":"https://api.github.com/repos/sorgerlab/minerva-lib-python/pulls/17/comments"},"review_comment":{"href":"https://api.github.com/repos/sorgerlab/minerva-lib-python/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/sorgerlab/minerva-lib-python/pulls/17/commits"},"statuses":{"href":"https://api.github.com/repos/sorgerlab/minerva-lib-python/statuses/a9737baae9314b87c7ea876ac8dd070ef43594fd"}},"author_association":"CONTRIBUTOR"}}
{"actor":{"display_login":"thejohnhoffer"}}