{"action":"created","comment":{"url":"https://api.github.com/repos/tachyons/botframework-ruby/pulls/comments/92201991","pull_request_review_id":12713047,"id":92201991,"diff_hunk":"@@ -0,0 +1,422 @@\n+module BotFramework\n+  class Session #< Events::EventEmitter\n+    attr_accessor :library, :message, :user_data, :conversation_data, :private_conversation_data,\n+                  :session_state, :dialog_state, :localizer\n+    def initialize(options)\n+      super\n+      @library = options[:library]\n+      @localizer = options[:localizer]\n+      @msg_sent = false\n+      @is_reset = false\n+      @last_send_time = Time.now # TODO: Move to proc?\n+      @batch = []\n+      @batch_timer = Timers::Group.new\n+      @batch_started = false\n+      @sending_batch = false\n+      @in_middleware = false\n+      @_locale = nil\n+\n+      @options = options || {\n+        on_save: nil,\n+        on_send: nil,\n+        library: nil,\n+        localizer: nil,\n+        middleware: nil,\n+        dialog_id: nil,\n+        dialog_args: nil,\n+        auto_batch_delay: nil,\n+        dialog_error_message: nil,\n+        actions: nil\n+      }\n+      @auto_batch_delay = 250 unless options[:auto_batch_delay].is_a? Integer\n+      @timers = Timers::Group.new\n+    end\n+\n+    def to_recognize_context\n+      {\n+        message: message,\n+        user_data: user_data,\n+        conversation_data: conversation_data,\n+        private_conversation_data: private_conversation_data,\n+        localizer: localizer,\n+        dialog_stack: dialog_stack,\n+        preferred_locale: preferred_locale,\n+        get_text: get_text,\n+        nget_text: nget_text,\n+        locale: preferred_locale\n+      }\n+    end\n+\n+    def dispatch(session_state, message)\n+      index = 0\n+      session = self\n+      now = Time.now\n+      middleware = @options[:middleware] || []\n+\n+      _next = lambda do\n+        handler = middleware[index] if index < middleware.length\n+        if handler\n+          index += 1\n+          handler(session, _next)\n+        else\n+          @in_middleware = false\n+          @session_state[:last_acess] = now\n+          done\n+        end\n+      end\n+      session_state ||= { call_stack: [], last_acess: Time.now, version: 0.0 }\n+      # Making sure that dialog is properly initialized\n+      cur = cur_dialog\n+      self.dialog_data = cur.state if cur\n+      # Dispatch message\n+      message ||= { text: '' }\n+      message[:type] ||= 'message'\n+      # Ensure that localized prompts are loaded\n+      # TODO\n+      self\n+    end\n+\n+    def error error\n+      logger.info \"Session error\"\n+      if options[:dialog_error_message] \n+        end_conversation(options[:dialog_error_message])\n+      else\n+        #TODO Add localisation\n+        locale= preferred_locale\n+        end_conversation (\"Error in conversation\")\n+      end\n+\n+      # TODO Log error\n+\n+    end\n+    \n+    def preferred_locale(locale=nil,&block)\n+      if locale\n+        @_locale = locale\n+        @user_data['BotBuilder.Data.PreferredLocale'] = locale if @user_data\n+        @localizer.load() if @localizer #TODO\n+      elsif !@_locale\n+        if @user_data && @user_data['BotBuilder.Data.PreferredLocale']\n+          @_locale = @user_data['BotBuilder.Data.PreferredLocale']\n+        elsif @message && @message[:text_locale]\n+          @_locale = @message[:text_locale]\n+        elsif @localizer \n+          @_locale = @localizer[:default_locale]\n+        end\n+      end\n+      @_locale\n+    end\n+    \n+    # Gets and formats localized text string\n+    def gettext(message_id,options={})\n+      #TODO\n+      #stub\n+    end\n+\n+    # Gets and formats the singular/plural form of a localized text string. \n+    def ngettext(message_id,message_id_plural,count)\n+    end    \n+\n+    # Manually save current session state\n+    def save\n+      logger.info 'Session.save'\n+      start_batch\n+      self\n+    end\n+\n+    def send(message,args=[])\n+      args.unshift(@cur_library_name,message)\n+      send_localized(args,message)\n+    end\n+\n+    def send_localized(localization_namspace,message,args=[])\n+      #TODO Incomplete\n+      @msg_sent = true\n+      m = {text: message}\n+      prepare_message(m)\n+      @batch << m\n+      self\n+    end\n+\n+    # Sends a typing indicator to the user\n+    def send_typing\n+      @msg_sent = true\n+      m = { type: 'typing' }\n+      m = prepare_message(m)\n+      @batch.push(m)\n+      logger.info 'Send Typing'\n+      send_batch \n+    end\n+\n+    def send_batch\n+      logger.info \"Sending batch with elements #{@batch.count}\"\n+      return if sending_batch?\n+      # TODO: timer\n+      @batch_timer = nil\n+      batch = @batch\n+      @batch_started = false\n+      @sending_batch = true\n+      cur = cur_dialog\n+      cur.state = @dialog_data\n+      options[:on_save] = proc do |err|\n+        if err\n+          @sending_batch = false\n+          case (err.code || '')\n+          when 'EBADMSG'\n+          when 'EMSGSIZE'\n+            # Something went wrong , let's reset everything\n+            @user_data = {}\n+            @batch = []\n+            end_conversation(@options[:dialog_error_message] || 'Something went wrong and we need to startover')\n+          end\n+          yield(err) if block_given?\n+        else\n+          if batch.length\n+            options[:on_send].call(batch) do |err|\n+              @sending_batch = false\n+              start_batch if @batch_started # What is this :o\n+              yield(err) if block_given?\n+            end\n+          else\n+            @sending_batch = false\n+            start_batch if @batch_started\n+            yield(err) if block_given?\n+          end\n+        end\n+      end\n+    end\n+\n+    \n+    # Begin a new dialog\n+    def begin_dialog(id, args = nil)\n+      logger.info \"Beginning new dialog #{id}\"\n+      id = resolve_dialog_id(id)\n+      dialog = find_dialog(id)\n+      raise \"Dialog #{id} Not found\" unless dialog\n+      push_dialog(id: id, state: {})\n+      start_batch\n+      dialog.begin(self, args)\n+      self\n+    end\n+\n+    def replace_dialog(id, args = nil)\n+      logger.info \"Session replace dialog #{id}\"\n+      id = resolve_dialog_id(id)\n+      dialog = find_dialog(id)\n+      raise \"Dialog #{id} Not found\" unless dialog\n+\n+      # Update the stack and start dialog\n+      pop_dialog\n+      push_dialog(id: id, state: {})\n+      start_batch\n+      dialog.begin(self, args)\n+      self\n+    end\n+\n+    # End conversation with the user\n+    def end_conversation(message = nil, _args = {})\n+      if message\n+        # TODO: sent message\n+      end\n+      # Clear private conversation data\n+      @private_conversation_data = {}\n+\n+      # Clear stack and save\n+      logger.info 'End conversation'\n+      ss = @session_state\n+      ss.call_stack = []\n+      send_batch\n+      self\n+    end\n+\n+    def end_dialog(message = nil, args = {})\n+      if message\n+        # TODO: end_dialog_with_result\n+      end\n+      cur = cur_dialog\n+      if cur\n+        if message\n+          m = if (message.is_a? String) || (message.is_a? Array)\n+                create_message(cur_library_name, message, args)\n+              else\n+                message\n+              end\n+          @msg_sent = true\n+          prepare_message(m)\n+          @batch.push(m)\n+        end\n+\n+        # Pop the dialog of the stack and resume the parent\n+        logger.info 'Session.end_dialog'\n+        child_id = cur.id\n+        cur = pop_dialog\n+        start_batch\n+        if cur\n+          dialog = find_dialog(cur.id)\n+          if dialog\n+            dialog.dialog_resumed(self, resumed: :completed, response: true, child_id: child_id)\n+          else\n+            # Bad dialog !! , we should never reach here\n+            raise \"Can't resume , missing parent\"\n+          end\n+        end\n+      end\n+    end\n+\n+    # Ends current dialog and returns a value to the caller\n+    def end_dialog_with_result(result)\n+      # Validate call stack\n+      cur = cur_dialog\n+      if cur\n+        # Validate the result\n+        result ||= {}\n+        result[:resumed] ||= :completed\n+        result.child_id = cur.id\n+        logger.info 'Session.end_dialog_with_result'\n+\n+        # Pop dialog of the stack and resume parent dialog\n+        cur = pop_dialog\n+        start_batch\n+        if cur\n+          dialog = find_dialog(cur.id)\n+          if dialog\n+            dialog.dialog_resumed(self, result)\n+          else\n+            # Bad dialog state\n+            raise \"Can't resume , missing parent dialog\"\n+          end\n+        end\n+      end\n+      self\n+    end\n+\n+    def cancel_dialog\n+    end\n+\n+    def reset\n+    end\n+\n+    ############### Dialog Stack Management ############################33\n+\n+    # Gets and Sets current dialog stack\n+    def dialog_stack(new_stack = nil)\n+      if new_stack\n+        # Update stack and dialog data\n+\n+        stack = @session_state[:call_stack] = new_stack || []\n+        @dialog_data = stack.empty? nil || stack.last","path":"lib/bot_framework/session.rb","position":302,"original_position":307,"commit_id":"8ac6c1ab1676731d5432c3afc33b4719477e49ac","original_commit_id":"84871656999858b44d31b89f33eff4adf20f8409","user":{"login":"tachyons","id":3112976,"avatar_url":"https://avatars.githubusercontent.com/u/3112976?v=3","gravatar_id":"","url":"https://api.github.com/users/tachyons","html_url":"https://github.com/tachyons","followers_url":"https://api.github.com/users/tachyons/followers","following_url":"https://api.github.com/users/tachyons/following{/other_user}","gists_url":"https://api.github.com/users/tachyons/gists{/gist_id}","starred_url":"https://api.github.com/users/tachyons/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/tachyons/subscriptions","organizations_url":"https://api.github.com/users/tachyons/orgs","repos_url":"https://api.github.com/users/tachyons/repos","events_url":"https://api.github.com/users/tachyons/events{/privacy}","received_events_url":"https://api.github.com/users/tachyons/received_events","type":"User","site_admin":false},"body":"Use parentheses in the method call to avoid confusion about precedence.","created_at":"2016-12-13T16:09:44Z","updated_at":"2016-12-13T16:09:44Z","html_url":"https://github.com/tachyons/botframework-ruby/pull/10#discussion_r92201991","pull_request_url":"https://api.github.com/repos/tachyons/botframework-ruby/pulls/10","_links":{"self":{"href":"https://api.github.com/repos/tachyons/botframework-ruby/pulls/comments/92201991"},"html":{"href":"https://github.com/tachyons/botframework-ruby/pull/10#discussion_r92201991"},"pull_request":{"href":"https://api.github.com/repos/tachyons/botframework-ruby/pulls/10"}}},"pull_request":{"url":"https://api.github.com/repos/tachyons/botframework-ruby/pulls/10","id":94659977,"html_url":"https://github.com/tachyons/botframework-ruby/pull/10","diff_url":"https://github.com/tachyons/botframework-ruby/pull/10.diff","patch_url":"https://github.com/tachyons/botframework-ruby/pull/10.patch","issue_url":"https://api.github.com/repos/tachyons/botframework-ruby/issues/10","number":10,"state":"open","locked":false,"title":"Dialog","user":{"login":"tachyons","id":3112976,"avatar_url":"https://avatars.githubusercontent.com/u/3112976?v=3","gravatar_id":"","url":"https://api.github.com/users/tachyons","html_url":"https://github.com/tachyons","followers_url":"https://api.github.com/users/tachyons/followers","following_url":"https://api.github.com/users/tachyons/following{/other_user}","gists_url":"https://api.github.com/users/tachyons/gists{/gist_id}","starred_url":"https://api.github.com/users/tachyons/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/tachyons/subscriptions","organizations_url":"https://api.github.com/users/tachyons/orgs","repos_url":"https://api.github.com/users/tachyons/repos","events_url":"https://api.github.com/users/tachyons/events{/privacy}","received_events_url":"https://api.github.com/users/tachyons/received_events","type":"User","site_admin":false},"body":"Dialog Implementation from Nodejs client\r\n\r\n- [ ] Session\r\n- [ ] ActionSet\r\n- [ ] Dialog","created_at":"2016-11-21T17:27:16Z","updated_at":"2016-12-13T16:09:44Z","closed_at":null,"merged_at":null,"merge_commit_sha":"c005d6aaddf2e4c3d82a6c384b060c47e64055b4","assignee":null,"assignees":[],"milestone":null,"commits_url":"https://api.github.com/repos/tachyons/botframework-ruby/pulls/10/commits","review_comments_url":"https://api.github.com/repos/tachyons/botframework-ruby/pulls/10/comments","review_comment_url":"https://api.github.com/repos/tachyons/botframework-ruby/pulls/comments{/number}","comments_url":"https://api.github.com/repos/tachyons/botframework-ruby/issues/10/comments","statuses_url":"https://api.github.com/repos/tachyons/botframework-ruby/statuses/8ac6c1ab1676731d5432c3afc33b4719477e49ac","head":{"label":"tachyons:dialog","ref":"dialog","sha":"8ac6c1ab1676731d5432c3afc33b4719477e49ac","user":{"login":"tachyons","id":3112976,"avatar_url":"https://avatars.githubusercontent.com/u/3112976?v=3","gravatar_id":"","url":"https://api.github.com/users/tachyons","html_url":"https://github.com/tachyons","followers_url":"https://api.github.com/users/tachyons/followers","following_url":"https://api.github.com/users/tachyons/following{/other_user}","gists_url":"https://api.github.com/users/tachyons/gists{/gist_id}","starred_url":"https://api.github.com/users/tachyons/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/tachyons/subscriptions","organizations_url":"https://api.github.com/users/tachyons/orgs","repos_url":"https://api.github.com/users/tachyons/repos","events_url":"https://api.github.com/users/tachyons/events{/privacy}","received_events_url":"https://api.github.com/users/tachyons/received_events","type":"User","site_admin":false},"repo":{"id":69970614,"name":"botframework-ruby","full_name":"tachyons/botframework-ruby","owner":{"login":"tachyons","id":3112976,"avatar_url":"https://avatars.githubusercontent.com/u/3112976?v=3","gravatar_id":"","url":"https://api.github.com/users/tachyons","html_url":"https://github.com/tachyons","followers_url":"https://api.github.com/users/tachyons/followers","following_url":"https://api.github.com/users/tachyons/following{/other_user}","gists_url":"https://api.github.com/users/tachyons/gists{/gist_id}","starred_url":"https://api.github.com/users/tachyons/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/tachyons/subscriptions","organizations_url":"https://api.github.com/users/tachyons/orgs","repos_url":"https://api.github.com/users/tachyons/repos","events_url":"https://api.github.com/users/tachyons/events{/privacy}","received_events_url":"https://api.github.com/users/tachyons/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/tachyons/botframework-ruby","description":"Microsoft Bot Framework ruby client","fork":false,"url":"https://api.github.com/repos/tachyons/botframework-ruby","forks_url":"https://api.github.com/repos/tachyons/botframework-ruby/forks","keys_url":"https://api.github.com/repos/tachyons/botframework-ruby/keys{/key_id}","collaborators_url":"https://api.github.com/repos/tachyons/botframework-ruby/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/tachyons/botframework-ruby/teams","hooks_url":"https://api.github.com/repos/tachyons/botframework-ruby/hooks","issue_events_url":"https://api.github.com/repos/tachyons/botframework-ruby/issues/events{/number}","events_url":"https://api.github.com/repos/tachyons/botframework-ruby/events","assignees_url":"https://api.github.com/repos/tachyons/botframework-ruby/assignees{/user}","branches_url":"https://api.github.com/repos/tachyons/botframework-ruby/branches{/branch}","tags_url":"https://api.github.com/repos/tachyons/botframework-ruby/tags","blobs_url":"https://api.github.com/repos/tachyons/botframework-ruby/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/tachyons/botframework-ruby/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/tachyons/botframework-ruby/git/refs{/sha}","trees_url":"https://api.github.com/repos/tachyons/botframework-ruby/git/trees{/sha}","statuses_url":"https://api.github.com/repos/tachyons/botframework-ruby/statuses/{sha}","languages_url":"https://api.github.com/repos/tachyons/botframework-ruby/languages","stargazers_url":"https://api.github.com/repos/tachyons/botframework-ruby/stargazers","contributors_url":"https://api.github.com/repos/tachyons/botframework-ruby/contributors","subscribers_url":"https://api.github.com/repos/tachyons/botframework-ruby/subscribers","subscription_url":"https://api.github.com/repos/tachyons/botframework-ruby/subscription","commits_url":"https://api.github.com/repos/tachyons/botframework-ruby/commits{/sha}","git_commits_url":"https://api.github.com/repos/tachyons/botframework-ruby/git/commits{/sha}","comments_url":"https://api.github.com/repos/tachyons/botframework-ruby/comments{/number}","issue_comment_url":"https://api.github.com/repos/tachyons/botframework-ruby/issues/comments{/number}","contents_url":"https://api.github.com/repos/tachyons/botframework-ruby/contents/{+path}","compare_url":"https://api.github.com/repos/tachyons/botframework-ruby/compare/{base}...{head}","merges_url":"https://api.github.com/repos/tachyons/botframework-ruby/merges","archive_url":"https://api.github.com/repos/tachyons/botframework-ruby/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/tachyons/botframework-ruby/downloads","issues_url":"https://api.github.com/repos/tachyons/botframework-ruby/issues{/number}","pulls_url":"https://api.github.com/repos/tachyons/botframework-ruby/pulls{/number}","milestones_url":"https://api.github.com/repos/tachyons/botframework-ruby/milestones{/number}","notifications_url":"https://api.github.com/repos/tachyons/botframework-ruby/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/tachyons/botframework-ruby/labels{/name}","releases_url":"https://api.github.com/repos/tachyons/botframework-ruby/releases{/id}","deployments_url":"https://api.github.com/repos/tachyons/botframework-ruby/deployments","created_at":"2016-10-04T14:03:54Z","updated_at":"2016-12-12T09:59:23Z","pushed_at":"2016-12-13T16:09:15Z","git_url":"git://github.com/tachyons/botframework-ruby.git","ssh_url":"git@github.com:tachyons/botframework-ruby.git","clone_url":"https://github.com/tachyons/botframework-ruby.git","svn_url":"https://github.com/tachyons/botframework-ruby","homepage":null,"size":38,"stargazers_count":8,"watchers_count":8,"language":"Ruby","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":0,"mirror_url":null,"open_issues_count":10,"forks":0,"open_issues":10,"watchers":8,"default_branch":"master"}},"base":{"label":"tachyons:master","ref":"master","sha":"786ca83f8027710851560322ced0ed203059a80a","user":{"login":"tachyons","id":3112976,"avatar_url":"https://avatars.githubusercontent.com/u/3112976?v=3","gravatar_id":"","url":"https://api.github.com/users/tachyons","html_url":"https://github.com/tachyons","followers_url":"https://api.github.com/users/tachyons/followers","following_url":"https://api.github.com/users/tachyons/following{/other_user}","gists_url":"https://api.github.com/users/tachyons/gists{/gist_id}","starred_url":"https://api.github.com/users/tachyons/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/tachyons/subscriptions","organizations_url":"https://api.github.com/users/tachyons/orgs","repos_url":"https://api.github.com/users/tachyons/repos","events_url":"https://api.github.com/users/tachyons/events{/privacy}","received_events_url":"https://api.github.com/users/tachyons/received_events","type":"User","site_admin":false},"repo":{"id":69970614,"name":"botframework-ruby","full_name":"tachyons/botframework-ruby","owner":{"login":"tachyons","id":3112976,"avatar_url":"https://avatars.githubusercontent.com/u/3112976?v=3","gravatar_id":"","url":"https://api.github.com/users/tachyons","html_url":"https://github.com/tachyons","followers_url":"https://api.github.com/users/tachyons/followers","following_url":"https://api.github.com/users/tachyons/following{/other_user}","gists_url":"https://api.github.com/users/tachyons/gists{/gist_id}","starred_url":"https://api.github.com/users/tachyons/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/tachyons/subscriptions","organizations_url":"https://api.github.com/users/tachyons/orgs","repos_url":"https://api.github.com/users/tachyons/repos","events_url":"https://api.github.com/users/tachyons/events{/privacy}","received_events_url":"https://api.github.com/users/tachyons/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/tachyons/botframework-ruby","description":"Microsoft Bot Framework ruby client","fork":false,"url":"https://api.github.com/repos/tachyons/botframework-ruby","forks_url":"https://api.github.com/repos/tachyons/botframework-ruby/forks","keys_url":"https://api.github.com/repos/tachyons/botframework-ruby/keys{/key_id}","collaborators_url":"https://api.github.com/repos/tachyons/botframework-ruby/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/tachyons/botframework-ruby/teams","hooks_url":"https://api.github.com/repos/tachyons/botframework-ruby/hooks","issue_events_url":"https://api.github.com/repos/tachyons/botframework-ruby/issues/events{/number}","events_url":"https://api.github.com/repos/tachyons/botframework-ruby/events","assignees_url":"https://api.github.com/repos/tachyons/botframework-ruby/assignees{/user}","branches_url":"https://api.github.com/repos/tachyons/botframework-ruby/branches{/branch}","tags_url":"https://api.github.com/repos/tachyons/botframework-ruby/tags","blobs_url":"https://api.github.com/repos/tachyons/botframework-ruby/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/tachyons/botframework-ruby/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/tachyons/botframework-ruby/git/refs{/sha}","trees_url":"https://api.github.com/repos/tachyons/botframework-ruby/git/trees{/sha}","statuses_url":"https://api.github.com/repos/tachyons/botframework-ruby/statuses/{sha}","languages_url":"https://api.github.com/repos/tachyons/botframework-ruby/languages","stargazers_url":"https://api.github.com/repos/tachyons/botframework-ruby/stargazers","contributors_url":"https://api.github.com/repos/tachyons/botframework-ruby/contributors","subscribers_url":"https://api.github.com/repos/tachyons/botframework-ruby/subscribers","subscription_url":"https://api.github.com/repos/tachyons/botframework-ruby/subscription","commits_url":"https://api.github.com/repos/tachyons/botframework-ruby/commits{/sha}","git_commits_url":"https://api.github.com/repos/tachyons/botframework-ruby/git/commits{/sha}","comments_url":"https://api.github.com/repos/tachyons/botframework-ruby/comments{/number}","issue_comment_url":"https://api.github.com/repos/tachyons/botframework-ruby/issues/comments{/number}","contents_url":"https://api.github.com/repos/tachyons/botframework-ruby/contents/{+path}","compare_url":"https://api.github.com/repos/tachyons/botframework-ruby/compare/{base}...{head}","merges_url":"https://api.github.com/repos/tachyons/botframework-ruby/merges","archive_url":"https://api.github.com/repos/tachyons/botframework-ruby/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/tachyons/botframework-ruby/downloads","issues_url":"https://api.github.com/repos/tachyons/botframework-ruby/issues{/number}","pulls_url":"https://api.github.com/repos/tachyons/botframework-ruby/pulls{/number}","milestones_url":"https://api.github.com/repos/tachyons/botframework-ruby/milestones{/number}","notifications_url":"https://api.github.com/repos/tachyons/botframework-ruby/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/tachyons/botframework-ruby/labels{/name}","releases_url":"https://api.github.com/repos/tachyons/botframework-ruby/releases{/id}","deployments_url":"https://api.github.com/repos/tachyons/botframework-ruby/deployments","created_at":"2016-10-04T14:03:54Z","updated_at":"2016-12-12T09:59:23Z","pushed_at":"2016-12-13T16:09:15Z","git_url":"git://github.com/tachyons/botframework-ruby.git","ssh_url":"git@github.com:tachyons/botframework-ruby.git","clone_url":"https://github.com/tachyons/botframework-ruby.git","svn_url":"https://github.com/tachyons/botframework-ruby","homepage":null,"size":38,"stargazers_count":8,"watchers_count":8,"language":"Ruby","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":0,"mirror_url":null,"open_issues_count":10,"forks":0,"open_issues":10,"watchers":8,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/tachyons/botframework-ruby/pulls/10"},"html":{"href":"https://github.com/tachyons/botframework-ruby/pull/10"},"issue":{"href":"https://api.github.com/repos/tachyons/botframework-ruby/issues/10"},"comments":{"href":"https://api.github.com/repos/tachyons/botframework-ruby/issues/10/comments"},"review_comments":{"href":"https://api.github.com/repos/tachyons/botframework-ruby/pulls/10/comments"},"review_comment":{"href":"https://api.github.com/repos/tachyons/botframework-ruby/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/tachyons/botframework-ruby/pulls/10/commits"},"statuses":{"href":"https://api.github.com/repos/tachyons/botframework-ruby/statuses/8ac6c1ab1676731d5432c3afc33b4719477e49ac"}}}}
{"actor":{"display_login":"tachyons"}}