{"action":"created","comment":{"url":"https://api.github.com/repos/cloudant/CDTDatastore/pulls/comments/51862706","id":51862706,"diff_hunk":"@@ -0,0 +1,195 @@\n+# Replication Policies\n+\n+## iOS replication policies\n+\n+Replication policies on iOS run in a background task to allow them to run independently of the rest of your application\n+and to enable them to continue even when the app is suspended or terminated.\n+\n+It is also possible to configure periodic replication of data whilst the app is in the background. It is important\n+to realise that iOS imposes restrictions on background data transfer and these apply to replication policies. In\n+particular, iOS limits the time during which data transfers can occur while the app is in the background to 30\n+seconds. Also, although a minimum background fetch interval can be specified, this is the absolute minimum period\n+between performing background data transfers and the actual interval may be significantly different to the minimum\n+interval specified.\n+\n+### Configuring background execution\n+\n+To configure background execution, it is necessary to:\n+* enable the Background fetch option for the Background modes section of the Capabilites tab in your Xcode project (you\n+  can also enable this support by including the `UIBackgroundModes` key with the `fetch` value in your app's `Info.plist`\n+  file).\n+* implement an app delegate method `application:performFetchWithCompletionHandler:` to initiate the replications. Once\n+  replications are complete, this method must execute the provided completion handler block, passing a result that\n+  indicates whether content was available.\n+* set the minimum background fetch interval by calling `setMinimumBackgroundFetchInterval:` on the application's\n+  `UIApplication` object. The value given to `setMinimumBackgroundFetchInterval:` is advisory only and the actual\n+  time between background replications may vary considerably from the value set.\n+\n+You should note that enabling background fetch does not guarantee that iOS will give your app any time to perform\n+background fetches as iOS will attempt to balance your app's need to fetch content with the needs of the system and\n+of other apps.\n+\n+### Example\n+\n+Lets assume we wish to configure a replication policy as follows:\n+\n+* We only ever want replications to occur when the device is connected to a WiFi network.\n+* We want to do sync replications (pull and push).\n+* When the app is not displaying data to the user we want replications to occur once every 24 hours to keep the data on the device fairly fresh.\n+* When the app is displaying data to the user we want replications to occur every 5 minutes so the data displayed to the user is only ever a few minutes out of date if we're on Wifi.\n+* When the app is displaying data to the user we want to refresh the UI to display the new data when the pull replication has completed.\n+* After the device has rebooted, we want replications to continue in the same way as prior to the reboot.\n+\n+Note that there is a full example implementing a policy similar to the above in the example project in the\n+`Project` directory.\n+\n+#### Configuring app capabilities\n+\n+On the `Capabilities` tab of your Xcode project turn on `Background Modes` and select `Background fetch`.\n+\n+#### Configure your replications\n+\n+Configure your replications following the guidance in the [Replication guide](replication.md).\n+\n+Note however, that in the following example we'll use the `startWithError:taskGroup:` method of\n+`CDTReplicator` instead of `startWithError:` so that we can batch the replication tasks and wait\n+for the completion of all of them.\n+\n+For example:\n+```objc\n+/** Start both a push and pull replication.\n+ *\n+ *  @param taskGroup A dispatch_group_t to allow us to wait for replications to complete.\n+ */\n+- (void)startReplications:(dispatch_group_t)taskGroup\n+{\n+    // Create and start the replicator -- -start is essential!\n+    CDTReplicatorFactory *replicatorFactory =\n+    [[CDTReplicatorFactory alloc] initWithDatastoreManager:manager];\n+\n+    // username/password can be Cloudant API keys\n+    NSString *s = @\"https://username:password@username.cloudant.com/my_database\";\n+    NSURL *remoteDatabaseURL = [NSURL URLWithString:s];\n+    CDTDatastore *datastore = [manager datastoreNamed:@\"my_datastore\"];\n+\n+    // Create a replicator that replicates changes from the local\n+    // datastore to the remote database.\n+    CDTPushReplication *pushReplication = [CDTPushReplication replicationWithSource:datastore\n+                                                                             target:remoteDatabaseURL];\n+\n+    // Create a replicator that replicates changes from a remote\n+    // database to the local one.\n+    CDTPullReplication *pullReplication = [CDTPullReplication replicationWithSource:remoteDatabaseURL\n+                                                                             target:datastore];\n+\n+    NSError *pushError;\n+    CDTReplicator *pushReplicator = [replicatorFactory oneWay:pushReplication error:&error];\n+    pushReplicator.sessionConfigDelegate = self;\n+\n+    NSError *pullError;\n+    CDTReplicator *pullReplicator = [replicatorFactory oneWay:pullReplication error:&error];\n+    pullReplicator.sessionConfigDelegate = self;\n+\n+    // Start the push replication\n+    if (![pushReplicator startWithError:&error taskGroup:taskGroup]){\n+        //handle error\n+    }\n+\n+    // Start the pull replication\n+    if (![pullReplicator startWithError:&error taskGroup:taskGroup]){\n+        //handle error\n+    }\n+}\n+```\n+\n+Create a method to start replications and wait for their completion (on a background thread).\n+\n+```objc\n+-(void)syncInBackgroundWithCompletionHandler:(void (^)())completionHandler\n+{\n+    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0), ^{\n+        dispatch_group_t backgroundTasks = dispatch_group_create();\n+\n+        UIBackgroundTaskIdentifier taskId = [[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:NULL];\n+\n+        [self startReplications:backgroundTasks];\n+\n+        dispatch_group_wait(backgroundTasks, dispatch_time(DISPATCH_TIME_NOW, 30000000000));\n+\n+        if (completionHandler) {\n+            completionHandler();\n+        }\n+\n+        [[UIApplication sharedApplication] endBackgroundTask:taskId];\n+    });\n+}\n+```\n+\n+Setup an NSURLSessionConfigurationDelegate to customise the NSURLSession as you require:\n+\n+```objc\n+- (NSURLSessionConfiguration*)customiseNSURLSessionConfiguration:(nonnull NSURLSessionConfiguration *)config {","path":"doc/replication-policies.md","position":131,"original_position":131,"commit_id":"84bf89703fbcdb9db583075df432a874e782fd8e","original_commit_id":"84bf89703fbcdb9db583075df432a874e782fd8e","user":{"login":"rhyshort","id":1616727,"avatar_url":"https://avatars.githubusercontent.com/u/1616727?v=3","gravatar_id":"","url":"https://api.github.com/users/rhyshort","html_url":"https://github.com/rhyshort","followers_url":"https://api.github.com/users/rhyshort/followers","following_url":"https://api.github.com/users/rhyshort/following{/other_user}","gists_url":"https://api.github.com/users/rhyshort/gists{/gist_id}","starred_url":"https://api.github.com/users/rhyshort/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/rhyshort/subscriptions","organizations_url":"https://api.github.com/users/rhyshort/orgs","repos_url":"https://api.github.com/users/rhyshort/repos","events_url":"https://api.github.com/users/rhyshort/events{/privacy}","received_events_url":"https://api.github.com/users/rhyshort/received_events","type":"User","site_admin":false},"body":"I'm a bit confused, how does this method get called from the replicator? from what I can see we only pass in a target and source without a delegate","created_at":"2016-02-04T11:52:06Z","updated_at":"2016-02-04T11:52:06Z","html_url":"https://github.com/cloudant/CDTDatastore/pull/219#discussion_r51862706","pull_request_url":"https://api.github.com/repos/cloudant/CDTDatastore/pulls/219","_links":{"self":{"href":"https://api.github.com/repos/cloudant/CDTDatastore/pulls/comments/51862706"},"html":{"href":"https://github.com/cloudant/CDTDatastore/pull/219#discussion_r51862706"},"pull_request":{"href":"https://api.github.com/repos/cloudant/CDTDatastore/pulls/219"}}},"pull_request":{"url":"https://api.github.com/repos/cloudant/CDTDatastore/pulls/219","id":58126898,"html_url":"https://github.com/cloudant/CDTDatastore/pull/219","diff_url":"https://github.com/cloudant/CDTDatastore/pull/219.diff","patch_url":"https://github.com/cloudant/CDTDatastore/pull/219.patch","issue_url":"https://api.github.com/repos/cloudant/CDTDatastore/issues/219","number":219,"state":"open","locked":false,"title":"Add documentation updates","user":{"login":"brynh","id":12249863,"avatar_url":"https://avatars.githubusercontent.com/u/12249863?v=3","gravatar_id":"","url":"https://api.github.com/users/brynh","html_url":"https://github.com/brynh","followers_url":"https://api.github.com/users/brynh/followers","following_url":"https://api.github.com/users/brynh/following{/other_user}","gists_url":"https://api.github.com/users/brynh/gists{/gist_id}","starred_url":"https://api.github.com/users/brynh/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/brynh/subscriptions","organizations_url":"https://api.github.com/users/brynh/orgs","repos_url":"https://api.github.com/users/brynh/repos","events_url":"https://api.github.com/users/brynh/events{/privacy}","received_events_url":"https://api.github.com/users/brynh/received_events","type":"User","site_admin":false},"body":"This is part 2 of a 3 part change to implement replication policies. Each of the 3 parts of the implementation of replication policies is in a separate branch.\r\n\r\n_The following text is common to all 3 PRs._\r\n\r\nThe 3 branches include:\r\n1. _replication-policies-1_: The main code changes implementing replication policies on iOS.\r\n2. _replication-policies-2-doc_: Documentation updates.\r\n3. _replication-policies-3-sample-project_: Updates to the sample project to add periodic replication when on WiFi.\r\n\r\n_What?_\r\nAdd mechanism to enable users to more easily specify the circumstances under which they want replication to occur. This allows relatively simple definition of policies within the constraints of [iOS background execution](https://developer.apple.com/library/ios/documentation/iPhone/Conceptual/iPhoneOSProgrammingGuide/BackgroundExecution/BackgroundExecution.html) - e.g.:\r\n* Do a pull replication every 2 hours;\r\n* Do a full sync every hour, but only when we have a Wifi connection;\r\n\r\n_Why?_\r\nPrior to this PR, it was more complicated to implement such policies and replication when the app was suspended was not supported. This aims to update the code to allow it to support the relatively simple configuration of policies by the user.\r\n\r\n_How?_\r\nWe need the replication policy management to work within the strict constraints of iOS and to allow background transfers while the app is suspended. This requires that data transfers between the device and server are performed using background sessions.\r\n\r\nThe code has therefore been modified to configure the `NSURLSession` using a background session configuration. Background session configurations must use delegates to process responses rather than completion handlers and corresponding changes have therefore been made in the code, making `CDTURLSession` the delegate handling the responses.\r\n\r\n`CDTURLSession` stores a mapping of the unique identifiers of `NSURLSessionTask` objects to their corresponding `CDTURLSessionTask` objects so that processing of the responses can be further delegated to the `CDTURLSessionTask` that sent the corresponding request.\r\n\r\nThe new `NSURLSessionConfigurationDelegate` allows a delegate to be set that enables the user to configure aspects of the `NSURLSessionConfiguration` - e.g. setting the `allowsCellularAccess` property to enable/disable use of the cellular data connection.\r\n\r\nSee the [Replication Policies User Guide](https://github.com/cloudant/CDTDatastore/blob/replication-policies-2-doc/doc/replication-policies.md) for further information on how replication policies are implemented.","created_at":"2016-02-03T11:55:23Z","updated_at":"2016-02-04T11:52:06Z","closed_at":null,"merged_at":null,"merge_commit_sha":"b75db05348213ac709da2ca90c476a461e08a551","assignee":null,"milestone":null,"commits_url":"https://api.github.com/repos/cloudant/CDTDatastore/pulls/219/commits","review_comments_url":"https://api.github.com/repos/cloudant/CDTDatastore/pulls/219/comments","review_comment_url":"https://api.github.com/repos/cloudant/CDTDatastore/pulls/comments{/number}","comments_url":"https://api.github.com/repos/cloudant/CDTDatastore/issues/219/comments","statuses_url":"https://api.github.com/repos/cloudant/CDTDatastore/statuses/84bf89703fbcdb9db583075df432a874e782fd8e","head":{"label":"cloudant:replication-policies-2-doc","ref":"replication-policies-2-doc","sha":"84bf89703fbcdb9db583075df432a874e782fd8e","user":{"login":"cloudant","id":44642,"avatar_url":"https://avatars.githubusercontent.com/u/44642?v=3","gravatar_id":"","url":"https://api.github.com/users/cloudant","html_url":"https://github.com/cloudant","followers_url":"https://api.github.com/users/cloudant/followers","following_url":"https://api.github.com/users/cloudant/following{/other_user}","gists_url":"https://api.github.com/users/cloudant/gists{/gist_id}","starred_url":"https://api.github.com/users/cloudant/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cloudant/subscriptions","organizations_url":"https://api.github.com/users/cloudant/orgs","repos_url":"https://api.github.com/users/cloudant/repos","events_url":"https://api.github.com/users/cloudant/events{/privacy}","received_events_url":"https://api.github.com/users/cloudant/received_events","type":"Organization","site_admin":false},"repo":{"id":15022868,"name":"CDTDatastore","full_name":"cloudant/CDTDatastore","owner":{"login":"cloudant","id":44642,"avatar_url":"https://avatars.githubusercontent.com/u/44642?v=3","gravatar_id":"","url":"https://api.github.com/users/cloudant","html_url":"https://github.com/cloudant","followers_url":"https://api.github.com/users/cloudant/followers","following_url":"https://api.github.com/users/cloudant/following{/other_user}","gists_url":"https://api.github.com/users/cloudant/gists{/gist_id}","starred_url":"https://api.github.com/users/cloudant/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cloudant/subscriptions","organizations_url":"https://api.github.com/users/cloudant/orgs","repos_url":"https://api.github.com/users/cloudant/repos","events_url":"https://api.github.com/users/cloudant/events{/privacy}","received_events_url":"https://api.github.com/users/cloudant/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/cloudant/CDTDatastore","description":"Cloudant Sync iOS datastore library.","fork":false,"url":"https://api.github.com/repos/cloudant/CDTDatastore","forks_url":"https://api.github.com/repos/cloudant/CDTDatastore/forks","keys_url":"https://api.github.com/repos/cloudant/CDTDatastore/keys{/key_id}","collaborators_url":"https://api.github.com/repos/cloudant/CDTDatastore/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/cloudant/CDTDatastore/teams","hooks_url":"https://api.github.com/repos/cloudant/CDTDatastore/hooks","issue_events_url":"https://api.github.com/repos/cloudant/CDTDatastore/issues/events{/number}","events_url":"https://api.github.com/repos/cloudant/CDTDatastore/events","assignees_url":"https://api.github.com/repos/cloudant/CDTDatastore/assignees{/user}","branches_url":"https://api.github.com/repos/cloudant/CDTDatastore/branches{/branch}","tags_url":"https://api.github.com/repos/cloudant/CDTDatastore/tags","blobs_url":"https://api.github.com/repos/cloudant/CDTDatastore/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/cloudant/CDTDatastore/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/cloudant/CDTDatastore/git/refs{/sha}","trees_url":"https://api.github.com/repos/cloudant/CDTDatastore/git/trees{/sha}","statuses_url":"https://api.github.com/repos/cloudant/CDTDatastore/statuses/{sha}","languages_url":"https://api.github.com/repos/cloudant/CDTDatastore/languages","stargazers_url":"https://api.github.com/repos/cloudant/CDTDatastore/stargazers","contributors_url":"https://api.github.com/repos/cloudant/CDTDatastore/contributors","subscribers_url":"https://api.github.com/repos/cloudant/CDTDatastore/subscribers","subscription_url":"https://api.github.com/repos/cloudant/CDTDatastore/subscription","commits_url":"https://api.github.com/repos/cloudant/CDTDatastore/commits{/sha}","git_commits_url":"https://api.github.com/repos/cloudant/CDTDatastore/git/commits{/sha}","comments_url":"https://api.github.com/repos/cloudant/CDTDatastore/comments{/number}","issue_comment_url":"https://api.github.com/repos/cloudant/CDTDatastore/issues/comments{/number}","contents_url":"https://api.github.com/repos/cloudant/CDTDatastore/contents/{+path}","compare_url":"https://api.github.com/repos/cloudant/CDTDatastore/compare/{base}...{head}","merges_url":"https://api.github.com/repos/cloudant/CDTDatastore/merges","archive_url":"https://api.github.com/repos/cloudant/CDTDatastore/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/cloudant/CDTDatastore/downloads","issues_url":"https://api.github.com/repos/cloudant/CDTDatastore/issues{/number}","pulls_url":"https://api.github.com/repos/cloudant/CDTDatastore/pulls{/number}","milestones_url":"https://api.github.com/repos/cloudant/CDTDatastore/milestones{/number}","notifications_url":"https://api.github.com/repos/cloudant/CDTDatastore/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/cloudant/CDTDatastore/labels{/name}","releases_url":"https://api.github.com/repos/cloudant/CDTDatastore/releases{/id}","deployments_url":"https://api.github.com/repos/cloudant/CDTDatastore/deployments","created_at":"2013-12-08T11:59:05Z","updated_at":"2016-02-02T17:42:13Z","pushed_at":"2016-02-03T14:29:04Z","git_url":"git://github.com/cloudant/CDTDatastore.git","ssh_url":"git@github.com:cloudant/CDTDatastore.git","clone_url":"https://github.com/cloudant/CDTDatastore.git","svn_url":"https://github.com/cloudant/CDTDatastore","homepage":null,"size":6643,"stargazers_count":95,"watchers_count":95,"language":"Objective-C","has_issues":true,"has_downloads":true,"has_wiki":false,"has_pages":false,"forks_count":23,"mirror_url":null,"open_issues_count":9,"forks":23,"open_issues":9,"watchers":95,"default_branch":"master"}},"base":{"label":"cloudant:replication-policies-1","ref":"replication-policies-1","sha":"22b92801d255a6e7cb3b80e979e359c80bee6232","user":{"login":"cloudant","id":44642,"avatar_url":"https://avatars.githubusercontent.com/u/44642?v=3","gravatar_id":"","url":"https://api.github.com/users/cloudant","html_url":"https://github.com/cloudant","followers_url":"https://api.github.com/users/cloudant/followers","following_url":"https://api.github.com/users/cloudant/following{/other_user}","gists_url":"https://api.github.com/users/cloudant/gists{/gist_id}","starred_url":"https://api.github.com/users/cloudant/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cloudant/subscriptions","organizations_url":"https://api.github.com/users/cloudant/orgs","repos_url":"https://api.github.com/users/cloudant/repos","events_url":"https://api.github.com/users/cloudant/events{/privacy}","received_events_url":"https://api.github.com/users/cloudant/received_events","type":"Organization","site_admin":false},"repo":{"id":15022868,"name":"CDTDatastore","full_name":"cloudant/CDTDatastore","owner":{"login":"cloudant","id":44642,"avatar_url":"https://avatars.githubusercontent.com/u/44642?v=3","gravatar_id":"","url":"https://api.github.com/users/cloudant","html_url":"https://github.com/cloudant","followers_url":"https://api.github.com/users/cloudant/followers","following_url":"https://api.github.com/users/cloudant/following{/other_user}","gists_url":"https://api.github.com/users/cloudant/gists{/gist_id}","starred_url":"https://api.github.com/users/cloudant/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cloudant/subscriptions","organizations_url":"https://api.github.com/users/cloudant/orgs","repos_url":"https://api.github.com/users/cloudant/repos","events_url":"https://api.github.com/users/cloudant/events{/privacy}","received_events_url":"https://api.github.com/users/cloudant/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/cloudant/CDTDatastore","description":"Cloudant Sync iOS datastore library.","fork":false,"url":"https://api.github.com/repos/cloudant/CDTDatastore","forks_url":"https://api.github.com/repos/cloudant/CDTDatastore/forks","keys_url":"https://api.github.com/repos/cloudant/CDTDatastore/keys{/key_id}","collaborators_url":"https://api.github.com/repos/cloudant/CDTDatastore/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/cloudant/CDTDatastore/teams","hooks_url":"https://api.github.com/repos/cloudant/CDTDatastore/hooks","issue_events_url":"https://api.github.com/repos/cloudant/CDTDatastore/issues/events{/number}","events_url":"https://api.github.com/repos/cloudant/CDTDatastore/events","assignees_url":"https://api.github.com/repos/cloudant/CDTDatastore/assignees{/user}","branches_url":"https://api.github.com/repos/cloudant/CDTDatastore/branches{/branch}","tags_url":"https://api.github.com/repos/cloudant/CDTDatastore/tags","blobs_url":"https://api.github.com/repos/cloudant/CDTDatastore/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/cloudant/CDTDatastore/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/cloudant/CDTDatastore/git/refs{/sha}","trees_url":"https://api.github.com/repos/cloudant/CDTDatastore/git/trees{/sha}","statuses_url":"https://api.github.com/repos/cloudant/CDTDatastore/statuses/{sha}","languages_url":"https://api.github.com/repos/cloudant/CDTDatastore/languages","stargazers_url":"https://api.github.com/repos/cloudant/CDTDatastore/stargazers","contributors_url":"https://api.github.com/repos/cloudant/CDTDatastore/contributors","subscribers_url":"https://api.github.com/repos/cloudant/CDTDatastore/subscribers","subscription_url":"https://api.github.com/repos/cloudant/CDTDatastore/subscription","commits_url":"https://api.github.com/repos/cloudant/CDTDatastore/commits{/sha}","git_commits_url":"https://api.github.com/repos/cloudant/CDTDatastore/git/commits{/sha}","comments_url":"https://api.github.com/repos/cloudant/CDTDatastore/comments{/number}","issue_comment_url":"https://api.github.com/repos/cloudant/CDTDatastore/issues/comments{/number}","contents_url":"https://api.github.com/repos/cloudant/CDTDatastore/contents/{+path}","compare_url":"https://api.github.com/repos/cloudant/CDTDatastore/compare/{base}...{head}","merges_url":"https://api.github.com/repos/cloudant/CDTDatastore/merges","archive_url":"https://api.github.com/repos/cloudant/CDTDatastore/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/cloudant/CDTDatastore/downloads","issues_url":"https://api.github.com/repos/cloudant/CDTDatastore/issues{/number}","pulls_url":"https://api.github.com/repos/cloudant/CDTDatastore/pulls{/number}","milestones_url":"https://api.github.com/repos/cloudant/CDTDatastore/milestones{/number}","notifications_url":"https://api.github.com/repos/cloudant/CDTDatastore/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/cloudant/CDTDatastore/labels{/name}","releases_url":"https://api.github.com/repos/cloudant/CDTDatastore/releases{/id}","deployments_url":"https://api.github.com/repos/cloudant/CDTDatastore/deployments","created_at":"2013-12-08T11:59:05Z","updated_at":"2016-02-02T17:42:13Z","pushed_at":"2016-02-03T14:29:04Z","git_url":"git://github.com/cloudant/CDTDatastore.git","ssh_url":"git@github.com:cloudant/CDTDatastore.git","clone_url":"https://github.com/cloudant/CDTDatastore.git","svn_url":"https://github.com/cloudant/CDTDatastore","homepage":null,"size":6643,"stargazers_count":95,"watchers_count":95,"language":"Objective-C","has_issues":true,"has_downloads":true,"has_wiki":false,"has_pages":false,"forks_count":23,"mirror_url":null,"open_issues_count":9,"forks":23,"open_issues":9,"watchers":95,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/cloudant/CDTDatastore/pulls/219"},"html":{"href":"https://github.com/cloudant/CDTDatastore/pull/219"},"issue":{"href":"https://api.github.com/repos/cloudant/CDTDatastore/issues/219"},"comments":{"href":"https://api.github.com/repos/cloudant/CDTDatastore/issues/219/comments"},"review_comments":{"href":"https://api.github.com/repos/cloudant/CDTDatastore/pulls/219/comments"},"review_comment":{"href":"https://api.github.com/repos/cloudant/CDTDatastore/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/cloudant/CDTDatastore/pulls/219/commits"},"statuses":{"href":"https://api.github.com/repos/cloudant/CDTDatastore/statuses/84bf89703fbcdb9db583075df432a874e782fd8e"}}}}