{"action":"created","comment":{"url":"https://api.github.com/repos/NYPL-Simplified/server_core/pulls/comments/108771917","pull_request_review_id":29826523,"id":108771917,"diff_hunk":"@@ -450,192 +576,51 @@ def ensure_coverage(self, item, force=False):\n         else:\n             coverage_record = None\n         return coverage_record\n-\n-    @property\n-    def output_source(self):\n-        \"\"\"Look up the DataSource object corresponding to the\n-        service we're running this data through.\n-\n-        Out of an excess of caution, we look up the DataSource every\n-        time, rather than storing it, in case a CoverageProvider is\n-        ever used in an environment where the database session is\n-        scoped (e.g. the circulation manager).\n-        \"\"\"\n-        return DataSource.lookup(self._db, self.output_source_name)\n-\n-    def license_pool(self, identifier):\n-        \"\"\"Finds or creates the LicensePool for a given Identifier.\"\"\"\n-        license_pool = identifier.licensed_through\n-        if not license_pool:\n-            if self.CAN_CREATE_LICENSE_POOLS:\n-                # The source of this data also provides license\n-                # pools, so it's okay to automatically create\n-                # a license pool for this book.\n-                license_pool, ignore = LicensePool.for_foreign_id(\n-                    self._db, self.output_source, identifier.type, \n-                    identifier.identifier\n-                )\n-            else:\n-                return None\n-        return license_pool\n-\n+    \n     def edition(self, identifier):\n-        \"\"\"Finds or creates the Edition for a given Identifier.\"\"\"\n-        license_pool = self.license_pool(identifier)\n-        if not license_pool:\n-            e = \"No license pool available\"\n-            return CoverageFailure(identifier, e, data_source=self.output_source, transient=True)\n-\n+        \"\"\"Finds or creates an Edition representing this coverage provider's\n+        view of a given Identifier.\n+        \"\"\"\n         edition, ignore = Edition.for_foreign_id(\n-            self._db, license_pool.data_source, identifier.type,\n+            self._db, self.data_source, identifier.type,\n             identifier.identifier\n         )\n         return edition\n \n-    def work(self, identifier):\n-        \"\"\"Finds or creates the Work for a given Identifier.\n-        \n-        :return: The Work (if it could be found) or an appropriate\n-        CoverageFailure (if not).\n-        \"\"\"\n-        license_pool = self.license_pool(identifier)\n-        if not license_pool:\n-            e = \"No license pool available\"\n-            return CoverageFailure(identifier, e, data_source=self.output_source, transient=True)\n-        work, created = license_pool.calculate_work(even_if_no_author=True)\n-        if not work:\n-            e = \"Work could not be calculated\"\n-            return CoverageFailure(identifier, e, data_source=self.output_source, transient=True)\n-        return work\n-\n-\n-    def set_metadata(self, identifier, metadata, ","path":"coverage.py","position":543,"original_position":543,"commit_id":"9eedf7a5ca2985cab0b4d6743be1883462a5f988","original_commit_id":"9eedf7a5ca2985cab0b4d6743be1883462a5f988","user":{"login":"leonardr","id":662474,"avatar_url":"https://avatars3.githubusercontent.com/u/662474?v=3","gravatar_id":"","url":"https://api.github.com/users/leonardr","html_url":"https://github.com/leonardr","followers_url":"https://api.github.com/users/leonardr/followers","following_url":"https://api.github.com/users/leonardr/following{/other_user}","gists_url":"https://api.github.com/users/leonardr/gists{/gist_id}","starred_url":"https://api.github.com/users/leonardr/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/leonardr/subscriptions","organizations_url":"https://api.github.com/users/leonardr/orgs","repos_url":"https://api.github.com/users/leonardr/repos","events_url":"https://api.github.com/users/leonardr/events{/privacy}","received_events_url":"https://api.github.com/users/leonardr/received_events","type":"User","site_admin":false},"body":"This was _not_ moved to CollectionCoverageProvider, it was just moved below this part of the diff.","created_at":"2017-03-29T19:58:01Z","updated_at":"2017-03-29T19:58:01Z","html_url":"https://github.com/NYPL-Simplified/server_core/pull/483#discussion_r108771917","pull_request_url":"https://api.github.com/repos/NYPL-Simplified/server_core/pulls/483","_links":{"self":{"href":"https://api.github.com/repos/NYPL-Simplified/server_core/pulls/comments/108771917"},"html":{"href":"https://github.com/NYPL-Simplified/server_core/pull/483#discussion_r108771917"},"pull_request":{"href":"https://api.github.com/repos/NYPL-Simplified/server_core/pulls/483"}}},"pull_request":{"url":"https://api.github.com/repos/NYPL-Simplified/server_core/pulls/483","id":112522976,"html_url":"https://github.com/NYPL-Simplified/server_core/pull/483","diff_url":"https://github.com/NYPL-Simplified/server_core/pull/483.diff","patch_url":"https://github.com/NYPL-Simplified/server_core/pull/483.patch","issue_url":"https://api.github.com/repos/NYPL-Simplified/server_core/issues/483","number":483,"state":"open","locked":false,"title":"One collection per licensepool","user":{"login":"leonardr","id":662474,"avatar_url":"https://avatars3.githubusercontent.com/u/662474?v=3","gravatar_id":"","url":"https://api.github.com/users/leonardr","html_url":"https://github.com/leonardr","followers_url":"https://api.github.com/users/leonardr/followers","following_url":"https://api.github.com/users/leonardr/following{/other_user}","gists_url":"https://api.github.com/users/leonardr/gists{/gist_id}","starred_url":"https://api.github.com/users/leonardr/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/leonardr/subscriptions","organizations_url":"https://api.github.com/users/leonardr/orgs","repos_url":"https://api.github.com/users/leonardr/repos","events_url":"https://api.github.com/users/leonardr/events{/privacy}","received_events_url":"https://api.github.com/users/leonardr/received_events","type":"User","site_admin":false},"body":"This branch is a work in progress and not yet ready for review.\r\n\r\nThis branch addresses https://github.com/NYPL-Simplified/server_core/issues/212. It allows the database to contain multiple LicensePools for the same book, so long as Identifier+DataSource+Collection is unique.\r\n\r\nAnything that might create or manipulate a `LicensePool` now needs to have a `Collection` handy so that we can distinguish between otherwise identical `LicensePool`s. \r\n\r\nI make the various API classes keep track of a `Collection` object. Previously their constructors took a `Collection` but it was discarded once the API credentials were extracted from it. Codes like \r\n\r\nThis branch changes `CoverageProvider` and its subclasses so that they take a `Collection` in their constructor. You can create a `CoverageProvider` with no `Collection`, but this might cause problems later on if you try to do something like set circulation data.\r\n\r\nI've limited the number of things that require a `Collection` by making it possible to go directly from an `Identifier` to a `Work`. This is possible because I've added a rule that all `LicensePool`s for a given `Identifier` must have the same `Work`.\r\n\r\n## Timestamp\r\n\r\nI extended the `Timestamp` class to have a reference to a Collection. This lets us keep track of when a given collection-specific monitor ran for a certain Collection,\r\n\r\n## Monitors\r\n\r\nI introduced `CollectionMonitor`, which does... something... for all Collections that implement a certain protocol, one after the other. The idea is that monitors like OverdriveCirculationMonitor will start subclassing this class. This removes the need to specify which Collection you mean when updating Overdrive circulation information. All Collections will be processed, one after the other.\r\n\r\n## Coverage Providers\r\n\r\nChanging the `CoverageProvider` constructor to take a `Collection` meant I had to touch every single `CoverageProvider` subclass and jiggle its constructor. I was really worried about this causing hard-to-detect problems, and then I noticed why we have this problem. \r\n\r\nThe coverage providers in core are abstract classes that must be specialized by subclassing. But a lot of the specializations (which data source to use, which identifier types to process) are passed into the constructor when the object is created. This makes tests a little easier to write, since you don't need to make a subclass just for a test, but it makes the constructor very complicated.\r\n\r\nSo I changed `BaseCoverageProvider` and its subclasses to take most of their configuration in class constants like SERVICE_NAME, OPERATION, and INPUT_IDENTIFIER_TYPES. This removes most of the complexity from the constructor signature. And the tests are actually better now--there are more one-off subclasses but there's less code overall.\r\n\r\nI renamed `CoverageProvider` to `IdentifierCoverageProvider` so that we don't have both `CoverageProvider` and `BaseCoverageProvider`.\r\n\r\nI went through `test_coverage.py` and verified that we have good test coverage for all our code. In places where specific methods were not tested in isolation I added stubs to test just those methods.\r\n\r\n### BibliographicCoverageProvider\r\n\r\nThis branch exposes, but does not resolve, a problem with coverage providers that is most obvious with `BibliographicCoverageProvider`.  A coverage provider does some work for an Identifier, and then checks the identifier off of a list and never does any more work.\r\n\r\nIt often makes sense to use one Collection or another when doing this work. Some third parties (Bibliotheca, Axis 360, and OneClick) won't allow work to be done on a title except in the context of a Collection that has that title available. But the _result_ of running a CoverageProvider is supposed to be Collection-independent, because you're only doing the work once. Anything that might differ between collections is supposed to be handled in a `Monitor` or in some other way.\r\n\r\nThe problem is that Overdrive, Bibliotheca, and OneClick all provide data about available formats along with bibliographic information. It's possible for two different Collections to have the same book available--that's the whole reason we're doing this. The only time we learn about formats is when the BibliographicCoverageProvider runs. Since BCP now runs in the context of a specific Collection, the only formats we're going to learn about are the one in the Collection that happens to be passed into the BCP. The other LicensePool will never have any DeliveryMechanisms associated with it.\r\n\r\n(Axis 360 always sends bibliographic and circulation data at the same time, so the BibliographicCoverageProvider isn't really necessary. We need to make sure it doesn't have this problem, but at least there's an obvious solution.)","created_at":"2017-03-24T19:01:27Z","updated_at":"2017-03-29T19:58:01Z","closed_at":null,"merged_at":null,"merge_commit_sha":"794d1e2f6ff5d99ea1891a758e88245c6e347522","assignee":null,"assignees":[],"milestone":null,"commits_url":"https://api.github.com/repos/NYPL-Simplified/server_core/pulls/483/commits","review_comments_url":"https://api.github.com/repos/NYPL-Simplified/server_core/pulls/483/comments","review_comment_url":"https://api.github.com/repos/NYPL-Simplified/server_core/pulls/comments{/number}","comments_url":"https://api.github.com/repos/NYPL-Simplified/server_core/issues/483/comments","statuses_url":"https://api.github.com/repos/NYPL-Simplified/server_core/statuses/9eedf7a5ca2985cab0b4d6743be1883462a5f988","head":{"label":"NYPL-Simplified:one-collection-per-licensepool","ref":"one-collection-per-licensepool","sha":"9eedf7a5ca2985cab0b4d6743be1883462a5f988","user":{"login":"NYPL-Simplified","id":16416905,"avatar_url":"https://avatars2.githubusercontent.com/u/16416905?v=3","gravatar_id":"","url":"https://api.github.com/users/NYPL-Simplified","html_url":"https://github.com/NYPL-Simplified","followers_url":"https://api.github.com/users/NYPL-Simplified/followers","following_url":"https://api.github.com/users/NYPL-Simplified/following{/other_user}","gists_url":"https://api.github.com/users/NYPL-Simplified/gists{/gist_id}","starred_url":"https://api.github.com/users/NYPL-Simplified/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/NYPL-Simplified/subscriptions","organizations_url":"https://api.github.com/users/NYPL-Simplified/orgs","repos_url":"https://api.github.com/users/NYPL-Simplified/repos","events_url":"https://api.github.com/users/NYPL-Simplified/events{/privacy}","received_events_url":"https://api.github.com/users/NYPL-Simplified/received_events","type":"Organization","site_admin":false},"repo":{"id":27601287,"name":"server_core","full_name":"NYPL-Simplified/server_core","owner":{"login":"NYPL-Simplified","id":16416905,"avatar_url":"https://avatars2.githubusercontent.com/u/16416905?v=3","gravatar_id":"","url":"https://api.github.com/users/NYPL-Simplified","html_url":"https://github.com/NYPL-Simplified","followers_url":"https://api.github.com/users/NYPL-Simplified/followers","following_url":"https://api.github.com/users/NYPL-Simplified/following{/other_user}","gists_url":"https://api.github.com/users/NYPL-Simplified/gists{/gist_id}","starred_url":"https://api.github.com/users/NYPL-Simplified/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/NYPL-Simplified/subscriptions","organizations_url":"https://api.github.com/users/NYPL-Simplified/orgs","repos_url":"https://api.github.com/users/NYPL-Simplified/repos","events_url":"https://api.github.com/users/NYPL-Simplified/events{/privacy}","received_events_url":"https://api.github.com/users/NYPL-Simplified/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/NYPL-Simplified/server_core","description":"Shared data model and utilities for Library Simplified server applications","fork":false,"url":"https://api.github.com/repos/NYPL-Simplified/server_core","forks_url":"https://api.github.com/repos/NYPL-Simplified/server_core/forks","keys_url":"https://api.github.com/repos/NYPL-Simplified/server_core/keys{/key_id}","collaborators_url":"https://api.github.com/repos/NYPL-Simplified/server_core/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/NYPL-Simplified/server_core/teams","hooks_url":"https://api.github.com/repos/NYPL-Simplified/server_core/hooks","issue_events_url":"https://api.github.com/repos/NYPL-Simplified/server_core/issues/events{/number}","events_url":"https://api.github.com/repos/NYPL-Simplified/server_core/events","assignees_url":"https://api.github.com/repos/NYPL-Simplified/server_core/assignees{/user}","branches_url":"https://api.github.com/repos/NYPL-Simplified/server_core/branches{/branch}","tags_url":"https://api.github.com/repos/NYPL-Simplified/server_core/tags","blobs_url":"https://api.github.com/repos/NYPL-Simplified/server_core/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/NYPL-Simplified/server_core/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/NYPL-Simplified/server_core/git/refs{/sha}","trees_url":"https://api.github.com/repos/NYPL-Simplified/server_core/git/trees{/sha}","statuses_url":"https://api.github.com/repos/NYPL-Simplified/server_core/statuses/{sha}","languages_url":"https://api.github.com/repos/NYPL-Simplified/server_core/languages","stargazers_url":"https://api.github.com/repos/NYPL-Simplified/server_core/stargazers","contributors_url":"https://api.github.com/repos/NYPL-Simplified/server_core/contributors","subscribers_url":"https://api.github.com/repos/NYPL-Simplified/server_core/subscribers","subscription_url":"https://api.github.com/repos/NYPL-Simplified/server_core/subscription","commits_url":"https://api.github.com/repos/NYPL-Simplified/server_core/commits{/sha}","git_commits_url":"https://api.github.com/repos/NYPL-Simplified/server_core/git/commits{/sha}","comments_url":"https://api.github.com/repos/NYPL-Simplified/server_core/comments{/number}","issue_comment_url":"https://api.github.com/repos/NYPL-Simplified/server_core/issues/comments{/number}","contents_url":"https://api.github.com/repos/NYPL-Simplified/server_core/contents/{+path}","compare_url":"https://api.github.com/repos/NYPL-Simplified/server_core/compare/{base}...{head}","merges_url":"https://api.github.com/repos/NYPL-Simplified/server_core/merges","archive_url":"https://api.github.com/repos/NYPL-Simplified/server_core/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/NYPL-Simplified/server_core/downloads","issues_url":"https://api.github.com/repos/NYPL-Simplified/server_core/issues{/number}","pulls_url":"https://api.github.com/repos/NYPL-Simplified/server_core/pulls{/number}","milestones_url":"https://api.github.com/repos/NYPL-Simplified/server_core/milestones{/number}","notifications_url":"https://api.github.com/repos/NYPL-Simplified/server_core/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/NYPL-Simplified/server_core/labels{/name}","releases_url":"https://api.github.com/repos/NYPL-Simplified/server_core/releases{/id}","deployments_url":"https://api.github.com/repos/NYPL-Simplified/server_core/deployments","created_at":"2014-12-05T17:03:04Z","updated_at":"2016-10-24T19:50:10Z","pushed_at":"2017-03-29T19:29:30Z","git_url":"git://github.com/NYPL-Simplified/server_core.git","ssh_url":"git@github.com:NYPL-Simplified/server_core.git","clone_url":"https://github.com/NYPL-Simplified/server_core.git","svn_url":"https://github.com/NYPL-Simplified/server_core","homepage":null,"size":6478,"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":2,"mirror_url":null,"open_issues_count":51,"forks":2,"open_issues":51,"watchers":0,"default_branch":"master"}},"base":{"label":"NYPL-Simplified:multi-tenant","ref":"multi-tenant","sha":"843d4144faedec6560eb8e173f7aaf955f347a6e","user":{"login":"NYPL-Simplified","id":16416905,"avatar_url":"https://avatars2.githubusercontent.com/u/16416905?v=3","gravatar_id":"","url":"https://api.github.com/users/NYPL-Simplified","html_url":"https://github.com/NYPL-Simplified","followers_url":"https://api.github.com/users/NYPL-Simplified/followers","following_url":"https://api.github.com/users/NYPL-Simplified/following{/other_user}","gists_url":"https://api.github.com/users/NYPL-Simplified/gists{/gist_id}","starred_url":"https://api.github.com/users/NYPL-Simplified/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/NYPL-Simplified/subscriptions","organizations_url":"https://api.github.com/users/NYPL-Simplified/orgs","repos_url":"https://api.github.com/users/NYPL-Simplified/repos","events_url":"https://api.github.com/users/NYPL-Simplified/events{/privacy}","received_events_url":"https://api.github.com/users/NYPL-Simplified/received_events","type":"Organization","site_admin":false},"repo":{"id":27601287,"name":"server_core","full_name":"NYPL-Simplified/server_core","owner":{"login":"NYPL-Simplified","id":16416905,"avatar_url":"https://avatars2.githubusercontent.com/u/16416905?v=3","gravatar_id":"","url":"https://api.github.com/users/NYPL-Simplified","html_url":"https://github.com/NYPL-Simplified","followers_url":"https://api.github.com/users/NYPL-Simplified/followers","following_url":"https://api.github.com/users/NYPL-Simplified/following{/other_user}","gists_url":"https://api.github.com/users/NYPL-Simplified/gists{/gist_id}","starred_url":"https://api.github.com/users/NYPL-Simplified/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/NYPL-Simplified/subscriptions","organizations_url":"https://api.github.com/users/NYPL-Simplified/orgs","repos_url":"https://api.github.com/users/NYPL-Simplified/repos","events_url":"https://api.github.com/users/NYPL-Simplified/events{/privacy}","received_events_url":"https://api.github.com/users/NYPL-Simplified/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/NYPL-Simplified/server_core","description":"Shared data model and utilities for Library Simplified server applications","fork":false,"url":"https://api.github.com/repos/NYPL-Simplified/server_core","forks_url":"https://api.github.com/repos/NYPL-Simplified/server_core/forks","keys_url":"https://api.github.com/repos/NYPL-Simplified/server_core/keys{/key_id}","collaborators_url":"https://api.github.com/repos/NYPL-Simplified/server_core/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/NYPL-Simplified/server_core/teams","hooks_url":"https://api.github.com/repos/NYPL-Simplified/server_core/hooks","issue_events_url":"https://api.github.com/repos/NYPL-Simplified/server_core/issues/events{/number}","events_url":"https://api.github.com/repos/NYPL-Simplified/server_core/events","assignees_url":"https://api.github.com/repos/NYPL-Simplified/server_core/assignees{/user}","branches_url":"https://api.github.com/repos/NYPL-Simplified/server_core/branches{/branch}","tags_url":"https://api.github.com/repos/NYPL-Simplified/server_core/tags","blobs_url":"https://api.github.com/repos/NYPL-Simplified/server_core/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/NYPL-Simplified/server_core/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/NYPL-Simplified/server_core/git/refs{/sha}","trees_url":"https://api.github.com/repos/NYPL-Simplified/server_core/git/trees{/sha}","statuses_url":"https://api.github.com/repos/NYPL-Simplified/server_core/statuses/{sha}","languages_url":"https://api.github.com/repos/NYPL-Simplified/server_core/languages","stargazers_url":"https://api.github.com/repos/NYPL-Simplified/server_core/stargazers","contributors_url":"https://api.github.com/repos/NYPL-Simplified/server_core/contributors","subscribers_url":"https://api.github.com/repos/NYPL-Simplified/server_core/subscribers","subscription_url":"https://api.github.com/repos/NYPL-Simplified/server_core/subscription","commits_url":"https://api.github.com/repos/NYPL-Simplified/server_core/commits{/sha}","git_commits_url":"https://api.github.com/repos/NYPL-Simplified/server_core/git/commits{/sha}","comments_url":"https://api.github.com/repos/NYPL-Simplified/server_core/comments{/number}","issue_comment_url":"https://api.github.com/repos/NYPL-Simplified/server_core/issues/comments{/number}","contents_url":"https://api.github.com/repos/NYPL-Simplified/server_core/contents/{+path}","compare_url":"https://api.github.com/repos/NYPL-Simplified/server_core/compare/{base}...{head}","merges_url":"https://api.github.com/repos/NYPL-Simplified/server_core/merges","archive_url":"https://api.github.com/repos/NYPL-Simplified/server_core/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/NYPL-Simplified/server_core/downloads","issues_url":"https://api.github.com/repos/NYPL-Simplified/server_core/issues{/number}","pulls_url":"https://api.github.com/repos/NYPL-Simplified/server_core/pulls{/number}","milestones_url":"https://api.github.com/repos/NYPL-Simplified/server_core/milestones{/number}","notifications_url":"https://api.github.com/repos/NYPL-Simplified/server_core/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/NYPL-Simplified/server_core/labels{/name}","releases_url":"https://api.github.com/repos/NYPL-Simplified/server_core/releases{/id}","deployments_url":"https://api.github.com/repos/NYPL-Simplified/server_core/deployments","created_at":"2014-12-05T17:03:04Z","updated_at":"2016-10-24T19:50:10Z","pushed_at":"2017-03-29T19:29:30Z","git_url":"git://github.com/NYPL-Simplified/server_core.git","ssh_url":"git@github.com:NYPL-Simplified/server_core.git","clone_url":"https://github.com/NYPL-Simplified/server_core.git","svn_url":"https://github.com/NYPL-Simplified/server_core","homepage":null,"size":6478,"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":2,"mirror_url":null,"open_issues_count":51,"forks":2,"open_issues":51,"watchers":0,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/NYPL-Simplified/server_core/pulls/483"},"html":{"href":"https://github.com/NYPL-Simplified/server_core/pull/483"},"issue":{"href":"https://api.github.com/repos/NYPL-Simplified/server_core/issues/483"},"comments":{"href":"https://api.github.com/repos/NYPL-Simplified/server_core/issues/483/comments"},"review_comments":{"href":"https://api.github.com/repos/NYPL-Simplified/server_core/pulls/483/comments"},"review_comment":{"href":"https://api.github.com/repos/NYPL-Simplified/server_core/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/NYPL-Simplified/server_core/pulls/483/commits"},"statuses":{"href":"https://api.github.com/repos/NYPL-Simplified/server_core/statuses/9eedf7a5ca2985cab0b4d6743be1883462a5f988"}}}}
{"actor":{"display_login":"leonardr"}}