{"action":"created","comment":{"url":"https://api.github.com/repos/adobe-photoshop/spaces-design/pulls/comments/36786837","id":36786837,"diff_hunk":"@@ -0,0 +1,365 @@\n+/*\n+ * Copyright (c) 2014 Adobe Systems Incorporated. All rights reserved.\n+ *  \n+ * Permission is hereby granted, free of charge, to any person obtaining a\n+ * copy of this software and associated documentation files (the \"Software\"), \n+ * to deal in the Software without restriction, including without limitation \n+ * the rights to use, copy, modify, merge, publish, distribute, sublicense, \n+ * and/or sell copies of the Software, and to permit persons to whom the \n+ * Software is furnished to do so, subject to the following conditions:\n+ *  \n+ * The above copyright notice and this permission notice shall be included in\n+ * all copies or substantial portions of the Software.\n+ *  \n+ * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, \n+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER \n+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING \n+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER \n+ * DEALINGS IN THE SOFTWARE.\n+ * \n+ */\n+\n+define(function (require, exports) {\n+    \"use strict\";\n+\n+    var Promise = require(\"bluebird\"),\n+        Immutable = require(\"immutable\");\n+\n+    var dialog = require(\"./dialog\"),\n+        events = require(\"js/events\"),\n+        locks = require(\"js/locks\"),\n+        collection = require(\"js/util/collection\"),\n+        log = require(\"js/util/log\"),\n+        ExportAsset = require(\"js/models/exportasset\"),\n+        ExportService = require(\"js/util/exportservice\");\n+\n+    var descriptor = require(\"adapter/ps/descriptor\"),\n+        // documentLib = require(\"adapter/lib/document\"),\n+        layerLib = require(\"adapter/lib/layer\");\n+\n+    /**\n+     * Export metadata is stored in the \"extension\" data structure in Ps, using this as the namespace\n+     * @type {String}\n+     */\n+    var EXTENSION_DATA_NAMESPACE = \"designSpace\";\n+\n+    /**\n+     * An instance of the ExportService utility used to communicate with the generator plugin\n+     * @private\n+     * @type {ExportService}\n+     */\n+    var _exportService;\n+\n+    /**\n+     * before start up, initialize the export service\n+     * @return {Promise}\n+     */\n+    var beforeStartup = function () {\n+        _exportService = new ExportService();\n+        return _exportService.init()\n+            .bind(this)\n+            .then(function () {\n+                return this.dispatchAsync(events.export.SERVICE_STATUS_CHANGED, { serviceAvailable: true });\n+            })\n+            .catch(Promise.TimeoutError, function (e) {\n+                log.error(\"Could not connect to generator plugin!\", e);\n+                return Promise.resolve(\"Export Service not enabled, but giving up\");\n+            });\n+    };\n+    beforeStartup.reads = [];\n+    beforeStartup.writes = [];\n+\n+    /**\n+     * Open the export modal dialog\n+     *\n+     * @return {Promise}\n+     */\n+    var openExportPanel = function () {\n+        return this.transfer(dialog.openDialog, \"exports-panel-dialog\");\n+    };\n+    openExportPanel.reads = [];\n+    openExportPanel.writes = [];\n+    openExportPanel.transfers = [dialog.openDialog];\n+\n+    /**\n+     * Close the export modal dialog\n+     *\n+     * @return {Promise}\n+     */\n+    var closeExportPanel = function () {\n+        return this.transfer(dialog.closeDialog, \"exports-panel-dialog\");\n+    };\n+    closeExportPanel.reads = [];\n+    closeExportPanel.writes = [];\n+    closeExportPanel.transfers = [dialog.closeDialog];\n+\n+    /**\n+     * Merge the given set of asset properties into the Export Asset model and persist in the the Ps metadata\n+     *\n+     * @param {Document} document\n+     * @param {Layer} layer\n+     * @param {number} assetIndex index of this asset within the layer's list\n+     * @param {object} props ExportAsset-like properties to be merged\n+     * @return {Promise}\n+     */\n+    var updateLayerExportAsset = function (document, layer, assetIndex, props) {\n+        var documentID = document.id,\n+            assetPropsArray = [],\n+            payload;\n+\n+        assetPropsArray[assetIndex] = props;\n+\n+        payload = {\n+            documentID: documentID,\n+            layerIDs: layer.id,\n+            assetPropsArray: assetPropsArray\n+        };\n+\n+        return this.dispatchAsync(events.export.ASSET_CHANGED, payload).bind(this).then(function () {\n+            return _syncLayerExportMetadata.call(this, documentID, layer.id);\n+        });\n+    };\n+    updateLayerExportAsset.reads = [locks.JS_DOC];\n+    updateLayerExportAsset.writes = [locks.JS_DOC, locks.PS_DOC];\n+\n+    /**\n+     * Set the numerical scale of the asset specified by the given index\n+     *\n+     * @param {Document} document\n+     * @param {Layer} layer\n+     * @param {number} assetIndex index of this asset within the layer's list\n+     * @param {number} scale\n+     * @return {Promise}\n+     */\n+    var updateLayerAssetScale = function (document, layer, assetIndex, scale) {\n+        return this.transfer(updateLayerExportAsset, document, layer, assetIndex, { scale: scale || 1 });\n+    };\n+    updateLayerAssetScale.reads = [];\n+    updateLayerAssetScale.writes = [];\n+    updateLayerAssetScale.transfers = [updateLayerExportAsset];\n+\n+    /**\n+     * Set the filename suffix of the asset specified by the given index\n+     *\n+     * @param {Document} document\n+     * @param {Layer} layer\n+     * @param {number} assetIndex index of this asset within the layer's list\n+     * @param {string} suffix\n+     * @return {Promise}\n+     */\n+    var updateLayerAssetSuffix = function (document, layer, assetIndex, suffix) {\n+        return this.transfer(updateLayerExportAsset, document, layer, assetIndex, { suffix: suffix });\n+    };\n+    updateLayerAssetSuffix.reads = [];\n+    updateLayerAssetSuffix.writes = [];\n+    updateLayerAssetSuffix.transfers = [updateLayerExportAsset];\n+\n+    /**\n+     * Set the format of the asset specified by the given index\n+     *\n+     * @param {Document} document\n+     * @param {Layer} layer\n+     * @param {number} assetIndex index of this asset within the layer's list\n+     * @param {string} format (example: jpg)\n+     * @return {Promise}\n+     */\n+    var updateLayerAssetFormat = function (document, layer, assetIndex, format) {\n+        return this.transfer(updateLayerExportAsset, document, layer, assetIndex, { format: format });\n+    };\n+    updateLayerAssetFormat.reads = [];\n+    updateLayerAssetFormat.writes = [];\n+    updateLayerAssetFormat.transfers = [updateLayerExportAsset];\n+\n+    /**\n+     * Update the status of all assets that are being requested\n+     *\n+     * @param {Document} document [description]\n+     */\n+    var setAllAssetsRequested = function (document) {\n+        var layerIDs = document.layers.all.reduce(function (IDs, layer) {\n+            if (layer.exportEnabled) {\n+                IDs.push(layer.id);\n+            }\n+            return IDs;\n+        }, []);\n+        return this.dispatchAsync(events.export.SET_AS_REQUESTED, { documentID: document.id, layerIDs: layerIDs });\n+    };\n+    setAllAssetsRequested.reads = [];\n+    setAllAssetsRequested.writes = [locks.JS_DOC];\n+\n+    /**\n+     * Delete the Export Asset configuration specified by the given index\n+     *\n+     * @param {Document} document\n+     * @param {Layer} layer\n+     * @param {number} assetIndex index of this asset within the layer's list\n+     * @return {Promise}\n+     */\n+    var deleteLayerExportAsset = function (document, layer, assetIndex) {\n+        var documentID = document.id,\n+            layerID = layer.id,\n+            payload = {\n+                documentID: documentID,\n+                layerID: layerID,\n+                assetIndex: assetIndex\n+            };\n+\n+        return this.dispatchAsync(events.export.DELETE_LAYER_ASSET, payload).bind(this).then(function () {\n+            return _syncLayerExportMetadata.call(this, documentID, layer.id);\n+        });\n+    };\n+    deleteLayerExportAsset.reads = [locks.JS_DOC];\n+    deleteLayerExportAsset.writes = [locks.JS_DOC, locks.PS_DOC];\n+\n+    /**\n+     * Sets the exportEnabled flag for a given layer or layers\n+     * @private\n+     * @param {Document} document Owner document\n+     * @param {Layer|Immutable.List.<Layer>} layers Either a Layer reference or array of Layers\n+     * @param {boolean=} exportEnabled\n+     * @returns {Promise}\n+     */\n+    var setLayerExportEnabled = function (document, layers, exportEnabled) {\n+        var layerIDs = Immutable.List.isList(layers) ?\n+                collection.pluck(layers, \"id\").toArray() :\n+                [layers.id];\n+\n+        var payload = {\n+                documentID: document.id,\n+                layerIDs: layerIDs,\n+                exportEnabled: exportEnabled\n+            };\n+\n+        this.dispatch(events.document.LAYER_EXPORT_ENABLED_CHANGED, payload);\n+\n+        return Promise.all(layerIDs.map(function (layerID) {\n+            return _syncLayerExportMetadata.call(this, document.id, layerID);\n+        }.bind(this)));\n+    };\n+    setLayerExportEnabled.reads = [locks.JS_DOC];\n+    setLayerExportEnabled.writes = [locks.JS_DOC, locks.PS_DOC];\n+\n+    /**\n+     * Helper function to export a single asset using the export service, and update the metadata afterwards\n+     *\n+     * @private\n+     * @param {Document} document\n+     * @param {Layer} layer\n+     * @param {number} assetIndex index of this asset within the layer's list\n+     * @param {ExportAsset} asset asset to export\n+     * @return {Promise}\n+     */\n+    var _exportAsset = function (document, layer, assetIndex, asset) {\n+        return _exportService.exportLayerAsset(layer, asset)\n+            .bind(this)\n+            .then(function (pathArray) {\n+                // Do we need to be aware of exports that return >1 file path?\n+                var assetProps = {\n+                    filePath: pathArray[0],\n+                    status: ExportAsset.STATUS.STABLE\n+                };\n+                return this.transfer(updateLayerExportAsset, document, layer, assetIndex, assetProps);\n+            });\n+    };\n+\n+    /**\n+     * Export all assets for the given document for which export has been enabled (layer.exportEnabled)\n+     *\n+     * @param {Document} document\n+     * @return {Promise} resolves when all assets have been exported\n+     */\n+    var exportAllAssets = function (document) {\n+        if (!document) {\n+            Promise.resolve(\"No Document\");\n+        }\n+\n+        if (!_exportService || !_exportService.ready()) {\n+            Promise.reject(\"Export Service is not available\");\n+        }\n+\n+        var documentID = document.id,\n+            documentExports = this.flux.stores.export.getDocumentExports(documentID),\n+            layerExportsMap = documentExports && documentExports.layerExportsMap,\n+            exportArray = [];\n+\n+        if (!layerExportsMap || layerExportsMap.size < 1) {\n+            return Promise.resolve(\"no assets to export\");\n+        }\n+\n+        // Iterate over the exports map, find the associated layer, test of \"exportEnabled\"\n+        layerExportsMap.forEach(function (layerExportAssets, layerID) {\n+            var layer = document.layers.byID(layerID);\n+            if (layer.exportEnabled) {\n+                // Export all assets for this layer\n+                layerExportAssets.forEach(function (asset, index) {\n+                    exportArray.push(_exportAsset.call(this, document, layer, index, asset));\n+                }, this);\n+            }\n+        }, this);\n+\n+        return Promise.all(exportArray);\n+    };\n+    exportAllAssets.reads = [locks.JS_DOC];\n+    exportAllAssets.writes = [locks.PS_GENERATOR];\n+    exportAllAssets.transfers = [updateLayerExportAsset];\n+\n+    /**\n+     * Handle the standard onReset action\n+     *\n+     * @return {Promise}\n+     */\n+    var onReset = function () {\n+        /*\n+        // Not sure if we need to do ANYTHING upon reset.  Closing the connection was a pretty bad idea, natch\n+        _exportService.close();\n+        _exportService = null;\n+        */\n+        return Promise.resolve();\n+    };\n+    onReset.reads = [];\n+    onReset.writes = [];\n+\n+    /**\n+     * Fetch relevant data from both the document and export stores, and sync the metadata to\n+     * the photoshop layer \"extension data\"\n+     *\n+     * TODO maybe this should handle a set of layers, for efficiency when called by layer actions?\n+     *\n+     * @private\n+     * @param {number} documentID\n+     * @param {number} layerID\n+     * @return {Promise}\n+     */\n+    var _syncLayerExportMetadata = function (documentID, layerID) {\n+        var documentExports = this.flux.stores.export.getDocumentExports(documentID),\n+            layerExportsArray = documentExports && documentExports.layerExportsArray(layerID),\n+            document = this.flux.stores.document.getDocument(documentID),\n+            layer = document && document.layers.byID(layerID),\n+            exportEnabled = document && layer && layer.exportEnabled;\n+\n+        var exportsMetadata = {\n+            exportAssets: layerExportsArray,\n+            exportEnabled: exportEnabled === undefined ? false : exportEnabled\n+        };\n+\n+        var playObject = layerLib.setExtensionData(documentID,\n+            layerID, EXTENSION_DATA_NAMESPACE, \"exportsMetadata\", exportsMetadata);","path":"src/js/actions/export.js","position":348,"original_position":348,"commit_id":"657355b7d3a1ae0fb145678476fadc67b91671f2","original_commit_id":"657355b7d3a1ae0fb145678476fadc67b91671f2","user":{"login":"iwehrman","id":1075154,"avatar_url":"https://avatars.githubusercontent.com/u/1075154?v=3","gravatar_id":"","url":"https://api.github.com/users/iwehrman","html_url":"https://github.com/iwehrman","followers_url":"https://api.github.com/users/iwehrman/followers","following_url":"https://api.github.com/users/iwehrman/following{/other_user}","gists_url":"https://api.github.com/users/iwehrman/gists{/gist_id}","starred_url":"https://api.github.com/users/iwehrman/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/iwehrman/subscriptions","organizations_url":"https://api.github.com/users/iwehrman/orgs","repos_url":"https://api.github.com/users/iwehrman/repos","events_url":"https://api.github.com/users/iwehrman/events{/privacy}","received_events_url":"https://api.github.com/users/iwehrman/received_events","type":"User","site_admin":false},"body":"Maybe indent this line one more tab stop. ","created_at":"2015-08-11T19:20:18Z","updated_at":"2015-08-11T19:20:18Z","html_url":"https://github.com/adobe-photoshop/spaces-design/pull/1750#discussion_r36786837","pull_request_url":"https://api.github.com/repos/adobe-photoshop/spaces-design/pulls/1750","_links":{"self":{"href":"https://api.github.com/repos/adobe-photoshop/spaces-design/pulls/comments/36786837"},"html":{"href":"https://github.com/adobe-photoshop/spaces-design/pull/1750#discussion_r36786837"},"pull_request":{"href":"https://api.github.com/repos/adobe-photoshop/spaces-design/pulls/1750"}}},"pull_request":{"url":"https://api.github.com/repos/adobe-photoshop/spaces-design/pulls/1750","id":40241489,"html_url":"https://github.com/adobe-photoshop/spaces-design/pull/1750","diff_url":"https://github.com/adobe-photoshop/spaces-design/pull/1750.diff","patch_url":"https://github.com/adobe-photoshop/spaces-design/pull/1750.patch","issue_url":"https://api.github.com/repos/adobe-photoshop/spaces-design/issues/1750","number":1750,"state":"open","locked":false,"title":"Basic Asset Export Feature","user":{"login":"mcilroyc","id":1168110,"avatar_url":"https://avatars.githubusercontent.com/u/1168110?v=3","gravatar_id":"","url":"https://api.github.com/users/mcilroyc","html_url":"https://github.com/mcilroyc","followers_url":"https://api.github.com/users/mcilroyc/followers","following_url":"https://api.github.com/users/mcilroyc/following{/other_user}","gists_url":"https://api.github.com/users/mcilroyc/gists{/gist_id}","starred_url":"https://api.github.com/users/mcilroyc/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/mcilroyc/subscriptions","organizations_url":"https://api.github.com/users/mcilroyc/orgs","repos_url":"https://api.github.com/users/mcilroyc/repos","events_url":"https://api.github.com/users/mcilroyc/events{/privacy}","received_events_url":"https://api.github.com/users/mcilroyc/received_events","type":"User","site_admin":false},"body":"This provides a barebones UI for generating assets in Design Space.  You can configure layers, groups and artboards to generate assets, in several formats (PNG, JPG, etc), at any (or all) of 4 pre-defined scales, and then generate all configured assets for the document with one click.  \r\n\r\nThe UI is split in two places.\r\n\r\n1. Assets are configured (one layer at a time) in a new EXPORT panel below the STYLE panel.  \r\n1. Once configured, the assets are *generated* by opening the export modal dialog (currently using Cmd+e)\r\n\r\nDependencies:\r\n- The necessary generator version (3.5) is now built-in to our playground-dev builds as of (mac) 423\r\n- Generator Enabled via (classic UI) Preferences > Plugin Ins...\r\n- [generator-spaces](https://github.com/adobe-photoshop/generator-spaces) plugin (private repo)\r\n  - download from github, run `npm install`, OR...\r\n  - download zip file that I'll post to slack\r\n  - Installed/unzipped as a subdirectory of `Adobe\\ Photoshop\\ CC\\ 2015.app/Contents/Required/Plug-Ins/Generator/` \r\n- Requires a `bower install`\r\n\r\nusage/caveats\r\n- mac only (there is at least an issue with file paths and the plugin, via chad)\r\n- ESC shortcut closes export dialog, but then it won't open back up properly\r\n- open the export util with `Cmd+e`","created_at":"2015-07-17T15:20:23Z","updated_at":"2015-08-11T19:20:18Z","closed_at":null,"merged_at":null,"merge_commit_sha":"9bfc2d30b2e2b2860d264ee9f644a5818c683f0a","assignee":{"login":"iwehrman","id":1075154,"avatar_url":"https://avatars.githubusercontent.com/u/1075154?v=3","gravatar_id":"","url":"https://api.github.com/users/iwehrman","html_url":"https://github.com/iwehrman","followers_url":"https://api.github.com/users/iwehrman/followers","following_url":"https://api.github.com/users/iwehrman/following{/other_user}","gists_url":"https://api.github.com/users/iwehrman/gists{/gist_id}","starred_url":"https://api.github.com/users/iwehrman/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/iwehrman/subscriptions","organizations_url":"https://api.github.com/users/iwehrman/orgs","repos_url":"https://api.github.com/users/iwehrman/repos","events_url":"https://api.github.com/users/iwehrman/events{/privacy}","received_events_url":"https://api.github.com/users/iwehrman/received_events","type":"User","site_admin":false},"milestone":null,"commits_url":"https://api.github.com/repos/adobe-photoshop/spaces-design/pulls/1750/commits","review_comments_url":"https://api.github.com/repos/adobe-photoshop/spaces-design/pulls/1750/comments","review_comment_url":"https://api.github.com/repos/adobe-photoshop/spaces-design/pulls/comments{/number}","comments_url":"https://api.github.com/repos/adobe-photoshop/spaces-design/issues/1750/comments","statuses_url":"https://api.github.com/repos/adobe-photoshop/spaces-design/statuses/657355b7d3a1ae0fb145678476fadc67b91671f2","head":{"label":"adobe-photoshop:mcilroy/export","ref":"mcilroy/export","sha":"657355b7d3a1ae0fb145678476fadc67b91671f2","user":{"login":"adobe-photoshop","id":4542585,"avatar_url":"https://avatars.githubusercontent.com/u/4542585?v=3","gravatar_id":"","url":"https://api.github.com/users/adobe-photoshop","html_url":"https://github.com/adobe-photoshop","followers_url":"https://api.github.com/users/adobe-photoshop/followers","following_url":"https://api.github.com/users/adobe-photoshop/following{/other_user}","gists_url":"https://api.github.com/users/adobe-photoshop/gists{/gist_id}","starred_url":"https://api.github.com/users/adobe-photoshop/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/adobe-photoshop/subscriptions","organizations_url":"https://api.github.com/users/adobe-photoshop/orgs","repos_url":"https://api.github.com/users/adobe-photoshop/repos","events_url":"https://api.github.com/users/adobe-photoshop/events{/privacy}","received_events_url":"https://api.github.com/users/adobe-photoshop/received_events","type":"Organization","site_admin":false},"repo":{"id":37291353,"name":"spaces-design","full_name":"adobe-photoshop/spaces-design","owner":{"login":"adobe-photoshop","id":4542585,"avatar_url":"https://avatars.githubusercontent.com/u/4542585?v=3","gravatar_id":"","url":"https://api.github.com/users/adobe-photoshop","html_url":"https://github.com/adobe-photoshop","followers_url":"https://api.github.com/users/adobe-photoshop/followers","following_url":"https://api.github.com/users/adobe-photoshop/following{/other_user}","gists_url":"https://api.github.com/users/adobe-photoshop/gists{/gist_id}","starred_url":"https://api.github.com/users/adobe-photoshop/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/adobe-photoshop/subscriptions","organizations_url":"https://api.github.com/users/adobe-photoshop/orgs","repos_url":"https://api.github.com/users/adobe-photoshop/repos","events_url":"https://api.github.com/users/adobe-photoshop/events{/privacy}","received_events_url":"https://api.github.com/users/adobe-photoshop/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/adobe-photoshop/spaces-design","description":"Adobe Photoshop Design Space","fork":false,"url":"https://api.github.com/repos/adobe-photoshop/spaces-design","forks_url":"https://api.github.com/repos/adobe-photoshop/spaces-design/forks","keys_url":"https://api.github.com/repos/adobe-photoshop/spaces-design/keys{/key_id}","collaborators_url":"https://api.github.com/repos/adobe-photoshop/spaces-design/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/adobe-photoshop/spaces-design/teams","hooks_url":"https://api.github.com/repos/adobe-photoshop/spaces-design/hooks","issue_events_url":"https://api.github.com/repos/adobe-photoshop/spaces-design/issues/events{/number}","events_url":"https://api.github.com/repos/adobe-photoshop/spaces-design/events","assignees_url":"https://api.github.com/repos/adobe-photoshop/spaces-design/assignees{/user}","branches_url":"https://api.github.com/repos/adobe-photoshop/spaces-design/branches{/branch}","tags_url":"https://api.github.com/repos/adobe-photoshop/spaces-design/tags","blobs_url":"https://api.github.com/repos/adobe-photoshop/spaces-design/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/adobe-photoshop/spaces-design/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/adobe-photoshop/spaces-design/git/refs{/sha}","trees_url":"https://api.github.com/repos/adobe-photoshop/spaces-design/git/trees{/sha}","statuses_url":"https://api.github.com/repos/adobe-photoshop/spaces-design/statuses/{sha}","languages_url":"https://api.github.com/repos/adobe-photoshop/spaces-design/languages","stargazers_url":"https://api.github.com/repos/adobe-photoshop/spaces-design/stargazers","contributors_url":"https://api.github.com/repos/adobe-photoshop/spaces-design/contributors","subscribers_url":"https://api.github.com/repos/adobe-photoshop/spaces-design/subscribers","subscription_url":"https://api.github.com/repos/adobe-photoshop/spaces-design/subscription","commits_url":"https://api.github.com/repos/adobe-photoshop/spaces-design/commits{/sha}","git_commits_url":"https://api.github.com/repos/adobe-photoshop/spaces-design/git/commits{/sha}","comments_url":"https://api.github.com/repos/adobe-photoshop/spaces-design/comments{/number}","issue_comment_url":"https://api.github.com/repos/adobe-photoshop/spaces-design/issues/comments{/number}","contents_url":"https://api.github.com/repos/adobe-photoshop/spaces-design/contents/{+path}","compare_url":"https://api.github.com/repos/adobe-photoshop/spaces-design/compare/{base}...{head}","merges_url":"https://api.github.com/repos/adobe-photoshop/spaces-design/merges","archive_url":"https://api.github.com/repos/adobe-photoshop/spaces-design/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/adobe-photoshop/spaces-design/downloads","issues_url":"https://api.github.com/repos/adobe-photoshop/spaces-design/issues{/number}","pulls_url":"https://api.github.com/repos/adobe-photoshop/spaces-design/pulls{/number}","milestones_url":"https://api.github.com/repos/adobe-photoshop/spaces-design/milestones{/number}","notifications_url":"https://api.github.com/repos/adobe-photoshop/spaces-design/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/adobe-photoshop/spaces-design/labels{/name}","releases_url":"https://api.github.com/repos/adobe-photoshop/spaces-design/releases{/id}","created_at":"2015-06-11T23:23:47Z","updated_at":"2015-08-11T06:29:34Z","pushed_at":"2015-08-11T18:54:48Z","git_url":"git://github.com/adobe-photoshop/spaces-design.git","ssh_url":"git@github.com:adobe-photoshop/spaces-design.git","clone_url":"https://github.com/adobe-photoshop/spaces-design.git","svn_url":"https://github.com/adobe-photoshop/spaces-design","homepage":"http://adobe-photoshop.github.io/","size":16166,"stargazers_count":596,"watchers_count":596,"language":"JavaScript","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":41,"mirror_url":null,"open_issues_count":183,"forks":41,"open_issues":183,"watchers":596,"default_branch":"master"}},"base":{"label":"adobe-photoshop:master","ref":"master","sha":"30fe13ae4bf01df22b3b45dac5f00419ebc88ff3","user":{"login":"adobe-photoshop","id":4542585,"avatar_url":"https://avatars.githubusercontent.com/u/4542585?v=3","gravatar_id":"","url":"https://api.github.com/users/adobe-photoshop","html_url":"https://github.com/adobe-photoshop","followers_url":"https://api.github.com/users/adobe-photoshop/followers","following_url":"https://api.github.com/users/adobe-photoshop/following{/other_user}","gists_url":"https://api.github.com/users/adobe-photoshop/gists{/gist_id}","starred_url":"https://api.github.com/users/adobe-photoshop/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/adobe-photoshop/subscriptions","organizations_url":"https://api.github.com/users/adobe-photoshop/orgs","repos_url":"https://api.github.com/users/adobe-photoshop/repos","events_url":"https://api.github.com/users/adobe-photoshop/events{/privacy}","received_events_url":"https://api.github.com/users/adobe-photoshop/received_events","type":"Organization","site_admin":false},"repo":{"id":37291353,"name":"spaces-design","full_name":"adobe-photoshop/spaces-design","owner":{"login":"adobe-photoshop","id":4542585,"avatar_url":"https://avatars.githubusercontent.com/u/4542585?v=3","gravatar_id":"","url":"https://api.github.com/users/adobe-photoshop","html_url":"https://github.com/adobe-photoshop","followers_url":"https://api.github.com/users/adobe-photoshop/followers","following_url":"https://api.github.com/users/adobe-photoshop/following{/other_user}","gists_url":"https://api.github.com/users/adobe-photoshop/gists{/gist_id}","starred_url":"https://api.github.com/users/adobe-photoshop/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/adobe-photoshop/subscriptions","organizations_url":"https://api.github.com/users/adobe-photoshop/orgs","repos_url":"https://api.github.com/users/adobe-photoshop/repos","events_url":"https://api.github.com/users/adobe-photoshop/events{/privacy}","received_events_url":"https://api.github.com/users/adobe-photoshop/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/adobe-photoshop/spaces-design","description":"Adobe Photoshop Design Space","fork":false,"url":"https://api.github.com/repos/adobe-photoshop/spaces-design","forks_url":"https://api.github.com/repos/adobe-photoshop/spaces-design/forks","keys_url":"https://api.github.com/repos/adobe-photoshop/spaces-design/keys{/key_id}","collaborators_url":"https://api.github.com/repos/adobe-photoshop/spaces-design/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/adobe-photoshop/spaces-design/teams","hooks_url":"https://api.github.com/repos/adobe-photoshop/spaces-design/hooks","issue_events_url":"https://api.github.com/repos/adobe-photoshop/spaces-design/issues/events{/number}","events_url":"https://api.github.com/repos/adobe-photoshop/spaces-design/events","assignees_url":"https://api.github.com/repos/adobe-photoshop/spaces-design/assignees{/user}","branches_url":"https://api.github.com/repos/adobe-photoshop/spaces-design/branches{/branch}","tags_url":"https://api.github.com/repos/adobe-photoshop/spaces-design/tags","blobs_url":"https://api.github.com/repos/adobe-photoshop/spaces-design/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/adobe-photoshop/spaces-design/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/adobe-photoshop/spaces-design/git/refs{/sha}","trees_url":"https://api.github.com/repos/adobe-photoshop/spaces-design/git/trees{/sha}","statuses_url":"https://api.github.com/repos/adobe-photoshop/spaces-design/statuses/{sha}","languages_url":"https://api.github.com/repos/adobe-photoshop/spaces-design/languages","stargazers_url":"https://api.github.com/repos/adobe-photoshop/spaces-design/stargazers","contributors_url":"https://api.github.com/repos/adobe-photoshop/spaces-design/contributors","subscribers_url":"https://api.github.com/repos/adobe-photoshop/spaces-design/subscribers","subscription_url":"https://api.github.com/repos/adobe-photoshop/spaces-design/subscription","commits_url":"https://api.github.com/repos/adobe-photoshop/spaces-design/commits{/sha}","git_commits_url":"https://api.github.com/repos/adobe-photoshop/spaces-design/git/commits{/sha}","comments_url":"https://api.github.com/repos/adobe-photoshop/spaces-design/comments{/number}","issue_comment_url":"https://api.github.com/repos/adobe-photoshop/spaces-design/issues/comments{/number}","contents_url":"https://api.github.com/repos/adobe-photoshop/spaces-design/contents/{+path}","compare_url":"https://api.github.com/repos/adobe-photoshop/spaces-design/compare/{base}...{head}","merges_url":"https://api.github.com/repos/adobe-photoshop/spaces-design/merges","archive_url":"https://api.github.com/repos/adobe-photoshop/spaces-design/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/adobe-photoshop/spaces-design/downloads","issues_url":"https://api.github.com/repos/adobe-photoshop/spaces-design/issues{/number}","pulls_url":"https://api.github.com/repos/adobe-photoshop/spaces-design/pulls{/number}","milestones_url":"https://api.github.com/repos/adobe-photoshop/spaces-design/milestones{/number}","notifications_url":"https://api.github.com/repos/adobe-photoshop/spaces-design/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/adobe-photoshop/spaces-design/labels{/name}","releases_url":"https://api.github.com/repos/adobe-photoshop/spaces-design/releases{/id}","created_at":"2015-06-11T23:23:47Z","updated_at":"2015-08-11T06:29:34Z","pushed_at":"2015-08-11T18:54:48Z","git_url":"git://github.com/adobe-photoshop/spaces-design.git","ssh_url":"git@github.com:adobe-photoshop/spaces-design.git","clone_url":"https://github.com/adobe-photoshop/spaces-design.git","svn_url":"https://github.com/adobe-photoshop/spaces-design","homepage":"http://adobe-photoshop.github.io/","size":16166,"stargazers_count":596,"watchers_count":596,"language":"JavaScript","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":41,"mirror_url":null,"open_issues_count":183,"forks":41,"open_issues":183,"watchers":596,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/adobe-photoshop/spaces-design/pulls/1750"},"html":{"href":"https://github.com/adobe-photoshop/spaces-design/pull/1750"},"issue":{"href":"https://api.github.com/repos/adobe-photoshop/spaces-design/issues/1750"},"comments":{"href":"https://api.github.com/repos/adobe-photoshop/spaces-design/issues/1750/comments"},"review_comments":{"href":"https://api.github.com/repos/adobe-photoshop/spaces-design/pulls/1750/comments"},"review_comment":{"href":"https://api.github.com/repos/adobe-photoshop/spaces-design/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/adobe-photoshop/spaces-design/pulls/1750/commits"},"statuses":{"href":"https://api.github.com/repos/adobe-photoshop/spaces-design/statuses/657355b7d3a1ae0fb145678476fadc67b91671f2"}}}}