{"action":"created","comment":{"url":"https://api.github.com/repos/lbondaryk/BrixClient/pulls/comments/50321309","id":50321309,"diff_hunk":"@@ -0,0 +1,904 @@\n+/* **************************************************************************\n+ * livecodeexample.js                                                       $\n+ * *********************************************************************/ /**\n+ *\n+ * @fileoverview Implementation of the _NewBricClass_ bric.\n+ *\n+ * The _NewBricClass_ bric [briefly describe what the new bric is]\n+ *\n+*\n+ *  - The order of the components of the bric in a file is as follows:\n+ *    - Constructor function that defines the class\n+ *    - class type definitions (they come 1st so they can be used by static properties and methods)\n+ *    - class static properties\n+ *    - class static methods (public before private and protected)\n+ *    - class public instance getters and setters\n+ *    - class public instance methods\n+ *    - class private and protected instance methods\n+ *\n+ * Created on       December 08, 2015\n+ * @author          Paul R LaRiviere (Adya Consulting Services, Inc.)\n+ *\n+ * @copyright (c) 2015 Pearson, All rights reserved.\n+ *\n+ * **************************************************************************/\n+\n+goog.provide('pearson.brix.LiveCodeExample');\n+\n+goog.require('pearson.brix.Question');\n+goog.require('pearson.brix.IState');\n+goog.require('pearson.utils');\n+goog.require('pearson.brix.utils');\n+goog.require('pearson.utils.IEventManager');\n+goog.require('pearson.brix.BricTypes');\n+goog.require('pearson.brix.utils.BricWorks');\n+goog.require('pearson.l10n');\n+\n+goog.require('goog.events');\n+\n+/* **************************************************************************\n+ * LiveCodeExample                                                      */ /**\n+ *\n+ * Constructor for the LiveCodeExample Class.\n+ *\n+ * @constructor\n+ * @extends {pearson.brix.Question}\n+ * @implements {pearson.brix.IState}\n+ * @export\n+ *\n+ * @param {pearson.brix.LiveCodeExample.Config} config\n+ *      The settings to configure this LiveCodeExample.\n+ *\n+ * @param {!pearson.utils.IEventManager=} eventManager\n+ *      The event manager to use for publishing events and subscribing to them.\n+ *\n+ * @param {!pearson.brix.utils.BricWorks=} bricWorks\n+ *      The BricWorks to use to create any child brix this LiveCodeExample\n+ *      will use internally.  This is not really optional, but in order to\n+ *      keep all Bric constructors w/ the same signature, we need to annotate\n+ *      it as though it was.\n+ *\n+ * @classdesc\n+ * The LiveCodeExample bric provides an interactice sandbox with three defined\n+ * areas: a text editor that functions as a full-featured Integrated Development\n+ * Environmnet (IDE), and typically presents the user with a source code snippet that \n+ * the user is expected to modify; a data entry box, an area that is treated as\n+ * a stdin region for holding input data values; and an output box, an area that \n+ * is treated as a stdout region, for output from a compile and run activity, \n+ * including compiler error messages. It also provides buttons for submitting\n+ * the customized snippet to the compiler, and for resetting the display to its\n+ * initial state.\n+ *\n+ * **************************************************************************/\n+pearson.brix.LiveCodeExample = function (config, eventManager, bricWorks)\n+{\n+    /**\n+     * Logger for this Bric, defined before the call to the base\n+    // constructor, thus allowing the base class to use this logger.\n+     * @private\n+     * @type {goog.log.Logger}\n+     */\n+    this.logger_ = goog.log.getLogger('pearson.brix.LiveCodeExample');\n+\n+    /**\n+     * A unique id for this instance of the LiveCodeExample bric.\n+     * @private\n+     * @type {string}\n+     */\n+    this.liveCodeExampleId_ = pearson.brix.utils.getIdFromConfigOrAuto(config, pearson.brix.LiveCodeExample);\n+\n+\n+    // Call the base class constructor \n+    //pearson.brix.LiveCodeExample.base(this, 'constructor', pearson.brix.LiveCodeExample.getQuestionConfig_(config), eventManager, bricWorks);\n+    pearson.brix.LiveCodeExample.base(this, 'constructor', /**@type {pearson.brix.Question.Config}*/ (config), eventManager, bricWorks);\n+\n+\n+    // Without a valid BricWorks we can't construct this LiveCodeExample, since\n+    // we cannot create the submit or reset buttons\n+    if (!bricWorks)\n+    {\n+        var msg = 'LiveCodeExample requires a valid BricWorks to create the child brix and other internal brix that it uses';\n+        this.logger_.severe(msg);\n+        throw new Error(msg);\n+    }\n+\n+    /**\n+     * The title text, possibly for display above the exercise.\n+     * @private\n+     * @type {string}\n+     */\n+    this.title_ = config.title;\n+\n+    /**\n+     * The preamble program code\n+     * @private\n+     * @type {string}\n+     */\n+    this.preamble_ = config.preamble;\n+\n+    /**\n+     * The initial codeline in the user code area\n+     * @private\n+     * @type {string}\n+     */\n+    this.usercode_ = config.usercode;\n+\n+    /**\n+     * The postamble program code\n+     * @private\n+     * @type {string}\n+     */\n+    this.postamble_ = config.postamble;\n+\n+    /**\n+     * The input dataset (as stdin)\n+     * @private\n+     * @type {string}\n+     */\n+    this.datasetinit_ = config.datasetinit;\n+\n+    /**\n+     * The compiler command\n+     * @private\n+     * @type {string}\n+     */\n+    this.invocation_ = config.invocation;\n+\n+    /**\n+     * The program source code file name\n+     * @private\n+     * @type {string}\n+     */\n+    this.sourcefile_ = config.sourcefile;\n+\n+    /**\n+     * Text for upper comment region\n+     * @private\n+     * @type {string}\n+     */\n+    this.uppercomment_ = config.uppercomment;\n+\n+    /**\n+     * Text for lower comment region\n+     * @private\n+     * @type {string}\n+     */\n+    this.lowercomment_ = config.lowercomment;\n+\n+    /**\n+     * Text for output region heading\n+     * @private\n+     * @type {string}\n+     */\n+    this.outputprompt_ = config.outputprompt;\n+\n+    // log the configuration of this bric\n+    var configMsg =\n+        [ '',\n+          'Initial config properties for LiveCodeExampleId: ' + this.getId(),\n+          '\\ttitle: ' + this.title_,\n+          '\\tpreamble_: ' + (this.preamble_.length < 220 ? this.preamble_ : this.preamble_.slice(0, 110) + '...'),\n+          '\\tpostamble_: ' + (this.postamble_.length < 220 ? this.postamble_ : this.postamble_.slice(0, 110) + '...'),\n+          '\\tdatasetinit: ' + this.datasetinit_,\n+          '\\tsourcefile: ' + this.sourcefile_\n+        ];\n+    this.logger_.config(configMsg.join('\\n'));\n+\n+    // The 'submit' button event should forward the completed Example to the compiler for\n+    // compilation and, if possible, launch and run the Example and publish its output\n+    //\n+    // Configuration options for the submit button\n+    var submitBtnConfig = \n+        {\n+            id: this.getId() + '_submitBtn',\n+            text: pearson.l10n.getString( 'Brix_Assessments', 'compileRun' ),\n+            enabled: false\n+        };\n+\n+    /**\n+     * The 'submit' button bric initiates the submission of the entire CodeExample \n+     * source to the compile/run server\n+     * @private\n+     * @type {!pearson.brix.Button}\n+     */\n+    this.submitButton_ = /**@type {!pearson.brix.Button}*/ ( bricWorks.createBric( pearson.brix.BricTypes.BUTTON, submitBtnConfig ) );\n+\n+    \n+    /**\n+     * Event details for this.submitScoreRequestEventId_ events\n+     * @typedef {Object} SubmitAnswerRequest\n+     * @property {string} submissionId - identifies this bric to the scoring engine\n+     * @property {Object} answer - answer object\n+     * @property {string} answer.entry - the entry text\n+     * @property {function(Object)} compilerCallback - [optional] function to call with response when\n+     *                                                 it is returned by the\n+     *                                                 scoring engine\n+     */\n+    var SubmitAnswerRequest;\n+\n+\n+    //Subscribe to submit button events from the child button bric. \n+    this.eventManager_.subscribe( this.submitButton_.getEventTopic('clicked'), goog.bind( this.handleSubmitRequested_, this ) );\n+\n+    // The 'reset' button restores the Example and input dataset to the \n+    // original content \n+    // Configuration options for the reset button\n+    var resetBtnConfig = \n+        {\n+            id: this.getId() + '_resetBtn',\n+            text: pearson.l10n.getString( 'Brix_Assessments', 'reset' ),\n+            enabled: false\n+        };\n+\n+\n+    /**\n+     * The 'reset' button bric restores and re-presents the complete Example and the input\n+     * dataset\n+     * @private\n+     * @type {!pearson.brix.Button}\n+     */\n+    this.resetButton_ = /**@type {!pearson.brix.Button}*/ ( bricWorks.createBric( pearson.brix.BricTypes.BUTTON, resetBtnConfig ) );\n+\n+    \n+    /**\n+     * Event details for this.resetExampleEventId_ events\n+     * @typedef {Object} ResetExample \n+     */\n+    var ResetExample;\n+\n+\n+    //Subscribe to reset button events from the child button bric. \n+    this.eventManager_.subscribe( this.resetButton_.getEventTopic('clicked'), goog.bind( this.handleResetExample_, this ) );\n+\n+\n+    /**\n+     * Information about the last drawn instance of this LiveCodeExample (from the draw method)\n+     * @private\n+     * @type {{ \n+     *      container: d3.selection,\n+     *      brixGroup: d3.selection,\n+     *      editor: Object\n+     * }}\n+     *\n+     * @property {d3.selection} container\n+     *      The container html element to which this HtmlBric element is appended.\n+     *      Null if this bric is not currently drawn.\n+     *\n+     * @property {d3.selection} brixGroup\n+     *      The element that has this bric's class on it and contains ALL other\n+     *      elements used to draw this bric. Null if this bric is not\n+     *      currently drawn.\n+     *\n+     * @property {Object} editor\n+     *      The element that is the integrated IDE\n+     */\n+    this.lastdrawn_ =\n+        {\n+            container: null,\n+            brixGroup: null,\n+            editor: null\n+        };\n+\n+}; // end of LiveCodeExample constructor\n+goog.inherits(pearson.brix.LiveCodeExample, pearson.brix.Question);\n+\n+\n+/* class type definitions */\n+\n+/* **************************************************************************\n+ * LiveCodeExample.Config                                               */ /**\n+ *\n+ * The LiveCodeExample.Config is the object that must be given to the\n+ * LiveCodeExample constructor when creating a LiveCodeExample instance.\n+ *\n+ * @mixes pearson.brix.Question.Config\n+ * @typedef {{\n+ *      LiveCodeExampleId: (string | undefined ),\n+ *      id: (string | undefined),\n+ *      title: string,\n+ *      preamble: string,\n+ *      usercode: string,\n+ *      postamble: string,\n+ *      datasetinit: string,\n+ *      invocation: string,\n+ *      sourcefile: string,\n+ *      uppercomment: string,\n+ *      lowercomment: string,\n+ *      outputprompt: string\n+ *\n+ * }} pearson.brix.LiveCodeExample.Config\n+ *\n+ * @property {string | undefined} liveCodeExampleId\n+ *      String to uniquely identify this LiveCodeExample, distinguishing it\n+ *      from other Brix submissions. Mapped to the base class config\n+ *      questionId property.\n+ *\n+ * @property {string | undefined} id\n+ *      String to uniquely identify this LiveCodeExample, distinguishing it\n+ *      from other Brix submissions. Mapped to the base class config\n+ *      questionId property.\n+ *\n+ * @property {string} title\n+ *      The title that may be used to display with this example.\n+ *\n+ * @property {string} preamble\n+ *      The immutable lines of code in the example presented to the\n+ *      user that precede the user's submitted lines of code.\n+ *\n+ * @property {string} usercode\n+ *      The lines of code submitted by the user in the example code's context\n+ *\n+ * @property {string} postamble\n+ *      The immutable lines of code in the example presented to the user that\n+ *      trail the user's submitted lines of code\n+ *\n+ * @property {string} datasetinit\n+ *      A dataset of input values to the snippet when it is run\n+ *\n+ * @property {string} invocation\n+ *      The command string to invoke the compiler\n+ *\n+ * @property {string} sourcefile\n+ *      The file name of the source code to be submitted (as reflected in title)\n+ *\n+ * @property {string} uppercomment\n+ *      Text placed in the region below the editor and above the input data\n+ *\n+ * @property {string} lowercomment\n+ *      Text placed in the region beside the Submit/Reset buttons\n+ *\n+ * @property {string} outputprompt\n+ *      Text for heading line in the output region\n+ */\n+pearson.brix.LiveCodeExample.Config;\n+\n+/* **************************************************************************\n+ * LiveCodeExample.StateObject                                            */ /**\n+ *\n+ * LiveCodeExample state object. This object represents the state of a\n+ * LiveCodeExample bric and is returned by getState and is the parameter to\n+ * setState.\n+ *\n+ * @typedef {{\n+ *      submissions: Array.<!pearson.brix.LiveCodeExample.ResponseRecord>\n+ *\n+ * }} pearson.brix.LiveCodeExample.StateObject\n+ *\n+ * @property {Array.<!pearson.brix.MultiSelectQuestion.ResponseRecord>} submissions\n+ *      The collection of responses to code previously submitted.\n+ */\n+pearson.brix.LiveCodeExample.StateObject;\n+\n+\n+/* class static properties */\n+\n+/* **************************************************************************\n+ * LiveCodeExample.autoIdPrefix (static)                                */ /**\n+ *\n+ * Prefix to use when generating ids for instances of LiveCodeExample.\n+ * @const\n+ * @type {string}\n+ */\n+pearson.brix.LiveCodeExample.autoIdPrefix = 'lce_auto_';\n+\n+\n+/* class static methods */\n+\n+/* **************************************************************************\n+ * LiveCodeExample.getEventTopic (static)                               */ /**\n+ *\n+ * Get the topic that will be published for the specified event by a\n+ * LiveCodeExample bric with the specified id.\n+ * @export\n+ *\n+ * @param {string} eventName\n+ *      The name of the event published by instances of this Bric.\n+ *      \n+ * @param {string} instanceId\n+ *      The id of the Bric instance.\n+ *\n+ * @returns {string} The topic string for the given topic name published\n+ *      by an instance of LiveCodeExample with the given instanceId.\n+ *\n+ * @throws {Error} If the eventName is not published by this bric or the\n+ *      topic cannot be determined for any other reason.\n+ ****************************************************************************/\n+pearson.brix.LiveCodeExample.getEventTopic = function (eventName, instanceId)\n+{\n+    /**\n+     * Functions that return the topic of a published event given an id.\n+     * @type {Object.<string, function(string): string>}\n+     */\n+    var publishedEventTopics =\n+    {\n+        'submit-score-request': function (instanceId)\n+        {\n+            return instanceId + '_submitAnswerRequest';\n+        },\n+        'submit-compile-request': function (instanceId)\n+        {\n+            return instanceId + '_submitCompileRequest';\n+        }\n+    };\n+\n+    if (!(eventName in publishedEventTopics))\n+    {\n+        throw new Error(\"The requested event '\" + eventName + \"' is not published by LiveCodeExample brix\");\n+    }\n+\n+    return publishedEventTopics[eventName](instanceId);\n+};\n+\n+/* **************************************************************************\n+ * LiveCodeExample.getQuestionConfig_ (static)                         */ /**\n+ *\n+ * Get the config for the Question base class given the config for the\n+ * LiveCodeExample instance if questionId is available in config it is used.\n+ * @private\n+ *\n+ * @param {!pearson.brix.LiveCodeExample.Config} config\n+ *      The config given to a LiveCodeExample instance from which to create\n+ *      the config for its Question base class.\n+ *\n+ * @returns {!pearson.brix.Question.Config} The config for the Question base class.\n+ *\n+ ****************************************************************************/\n+pearson.brix.LiveCodeExample.getQuestionConfig_ = function (config)\n+{\n+    var baseConfig =\n+        {\n+            // The following uses array syntax to avoid a Closure compiler \n+            // warning, since it does not understand @mixes annotation\n+            id: config['id'],\n+            maxAttempts: config[ 'maxAttempts' ],\n+            questionId: config['questionId']\n+        };\n+\n+    return baseConfig;\n+};\n+\n+\n+/* class instance getters and setters */\n+\n+/* **************************************************************************\n+ * LiveCodeExample.getState                                            */ /**\n+ *\n+ * Return a state object that represents the current state of this object and\n+ * can be passed to restoreState.\n+ * @override\n+ *\n+ * @returns {!pearson.brix.LiveCodeExample.StateObject} Object that when passed\n+ *      back to this type of object's restoreState method will set its state to\n+ *      match the current state of this object.\n+ *\n+ ****************************************************************************/\n+pearson.brix.LiveCodeExample.prototype.getState = function ()\n+{\n+    throw new Error('getState has not yet been implemented on LiveCodeExample Brix');\n+};\n+\n+/* **************************************************************************\n+ * LiveCodeExample.restoreState                                        */ /**\n+ *\n+ * Restores the state of this object to match the state object given.\n+ * @override\n+ *\n+ * @param {!Object} state\n+ *      Object returned by the call to getState on this type of an object\n+ *      representing the state to be restored.\n+ *\n+ ****************************************************************************/\n+pearson.brix.LiveCodeExample.prototype.restoreState = function (state)\n+{\n+    this.logger_.fine(this.getId() + ': restoreState() called');\n+\n+    // @todo - Do something here.\n+};\n+\n+/* **************************************************************************\n+ * LiveCodeExample.isDrawn                                              */ /**\n+ *\n+ * Determine if the bric has been drawn or not.\n+ * @override\n+ *\n+ * @returns {boolean} true if the bric is currently drawn somewhere.\n+ *\n+ * **************************************************************************/\n+pearson.brix.LiveCodeExample.prototype.isDrawn = function ()\n+{\n+    return goog.isDefAndNotNull(this.lastdrawn_.container);\n+};\n+\n+/* **************************************************************************\n+ * LiveCodeExample.setProperty                                          */ /**\n+ *\n+ * Set some property that this bric is to display or that affects what this\n+ * bric displays.\n+ * @export\n+ *\n+ * @param {!Array.<!Array.<pearson.utils.Point>>} newPropVal\n+ *      The new property value for this LiveCodeExample to display.\n+ *\n+ * @param {boolean=} delayRedraw\n+ *      True to not redraw after setting  the property, default is false.\n+ *\n+ ****************************************************************************/\n+pearson.brix.LiveCodeExample.prototype.setData = function (newPropVal, delayRedraw)\n+{\n+    // Example error handling that you may or may not want\n+    if (!newPropVal)\n+    {\n+        this.logger_.warning(\"setData(): newPropVal was undefined or null...call ignored.\");\n+        return;\n+    }\n+\n+    // update the instance property\n+    this.someProperty_ = newPropVal;\n+\n+    // If currently drawn someplace, redraw\n+    !delayRedraw && this.isDrawn() && this.redraw();\n+};\n+\n+\n+/* class public instance methods */\n+\n+/* **************************************************************************\n+ * LiveCodeExample.draw                                                 */ /**\n+ *\n+ * @inheritDoc\n+ * @export\n+ * @description The following is here until jsdoc supports the inheritDoc tag.\n+ *\n+ * Draw this LiveCodeExample bric into the specified area of the given container.\n+ *\n+ * @param {!d3.selection} container\n+ *      The container html element to append this HtmlBric element tree to.\n+ *\n+ ****************************************************************************/\n+pearson.brix.LiveCodeExample.prototype.draw = function (container)\n+{\n+    this.logger_.fine( this.getId() + ': draw() called' );\n+    \n+    this.lastdrawn_.container = container;\n+\n+    /**\n+     * The top-level element for the LiveCodeExample is a 'div'.\n+     * It is appended to the container and has a class attribute value\n+     * set according to the convention used for Brix (which is the class name\n+     * with a 'brix' prefix).\n+     * @type {!d3.selection}\n+     */\n+\n+    // This div contains all of the LiveCodeExample visuals\n+    var brixGroup = container.append( 'div' )","path":"src/pearson/brix/livecodeexample.js","position":573,"original_position":573,"commit_id":"38f7662ecd6c6028f821c1f4d9095dfc4ec31dee","original_commit_id":"38f7662ecd6c6028f821c1f4d9095dfc4ec31dee","user":{"login":"seannives","id":3911179,"avatar_url":"https://avatars.githubusercontent.com/u/3911179?v=3","gravatar_id":"","url":"https://api.github.com/users/seannives","html_url":"https://github.com/seannives","followers_url":"https://api.github.com/users/seannives/followers","following_url":"https://api.github.com/users/seannives/following{/other_user}","gists_url":"https://api.github.com/users/seannives/gists{/gist_id}","starred_url":"https://api.github.com/users/seannives/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/seannives/subscriptions","organizations_url":"https://api.github.com/users/seannives/orgs","repos_url":"https://api.github.com/users/seannives/repos","events_url":"https://api.github.com/users/seannives/events{/privacy}","received_events_url":"https://api.github.com/users/seannives/received_events","type":"User","site_admin":false},"body":"You can probably get rid of those extra spaces in here...  so container.append( 'div' ) goes to container.append('div').","created_at":"2016-01-20T21:24:01Z","updated_at":"2016-01-20T21:24:01Z","html_url":"https://github.com/lbondaryk/BrixClient/pull/33#discussion_r50321309","pull_request_url":"https://api.github.com/repos/lbondaryk/BrixClient/pulls/33","_links":{"self":{"href":"https://api.github.com/repos/lbondaryk/BrixClient/pulls/comments/50321309"},"html":{"href":"https://github.com/lbondaryk/BrixClient/pull/33#discussion_r50321309"},"pull_request":{"href":"https://api.github.com/repos/lbondaryk/BrixClient/pulls/33"}}},"pull_request":{"url":"https://api.github.com/repos/lbondaryk/BrixClient/pulls/33","id":56661156,"html_url":"https://github.com/lbondaryk/BrixClient/pull/33","diff_url":"https://github.com/lbondaryk/BrixClient/pull/33.diff","patch_url":"https://github.com/lbondaryk/BrixClient/pull/33.patch","issue_url":"https://api.github.com/repos/lbondaryk/BrixClient/issues/33","number":33,"state":"open","locked":false,"title":"Live example3","user":{"login":"seannives","id":3911179,"avatar_url":"https://avatars.githubusercontent.com/u/3911179?v=3","gravatar_id":"","url":"https://api.github.com/users/seannives","html_url":"https://github.com/seannives","followers_url":"https://api.github.com/users/seannives/followers","following_url":"https://api.github.com/users/seannives/following{/other_user}","gists_url":"https://api.github.com/users/seannives/gists{/gist_id}","starred_url":"https://api.github.com/users/seannives/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/seannives/subscriptions","organizations_url":"https://api.github.com/users/seannives/orgs","repos_url":"https://api.github.com/users/seannives/repos","events_url":"https://api.github.com/users/seannives/events{/privacy}","received_events_url":"https://api.github.com/users/seannives/received_events","type":"User","site_admin":false},"body":"","created_at":"2016-01-20T20:17:24Z","updated_at":"2016-01-20T21:24:01Z","closed_at":null,"merged_at":null,"merge_commit_sha":"09f6d293c7f379b37b98792ee5af74cef9e8bc15","assignee":null,"milestone":null,"commits_url":"https://api.github.com/repos/lbondaryk/BrixClient/pulls/33/commits","review_comments_url":"https://api.github.com/repos/lbondaryk/BrixClient/pulls/33/comments","review_comment_url":"https://api.github.com/repos/lbondaryk/BrixClient/pulls/comments{/number}","comments_url":"https://api.github.com/repos/lbondaryk/BrixClient/issues/33/comments","statuses_url":"https://api.github.com/repos/lbondaryk/BrixClient/statuses/38f7662ecd6c6028f821c1f4d9095dfc4ec31dee","head":{"label":"lbondaryk:live_example3","ref":"live_example3","sha":"38f7662ecd6c6028f821c1f4d9095dfc4ec31dee","user":{"login":"lbondaryk","id":1867623,"avatar_url":"https://avatars.githubusercontent.com/u/1867623?v=3","gravatar_id":"","url":"https://api.github.com/users/lbondaryk","html_url":"https://github.com/lbondaryk","followers_url":"https://api.github.com/users/lbondaryk/followers","following_url":"https://api.github.com/users/lbondaryk/following{/other_user}","gists_url":"https://api.github.com/users/lbondaryk/gists{/gist_id}","starred_url":"https://api.github.com/users/lbondaryk/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/lbondaryk/subscriptions","organizations_url":"https://api.github.com/users/lbondaryk/orgs","repos_url":"https://api.github.com/users/lbondaryk/repos","events_url":"https://api.github.com/users/lbondaryk/events{/privacy}","received_events_url":"https://api.github.com/users/lbondaryk/received_events","type":"User","site_admin":false},"repo":{"id":14959673,"name":"BrixClient","full_name":"lbondaryk/BrixClient","owner":{"login":"lbondaryk","id":1867623,"avatar_url":"https://avatars.githubusercontent.com/u/1867623?v=3","gravatar_id":"","url":"https://api.github.com/users/lbondaryk","html_url":"https://github.com/lbondaryk","followers_url":"https://api.github.com/users/lbondaryk/followers","following_url":"https://api.github.com/users/lbondaryk/following{/other_user}","gists_url":"https://api.github.com/users/lbondaryk/gists{/gist_id}","starred_url":"https://api.github.com/users/lbondaryk/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/lbondaryk/subscriptions","organizations_url":"https://api.github.com/users/lbondaryk/orgs","repos_url":"https://api.github.com/users/lbondaryk/repos","events_url":"https://api.github.com/users/lbondaryk/events{/privacy}","received_events_url":"https://api.github.com/users/lbondaryk/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/lbondaryk/BrixClient","description":"","fork":false,"url":"https://api.github.com/repos/lbondaryk/BrixClient","forks_url":"https://api.github.com/repos/lbondaryk/BrixClient/forks","keys_url":"https://api.github.com/repos/lbondaryk/BrixClient/keys{/key_id}","collaborators_url":"https://api.github.com/repos/lbondaryk/BrixClient/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/lbondaryk/BrixClient/teams","hooks_url":"https://api.github.com/repos/lbondaryk/BrixClient/hooks","issue_events_url":"https://api.github.com/repos/lbondaryk/BrixClient/issues/events{/number}","events_url":"https://api.github.com/repos/lbondaryk/BrixClient/events","assignees_url":"https://api.github.com/repos/lbondaryk/BrixClient/assignees{/user}","branches_url":"https://api.github.com/repos/lbondaryk/BrixClient/branches{/branch}","tags_url":"https://api.github.com/repos/lbondaryk/BrixClient/tags","blobs_url":"https://api.github.com/repos/lbondaryk/BrixClient/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/lbondaryk/BrixClient/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/lbondaryk/BrixClient/git/refs{/sha}","trees_url":"https://api.github.com/repos/lbondaryk/BrixClient/git/trees{/sha}","statuses_url":"https://api.github.com/repos/lbondaryk/BrixClient/statuses/{sha}","languages_url":"https://api.github.com/repos/lbondaryk/BrixClient/languages","stargazers_url":"https://api.github.com/repos/lbondaryk/BrixClient/stargazers","contributors_url":"https://api.github.com/repos/lbondaryk/BrixClient/contributors","subscribers_url":"https://api.github.com/repos/lbondaryk/BrixClient/subscribers","subscription_url":"https://api.github.com/repos/lbondaryk/BrixClient/subscription","commits_url":"https://api.github.com/repos/lbondaryk/BrixClient/commits{/sha}","git_commits_url":"https://api.github.com/repos/lbondaryk/BrixClient/git/commits{/sha}","comments_url":"https://api.github.com/repos/lbondaryk/BrixClient/comments{/number}","issue_comment_url":"https://api.github.com/repos/lbondaryk/BrixClient/issues/comments{/number}","contents_url":"https://api.github.com/repos/lbondaryk/BrixClient/contents/{+path}","compare_url":"https://api.github.com/repos/lbondaryk/BrixClient/compare/{base}...{head}","merges_url":"https://api.github.com/repos/lbondaryk/BrixClient/merges","archive_url":"https://api.github.com/repos/lbondaryk/BrixClient/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/lbondaryk/BrixClient/downloads","issues_url":"https://api.github.com/repos/lbondaryk/BrixClient/issues{/number}","pulls_url":"https://api.github.com/repos/lbondaryk/BrixClient/pulls{/number}","milestones_url":"https://api.github.com/repos/lbondaryk/BrixClient/milestones{/number}","notifications_url":"https://api.github.com/repos/lbondaryk/BrixClient/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/lbondaryk/BrixClient/labels{/name}","releases_url":"https://api.github.com/repos/lbondaryk/BrixClient/releases{/id}","created_at":"2013-12-05T16:49:06Z","updated_at":"2015-05-07T22:47:52Z","pushed_at":"2016-01-20T20:17:24Z","git_url":"git://github.com/lbondaryk/BrixClient.git","ssh_url":"git@github.com:lbondaryk/BrixClient.git","clone_url":"https://github.com/lbondaryk/BrixClient.git","svn_url":"https://github.com/lbondaryk/BrixClient","homepage":null,"size":22955,"stargazers_count":0,"watchers_count":0,"language":"JavaScript","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":1,"mirror_url":null,"open_issues_count":4,"forks":1,"open_issues":4,"watchers":0,"default_branch":"master"}},"base":{"label":"lbondaryk:adya-rfm","ref":"adya-rfm","sha":"617f797c010f366248c57aa99b434623a176c35c","user":{"login":"lbondaryk","id":1867623,"avatar_url":"https://avatars.githubusercontent.com/u/1867623?v=3","gravatar_id":"","url":"https://api.github.com/users/lbondaryk","html_url":"https://github.com/lbondaryk","followers_url":"https://api.github.com/users/lbondaryk/followers","following_url":"https://api.github.com/users/lbondaryk/following{/other_user}","gists_url":"https://api.github.com/users/lbondaryk/gists{/gist_id}","starred_url":"https://api.github.com/users/lbondaryk/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/lbondaryk/subscriptions","organizations_url":"https://api.github.com/users/lbondaryk/orgs","repos_url":"https://api.github.com/users/lbondaryk/repos","events_url":"https://api.github.com/users/lbondaryk/events{/privacy}","received_events_url":"https://api.github.com/users/lbondaryk/received_events","type":"User","site_admin":false},"repo":{"id":14959673,"name":"BrixClient","full_name":"lbondaryk/BrixClient","owner":{"login":"lbondaryk","id":1867623,"avatar_url":"https://avatars.githubusercontent.com/u/1867623?v=3","gravatar_id":"","url":"https://api.github.com/users/lbondaryk","html_url":"https://github.com/lbondaryk","followers_url":"https://api.github.com/users/lbondaryk/followers","following_url":"https://api.github.com/users/lbondaryk/following{/other_user}","gists_url":"https://api.github.com/users/lbondaryk/gists{/gist_id}","starred_url":"https://api.github.com/users/lbondaryk/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/lbondaryk/subscriptions","organizations_url":"https://api.github.com/users/lbondaryk/orgs","repos_url":"https://api.github.com/users/lbondaryk/repos","events_url":"https://api.github.com/users/lbondaryk/events{/privacy}","received_events_url":"https://api.github.com/users/lbondaryk/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/lbondaryk/BrixClient","description":"","fork":false,"url":"https://api.github.com/repos/lbondaryk/BrixClient","forks_url":"https://api.github.com/repos/lbondaryk/BrixClient/forks","keys_url":"https://api.github.com/repos/lbondaryk/BrixClient/keys{/key_id}","collaborators_url":"https://api.github.com/repos/lbondaryk/BrixClient/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/lbondaryk/BrixClient/teams","hooks_url":"https://api.github.com/repos/lbondaryk/BrixClient/hooks","issue_events_url":"https://api.github.com/repos/lbondaryk/BrixClient/issues/events{/number}","events_url":"https://api.github.com/repos/lbondaryk/BrixClient/events","assignees_url":"https://api.github.com/repos/lbondaryk/BrixClient/assignees{/user}","branches_url":"https://api.github.com/repos/lbondaryk/BrixClient/branches{/branch}","tags_url":"https://api.github.com/repos/lbondaryk/BrixClient/tags","blobs_url":"https://api.github.com/repos/lbondaryk/BrixClient/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/lbondaryk/BrixClient/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/lbondaryk/BrixClient/git/refs{/sha}","trees_url":"https://api.github.com/repos/lbondaryk/BrixClient/git/trees{/sha}","statuses_url":"https://api.github.com/repos/lbondaryk/BrixClient/statuses/{sha}","languages_url":"https://api.github.com/repos/lbondaryk/BrixClient/languages","stargazers_url":"https://api.github.com/repos/lbondaryk/BrixClient/stargazers","contributors_url":"https://api.github.com/repos/lbondaryk/BrixClient/contributors","subscribers_url":"https://api.github.com/repos/lbondaryk/BrixClient/subscribers","subscription_url":"https://api.github.com/repos/lbondaryk/BrixClient/subscription","commits_url":"https://api.github.com/repos/lbondaryk/BrixClient/commits{/sha}","git_commits_url":"https://api.github.com/repos/lbondaryk/BrixClient/git/commits{/sha}","comments_url":"https://api.github.com/repos/lbondaryk/BrixClient/comments{/number}","issue_comment_url":"https://api.github.com/repos/lbondaryk/BrixClient/issues/comments{/number}","contents_url":"https://api.github.com/repos/lbondaryk/BrixClient/contents/{+path}","compare_url":"https://api.github.com/repos/lbondaryk/BrixClient/compare/{base}...{head}","merges_url":"https://api.github.com/repos/lbondaryk/BrixClient/merges","archive_url":"https://api.github.com/repos/lbondaryk/BrixClient/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/lbondaryk/BrixClient/downloads","issues_url":"https://api.github.com/repos/lbondaryk/BrixClient/issues{/number}","pulls_url":"https://api.github.com/repos/lbondaryk/BrixClient/pulls{/number}","milestones_url":"https://api.github.com/repos/lbondaryk/BrixClient/milestones{/number}","notifications_url":"https://api.github.com/repos/lbondaryk/BrixClient/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/lbondaryk/BrixClient/labels{/name}","releases_url":"https://api.github.com/repos/lbondaryk/BrixClient/releases{/id}","created_at":"2013-12-05T16:49:06Z","updated_at":"2015-05-07T22:47:52Z","pushed_at":"2016-01-20T20:17:24Z","git_url":"git://github.com/lbondaryk/BrixClient.git","ssh_url":"git@github.com:lbondaryk/BrixClient.git","clone_url":"https://github.com/lbondaryk/BrixClient.git","svn_url":"https://github.com/lbondaryk/BrixClient","homepage":null,"size":22955,"stargazers_count":0,"watchers_count":0,"language":"JavaScript","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":1,"mirror_url":null,"open_issues_count":4,"forks":1,"open_issues":4,"watchers":0,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/lbondaryk/BrixClient/pulls/33"},"html":{"href":"https://github.com/lbondaryk/BrixClient/pull/33"},"issue":{"href":"https://api.github.com/repos/lbondaryk/BrixClient/issues/33"},"comments":{"href":"https://api.github.com/repos/lbondaryk/BrixClient/issues/33/comments"},"review_comments":{"href":"https://api.github.com/repos/lbondaryk/BrixClient/pulls/33/comments"},"review_comment":{"href":"https://api.github.com/repos/lbondaryk/BrixClient/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/lbondaryk/BrixClient/pulls/33/commits"},"statuses":{"href":"https://api.github.com/repos/lbondaryk/BrixClient/statuses/38f7662ecd6c6028f821c1f4d9095dfc4ec31dee"}}}}