{"action":"created","comment":{"url":"https://api.github.com/repos/ClusterHQ/pyzfs/pulls/comments/36304535","id":36304535,"diff_hunk":"@@ -655,6 +660,276 @@ def lzc_exists(name):\n     return bool(ret)\n \n \n+def _uncommitted(check_func = None):\n+    def _uncommitted_decorator(func, check_func = check_func):\n+        if check_func is None:\n+            check_func = func\n+\n+        @functools.wraps(func)\n+        def _f(*args, **kwargs):\n+            if not is_supported(check_func):\n+                raise NotImplementedError(func.__name__)\n+            return func(*args, **kwargs)\n+        return _f\n+    return _uncommitted_decorator\n+\n+\n+@_uncommitted()\n+def lzc_promote(name):\n+    '''\n+    Promotes the ZFS dataset.\n+\n+    :param str name: the name of the dataset to promote.\n+    '''\n+    ret = _lib.lzc_promote(name, _ffi.NULL)\n+    xlate.lzc_promote_xlate_error(ret, name)\n+\n+\n+@_uncommitted()\n+def lzc_rename(source, target):\n+    '''\n+    Rename the ZFS dataset.\n+\n+    :param source name: the current name of the dataset to rename.\n+    :param target name: the new name of the dataset.\n+    '''\n+    ret = _lib.lzc_rename(source, target, _ffi.NULL, _ffi.NULL)\n+    xlate.lzc_rename_xlate_error(ret, source, target)\n+\n+\n+@_uncommitted()\n+def lzc_destroy_one(name):\n+    '''\n+    Destroy the ZFS dataset.\n+\n+    :param str name: the name of the dataset to destroy.\n+    '''\n+    ret = _lib.lzc_destroy_one(name, _ffi.NULL)\n+    xlate.lzc_destroy_xlate_error(ret, name)\n+\n+\n+lzc_destroy = lzc_destroy_one\n+\n+\n+@_uncommitted()\n+def lzc_inherit(name, prop):\n+    '''\n+    Inherit properties from a parent dataset of the given ZFS dataset.\n+\n+    :param str name: the name of the dataset.\n+    :param str prop: the name of the property to inherit.\n+    '''\n+    ret = _lib.lzc_inherit(name, prop, _ffi.NULL)\n+    xlate.lzc_inherit_prop_xlate_error(ret, name, prop)\n+\n+\n+lzc_inherit_prop = lzc_inherit\n+\n+\n+@_uncommitted()\n+def lzc_set_props(name, prop, val):\n+    '''\n+    Set properties of the ZFS dataset.\n+\n+    :param str name: the name of the dataset.\n+    :param str prop: the name of the property.\n+    :param str val: the value of the property.\n+    '''\n+    props = { prop: val }\n+    props_nv = nvlist_in(props)\n+    ret = _lib.lzc_set_props(name, props_nv, _ffi.NULL, _ffi.NULL)\n+    xlate.lzc_set_prop_xlate_error(ret, name, prop, val)\n+\n+\n+lzc_set_prop = lzc_set_props\n+\n+\n+@_uncommitted()\n+def lzc_list(name, options):\n+    (rfd, wfd) = os.pipe()\n+    fcntl.fcntl(rfd, fcntl.F_SETFD, fcntl.FD_CLOEXEC)\n+    fcntl.fcntl(wfd, fcntl.F_SETFD, fcntl.FD_CLOEXEC)\n+    options['fd'] = int32_t(wfd)\n+    opts_nv = nvlist_in(options)\n+    ret = _lib.lzc_list(name, opts_nv)\n+    xlate.lzc_list_xlate_error(ret, name, options)\n+    return (rfd, wfd)\n+\n+\n+_PIPE_RECORD_FORMAT = 'IBBBB'\n+_PIPE_RECORD_SIZE = struct.calcsize(_PIPE_RECORD_FORMAT)\n+\n+\n+@_uncommitted(lzc_list)\n+def lzc_get_props(name):\n+    '''\n+    Get properties of the ZFS dataset.\n+\n+    :param str name: the name of the dataset.\n+    :return: a dictionary mapping the property names to their values.\n+    :rtype: dict of str:Any\n+\n+    .. note::\n+        The value of ``clones`` property is a `list` of clone names\n+        as byte strings.\n+\n+    .. warning::\n+        The returned dictionary does not contain entries for properties\n+        with default values.  One exception is the ``mountpoint`` property\n+        for which the default value is derived from the dataset name.\n+    '''\n+    (fd, other_fd) = lzc_list(name, {'recurse': 1})\n+    entry = None\n+    try:\n+        while True:\n+            record_bytes = os.read(fd, _PIPE_RECORD_SIZE)\n+            if not record_bytes:\n+                break\n+            (size, _, err, _, _) =  struct.unpack(_PIPE_RECORD_FORMAT, record_bytes)\n+            xlate.lzc_get_props_xlate_error(err, name)\n+            if size == 0:\n+                break\n+            data_bytes = os.read(fd, size)\n+            result = {}\n+            with nvlist_out(result) as nvp:\n+                ret = _lib.nvlist_unpack(data_bytes, size, nvp, 0)\n+            if ret != 0:\n+                raise ZFSError(ret, \"Failed to unpack list data\")\n+            entry = result['name']\n+            if entry == name:\n+                break\n+            else:\n+                entry = None\n+    finally:\n+        os.close(other_fd)\n+        os.close(fd)\n+\n+    if entry is None:\n+        raise exceptions.DatasetNotFound(name)\n+    result = result['properties']\n+    # In most cases the source of the property is uninteresting and the\n+    # value alone is sufficient.  One exception is the 'mountpoint'\n+    # property the final value of which is not the same as the inherited\n+    # value.\n+    mountpoint = result.get('mountpoint')\n+    if mountpoint is not None:\n+        mountpoint_src = mountpoint['source']\n+        mountpoint_val = mountpoint['value']\n+        # 'source' is the name of the dataset that has 'mountpoint' set\n+        # to a non-default value and from which the current dataset inherits\n+        # the property.  'source' can be the current dataset if its\n+        # 'mountpoint' is explicitly set.\n+        # 'source' can also be a special value like '$recvd', that case\n+        # is equivalent to the property being set on the current dataset.\n+        if not mountpoint_src.startswith('$'):\n+            mountpoint_val = mountpoint_val + name[len(mountpoint_src):]\n+    else:\n+        mountpoint_val = '/' + name\n+    result = { k: v['value'] for k, v in result.iteritems() }\n+    if result.has_key('clones'):\n+        result['clones'] = [ x for x in result['clones'] ]\n+    result['mountpoint'] = mountpoint_val\n+    return result\n+\n+\n+@_uncommitted(lzc_list)\n+def lzc_list_children(name):\n+    '''\n+    List the children of the ZFS dataset.\n+\n+    :param str name: the name of the dataset.\n+    :return: an iterator that produces the names of the children.\n+    '''\n+    (fd, other_fd) = lzc_list(name, {'recurse': 1, 'type': {'filesystem': None, 'volume': None}})\n+\n+    def _iterator():\n+        try:\n+            while True:\n+                record_bytes = os.read(fd, _PIPE_RECORD_SIZE)\n+                if not record_bytes:\n+                    break\n+                (size, _, err, _, _) =  struct.unpack(_PIPE_RECORD_FORMAT, record_bytes)\n+                xlate.lzc_list_children_xlate_error(err, name)\n+                if size == 0:\n+                    break\n+                data_bytes = os.read(fd, size)\n+                result = {}\n+                with nvlist_out(result) as nvp:\n+                    ret = _lib.nvlist_unpack(data_bytes, size, nvp, 0)\n+                if ret != 0:\n+                    raise ZFSError(ret, \"Failed to unpack list data\")\n+                child = result['name']\n+                if child != name:\n+                    yield child\n+        finally:\n+            os.close(other_fd)\n+            os.close(fd)\n+\n+    return _iterator()\n+\n+\n+@_uncommitted(lzc_list)\n+def lzc_list_snaps(name):\n+    '''\n+    List the snapshots of the ZFS dataset.\n+\n+    :param str name: the name of the dataset.\n+    :return: an iterator that produces the names of the snapshots.\n+    '''\n+    (fd, other_fd) = lzc_list(name, {'recurse': 1, 'type': {'snapshot': None}})\n+\n+    def _iterator():\n+        try:\n+            while True:\n+                record_bytes = os.read(fd, _PIPE_RECORD_SIZE)\n+                if not record_bytes:\n+                    break\n+                (size, _, err, _, _) =  struct.unpack(_PIPE_RECORD_FORMAT, record_bytes)\n+                xlate.lzc_list_snaps_xlate_error(err, name)\n+                if size == 0:\n+                    break\n+                data_bytes = os.read(fd, size)\n+                result = {}\n+                with nvlist_out(result) as nvp:\n+                    ret = _lib.nvlist_unpack(data_bytes, size, nvp, 0)\n+                if ret != 0:\n+                    raise ZFSError(ret, \"Failed to unpack list data\")\n+                snap = result['name']\n+                if snap != name:\n+                    yield snap\n+        finally:\n+            os.close(other_fd)\n+            os.close(fd)\n+\n+    return _iterator()\n+\n+\n+def is_supported(func):\n+    '''\n+    Check whether C *libzfs_core* provides implementation required\n+    for the given Python wrapper.\n+\n+    :param function func: the function to check.\n+    :return bool: whether the funciton can be used.\n+\n+    If `is_supported` returns ``False`` for the function, then\n+    calling the function would result in :exc:`NotImplementedError`.\n+    '''\n+    try:\n+        # woulf fail if is_supported is not set yet\n+        return func._is_supported\n+    except AttributeError:\n+        fname = getattr(func, '__name__', None)\n+        if fname is None:\n+            raise ValueError('argument does not have __name__')\n+        if not fname in globals():\n+            raise ValueError(fname + ' is not from libzfs_core')\n+        if not callable(func):\n+            raise ValueError(fname + ' is not a function')\n+        func._is_supported = (getattr(_lib, fname, None) != None)","path":"libzfs_core/_libzfs_core.py","position":287,"original_position":287,"commit_id":"64dc6cc3124a835751904841ce3250a959911f84","original_commit_id":"64dc6cc3124a835751904841ce3250a959911f84","user":{"login":"exarkun","id":254565,"avatar_url":"https://avatars.githubusercontent.com/u/254565?v=3","gravatar_id":"","url":"https://api.github.com/users/exarkun","html_url":"https://github.com/exarkun","followers_url":"https://api.github.com/users/exarkun/followers","following_url":"https://api.github.com/users/exarkun/following{/other_user}","gists_url":"https://api.github.com/users/exarkun/gists{/gist_id}","starred_url":"https://api.github.com/users/exarkun/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/exarkun/subscriptions","organizations_url":"https://api.github.com/users/exarkun/orgs","repos_url":"https://api.github.com/users/exarkun/repos","events_url":"https://api.github.com/users/exarkun/events{/privacy}","received_events_url":"https://api.github.com/users/exarkun/received_events","type":"User","site_admin":false},"body":"What about `is_supported(is_supported)`?  It passes all these checks and reports `False` - which contradicts the documented behavior. :smile: \r\n\r\nMaybe a different check like `fname.startswith(\"lzc_\")` or `fname in collection_of_functions_that_can_be_checked` would be a reasonable way to replace the globals/callable checks here.","created_at":"2015-08-05T14:04:32Z","updated_at":"2015-08-05T14:04:32Z","html_url":"https://github.com/ClusterHQ/pyzfs/pull/2#discussion_r36304535","pull_request_url":"https://api.github.com/repos/ClusterHQ/pyzfs/pulls/2","_links":{"self":{"href":"https://api.github.com/repos/ClusterHQ/pyzfs/pulls/comments/36304535"},"html":{"href":"https://github.com/ClusterHQ/pyzfs/pull/2#discussion_r36304535"},"pull_request":{"href":"https://api.github.com/repos/ClusterHQ/pyzfs/pulls/2"}}},"pull_request":{"url":"https://api.github.com/repos/ClusterHQ/pyzfs/pulls/2","id":40268148,"html_url":"https://github.com/ClusterHQ/pyzfs/pull/2","diff_url":"https://github.com/ClusterHQ/pyzfs/pull/2.diff","patch_url":"https://github.com/ClusterHQ/pyzfs/pull/2.patch","issue_url":"https://api.github.com/repos/ClusterHQ/pyzfs/issues/2","number":2,"state":"open","locked":false,"title":"pyzfs version 0.2: support for extended API","user":{"login":"avg-I","id":1499700,"avatar_url":"https://avatars.githubusercontent.com/u/1499700?v=3","gravatar_id":"","url":"https://api.github.com/users/avg-I","html_url":"https://github.com/avg-I","followers_url":"https://api.github.com/users/avg-I/followers","following_url":"https://api.github.com/users/avg-I/following{/other_user}","gists_url":"https://api.github.com/users/avg-I/gists{/gist_id}","starred_url":"https://api.github.com/users/avg-I/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/avg-I/subscriptions","organizations_url":"https://api.github.com/users/avg-I/orgs","repos_url":"https://api.github.com/users/avg-I/repos","events_url":"https://api.github.com/users/avg-I/events{/privacy}","received_events_url":"https://api.github.com/users/avg-I/received_events","type":"User","site_admin":false},"body":"Please **DO NOT MERGE**.\r\nNote that this pull request is against pyzfs-0.1, not master.\r\nThis pull request is for reviewing only.\r\nA new request should be created once pyzfs-0.1 is reviewed and merged.","created_at":"2015-07-17T20:25:12Z","updated_at":"2015-08-05T14:04:32Z","closed_at":null,"merged_at":null,"merge_commit_sha":"ccd8e13b22228cdb960cdbab404e212d073154cd","assignee":null,"milestone":null,"commits_url":"https://api.github.com/repos/ClusterHQ/pyzfs/pulls/2/commits","review_comments_url":"https://api.github.com/repos/ClusterHQ/pyzfs/pulls/2/comments","review_comment_url":"https://api.github.com/repos/ClusterHQ/pyzfs/pulls/comments{/number}","comments_url":"https://api.github.com/repos/ClusterHQ/pyzfs/issues/2/comments","statuses_url":"https://api.github.com/repos/ClusterHQ/pyzfs/statuses/64dc6cc3124a835751904841ce3250a959911f84","head":{"label":"ClusterHQ:pyzfs-0.2","ref":"pyzfs-0.2","sha":"64dc6cc3124a835751904841ce3250a959911f84","user":{"login":"ClusterHQ","id":7913449,"avatar_url":"https://avatars.githubusercontent.com/u/7913449?v=3","gravatar_id":"","url":"https://api.github.com/users/ClusterHQ","html_url":"https://github.com/ClusterHQ","followers_url":"https://api.github.com/users/ClusterHQ/followers","following_url":"https://api.github.com/users/ClusterHQ/following{/other_user}","gists_url":"https://api.github.com/users/ClusterHQ/gists{/gist_id}","starred_url":"https://api.github.com/users/ClusterHQ/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/ClusterHQ/subscriptions","organizations_url":"https://api.github.com/users/ClusterHQ/orgs","repos_url":"https://api.github.com/users/ClusterHQ/repos","events_url":"https://api.github.com/users/ClusterHQ/events{/privacy}","received_events_url":"https://api.github.com/users/ClusterHQ/received_events","type":"Organization","site_admin":false},"repo":{"id":32338081,"name":"pyzfs","full_name":"ClusterHQ/pyzfs","owner":{"login":"ClusterHQ","id":7913449,"avatar_url":"https://avatars.githubusercontent.com/u/7913449?v=3","gravatar_id":"","url":"https://api.github.com/users/ClusterHQ","html_url":"https://github.com/ClusterHQ","followers_url":"https://api.github.com/users/ClusterHQ/followers","following_url":"https://api.github.com/users/ClusterHQ/following{/other_user}","gists_url":"https://api.github.com/users/ClusterHQ/gists{/gist_id}","starred_url":"https://api.github.com/users/ClusterHQ/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/ClusterHQ/subscriptions","organizations_url":"https://api.github.com/users/ClusterHQ/orgs","repos_url":"https://api.github.com/users/ClusterHQ/repos","events_url":"https://api.github.com/users/ClusterHQ/events{/privacy}","received_events_url":"https://api.github.com/users/ClusterHQ/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/ClusterHQ/pyzfs","description":"Python bindings to the stable ZFS ABI","fork":false,"url":"https://api.github.com/repos/ClusterHQ/pyzfs","forks_url":"https://api.github.com/repos/ClusterHQ/pyzfs/forks","keys_url":"https://api.github.com/repos/ClusterHQ/pyzfs/keys{/key_id}","collaborators_url":"https://api.github.com/repos/ClusterHQ/pyzfs/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/ClusterHQ/pyzfs/teams","hooks_url":"https://api.github.com/repos/ClusterHQ/pyzfs/hooks","issue_events_url":"https://api.github.com/repos/ClusterHQ/pyzfs/issues/events{/number}","events_url":"https://api.github.com/repos/ClusterHQ/pyzfs/events","assignees_url":"https://api.github.com/repos/ClusterHQ/pyzfs/assignees{/user}","branches_url":"https://api.github.com/repos/ClusterHQ/pyzfs/branches{/branch}","tags_url":"https://api.github.com/repos/ClusterHQ/pyzfs/tags","blobs_url":"https://api.github.com/repos/ClusterHQ/pyzfs/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/ClusterHQ/pyzfs/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/ClusterHQ/pyzfs/git/refs{/sha}","trees_url":"https://api.github.com/repos/ClusterHQ/pyzfs/git/trees{/sha}","statuses_url":"https://api.github.com/repos/ClusterHQ/pyzfs/statuses/{sha}","languages_url":"https://api.github.com/repos/ClusterHQ/pyzfs/languages","stargazers_url":"https://api.github.com/repos/ClusterHQ/pyzfs/stargazers","contributors_url":"https://api.github.com/repos/ClusterHQ/pyzfs/contributors","subscribers_url":"https://api.github.com/repos/ClusterHQ/pyzfs/subscribers","subscription_url":"https://api.github.com/repos/ClusterHQ/pyzfs/subscription","commits_url":"https://api.github.com/repos/ClusterHQ/pyzfs/commits{/sha}","git_commits_url":"https://api.github.com/repos/ClusterHQ/pyzfs/git/commits{/sha}","comments_url":"https://api.github.com/repos/ClusterHQ/pyzfs/comments{/number}","issue_comment_url":"https://api.github.com/repos/ClusterHQ/pyzfs/issues/comments{/number}","contents_url":"https://api.github.com/repos/ClusterHQ/pyzfs/contents/{+path}","compare_url":"https://api.github.com/repos/ClusterHQ/pyzfs/compare/{base}...{head}","merges_url":"https://api.github.com/repos/ClusterHQ/pyzfs/merges","archive_url":"https://api.github.com/repos/ClusterHQ/pyzfs/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/ClusterHQ/pyzfs/downloads","issues_url":"https://api.github.com/repos/ClusterHQ/pyzfs/issues{/number}","pulls_url":"https://api.github.com/repos/ClusterHQ/pyzfs/pulls{/number}","milestones_url":"https://api.github.com/repos/ClusterHQ/pyzfs/milestones{/number}","notifications_url":"https://api.github.com/repos/ClusterHQ/pyzfs/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/ClusterHQ/pyzfs/labels{/name}","releases_url":"https://api.github.com/repos/ClusterHQ/pyzfs/releases{/id}","created_at":"2015-03-16T16:28:40Z","updated_at":"2015-08-05T13:08:27Z","pushed_at":"2015-08-05T12:26:03Z","git_url":"git://github.com/ClusterHQ/pyzfs.git","ssh_url":"git@github.com:ClusterHQ/pyzfs.git","clone_url":"https://github.com/ClusterHQ/pyzfs.git","svn_url":"https://github.com/ClusterHQ/pyzfs","homepage":null,"size":679,"stargazers_count":1,"watchers_count":1,"language":null,"has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":0,"mirror_url":null,"open_issues_count":2,"forks":0,"open_issues":2,"watchers":1,"default_branch":"master"}},"base":{"label":"ClusterHQ:pyzfs-0.1","ref":"pyzfs-0.1","sha":"aea2770903ec4c248c819fb3a5e9ea063d3ea01e","user":{"login":"ClusterHQ","id":7913449,"avatar_url":"https://avatars.githubusercontent.com/u/7913449?v=3","gravatar_id":"","url":"https://api.github.com/users/ClusterHQ","html_url":"https://github.com/ClusterHQ","followers_url":"https://api.github.com/users/ClusterHQ/followers","following_url":"https://api.github.com/users/ClusterHQ/following{/other_user}","gists_url":"https://api.github.com/users/ClusterHQ/gists{/gist_id}","starred_url":"https://api.github.com/users/ClusterHQ/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/ClusterHQ/subscriptions","organizations_url":"https://api.github.com/users/ClusterHQ/orgs","repos_url":"https://api.github.com/users/ClusterHQ/repos","events_url":"https://api.github.com/users/ClusterHQ/events{/privacy}","received_events_url":"https://api.github.com/users/ClusterHQ/received_events","type":"Organization","site_admin":false},"repo":{"id":32338081,"name":"pyzfs","full_name":"ClusterHQ/pyzfs","owner":{"login":"ClusterHQ","id":7913449,"avatar_url":"https://avatars.githubusercontent.com/u/7913449?v=3","gravatar_id":"","url":"https://api.github.com/users/ClusterHQ","html_url":"https://github.com/ClusterHQ","followers_url":"https://api.github.com/users/ClusterHQ/followers","following_url":"https://api.github.com/users/ClusterHQ/following{/other_user}","gists_url":"https://api.github.com/users/ClusterHQ/gists{/gist_id}","starred_url":"https://api.github.com/users/ClusterHQ/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/ClusterHQ/subscriptions","organizations_url":"https://api.github.com/users/ClusterHQ/orgs","repos_url":"https://api.github.com/users/ClusterHQ/repos","events_url":"https://api.github.com/users/ClusterHQ/events{/privacy}","received_events_url":"https://api.github.com/users/ClusterHQ/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/ClusterHQ/pyzfs","description":"Python bindings to the stable ZFS ABI","fork":false,"url":"https://api.github.com/repos/ClusterHQ/pyzfs","forks_url":"https://api.github.com/repos/ClusterHQ/pyzfs/forks","keys_url":"https://api.github.com/repos/ClusterHQ/pyzfs/keys{/key_id}","collaborators_url":"https://api.github.com/repos/ClusterHQ/pyzfs/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/ClusterHQ/pyzfs/teams","hooks_url":"https://api.github.com/repos/ClusterHQ/pyzfs/hooks","issue_events_url":"https://api.github.com/repos/ClusterHQ/pyzfs/issues/events{/number}","events_url":"https://api.github.com/repos/ClusterHQ/pyzfs/events","assignees_url":"https://api.github.com/repos/ClusterHQ/pyzfs/assignees{/user}","branches_url":"https://api.github.com/repos/ClusterHQ/pyzfs/branches{/branch}","tags_url":"https://api.github.com/repos/ClusterHQ/pyzfs/tags","blobs_url":"https://api.github.com/repos/ClusterHQ/pyzfs/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/ClusterHQ/pyzfs/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/ClusterHQ/pyzfs/git/refs{/sha}","trees_url":"https://api.github.com/repos/ClusterHQ/pyzfs/git/trees{/sha}","statuses_url":"https://api.github.com/repos/ClusterHQ/pyzfs/statuses/{sha}","languages_url":"https://api.github.com/repos/ClusterHQ/pyzfs/languages","stargazers_url":"https://api.github.com/repos/ClusterHQ/pyzfs/stargazers","contributors_url":"https://api.github.com/repos/ClusterHQ/pyzfs/contributors","subscribers_url":"https://api.github.com/repos/ClusterHQ/pyzfs/subscribers","subscription_url":"https://api.github.com/repos/ClusterHQ/pyzfs/subscription","commits_url":"https://api.github.com/repos/ClusterHQ/pyzfs/commits{/sha}","git_commits_url":"https://api.github.com/repos/ClusterHQ/pyzfs/git/commits{/sha}","comments_url":"https://api.github.com/repos/ClusterHQ/pyzfs/comments{/number}","issue_comment_url":"https://api.github.com/repos/ClusterHQ/pyzfs/issues/comments{/number}","contents_url":"https://api.github.com/repos/ClusterHQ/pyzfs/contents/{+path}","compare_url":"https://api.github.com/repos/ClusterHQ/pyzfs/compare/{base}...{head}","merges_url":"https://api.github.com/repos/ClusterHQ/pyzfs/merges","archive_url":"https://api.github.com/repos/ClusterHQ/pyzfs/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/ClusterHQ/pyzfs/downloads","issues_url":"https://api.github.com/repos/ClusterHQ/pyzfs/issues{/number}","pulls_url":"https://api.github.com/repos/ClusterHQ/pyzfs/pulls{/number}","milestones_url":"https://api.github.com/repos/ClusterHQ/pyzfs/milestones{/number}","notifications_url":"https://api.github.com/repos/ClusterHQ/pyzfs/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/ClusterHQ/pyzfs/labels{/name}","releases_url":"https://api.github.com/repos/ClusterHQ/pyzfs/releases{/id}","created_at":"2015-03-16T16:28:40Z","updated_at":"2015-08-05T13:08:27Z","pushed_at":"2015-08-05T12:26:03Z","git_url":"git://github.com/ClusterHQ/pyzfs.git","ssh_url":"git@github.com:ClusterHQ/pyzfs.git","clone_url":"https://github.com/ClusterHQ/pyzfs.git","svn_url":"https://github.com/ClusterHQ/pyzfs","homepage":null,"size":679,"stargazers_count":1,"watchers_count":1,"language":null,"has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":0,"mirror_url":null,"open_issues_count":2,"forks":0,"open_issues":2,"watchers":1,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/ClusterHQ/pyzfs/pulls/2"},"html":{"href":"https://github.com/ClusterHQ/pyzfs/pull/2"},"issue":{"href":"https://api.github.com/repos/ClusterHQ/pyzfs/issues/2"},"comments":{"href":"https://api.github.com/repos/ClusterHQ/pyzfs/issues/2/comments"},"review_comments":{"href":"https://api.github.com/repos/ClusterHQ/pyzfs/pulls/2/comments"},"review_comment":{"href":"https://api.github.com/repos/ClusterHQ/pyzfs/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/ClusterHQ/pyzfs/pulls/2/commits"},"statuses":{"href":"https://api.github.com/repos/ClusterHQ/pyzfs/statuses/64dc6cc3124a835751904841ce3250a959911f84"}}}}