docs: def push(description, datasets, wait, verbose):
      """Publish your submission to brains"""
      # Loading config
      config = _get_config()
      file_patterns = config["contents"]
      if not isinstance(file_patterns, type([])):
          # put it into an array so we can iterate it, if it isn't already an array
          file_patterns = [file_patterns]
      if datasets:
          datasets_string = datasets.split(',')
      else:
          datasets_string = config.get("datasets", '')
  
  
      # Getting all file names/globs -- making sure we get CONFIG_FILE
      files = {CONFIG_FILE}  # use a set so we don't get duplicates
      for pattern in file_patterns:
          files.update(glob.glob(pattern))
      if not files:
          print "No files could be found? Check your contents section in `CONFIG_FILE`!"
          exit(-1)
  
      if verbose:
          print ""
          print "gatherered files:"
          for path in files:
              print "\t", path
          print ""
  
      # Zipping
      _print("zipping...")
  
      if not os.path.exists("brains_history"):
          os.mkdir("brains_history")
  
      zip_path = 'brains_history/%s.zip' % str(datetime.datetime.now())
      with ZipFile(zip_path, 'w') as zip_file:
          for path in files:
              zip_file.write(path)
      cprint("done", 'green')
  
      # Sending to server
      with open(zip_path, 'rb') as zip_file:
          _print("sending to server...")
          try:
              response = requests.post(
                  URL_SUBMIT,
                  files={
                      "zip_file": zip_file,
                  },
                  data={
                      "name": config["name"],
                      "description": description or '',
                      "languages": config["languages"],
                      "datasets": datasets_string,
                      "wait": wait,
                  },
                  stream=wait  # if we're waiting for response then stream
              )
  
              if response.status_code == 200:
                  cprint("done", 'green')
  
                  if wait:
                      _print("\nOutput: ")
                      cprint(" " * 72, 'green', attrs=('underline',))
  
                      chunk_buffer = ""
                      # read in 1 chunk at a time for carriage return detection
                      for chunk in response.iter_content(chunk_size=1):
                          chunk_buffer += chunk
  
                          if chunk == '\r':
                              # We hit the end of a message!
                              try:
                                  data = json.loads(chunk_buffer)
                                  if "stdout" not in data or "stderr" not in data:
                                      print "dis one"
                                      continue
                              except (ValueError,):
                                  continue
  
                              if data["stdout"]:
                                  # Get rid of termination string, if it's there
                                  data["stdout"] = data["stdout"].replace("-%-%-%-%-END BRAIN SEQUENCE-%-%-%-%-", "")
                                  _print(data["stdout"])
                              if data["stderr"]:
                                  _print(colored(data["stderr"], 'red'))
  
                              # Clear buffer after reading message
                              chunk_buffer = ""
              else:
                  cprint(response.json()["error"], 'red')
          except requests.exceptions.ConnectionError:
              cprint("failed to connect to server!", 'red')
              exit(-2)