{"action":"created","comment":{"url":"https://api.github.com/repos/hyperledger/composer/pulls/comments/171524741","pull_request_review_id":100389678,"id":171524741,"diff_hunk":"@@ -15,27 +15,223 @@\n 'use strict';\n \n const chai = require('chai');\n+const sinon = require('sinon');\n+const path = require('path');\n+const yargs = require('yargs');\n+const mockery = require('mockery');\n+\n+\n chai.should();\n chai.use(require('chai-as-promised'));\n chai.use(require('chai-things'));\n-const sinon = require('sinon');\n \n \n+// need to have this as the module cache will need to be cleared, and code reloaded per test\n+const pathToCode = path.resolve(__dirname, '../../lib/codegen/parsejs.js');\n+\n describe('parsejs', function () {\n \n     let sandbox;\n+    let optionsStub;\n+    let stdout;\n+    let stderr;\n+\n+    let parseStub;\n+\n+    let fsextraStubs;\n+    let jsonGenerateSpy;\n+    let apiGenerateSpy;\n+    let plantGenerateSpy;\n \n     beforeEach(() => {\n+        //\n+        mockery.enable({\n+            warnOnReplace: false,\n+            warnOnUnregistered: false\n+        });\n         sandbox = sinon.sandbox.create();\n+\n+        // stub out the yagrs cmd line handling\n+        optionsStub = sandbox.stub(yargs, 'options');\n+        sandbox.stub(yargs, 'usage').returns(yargs);\n+        sandbox.stub(yargs, 'argv').returns();\n+        sandbox.stub(process,'exit');\n+\n+        // create a fake file object that will be return one fs walk\n+        // useing first/second call to prevent a loop\n+        let fakeFile = {\n+            stats : {\n+                isFile :  sandbox.stub().onFirstCall().returns(true).onSecondCall().returns(false)\n+            }\n+        };\n+\n+        // setup stups for the fs-extra model\n+        fsextraStubs = {};\n+        let onStub = sandbox.stub();\n+        // yes it returns it self, but it's one of those chaining things\n+        onStub.returns({ 'on' : onStub});\n+\n+        let readStub = { read : sandbox.stub().onFirstCall().returns(fakeFile)\n+                                              .onSecondCall().returns(fakeFile)\n+                                              .onThirdCall().returns(null)};\n+\n+        // this handles the callback and ensure the 'this' context is correctly set\n+        onStub.callsArgOn(1, readStub);\n+\n+\n+        fsextraStubs.walk = sandbox.stub();\n+        fsextraStubs.walk.callsFake(function fakeWalk(){\n+            return { 'on' : onStub};\n+        });\n+\n+        fsextraStubs.readFileSync = sandbox.stub();\n+\n+        // register the mock for the file system\n+        mockery.registerMock('fs-extra', fsextraStubs);\n+\n+\n+\n+        // spy on the output\n+        stdout = sandbox.spy(console,'log');\n+        stderr = sandbox.spy(console,'error');\n+\n+        // register the mocks for  'path'\n+        parseStub = sandbox.stub(path,'parse');\n+        mockery.registerMock('path',  { parse:parseStub, resolve: sandbox.stub() } );\n+\n+\n+        // The next section of code, is .... not the greatest IMHO\n+        // This was the only way I could get the Generator classes spied on in such\n+        // a way that would be loaded by the test code and made to be certain\n+        // they where being called.\n+\n+        // This creates a fake class with the generate method ( that we're interested in )\n+        // Spies on that generate fn, and use mockery to inject that.\n+\n+\n+        // eslint-disable-next-line require-jsdoc\n+        class fakeClassJson  {\n+            // eslint-disable-next-line require-jsdoc\n+            constructor(){ }\n+            // eslint-disable-next-line require-jsdoc\n+            generate(){ }\n+        }\n+\n+        jsonGenerateSpy = sandbox.spy(fakeClassJson.prototype,'generate');\n+        mockery.registerMock('./fromjs/jsongenerator',fakeClassJson);\n+\n+        // eslint-disable-next-line require-jsdoc\n+        class fakeClassAPISignature  {\n+            // eslint-disable-next-line require-jsdoc\n+            constructor(){ }\n+            // eslint-disable-next-line require-jsdoc\n+            generate(){ }\n+        }\n+        apiGenerateSpy = sandbox.spy(fakeClassAPISignature.prototype,'generate');\n+        mockery.registerMock('./fromjs/apisignaturegenerator',fakeClassAPISignature);\n+\n+        // eslint-disable-next-line require-jsdoc\n+        class fakeClassPlant {\n+            // eslint-disable-next-line require-jsdoc\n+            constructor(){ }\n+            // eslint-disable-next-line require-jsdoc\n+            generate(){ }\n+        }\n+        plantGenerateSpy = sandbox.spy(fakeClassPlant.prototype,'generate');\n+        mockery.registerMock('./fromjs/plantumlgenerator',fakeClassPlant);\n+\n+\n+        // clean the module cache\n+        delete require.cache[pathToCode];\n+\n     });\n \n     afterEach(() => {\n+        mockery.deregisterAll();\n+        sandbox.restore();\n         sandbox.restore();\n     });\n \n-    describe('#maintest', function() {\n-        it('main path', function() {\n-           // require('../../lib/codegen/parsejs.js');\n+    after(()=>{\n+        delete require.cache[pathToCode];\n+    });\n+\n+    describe('#missing options', function() {\n+        it('should handle case where no file option is given', function() {\n+            optionsStub.returns(yargs(['--outputDir=/tmp','--format=json']));\n+            require(pathToCode);\n+            stdout.should.have.been.calledWith(sinon.match(/no file option given/));\n+        });\n+\n+        it('should handle case where no outputDir  option is given', function() {\n+            optionsStub.returns(yargs(['--format=json']));\n+            require(pathToCode);\n+            stderr.should.have.been.calledWith(sinon.match(/Missing required argument: outputDir/));\n+        });\n+    });\n+\n+    describe('#JSON',()=>{\n+        it('should process JSON format', function() {\n+            optionsStub.returns(yargs(['--outputDir=/tmp','--format=JSON','--inputDir=in']));\n+            parseStub.returns({ext:'.js',base:'something.js'});\n+            require(pathToCode);\n+\n+            sinon.assert.calledOnce(jsonGenerateSpy);\n+        });\n+    });\n+\n+    describe('#APISignature',()=>{\n+        it('should process APISignature format', function() {\n+            optionsStub.returns(yargs(['--outputDir=/tmp','--format=APISignature','--inputDir=in']));\n+            parseStub.returns({ext:'.js',base:'something.js'});\n+            require(pathToCode);\n+\n+            sinon.assert.calledOnce(apiGenerateSpy);\n+        });\n+    });\n+\n+    describe('#PlantUML',()=>{\n+        it('should process PlantUML format', function() {\n+            optionsStub.returns(yargs(['--outputDir=/tmp','--format=PlantUML','--inputDir=in']));\n+            parseStub.returns({ext:'.js',base:'something.js'});\n+            require(pathToCode);\n+\n+            sinon.assert.calledOnce(plantGenerateSpy);\n+        });\n+    });\n+\n+    describe('#Default',()=>{\n+        it('should process PlantUML as the default format', function() {\n+            optionsStub.returns(yargs(['--outputDir=/tmp','--inputDir=in']));\n+            parseStub.returns({ext:'.js',base:'something.js'});\n+            require(pathToCode);\n+            sinon.assert.calledOnce(plantGenerateSpy);\n+        });\n+        it('should process PlantUML as the default format, single file mode', function() {\n+            optionsStub.returns(yargs(['--outputDir=/tmp','--single=in']));\n+            parseStub.returns({ext:'.js',base:'something.js'});\n+            require(pathToCode);\n+            sinon.assert.calledOnce(plantGenerateSpy);\n+        });\n+        it('should cope with files that are a mix of js and non js ones', function(){\n+            optionsStub.returns(yargs(['--outputDir=/tmp','--inputDir=in']));\n+            parseStub.returns({ext:'.js',base:'something.js'});\n+            require(pathToCode);\n+            sinon.assert.calledOnce(plantGenerateSpy);\n+        });\n+        it('should not parse the parser.js file', function(){\n+            optionsStub.returns(yargs(['--outputDir=/tmp','--inputDir=in']));\n+            parseStub.returns({ext:'.js',base:'parser.js'});\n+\n+            require(pathToCode);\n+            sinon.assert.notCalled(plantGenerateSpy);\n+        });\n+        it('should cope with files that wibble files', function(){","path":"packages/composer-common/test/codegen/parsejs.js","position":219,"original_position":219,"commit_id":"f6a1413c029fd8cc829c8d1c61ee270a97369341","original_commit_id":"f6a1413c029fd8cc829c8d1c61ee270a97369341","user":{"login":"nklincoln","id":8394544,"avatar_url":"https://avatars1.githubusercontent.com/u/8394544?v=4","gravatar_id":"","url":"https://api.github.com/users/nklincoln","html_url":"https://github.com/nklincoln","followers_url":"https://api.github.com/users/nklincoln/followers","following_url":"https://api.github.com/users/nklincoln/following{/other_user}","gists_url":"https://api.github.com/users/nklincoln/gists{/gist_id}","starred_url":"https://api.github.com/users/nklincoln/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/nklincoln/subscriptions","organizations_url":"https://api.github.com/users/nklincoln/orgs","repos_url":"https://api.github.com/users/nklincoln/repos","events_url":"https://api.github.com/users/nklincoln/events{/privacy}","received_events_url":"https://api.github.com/users/nklincoln/received_events","type":"User","site_admin":false},"body":"should it?","created_at":"2018-03-01T11:01:28Z","updated_at":"2018-03-01T11:03:19Z","html_url":"https://github.com/hyperledger/composer/pull/3462#discussion_r171524741","pull_request_url":"https://api.github.com/repos/hyperledger/composer/pulls/3462","author_association":"CONTRIBUTOR","_links":{"self":{"href":"https://api.github.com/repos/hyperledger/composer/pulls/comments/171524741"},"html":{"href":"https://github.com/hyperledger/composer/pull/3462#discussion_r171524741"},"pull_request":{"href":"https://api.github.com/repos/hyperledger/composer/pulls/3462"}}},"pull_request":{"url":"https://api.github.com/repos/hyperledger/composer/pulls/3462","id":170973627,"html_url":"https://github.com/hyperledger/composer/pull/3462","diff_url":"https://github.com/hyperledger/composer/pull/3462.diff","patch_url":"https://github.com/hyperledger/composer/pull/3462.patch","issue_url":"https://api.github.com/repos/hyperledger/composer/issues/3462","number":3462,"state":"open","locked":false,"title":"Coverage for parsejs","user":{"login":"mbwhite","id":6673453,"avatar_url":"https://avatars1.githubusercontent.com/u/6673453?v=4","gravatar_id":"","url":"https://api.github.com/users/mbwhite","html_url":"https://github.com/mbwhite","followers_url":"https://api.github.com/users/mbwhite/followers","following_url":"https://api.github.com/users/mbwhite/following{/other_user}","gists_url":"https://api.github.com/users/mbwhite/gists{/gist_id}","starred_url":"https://api.github.com/users/mbwhite/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/mbwhite/subscriptions","organizations_url":"https://api.github.com/users/mbwhite/orgs","repos_url":"https://api.github.com/users/mbwhite/repos","events_url":"https://api.github.com/users/mbwhite/events{/privacy}","received_events_url":"https://api.github.com/users/mbwhite/received_events","type":"User","site_admin":false},"body":"Update the coverage for the parsejs.js fil","created_at":"2018-02-23T09:56:39Z","updated_at":"2018-03-01T11:03:19Z","closed_at":null,"merged_at":null,"merge_commit_sha":"79449faa9d9d3a9be9a1150183b94359042cc0cd","assignee":null,"assignees":[],"requested_reviewers":[],"requested_teams":[],"labels":[],"milestone":null,"commits_url":"https://api.github.com/repos/hyperledger/composer/pulls/3462/commits","review_comments_url":"https://api.github.com/repos/hyperledger/composer/pulls/3462/comments","review_comment_url":"https://api.github.com/repos/hyperledger/composer/pulls/comments{/number}","comments_url":"https://api.github.com/repos/hyperledger/composer/issues/3462/comments","statuses_url":"https://api.github.com/repos/hyperledger/composer/statuses/f6a1413c029fd8cc829c8d1c61ee270a97369341","head":{"label":"mbwhite:coverage-22feb","ref":"coverage-22feb","sha":"f6a1413c029fd8cc829c8d1c61ee270a97369341","user":{"login":"mbwhite","id":6673453,"avatar_url":"https://avatars1.githubusercontent.com/u/6673453?v=4","gravatar_id":"","url":"https://api.github.com/users/mbwhite","html_url":"https://github.com/mbwhite","followers_url":"https://api.github.com/users/mbwhite/followers","following_url":"https://api.github.com/users/mbwhite/following{/other_user}","gists_url":"https://api.github.com/users/mbwhite/gists{/gist_id}","starred_url":"https://api.github.com/users/mbwhite/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/mbwhite/subscriptions","organizations_url":"https://api.github.com/users/mbwhite/orgs","repos_url":"https://api.github.com/users/mbwhite/repos","events_url":"https://api.github.com/users/mbwhite/events{/privacy}","received_events_url":"https://api.github.com/users/mbwhite/received_events","type":"User","site_admin":false},"repo":{"id":95863748,"name":"composer","full_name":"mbwhite/composer","owner":{"login":"mbwhite","id":6673453,"avatar_url":"https://avatars1.githubusercontent.com/u/6673453?v=4","gravatar_id":"","url":"https://api.github.com/users/mbwhite","html_url":"https://github.com/mbwhite","followers_url":"https://api.github.com/users/mbwhite/followers","following_url":"https://api.github.com/users/mbwhite/following{/other_user}","gists_url":"https://api.github.com/users/mbwhite/gists{/gist_id}","starred_url":"https://api.github.com/users/mbwhite/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/mbwhite/subscriptions","organizations_url":"https://api.github.com/users/mbwhite/orgs","repos_url":"https://api.github.com/users/mbwhite/repos","events_url":"https://api.github.com/users/mbwhite/events{/privacy}","received_events_url":"https://api.github.com/users/mbwhite/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/mbwhite/composer","description":"Composer is a framework for building Blockchain business networks","fork":true,"url":"https://api.github.com/repos/mbwhite/composer","forks_url":"https://api.github.com/repos/mbwhite/composer/forks","keys_url":"https://api.github.com/repos/mbwhite/composer/keys{/key_id}","collaborators_url":"https://api.github.com/repos/mbwhite/composer/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/mbwhite/composer/teams","hooks_url":"https://api.github.com/repos/mbwhite/composer/hooks","issue_events_url":"https://api.github.com/repos/mbwhite/composer/issues/events{/number}","events_url":"https://api.github.com/repos/mbwhite/composer/events","assignees_url":"https://api.github.com/repos/mbwhite/composer/assignees{/user}","branches_url":"https://api.github.com/repos/mbwhite/composer/branches{/branch}","tags_url":"https://api.github.com/repos/mbwhite/composer/tags","blobs_url":"https://api.github.com/repos/mbwhite/composer/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/mbwhite/composer/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/mbwhite/composer/git/refs{/sha}","trees_url":"https://api.github.com/repos/mbwhite/composer/git/trees{/sha}","statuses_url":"https://api.github.com/repos/mbwhite/composer/statuses/{sha}","languages_url":"https://api.github.com/repos/mbwhite/composer/languages","stargazers_url":"https://api.github.com/repos/mbwhite/composer/stargazers","contributors_url":"https://api.github.com/repos/mbwhite/composer/contributors","subscribers_url":"https://api.github.com/repos/mbwhite/composer/subscribers","subscription_url":"https://api.github.com/repos/mbwhite/composer/subscription","commits_url":"https://api.github.com/repos/mbwhite/composer/commits{/sha}","git_commits_url":"https://api.github.com/repos/mbwhite/composer/git/commits{/sha}","comments_url":"https://api.github.com/repos/mbwhite/composer/comments{/number}","issue_comment_url":"https://api.github.com/repos/mbwhite/composer/issues/comments{/number}","contents_url":"https://api.github.com/repos/mbwhite/composer/contents/{+path}","compare_url":"https://api.github.com/repos/mbwhite/composer/compare/{base}...{head}","merges_url":"https://api.github.com/repos/mbwhite/composer/merges","archive_url":"https://api.github.com/repos/mbwhite/composer/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/mbwhite/composer/downloads","issues_url":"https://api.github.com/repos/mbwhite/composer/issues{/number}","pulls_url":"https://api.github.com/repos/mbwhite/composer/pulls{/number}","milestones_url":"https://api.github.com/repos/mbwhite/composer/milestones{/number}","notifications_url":"https://api.github.com/repos/mbwhite/composer/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/mbwhite/composer/labels{/name}","releases_url":"https://api.github.com/repos/mbwhite/composer/releases{/id}","deployments_url":"https://api.github.com/repos/mbwhite/composer/deployments","created_at":"2017-06-30T07:52:07Z","updated_at":"2017-06-30T07:52:12Z","pushed_at":"2018-02-28T22:28:30Z","git_url":"git://github.com/mbwhite/composer.git","ssh_url":"git@github.com:mbwhite/composer.git","clone_url":"https://github.com/mbwhite/composer.git","svn_url":"https://github.com/mbwhite/composer","homepage":"https://hyperledger.github.io/composer","size":96270,"stargazers_count":0,"watchers_count":0,"language":"JavaScript","has_issues":false,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":0,"mirror_url":null,"archived":false,"open_issues_count":0,"license":null,"forks":0,"open_issues":0,"watchers":0,"default_branch":"master"}},"base":{"label":"hyperledger:master","ref":"master","sha":"60e4338d85da0a3992e2ff760f774452b821ef24","user":{"login":"hyperledger","id":7657900,"avatar_url":"https://avatars2.githubusercontent.com/u/7657900?v=4","gravatar_id":"","url":"https://api.github.com/users/hyperledger","html_url":"https://github.com/hyperledger","followers_url":"https://api.github.com/users/hyperledger/followers","following_url":"https://api.github.com/users/hyperledger/following{/other_user}","gists_url":"https://api.github.com/users/hyperledger/gists{/gist_id}","starred_url":"https://api.github.com/users/hyperledger/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/hyperledger/subscriptions","organizations_url":"https://api.github.com/users/hyperledger/orgs","repos_url":"https://api.github.com/users/hyperledger/repos","events_url":"https://api.github.com/users/hyperledger/events{/privacy}","received_events_url":"https://api.github.com/users/hyperledger/received_events","type":"Organization","site_admin":false},"repo":{"id":80234065,"name":"composer","full_name":"hyperledger/composer","owner":{"login":"hyperledger","id":7657900,"avatar_url":"https://avatars2.githubusercontent.com/u/7657900?v=4","gravatar_id":"","url":"https://api.github.com/users/hyperledger","html_url":"https://github.com/hyperledger","followers_url":"https://api.github.com/users/hyperledger/followers","following_url":"https://api.github.com/users/hyperledger/following{/other_user}","gists_url":"https://api.github.com/users/hyperledger/gists{/gist_id}","starred_url":"https://api.github.com/users/hyperledger/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/hyperledger/subscriptions","organizations_url":"https://api.github.com/users/hyperledger/orgs","repos_url":"https://api.github.com/users/hyperledger/repos","events_url":"https://api.github.com/users/hyperledger/events{/privacy}","received_events_url":"https://api.github.com/users/hyperledger/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/hyperledger/composer","description":"Composer is a framework for building Blockchain business networks","fork":false,"url":"https://api.github.com/repos/hyperledger/composer","forks_url":"https://api.github.com/repos/hyperledger/composer/forks","keys_url":"https://api.github.com/repos/hyperledger/composer/keys{/key_id}","collaborators_url":"https://api.github.com/repos/hyperledger/composer/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/hyperledger/composer/teams","hooks_url":"https://api.github.com/repos/hyperledger/composer/hooks","issue_events_url":"https://api.github.com/repos/hyperledger/composer/issues/events{/number}","events_url":"https://api.github.com/repos/hyperledger/composer/events","assignees_url":"https://api.github.com/repos/hyperledger/composer/assignees{/user}","branches_url":"https://api.github.com/repos/hyperledger/composer/branches{/branch}","tags_url":"https://api.github.com/repos/hyperledger/composer/tags","blobs_url":"https://api.github.com/repos/hyperledger/composer/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/hyperledger/composer/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/hyperledger/composer/git/refs{/sha}","trees_url":"https://api.github.com/repos/hyperledger/composer/git/trees{/sha}","statuses_url":"https://api.github.com/repos/hyperledger/composer/statuses/{sha}","languages_url":"https://api.github.com/repos/hyperledger/composer/languages","stargazers_url":"https://api.github.com/repos/hyperledger/composer/stargazers","contributors_url":"https://api.github.com/repos/hyperledger/composer/contributors","subscribers_url":"https://api.github.com/repos/hyperledger/composer/subscribers","subscription_url":"https://api.github.com/repos/hyperledger/composer/subscription","commits_url":"https://api.github.com/repos/hyperledger/composer/commits{/sha}","git_commits_url":"https://api.github.com/repos/hyperledger/composer/git/commits{/sha}","comments_url":"https://api.github.com/repos/hyperledger/composer/comments{/number}","issue_comment_url":"https://api.github.com/repos/hyperledger/composer/issues/comments{/number}","contents_url":"https://api.github.com/repos/hyperledger/composer/contents/{+path}","compare_url":"https://api.github.com/repos/hyperledger/composer/compare/{base}...{head}","merges_url":"https://api.github.com/repos/hyperledger/composer/merges","archive_url":"https://api.github.com/repos/hyperledger/composer/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/hyperledger/composer/downloads","issues_url":"https://api.github.com/repos/hyperledger/composer/issues{/number}","pulls_url":"https://api.github.com/repos/hyperledger/composer/pulls{/number}","milestones_url":"https://api.github.com/repos/hyperledger/composer/milestones{/number}","notifications_url":"https://api.github.com/repos/hyperledger/composer/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/hyperledger/composer/labels{/name}","releases_url":"https://api.github.com/repos/hyperledger/composer/releases{/id}","deployments_url":"https://api.github.com/repos/hyperledger/composer/deployments","created_at":"2017-01-27T18:27:47Z","updated_at":"2018-03-01T06:48:18Z","pushed_at":"2018-03-01T10:49:54Z","git_url":"git://github.com/hyperledger/composer.git","ssh_url":"git@github.com:hyperledger/composer.git","clone_url":"https://github.com/hyperledger/composer.git","svn_url":"https://github.com/hyperledger/composer","homepage":"https://hyperledger.github.io/composer","size":174839,"stargazers_count":802,"watchers_count":802,"language":"JavaScript","has_issues":true,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":true,"forks_count":391,"mirror_url":null,"archived":false,"open_issues_count":298,"license":{"key":"other","name":"Other","spdx_id":null,"url":null},"forks":391,"open_issues":298,"watchers":802,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/hyperledger/composer/pulls/3462"},"html":{"href":"https://github.com/hyperledger/composer/pull/3462"},"issue":{"href":"https://api.github.com/repos/hyperledger/composer/issues/3462"},"comments":{"href":"https://api.github.com/repos/hyperledger/composer/issues/3462/comments"},"review_comments":{"href":"https://api.github.com/repos/hyperledger/composer/pulls/3462/comments"},"review_comment":{"href":"https://api.github.com/repos/hyperledger/composer/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/hyperledger/composer/pulls/3462/commits"},"statuses":{"href":"https://api.github.com/repos/hyperledger/composer/statuses/f6a1413c029fd8cc829c8d1c61ee270a97369341"}},"author_association":"CONTRIBUTOR"}}
{"actor":{"display_login":"nklincoln"}}