{"action":"created","comment":{"url":"https://api.github.com/repos/candlepin/subscription-manager/pulls/comments/84372528","pull_request_review_id":5155642,"id":84372528,"diff_hunk":"@@ -0,0 +1,208 @@\n+# Copyright (c) 2016 Red Hat, Inc.\n+#\n+# This software is licensed to you under the GNU General Public License,\n+# version 2 (GPLv2). There is NO WARRANTY for this software, express or\n+# implied, including the implied warranties of MERCHANTABILITY or FITNESS\n+# FOR A PARTICULAR PURPOSE. You should have received a copy of GPLv2\n+# along with this software; if not, see\n+# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt.\n+#\n+# Red Hat trademarks are not licensed under GPLv2. No permission is\n+# granted to use or replicate Red Hat trademarks that are incorporated\n+# in this software or its documentation.\n+#\n+\n+import logging\n+import collections\n+import dbus.service\n+\n+from rhsmlib.dbus import constants, exceptions, util, dbus_utils\n+\n+log = logging.getLogger(__name__)\n+\n+\n+class Property(object):\n+    default_access = 'read'\n+    default_value_signature = 's'\n+\n+    def __init__(self, value, value_signature=None, access=None):\n+        self.access = access or self.default_access\n+        self.value = value\n+        self.value_signature = value_signature or self.default_value_signature\n+\n+\n+# TODO: Make properties class a gobject, so we can reused it's prop handling\n+#       (And maybe python-dbus can do something useful with a Gobject?\n+class BaseProperties(collections.Mapping):\n+    def __init__(self, interface_name, data=None, properties_changed_callback=None):\n+        if not data:\n+            data = {}\n+\n+        self.props_data = data\n+        self.interface_name = interface_name\n+        self.properties_changed_callback = properties_changed_callback\n+\n+    def __getitem__(self, key):\n+        self._check_property(key)\n+        return self.props_data[key]\n+\n+    def __setitem__(self, key, value):\n+        if key in self.props_data:\n+            v = self.props_data[key]\n+\n+            if v and v.access != 'read':\n+                self.props_data[key] = dbus_utils.dbus_to_python(value)\n+            else:\n+                raise exceptions.AccessDenied(key, self.interface_name)\n+        else:\n+            raise exceptions.PropertyMissing(key, self.interface_name)\n+\n+    def __delitem__(self, key):\n+        del self.props_data[key]\n+\n+    def __contains__(self, item):\n+        return item in self.props_data\n+\n+    def __iter__(self):\n+        return iter(self.props_data)\n+\n+    def __len__(self):\n+        return len(self.props_data)\n+\n+    @classmethod\n+    def create_instance(cls, interface_name, prop_dict, properties_changed_callback=None):\n+        instance = cls(interface_name, properties_changed_callback=properties_changed_callback)\n+        props = {}\n+        for key, value in prop_dict.items():\n+            props[key] = Property(value)\n+\n+        instance.props_data = props\n+        return instance\n+\n+    def get_all(self):\n+        return dict([(name, p_v.value) for name, p_v in iter(self)])\n+\n+    def add_introspection_xml(self, interface_xml):\n+        ret = dbus_utils.add_properties(interface_xml, self.interface_name, self.to_introspection_props())\n+        return ret\n+\n+    def set(self, key, val):\n+        \"\"\"Used to add without hitting __setitem__'s access controls.\"\"\"\n+        self.props_data[key] = val\n+\n+    # FIXME: This only supports string type values at the moment.\n+    def to_introspection_props(self):\n+        \"\"\" Transform self.props_data (a dict) to:\n+\n+        data = {'blah': '1', 'blip': some_int_value}\n+        props_tup = ({'p_t': 's',\n+                      'p_name': 'blah',\n+                      'p_access': 'read' },\n+                      {'p_t': 'i',\n+                      'p_name': blip,\n+                      'p_access': 'read'}))\n+        \"\"\"\n+        props_list = []\n+        props_dict = {}\n+        for prop_info in self.props_data.values():\n+            #p_t = dbus_utils._type_map(type(prop_value))\n+            # FIXME: all strings atm\n+            props_dict = dict(\n+                p_t=prop_info.value_signature,\n+                p_name=prop_info.name,\n+                p_access=self.access_mask(prop_info.access))\n+            props_list.append(props_dict)\n+        return props_list\n+\n+    def access_mask(self, prop_key):\n+        return 'read'\n+\n+    def _check_property(self, property_name):\n+        if property_name not in self:\n+            raise exceptions.UnknownProperty(property_name)\n+\n+    def _emit_properties_changed(self, properties_iterable):\n+        if not self.properties_changed_callback:\n+            return\n+\n+        changed_properties = {}\n+        invalidated_properties = []\n+\n+        for property_name, new_value in properties_iterable:\n+            changed_properties[property_name] = new_value\n+\n+        self.properties_changed_callback(self.interface_name, changed_properties, invalidated_properties)\n+\n+\n+class ReadWriteProperties(BaseProperties):\n+    \"\"\"A read-write BaseProperties.\n+\n+    Use this if you want to be able to set()/Set() DBus.Properties\n+    on a service.\"\"\"\n+\n+    def __setitem__(self, key, value):\n+        if self.access_mask(key) != 'write':\n+            raise exceptions.AccessDenied(key, self.interface_name)\n+        self[key] = value\n+\n+    # FIXME: track read/write per property\n+    def access_mask(self, prop_key):\n+        return 'write'\n+\n+\n+class BaseObject(dbus.service.Object):\n+    # Name of the DBus interface provided by this object\n+    interface_name = constants.INTERFACE_BASE\n+    default_dbus_path = constants.ROOT_DBUS_PATH\n+\n+    def __init__(self, conn=None, object_path=None, bus_name=None):\n+        super(BaseObject, self).__init__(conn=conn, object_path=object_path, bus_name=bus_name)\n+        self.object_path = self.default_dbus_path\n+\n+        # TODO: Support multiple interfaces\n+        self.properties = {self.interface_name: self._create_properties(self.interface_name)}\n+\n+    def _create_properties(self, interface_name):\n+        return BaseProperties.create_instance(interface_name, {}, self.PropertiesChanged)\n+\n+    def _check_interface(self, interface_name):\n+        if interface_name != self.interface_name:\n+            raise exceptions.UnknownInterface(interface_name)\n+\n+    @dbus.service.signal(dbus.PROPERTIES_IFACE, signature='sa{sv}as')\n+    def PropertiesChanged(self, interface_name, changed_properties, invalidated_properties):\n+        # TODO: Do something here\n+        log.debug(\"Properties Changed emitted.\")\n+\n+    @util.dbus_service_method(\n+        dbus.PROPERTIES_IFACE,\n+        in_signature='s',\n+        out_signature='a{sv}')\n+    @util.dbus_handle_exceptions\n+    def GetAll(self, interface_name, sender=None):\n+        self._check_interface(interface_name)\n+        return dbus.Dictionary(self.properties[interface_name].get_all(), signature='sv')\n+\n+    @util.dbus_service_method(\n+        dbus.PROPERTIES_IFACE,\n+        in_signature='ss',\n+        out_signature='v')\n+    @util.dbus_handle_exceptions\n+    def Get(self, interface_name, property_name, sender=None):\n+        self._check_interface(interface_name)\n+        return self.properties[interface_name][property_name]\n+\n+    @util.dbus_service_method(\n+        dbus.PROPERTIES_IFACE,\n+        in_signature='ssv')\n+    @util.dbus_handle_exceptions\n+    def Set(self, interface_name, property_name, new_value, sender=None):\n+        \"\"\"Set a DBus property on this object.\n+\n+        This is the base service class, and defaults to DBus properties\n+        being read-only. Attempts to Set a property will raise a\n+        DBusException of type org.freedesktop.DBus.Error.AccessDenied.\n+\n+        Subclasses that need settable properties should override this.\"\"\"\n+        self._check_interface(interface_name)\n+        self.properties[interface_name][property_name] = new_value","path":"src/rhsmlib/dbus/base_object.py","position":208,"original_position":208,"commit_id":"5ae7d8526340666701300b270a1f92850a93bf8d","original_commit_id":"5ae7d8526340666701300b270a1f92850a93bf8d","user":{"login":"kahowell","id":1716882,"avatar_url":"https://avatars.githubusercontent.com/u/1716882?v=3","gravatar_id":"","url":"https://api.github.com/users/kahowell","html_url":"https://github.com/kahowell","followers_url":"https://api.github.com/users/kahowell/followers","following_url":"https://api.github.com/users/kahowell/following{/other_user}","gists_url":"https://api.github.com/users/kahowell/gists{/gist_id}","starred_url":"https://api.github.com/users/kahowell/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/kahowell/subscriptions","organizations_url":"https://api.github.com/users/kahowell/orgs","repos_url":"https://api.github.com/users/kahowell/repos","events_url":"https://api.github.com/users/kahowell/events{/privacy}","received_events_url":"https://api.github.com/users/kahowell/received_events","type":"User","site_admin":false},"body":"Fair enough :+1: ","created_at":"2016-10-20T20:47:31Z","updated_at":"2016-10-20T20:47:31Z","html_url":"https://github.com/candlepin/subscription-manager/pull/1509#discussion_r84372528","pull_request_url":"https://api.github.com/repos/candlepin/subscription-manager/pulls/1509","_links":{"self":{"href":"https://api.github.com/repos/candlepin/subscription-manager/pulls/comments/84372528"},"html":{"href":"https://github.com/candlepin/subscription-manager/pull/1509#discussion_r84372528"},"pull_request":{"href":"https://api.github.com/repos/candlepin/subscription-manager/pulls/1509"}}},"pull_request":{"url":"https://api.github.com/repos/candlepin/subscription-manager/pulls/1509","id":89687821,"html_url":"https://github.com/candlepin/subscription-manager/pull/1509","diff_url":"https://github.com/candlepin/subscription-manager/pull/1509.diff","patch_url":"https://github.com/candlepin/subscription-manager/pull/1509.patch","issue_url":"https://api.github.com/repos/candlepin/subscription-manager/issues/1509","number":1509,"state":"open","locked":false,"title":"Feature/dbus service","user":{"login":"awood","id":17975,"avatar_url":"https://avatars.githubusercontent.com/u/17975?v=3","gravatar_id":"","url":"https://api.github.com/users/awood","html_url":"https://github.com/awood","followers_url":"https://api.github.com/users/awood/followers","following_url":"https://api.github.com/users/awood/following{/other_user}","gists_url":"https://api.github.com/users/awood/gists{/gist_id}","starred_url":"https://api.github.com/users/awood/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/awood/subscriptions","organizations_url":"https://api.github.com/users/awood/orgs","repos_url":"https://api.github.com/users/awood/repos","events_url":"https://api.github.com/users/awood/events{/privacy}","received_events_url":"https://api.github.com/users/awood/received_events","type":"User","site_admin":false},"body":"* Delegates facts collection to a facts service that is also surfaced via DBus\r\n* Delegates configuration management to a service that is also surfaced via DBus\r\n\r\n**Notes**: \r\nTesting this PR will require that you have https://github.com/candlepin/python-rhsm/pull/171 on your pythonpath.  The easiest way is to set your python-rhsm to that PR's version and then\r\n\r\n```\r\nexport PYTHONPATH=path/to/python-rhsm/src\r\n```\r\n\r\nin the terminal before you start to run nosetests or do any other sort of experimenting.\r\n\r\nI recommend installing `d-feet` for easy D-Bus monitoring","created_at":"2016-10-17T19:36:38Z","updated_at":"2016-10-20T20:47:31Z","closed_at":null,"merged_at":null,"merge_commit_sha":"bad9b846ed7725e7ea07f569d3540abda6c488e1","assignee":null,"assignees":[],"milestone":null,"commits_url":"https://api.github.com/repos/candlepin/subscription-manager/pulls/1509/commits","review_comments_url":"https://api.github.com/repos/candlepin/subscription-manager/pulls/1509/comments","review_comment_url":"https://api.github.com/repos/candlepin/subscription-manager/pulls/comments{/number}","comments_url":"https://api.github.com/repos/candlepin/subscription-manager/issues/1509/comments","statuses_url":"https://api.github.com/repos/candlepin/subscription-manager/statuses/5ae7d8526340666701300b270a1f92850a93bf8d","head":{"label":"candlepin:feature/dbus_service","ref":"feature/dbus_service","sha":"5ae7d8526340666701300b270a1f92850a93bf8d","user":{"login":"candlepin","id":1749632,"avatar_url":"https://avatars.githubusercontent.com/u/1749632?v=3","gravatar_id":"","url":"https://api.github.com/users/candlepin","html_url":"https://github.com/candlepin","followers_url":"https://api.github.com/users/candlepin/followers","following_url":"https://api.github.com/users/candlepin/following{/other_user}","gists_url":"https://api.github.com/users/candlepin/gists{/gist_id}","starred_url":"https://api.github.com/users/candlepin/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/candlepin/subscriptions","organizations_url":"https://api.github.com/users/candlepin/orgs","repos_url":"https://api.github.com/users/candlepin/repos","events_url":"https://api.github.com/users/candlepin/events{/privacy}","received_events_url":"https://api.github.com/users/candlepin/received_events","type":"Organization","site_admin":false},"repo":{"id":4360334,"name":"subscription-manager","full_name":"candlepin/subscription-manager","owner":{"login":"candlepin","id":1749632,"avatar_url":"https://avatars.githubusercontent.com/u/1749632?v=3","gravatar_id":"","url":"https://api.github.com/users/candlepin","html_url":"https://github.com/candlepin","followers_url":"https://api.github.com/users/candlepin/followers","following_url":"https://api.github.com/users/candlepin/following{/other_user}","gists_url":"https://api.github.com/users/candlepin/gists{/gist_id}","starred_url":"https://api.github.com/users/candlepin/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/candlepin/subscriptions","organizations_url":"https://api.github.com/users/candlepin/orgs","repos_url":"https://api.github.com/users/candlepin/repos","events_url":"https://api.github.com/users/candlepin/events{/privacy}","received_events_url":"https://api.github.com/users/candlepin/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/candlepin/subscription-manager","description":"A GUI and CLI client for Candlepin","fork":false,"url":"https://api.github.com/repos/candlepin/subscription-manager","forks_url":"https://api.github.com/repos/candlepin/subscription-manager/forks","keys_url":"https://api.github.com/repos/candlepin/subscription-manager/keys{/key_id}","collaborators_url":"https://api.github.com/repos/candlepin/subscription-manager/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/candlepin/subscription-manager/teams","hooks_url":"https://api.github.com/repos/candlepin/subscription-manager/hooks","issue_events_url":"https://api.github.com/repos/candlepin/subscription-manager/issues/events{/number}","events_url":"https://api.github.com/repos/candlepin/subscription-manager/events","assignees_url":"https://api.github.com/repos/candlepin/subscription-manager/assignees{/user}","branches_url":"https://api.github.com/repos/candlepin/subscription-manager/branches{/branch}","tags_url":"https://api.github.com/repos/candlepin/subscription-manager/tags","blobs_url":"https://api.github.com/repos/candlepin/subscription-manager/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/candlepin/subscription-manager/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/candlepin/subscription-manager/git/refs{/sha}","trees_url":"https://api.github.com/repos/candlepin/subscription-manager/git/trees{/sha}","statuses_url":"https://api.github.com/repos/candlepin/subscription-manager/statuses/{sha}","languages_url":"https://api.github.com/repos/candlepin/subscription-manager/languages","stargazers_url":"https://api.github.com/repos/candlepin/subscription-manager/stargazers","contributors_url":"https://api.github.com/repos/candlepin/subscription-manager/contributors","subscribers_url":"https://api.github.com/repos/candlepin/subscription-manager/subscribers","subscription_url":"https://api.github.com/repos/candlepin/subscription-manager/subscription","commits_url":"https://api.github.com/repos/candlepin/subscription-manager/commits{/sha}","git_commits_url":"https://api.github.com/repos/candlepin/subscription-manager/git/commits{/sha}","comments_url":"https://api.github.com/repos/candlepin/subscription-manager/comments{/number}","issue_comment_url":"https://api.github.com/repos/candlepin/subscription-manager/issues/comments{/number}","contents_url":"https://api.github.com/repos/candlepin/subscription-manager/contents/{+path}","compare_url":"https://api.github.com/repos/candlepin/subscription-manager/compare/{base}...{head}","merges_url":"https://api.github.com/repos/candlepin/subscription-manager/merges","archive_url":"https://api.github.com/repos/candlepin/subscription-manager/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/candlepin/subscription-manager/downloads","issues_url":"https://api.github.com/repos/candlepin/subscription-manager/issues{/number}","pulls_url":"https://api.github.com/repos/candlepin/subscription-manager/pulls{/number}","milestones_url":"https://api.github.com/repos/candlepin/subscription-manager/milestones{/number}","notifications_url":"https://api.github.com/repos/candlepin/subscription-manager/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/candlepin/subscription-manager/labels{/name}","releases_url":"https://api.github.com/repos/candlepin/subscription-manager/releases{/id}","deployments_url":"https://api.github.com/repos/candlepin/subscription-manager/deployments","created_at":"2012-05-17T16:13:30Z","updated_at":"2016-08-22T20:26:53Z","pushed_at":"2016-10-19T21:28:19Z","git_url":"git://github.com/candlepin/subscription-manager.git","ssh_url":"git@github.com:candlepin/subscription-manager.git","clone_url":"https://github.com/candlepin/subscription-manager.git","svn_url":"https://github.com/candlepin/subscription-manager","homepage":"http://candlepinproject.org/","size":36252,"stargazers_count":15,"watchers_count":15,"language":"Python","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":36,"mirror_url":null,"open_issues_count":7,"forks":36,"open_issues":7,"watchers":15,"default_branch":"master"}},"base":{"label":"candlepin:master","ref":"master","sha":"128fd0ec86d9da0ac9176221e5a9e8c428a2b2b0","user":{"login":"candlepin","id":1749632,"avatar_url":"https://avatars.githubusercontent.com/u/1749632?v=3","gravatar_id":"","url":"https://api.github.com/users/candlepin","html_url":"https://github.com/candlepin","followers_url":"https://api.github.com/users/candlepin/followers","following_url":"https://api.github.com/users/candlepin/following{/other_user}","gists_url":"https://api.github.com/users/candlepin/gists{/gist_id}","starred_url":"https://api.github.com/users/candlepin/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/candlepin/subscriptions","organizations_url":"https://api.github.com/users/candlepin/orgs","repos_url":"https://api.github.com/users/candlepin/repos","events_url":"https://api.github.com/users/candlepin/events{/privacy}","received_events_url":"https://api.github.com/users/candlepin/received_events","type":"Organization","site_admin":false},"repo":{"id":4360334,"name":"subscription-manager","full_name":"candlepin/subscription-manager","owner":{"login":"candlepin","id":1749632,"avatar_url":"https://avatars.githubusercontent.com/u/1749632?v=3","gravatar_id":"","url":"https://api.github.com/users/candlepin","html_url":"https://github.com/candlepin","followers_url":"https://api.github.com/users/candlepin/followers","following_url":"https://api.github.com/users/candlepin/following{/other_user}","gists_url":"https://api.github.com/users/candlepin/gists{/gist_id}","starred_url":"https://api.github.com/users/candlepin/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/candlepin/subscriptions","organizations_url":"https://api.github.com/users/candlepin/orgs","repos_url":"https://api.github.com/users/candlepin/repos","events_url":"https://api.github.com/users/candlepin/events{/privacy}","received_events_url":"https://api.github.com/users/candlepin/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/candlepin/subscription-manager","description":"A GUI and CLI client for Candlepin","fork":false,"url":"https://api.github.com/repos/candlepin/subscription-manager","forks_url":"https://api.github.com/repos/candlepin/subscription-manager/forks","keys_url":"https://api.github.com/repos/candlepin/subscription-manager/keys{/key_id}","collaborators_url":"https://api.github.com/repos/candlepin/subscription-manager/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/candlepin/subscription-manager/teams","hooks_url":"https://api.github.com/repos/candlepin/subscription-manager/hooks","issue_events_url":"https://api.github.com/repos/candlepin/subscription-manager/issues/events{/number}","events_url":"https://api.github.com/repos/candlepin/subscription-manager/events","assignees_url":"https://api.github.com/repos/candlepin/subscription-manager/assignees{/user}","branches_url":"https://api.github.com/repos/candlepin/subscription-manager/branches{/branch}","tags_url":"https://api.github.com/repos/candlepin/subscription-manager/tags","blobs_url":"https://api.github.com/repos/candlepin/subscription-manager/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/candlepin/subscription-manager/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/candlepin/subscription-manager/git/refs{/sha}","trees_url":"https://api.github.com/repos/candlepin/subscription-manager/git/trees{/sha}","statuses_url":"https://api.github.com/repos/candlepin/subscription-manager/statuses/{sha}","languages_url":"https://api.github.com/repos/candlepin/subscription-manager/languages","stargazers_url":"https://api.github.com/repos/candlepin/subscription-manager/stargazers","contributors_url":"https://api.github.com/repos/candlepin/subscription-manager/contributors","subscribers_url":"https://api.github.com/repos/candlepin/subscription-manager/subscribers","subscription_url":"https://api.github.com/repos/candlepin/subscription-manager/subscription","commits_url":"https://api.github.com/repos/candlepin/subscription-manager/commits{/sha}","git_commits_url":"https://api.github.com/repos/candlepin/subscription-manager/git/commits{/sha}","comments_url":"https://api.github.com/repos/candlepin/subscription-manager/comments{/number}","issue_comment_url":"https://api.github.com/repos/candlepin/subscription-manager/issues/comments{/number}","contents_url":"https://api.github.com/repos/candlepin/subscription-manager/contents/{+path}","compare_url":"https://api.github.com/repos/candlepin/subscription-manager/compare/{base}...{head}","merges_url":"https://api.github.com/repos/candlepin/subscription-manager/merges","archive_url":"https://api.github.com/repos/candlepin/subscription-manager/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/candlepin/subscription-manager/downloads","issues_url":"https://api.github.com/repos/candlepin/subscription-manager/issues{/number}","pulls_url":"https://api.github.com/repos/candlepin/subscription-manager/pulls{/number}","milestones_url":"https://api.github.com/repos/candlepin/subscription-manager/milestones{/number}","notifications_url":"https://api.github.com/repos/candlepin/subscription-manager/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/candlepin/subscription-manager/labels{/name}","releases_url":"https://api.github.com/repos/candlepin/subscription-manager/releases{/id}","deployments_url":"https://api.github.com/repos/candlepin/subscription-manager/deployments","created_at":"2012-05-17T16:13:30Z","updated_at":"2016-08-22T20:26:53Z","pushed_at":"2016-10-19T21:28:19Z","git_url":"git://github.com/candlepin/subscription-manager.git","ssh_url":"git@github.com:candlepin/subscription-manager.git","clone_url":"https://github.com/candlepin/subscription-manager.git","svn_url":"https://github.com/candlepin/subscription-manager","homepage":"http://candlepinproject.org/","size":36252,"stargazers_count":15,"watchers_count":15,"language":"Python","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":36,"mirror_url":null,"open_issues_count":7,"forks":36,"open_issues":7,"watchers":15,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/candlepin/subscription-manager/pulls/1509"},"html":{"href":"https://github.com/candlepin/subscription-manager/pull/1509"},"issue":{"href":"https://api.github.com/repos/candlepin/subscription-manager/issues/1509"},"comments":{"href":"https://api.github.com/repos/candlepin/subscription-manager/issues/1509/comments"},"review_comments":{"href":"https://api.github.com/repos/candlepin/subscription-manager/pulls/1509/comments"},"review_comment":{"href":"https://api.github.com/repos/candlepin/subscription-manager/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/candlepin/subscription-manager/pulls/1509/commits"},"statuses":{"href":"https://api.github.com/repos/candlepin/subscription-manager/statuses/5ae7d8526340666701300b270a1f92850a93bf8d"}}}}
{"actor":{"display_login":"kahowell"}}