{"action":"created","comment":{"url":"https://api.github.com/repos/strongloop/loopback-datasource-juggler/pulls/comments/73603921","id":73603921,"diff_hunk":"@@ -2946,6 +2946,431 @@ module.exports = function(dataSource, should, connectorCapabilities) {\n \n     });\n \n+    describe('PersistedModel.upsertWithWhere', function() {\n+\n+      it('triggers hooks in the correct order on create', function(done) {\n+        monitorHookExecution();\n+        TestModel.upsertWithWhere({ extra: 'not-found' },\n+          { id: 'not-found', name: 'not found', extra: 'not-found' },\n+          function(err, record, created) {\n+            if (err) return done(err);\n+            if (dataSource.connector.upsertWithWhere) {\n+              hookMonitor.names.should.eql([\n+                'access',\n+                'before save',\n+                'persist',\n+                'loaded',\n+                'after save',\n+              ]);\n+            } else {\n+              hookMonitor.names.should.eql([\n+                'access',\n+                'before save',\n+                'persist',\n+                'loaded',\n+                'after save',\n+              ]);\n+            }\n+            TestModel.findById('not-found', function(err, data) {\n+              if (err) return done(err);\n+              data.name.should.equal('not found');\n+              data.extra.should.equal('not-found');\n+              done();\n+            });\n+          });\n+      });\n+\n+      it('triggers hooks in the correct order on update', function(done) {\n+        monitorHookExecution();\n+        TestModel.upsertWithWhere({ id: existingInstance.id },\n+          { name: 'new name', extra: 'new extra' },\n+          function(err, record, created) {\n+            if (err) return done(err);\n+            if (dataSource.connector.upsertWithWhere) {\n+              hookMonitor.names.should.eql([\n+                'access',\n+                'before save',\n+                'persist',\n+                'loaded',\n+                'after save',\n+              ]);\n+            } else {\n+              hookMonitor.names.should.eql([\n+                'access',\n+                'before save',\n+                'persist',\n+                'loaded',\n+                'after save',\n+              ]);\n+            }\n+            TestModel.findById(existingInstance.id, function(err, data) {\n+              if (err) return done(err);\n+              data.name.should.equal('new name');\n+              data.extra.should.equal('new extra');\n+              done();\n+            });\n+          });\n+      });\n+\n+      it('triggers `access` hook on create', function(done) {\n+        TestModel.observe('access', ctxRecorder.recordAndNext());\n+\n+        TestModel.upsertWithWhere({ extra: 'not-found' },\n+          { id: 'not-found', name: 'not found' },\n+          function(err, instance) {\n+            if (err) return done(err);\n+            ctxRecorder.records.should.eql(aCtxForModel(TestModel, { query: {\n+              where: { extra: 'not-found' },\n+            }}));\n+            done();\n+          });\n+      });\n+\n+      it('triggers `access` hook on update', function(done) {\n+        TestModel.observe('access', ctxRecorder.recordAndNext());\n+\n+        TestModel.upsertWithWhere({ id: existingInstance.id },\n+          { name: 'new name', extra: 'new extra' },\n+          function(err, instance) {\n+            if (err) return done(err);\n+            ctxRecorder.records.should.eql(aCtxForModel(TestModel, { query: {\n+              where: { id: existingInstance.id },\n+            }}));\n+            done();\n+          });\n+      });\n+\n+      it('triggers hooks only once', function(done) {\n+        monitorHookExecution(['access', 'before save']);\n+\n+        TestModel.observe('access', function(ctx, next) {\n+          ctx.query = { where: { id: { neq: existingInstance.id }}};\n+          next();\n+        });\n+\n+        TestModel.upsertWithWhere({ id: existingInstance.id },\n+          { id: 'ignored', name: 'new name' },\n+          function(err, instance) {\n+            if (err) return done(err);\n+            hookMonitor.names.should.eql(['access', 'before save']);\n+            done();\n+          });\n+      });\n+\n+      it('applies updates from `access` hook when found', function(done) {\n+        TestModel.observe('access', function(ctx, next) {\n+          ctx.query = { where: { id: { neq: existingInstance.id }}};\n+          next();\n+        });\n+\n+        TestModel.upsertWithWhere({ id: existingInstance.id },\n+          { name: 'new name' },\n+          function(err, instance) {\n+            if (err) return done(err);\n+            findTestModels({ fields: ['id', 'name'] }, function(err, list) {\n+              if (err) return done(err);\n+              (list || []).map(toObject).should.eql([\n+                { id: existingInstance.id, name: existingInstance.name, extra: undefined },\n+                { id: instance.id, name: 'new name', extra: undefined },\n+              ]);\n+              done();\n+            });\n+          });\n+      });\n+\n+      it('applies updates from `access` hook when not found', function(done) {\n+        TestModel.observe('access', function(ctx, next) {\n+          ctx.query = { where: { id: 'not-found' }};\n+          next();\n+        });\n+\n+        TestModel.upsertWithWhere({ id: existingInstance.id },\n+          { name: 'new name' },\n+          function(err, instance) {\n+            if (err) return done(err);\n+            findTestModels({ fields: ['id', 'name'] }, function(err, list) {\n+              if (err) return done(err);\n+              (list || []).map(toObject).should.eql([\n+                { id: existingInstance.id, name: existingInstance.name, extra: undefined },\n+                { id: list[1].id, name: 'second', extra: undefined },\n+                { id: instance.id, name: 'new name', extra: undefined },\n+              ]);\n+              done();\n+            });\n+          });\n+      });\n+\n+      it('triggers `before save` hook on update', function(done) {\n+        TestModel.observe('before save', ctxRecorder.recordAndNext());\n+\n+        TestModel.upsertWithWhere({ id: existingInstance.id },\n+          { id: existingInstance.id, name: 'updated name' },\n+          function(err, instance) {\n+            if (err) return done(err);\n+            if (dataSource.connector.upsertWithWhere) {\n+              ctxRecorder.records.should.eql(aCtxForModel(TestModel, {\n+                where: { id: existingInstance.id },\n+                data: { id: existingInstance.id, name: 'updated name' },\n+              }));\n+            } else {\n+              ctxRecorder.records.should.eql(aCtxForModel(TestModel, {\n+                where: { id: existingInstance.id },\n+                data: { id: existingInstance.id, name: 'updated name' },\n+                currentInstance: existingInstance,\n+              }));\n+            }\n+            done();\n+          });\n+      });\n+\n+      it('triggers `before save` hook on create', function(done) {\n+        TestModel.observe('before save', ctxRecorder.recordAndNext());\n+\n+        TestModel.upsertWithWhere({ id: 'new-id' },\n+          { id: 'new-id', name: 'a name' },\n+          function(err, instance) {\n+            if (err) return done(err);\n+            if (dataSource.connector.upsertWithWhere) {\n+              ctxRecorder.records.should.eql(aCtxForModel(TestModel, {\n+                where: { id: 'new-id' },\n+                data: { id: 'new-id', name: 'a name' },\n+              }));\n+            } else {\n+              ctxRecorder.records.should.eql(aCtxForModel(TestModel, {\n+                instance: { id: 'new-id', name: 'a name', extra: undefined },\n+                isNewInstance: true,\n+              }));\n+            }\n+            done();\n+          });\n+      });\n+\n+      it('applies updates from `before save` hook on update', function(done) {\n+        TestModel.observe('before save', function(ctx, next) {\n+          ctx.data.name = 'hooked';\n+          next();\n+        });\n+\n+        TestModel.upsertWithWhere({ id: existingInstance.id },\n+          { name: 'updated name' },\n+          function(err, instance) {\n+            if (err) return done(err);\n+            instance.name.should.equal('hooked');\n+            done();\n+          });\n+      });\n+\n+      it('applies updates from `before save` hook on create', function(done) {\n+        TestModel.observe('before save', function(ctx, next) {\n+          if (ctx.instance) {\n+            ctx.instance.name = 'hooked';\n+          } else {\n+            ctx.data.name = 'hooked';\n+          }\n+          next();\n+        });\n+\n+        TestModel.upsertWithWhere({ id: 'new-id' },\n+          { id: 'new-id', name: 'new name' },\n+          function(err, instance) {\n+            if (err) return done(err);\n+            instance.name.should.equal('hooked');\n+            done();\n+          });\n+      });\n+\n+      it('validates model after `before save` hook on create', function(done) {\n+        TestModel.observe('before save', invalidateTestModel());\n+\n+        TestModel.upsertWithWhere({ id: 'new-id' },\n+          { id: 'new-id', name: 'new name' },\n+          function(err, instance) {\n+            (err || {}).should.be.instanceOf(ValidationError);\n+            (err.details.codes || {}).should.eql({ name: ['presence'] });\n+            done();\n+          });\n+      });\n+\n+      it('validates model after `before save` hook on update', function(done) {\n+        TestModel.observe('before save', invalidateTestModel());\n+\n+        TestModel.upsertWithWhere({ id: existingInstance.id },\n+          { id: existingInstance.id, name: 'updated name' },\n+          function(err, instance) {\n+            (err || {}).should.be.instanceOf(ValidationError);\n+            (err.details.codes || {}).should.eql({ name: ['presence'] });\n+            done();\n+          });\n+      });\n+\n+      it('triggers `persist` hook on create', function(done) {\n+        TestModel.observe('persist', ctxRecorder.recordAndNext());\n+\n+        TestModel.upsertWithWhere({ id: 'new-id' },\n+          { id: 'new-id', name: 'a name' },\n+          function(err, instance) {\n+            if (err) return done(err);\n+\n+            if (dataSource.connector.upsertWithWhere) {\n+              ctxRecorder.records.should.eql(aCtxForModel(TestModel, {\n+                where: { id: 'new-id' },\n+                data: { id: 'new-id', name: 'a name' },\n+                currentInstance: {\n+                  id: 'new-id',\n+                  name: 'a name',\n+                  extra: undefined,\n+                },\n+              }));\n+            } else {\n+              ctxRecorder.records.should.eql(aCtxForModel(TestModel, {\n+                data: {\n+                  id: 'new-id',\n+                  name: 'a name',\n+                },\n+                isNewInstance: true,\n+                currentInstance: {\n+                  id: 'new-id',\n+                  name: 'a name',\n+                  extra: undefined,\n+                },\n+              }));\n+            }\n+            done();\n+          });\n+      });\n+\n+      it('triggers persist hook on update', function(done) {\n+        TestModel.observe('persist', ctxRecorder.recordAndNext());\n+\n+        TestModel.upsertWithWhere({ id: existingInstance.id },\n+          { id: existingInstance.id, name: 'updated name' },\n+          function(err, instance) {\n+            if (err) return done(err);\n+            var expectedContext = aCtxForModel(TestModel, {\n+              where: { id: existingInstance.id },\n+              data: {\n+                id: existingInstance.id,\n+                name: 'updated name',\n+              },\n+              currentInstance: {\n+                id: existingInstance.id,\n+                name: 'updated name',\n+                extra: undefined,\n+              },\n+            });\n+            if (!dataSource.connector.upsertWithWhere) {\n+              expectedContext.isNewInstance = false;\n+            }\n+            ctxRecorder.records.should.eql(expectedContext);\n+            done();\n+          });\n+      });\n+\n+      it('triggers `loaded` hook on create', function(done) {\n+        TestModel.observe('loaded', ctxRecorder.recordAndNext());\n+\n+        TestModel.upsertWithWhere({ id: 'new-id' },\n+          { id: 'new-id', name: 'a name' },\n+          function(err, instance) {\n+            if (err) return done(err);\n+\n+            if (dataSource.connector.upsertWithWhere) {\n+              ctxRecorder.records.should.eql(aCtxForModel(TestModel, {\n+                data: { id: 'new-id', name: 'a name' },\n+                isNewInstance: true,\n+              }));\n+            } else {\n+              ctxRecorder.records.should.eql(aCtxForModel(TestModel, {\n+                data: {\n+                  id: 'new-id',\n+                  name: 'a name',\n+                },\n+                isNewInstance: true,\n+              }));\n+            }\n+            done();\n+          });\n+      });\n+\n+      it('triggers `loaded` hook on update', function(done) {\n+        TestModel.observe('loaded', ctxRecorder.recordAndNext());\n+\n+        TestModel.upsertWithWhere({ id: existingInstance.id },\n+          { id: existingInstance.id, name: 'updated name' },\n+          function(err, instance) {\n+            if (err) return done(err);\n+\n+            if (dataSource.connector.upsertWithWhere) {","path":"test/persistence-hooks.suite.js","position":358,"original_position":358,"commit_id":"3722b8d61279ea835273f287e0f23cdb87841f57","original_commit_id":"3722b8d61279ea835273f287e0f23cdb87841f57","user":{"login":"Amir-61","id":10672146,"avatar_url":"https://avatars.githubusercontent.com/u/10672146?v=3","gravatar_id":"","url":"https://api.github.com/users/Amir-61","html_url":"https://github.com/Amir-61","followers_url":"https://api.github.com/users/Amir-61/followers","following_url":"https://api.github.com/users/Amir-61/following{/other_user}","gists_url":"https://api.github.com/users/Amir-61/gists{/gist_id}","starred_url":"https://api.github.com/users/Amir-61/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Amir-61/subscriptions","organizations_url":"https://api.github.com/users/Amir-61/orgs","repos_url":"https://api.github.com/users/Amir-61/repos","events_url":"https://api.github.com/users/Amir-61/events{/privacy}","received_events_url":"https://api.github.com/users/Amir-61/received_events","type":"User","site_admin":false},"body":"Ditto, `dataSource.connector.upsertWithWhere` is not needed I think","created_at":"2016-08-04T21:13:52Z","updated_at":"2016-08-04T21:13:52Z","html_url":"https://github.com/strongloop/loopback-datasource-juggler/pull/1001#discussion_r73603921","pull_request_url":"https://api.github.com/repos/strongloop/loopback-datasource-juggler/pulls/1001","_links":{"self":{"href":"https://api.github.com/repos/strongloop/loopback-datasource-juggler/pulls/comments/73603921"},"html":{"href":"https://github.com/strongloop/loopback-datasource-juggler/pull/1001#discussion_r73603921"},"pull_request":{"href":"https://api.github.com/repos/strongloop/loopback-datasource-juggler/pulls/1001"}}},"pull_request":{"url":"https://api.github.com/repos/strongloop/loopback-datasource-juggler/pulls/1001","id":77335191,"html_url":"https://github.com/strongloop/loopback-datasource-juggler/pull/1001","diff_url":"https://github.com/strongloop/loopback-datasource-juggler/pull/1001.diff","patch_url":"https://github.com/strongloop/loopback-datasource-juggler/pull/1001.patch","issue_url":"https://api.github.com/repos/strongloop/loopback-datasource-juggler/issues/1001","number":1001,"state":"open","locked":false,"title":"upsertWithWhere method","user":{"login":"mountain1234585","id":18303722,"avatar_url":"https://avatars.githubusercontent.com/u/18303722?v=3","gravatar_id":"","url":"https://api.github.com/users/mountain1234585","html_url":"https://github.com/mountain1234585","followers_url":"https://api.github.com/users/mountain1234585/followers","following_url":"https://api.github.com/users/mountain1234585/following{/other_user}","gists_url":"https://api.github.com/users/mountain1234585/gists{/gist_id}","starred_url":"https://api.github.com/users/mountain1234585/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/mountain1234585/subscriptions","organizations_url":"https://api.github.com/users/mountain1234585/orgs","repos_url":"https://api.github.com/users/mountain1234585/repos","events_url":"https://api.github.com/users/mountain1234585/events{/privacy}","received_events_url":"https://api.github.com/users/mountain1234585/received_events","type":"User","site_admin":false},"body":"Added a new method for performing upsertWithWhere in dao.js\r\n\r\nConnect to strongloop/loopback#2331\r\n\r\nConnect to https://github.com/strongloop/loopback/pull/2539","created_at":"2016-07-13T18:09:55Z","updated_at":"2016-08-04T21:13:52Z","closed_at":null,"merged_at":null,"merge_commit_sha":"fdacbcb58a30d6366f17a4f42a7596cf1ad4e9e0","assignee":{"login":"Amir-61","id":10672146,"avatar_url":"https://avatars.githubusercontent.com/u/10672146?v=3","gravatar_id":"","url":"https://api.github.com/users/Amir-61","html_url":"https://github.com/Amir-61","followers_url":"https://api.github.com/users/Amir-61/followers","following_url":"https://api.github.com/users/Amir-61/following{/other_user}","gists_url":"https://api.github.com/users/Amir-61/gists{/gist_id}","starred_url":"https://api.github.com/users/Amir-61/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Amir-61/subscriptions","organizations_url":"https://api.github.com/users/Amir-61/orgs","repos_url":"https://api.github.com/users/Amir-61/repos","events_url":"https://api.github.com/users/Amir-61/events{/privacy}","received_events_url":"https://api.github.com/users/Amir-61/received_events","type":"User","site_admin":false},"assignees":[{"login":"Amir-61","id":10672146,"avatar_url":"https://avatars.githubusercontent.com/u/10672146?v=3","gravatar_id":"","url":"https://api.github.com/users/Amir-61","html_url":"https://github.com/Amir-61","followers_url":"https://api.github.com/users/Amir-61/followers","following_url":"https://api.github.com/users/Amir-61/following{/other_user}","gists_url":"https://api.github.com/users/Amir-61/gists{/gist_id}","starred_url":"https://api.github.com/users/Amir-61/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Amir-61/subscriptions","organizations_url":"https://api.github.com/users/Amir-61/orgs","repos_url":"https://api.github.com/users/Amir-61/repos","events_url":"https://api.github.com/users/Amir-61/events{/privacy}","received_events_url":"https://api.github.com/users/Amir-61/received_events","type":"User","site_admin":false}],"milestone":null,"commits_url":"https://api.github.com/repos/strongloop/loopback-datasource-juggler/pulls/1001/commits","review_comments_url":"https://api.github.com/repos/strongloop/loopback-datasource-juggler/pulls/1001/comments","review_comment_url":"https://api.github.com/repos/strongloop/loopback-datasource-juggler/pulls/comments{/number}","comments_url":"https://api.github.com/repos/strongloop/loopback-datasource-juggler/issues/1001/comments","statuses_url":"https://api.github.com/repos/strongloop/loopback-datasource-juggler/statuses/3722b8d61279ea835273f287e0f23cdb87841f57","head":{"label":"mountain1234585:upsertNPK","ref":"upsertNPK","sha":"3722b8d61279ea835273f287e0f23cdb87841f57","user":{"login":"mountain1234585","id":18303722,"avatar_url":"https://avatars.githubusercontent.com/u/18303722?v=3","gravatar_id":"","url":"https://api.github.com/users/mountain1234585","html_url":"https://github.com/mountain1234585","followers_url":"https://api.github.com/users/mountain1234585/followers","following_url":"https://api.github.com/users/mountain1234585/following{/other_user}","gists_url":"https://api.github.com/users/mountain1234585/gists{/gist_id}","starred_url":"https://api.github.com/users/mountain1234585/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/mountain1234585/subscriptions","organizations_url":"https://api.github.com/users/mountain1234585/orgs","repos_url":"https://api.github.com/users/mountain1234585/repos","events_url":"https://api.github.com/users/mountain1234585/events{/privacy}","received_events_url":"https://api.github.com/users/mountain1234585/received_events","type":"User","site_admin":false},"repo":{"id":63267897,"name":"loopback-datasource-juggler","full_name":"mountain1234585/loopback-datasource-juggler","owner":{"login":"mountain1234585","id":18303722,"avatar_url":"https://avatars.githubusercontent.com/u/18303722?v=3","gravatar_id":"","url":"https://api.github.com/users/mountain1234585","html_url":"https://github.com/mountain1234585","followers_url":"https://api.github.com/users/mountain1234585/followers","following_url":"https://api.github.com/users/mountain1234585/following{/other_user}","gists_url":"https://api.github.com/users/mountain1234585/gists{/gist_id}","starred_url":"https://api.github.com/users/mountain1234585/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/mountain1234585/subscriptions","organizations_url":"https://api.github.com/users/mountain1234585/orgs","repos_url":"https://api.github.com/users/mountain1234585/repos","events_url":"https://api.github.com/users/mountain1234585/events{/privacy}","received_events_url":"https://api.github.com/users/mountain1234585/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/mountain1234585/loopback-datasource-juggler","description":"Connect Loopback to various Data Sources","fork":true,"url":"https://api.github.com/repos/mountain1234585/loopback-datasource-juggler","forks_url":"https://api.github.com/repos/mountain1234585/loopback-datasource-juggler/forks","keys_url":"https://api.github.com/repos/mountain1234585/loopback-datasource-juggler/keys{/key_id}","collaborators_url":"https://api.github.com/repos/mountain1234585/loopback-datasource-juggler/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/mountain1234585/loopback-datasource-juggler/teams","hooks_url":"https://api.github.com/repos/mountain1234585/loopback-datasource-juggler/hooks","issue_events_url":"https://api.github.com/repos/mountain1234585/loopback-datasource-juggler/issues/events{/number}","events_url":"https://api.github.com/repos/mountain1234585/loopback-datasource-juggler/events","assignees_url":"https://api.github.com/repos/mountain1234585/loopback-datasource-juggler/assignees{/user}","branches_url":"https://api.github.com/repos/mountain1234585/loopback-datasource-juggler/branches{/branch}","tags_url":"https://api.github.com/repos/mountain1234585/loopback-datasource-juggler/tags","blobs_url":"https://api.github.com/repos/mountain1234585/loopback-datasource-juggler/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/mountain1234585/loopback-datasource-juggler/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/mountain1234585/loopback-datasource-juggler/git/refs{/sha}","trees_url":"https://api.github.com/repos/mountain1234585/loopback-datasource-juggler/git/trees{/sha}","statuses_url":"https://api.github.com/repos/mountain1234585/loopback-datasource-juggler/statuses/{sha}","languages_url":"https://api.github.com/repos/mountain1234585/loopback-datasource-juggler/languages","stargazers_url":"https://api.github.com/repos/mountain1234585/loopback-datasource-juggler/stargazers","contributors_url":"https://api.github.com/repos/mountain1234585/loopback-datasource-juggler/contributors","subscribers_url":"https://api.github.com/repos/mountain1234585/loopback-datasource-juggler/subscribers","subscription_url":"https://api.github.com/repos/mountain1234585/loopback-datasource-juggler/subscription","commits_url":"https://api.github.com/repos/mountain1234585/loopback-datasource-juggler/commits{/sha}","git_commits_url":"https://api.github.com/repos/mountain1234585/loopback-datasource-juggler/git/commits{/sha}","comments_url":"https://api.github.com/repos/mountain1234585/loopback-datasource-juggler/comments{/number}","issue_comment_url":"https://api.github.com/repos/mountain1234585/loopback-datasource-juggler/issues/comments{/number}","contents_url":"https://api.github.com/repos/mountain1234585/loopback-datasource-juggler/contents/{+path}","compare_url":"https://api.github.com/repos/mountain1234585/loopback-datasource-juggler/compare/{base}...{head}","merges_url":"https://api.github.com/repos/mountain1234585/loopback-datasource-juggler/merges","archive_url":"https://api.github.com/repos/mountain1234585/loopback-datasource-juggler/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/mountain1234585/loopback-datasource-juggler/downloads","issues_url":"https://api.github.com/repos/mountain1234585/loopback-datasource-juggler/issues{/number}","pulls_url":"https://api.github.com/repos/mountain1234585/loopback-datasource-juggler/pulls{/number}","milestones_url":"https://api.github.com/repos/mountain1234585/loopback-datasource-juggler/milestones{/number}","notifications_url":"https://api.github.com/repos/mountain1234585/loopback-datasource-juggler/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/mountain1234585/loopback-datasource-juggler/labels{/name}","releases_url":"https://api.github.com/repos/mountain1234585/loopback-datasource-juggler/releases{/id}","deployments_url":"https://api.github.com/repos/mountain1234585/loopback-datasource-juggler/deployments","created_at":"2016-07-13T17:55:56Z","updated_at":"2016-07-13T17:55:58Z","pushed_at":"2016-08-01T09:22:10Z","git_url":"git://github.com/mountain1234585/loopback-datasource-juggler.git","ssh_url":"git@github.com:mountain1234585/loopback-datasource-juggler.git","clone_url":"https://github.com/mountain1234585/loopback-datasource-juggler.git","svn_url":"https://github.com/mountain1234585/loopback-datasource-juggler","homepage":"http://www.loopback.io","size":5968,"stargazers_count":0,"watchers_count":0,"language":"JavaScript","has_issues":false,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":0,"mirror_url":null,"open_issues_count":0,"forks":0,"open_issues":0,"watchers":0,"default_branch":"master"}},"base":{"label":"strongloop:master","ref":"master","sha":"799d803fa0d6e45ec7ba3e4e000633b42945ffef","user":{"login":"strongloop","id":3020012,"avatar_url":"https://avatars.githubusercontent.com/u/3020012?v=3","gravatar_id":"","url":"https://api.github.com/users/strongloop","html_url":"https://github.com/strongloop","followers_url":"https://api.github.com/users/strongloop/followers","following_url":"https://api.github.com/users/strongloop/following{/other_user}","gists_url":"https://api.github.com/users/strongloop/gists{/gist_id}","starred_url":"https://api.github.com/users/strongloop/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/strongloop/subscriptions","organizations_url":"https://api.github.com/users/strongloop/orgs","repos_url":"https://api.github.com/users/strongloop/repos","events_url":"https://api.github.com/users/strongloop/events{/privacy}","received_events_url":"https://api.github.com/users/strongloop/received_events","type":"Organization","site_admin":false},"repo":{"id":10126908,"name":"loopback-datasource-juggler","full_name":"strongloop/loopback-datasource-juggler","owner":{"login":"strongloop","id":3020012,"avatar_url":"https://avatars.githubusercontent.com/u/3020012?v=3","gravatar_id":"","url":"https://api.github.com/users/strongloop","html_url":"https://github.com/strongloop","followers_url":"https://api.github.com/users/strongloop/followers","following_url":"https://api.github.com/users/strongloop/following{/other_user}","gists_url":"https://api.github.com/users/strongloop/gists{/gist_id}","starred_url":"https://api.github.com/users/strongloop/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/strongloop/subscriptions","organizations_url":"https://api.github.com/users/strongloop/orgs","repos_url":"https://api.github.com/users/strongloop/repos","events_url":"https://api.github.com/users/strongloop/events{/privacy}","received_events_url":"https://api.github.com/users/strongloop/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/strongloop/loopback-datasource-juggler","description":"Connect Loopback to various Data Sources","fork":false,"url":"https://api.github.com/repos/strongloop/loopback-datasource-juggler","forks_url":"https://api.github.com/repos/strongloop/loopback-datasource-juggler/forks","keys_url":"https://api.github.com/repos/strongloop/loopback-datasource-juggler/keys{/key_id}","collaborators_url":"https://api.github.com/repos/strongloop/loopback-datasource-juggler/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/strongloop/loopback-datasource-juggler/teams","hooks_url":"https://api.github.com/repos/strongloop/loopback-datasource-juggler/hooks","issue_events_url":"https://api.github.com/repos/strongloop/loopback-datasource-juggler/issues/events{/number}","events_url":"https://api.github.com/repos/strongloop/loopback-datasource-juggler/events","assignees_url":"https://api.github.com/repos/strongloop/loopback-datasource-juggler/assignees{/user}","branches_url":"https://api.github.com/repos/strongloop/loopback-datasource-juggler/branches{/branch}","tags_url":"https://api.github.com/repos/strongloop/loopback-datasource-juggler/tags","blobs_url":"https://api.github.com/repos/strongloop/loopback-datasource-juggler/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/strongloop/loopback-datasource-juggler/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/strongloop/loopback-datasource-juggler/git/refs{/sha}","trees_url":"https://api.github.com/repos/strongloop/loopback-datasource-juggler/git/trees{/sha}","statuses_url":"https://api.github.com/repos/strongloop/loopback-datasource-juggler/statuses/{sha}","languages_url":"https://api.github.com/repos/strongloop/loopback-datasource-juggler/languages","stargazers_url":"https://api.github.com/repos/strongloop/loopback-datasource-juggler/stargazers","contributors_url":"https://api.github.com/repos/strongloop/loopback-datasource-juggler/contributors","subscribers_url":"https://api.github.com/repos/strongloop/loopback-datasource-juggler/subscribers","subscription_url":"https://api.github.com/repos/strongloop/loopback-datasource-juggler/subscription","commits_url":"https://api.github.com/repos/strongloop/loopback-datasource-juggler/commits{/sha}","git_commits_url":"https://api.github.com/repos/strongloop/loopback-datasource-juggler/git/commits{/sha}","comments_url":"https://api.github.com/repos/strongloop/loopback-datasource-juggler/comments{/number}","issue_comment_url":"https://api.github.com/repos/strongloop/loopback-datasource-juggler/issues/comments{/number}","contents_url":"https://api.github.com/repos/strongloop/loopback-datasource-juggler/contents/{+path}","compare_url":"https://api.github.com/repos/strongloop/loopback-datasource-juggler/compare/{base}...{head}","merges_url":"https://api.github.com/repos/strongloop/loopback-datasource-juggler/merges","archive_url":"https://api.github.com/repos/strongloop/loopback-datasource-juggler/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/strongloop/loopback-datasource-juggler/downloads","issues_url":"https://api.github.com/repos/strongloop/loopback-datasource-juggler/issues{/number}","pulls_url":"https://api.github.com/repos/strongloop/loopback-datasource-juggler/pulls{/number}","milestones_url":"https://api.github.com/repos/strongloop/loopback-datasource-juggler/milestones{/number}","notifications_url":"https://api.github.com/repos/strongloop/loopback-datasource-juggler/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/strongloop/loopback-datasource-juggler/labels{/name}","releases_url":"https://api.github.com/repos/strongloop/loopback-datasource-juggler/releases{/id}","deployments_url":"https://api.github.com/repos/strongloop/loopback-datasource-juggler/deployments","created_at":"2013-05-17T15:56:04Z","updated_at":"2016-06-28T18:45:59Z","pushed_at":"2016-08-04T14:45:55Z","git_url":"git://github.com/strongloop/loopback-datasource-juggler.git","ssh_url":"git@github.com:strongloop/loopback-datasource-juggler.git","clone_url":"https://github.com/strongloop/loopback-datasource-juggler.git","svn_url":"https://github.com/strongloop/loopback-datasource-juggler","homepage":"http://www.loopback.io","size":6449,"stargazers_count":138,"watchers_count":138,"language":"JavaScript","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":true,"forks_count":199,"mirror_url":null,"open_issues_count":206,"forks":199,"open_issues":206,"watchers":138,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/strongloop/loopback-datasource-juggler/pulls/1001"},"html":{"href":"https://github.com/strongloop/loopback-datasource-juggler/pull/1001"},"issue":{"href":"https://api.github.com/repos/strongloop/loopback-datasource-juggler/issues/1001"},"comments":{"href":"https://api.github.com/repos/strongloop/loopback-datasource-juggler/issues/1001/comments"},"review_comments":{"href":"https://api.github.com/repos/strongloop/loopback-datasource-juggler/pulls/1001/comments"},"review_comment":{"href":"https://api.github.com/repos/strongloop/loopback-datasource-juggler/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/strongloop/loopback-datasource-juggler/pulls/1001/commits"},"statuses":{"href":"https://api.github.com/repos/strongloop/loopback-datasource-juggler/statuses/3722b8d61279ea835273f287e0f23cdb87841f57"}}}}
{"actor":{"display_login":"Amir-61"}}