code: def upload_attachment(self, location, data):
          
          self.validate_attachment_location(location)
          content = data.read() if hasattr(data, 'read') else data
          orig_content = content
          if isinstance(content, bytes):
              content = base64.b64encode(orig_content).decode('ascii')
          else:
              pass  # Should be base64 encoded already
          apath = '%s/%s' % (self.attachment_location, location)
          url = '%s/contents/%s' % (self.base_url, apath)
          result = requests.put(
              url, auth=(self.user, self.token), data=json.dumps({
                  'message': 'file attachment %s' % location,
                  'content': content}))
          if result.status_code != 201:
              raise ValueError(
                  "Can't upload attachment %s due to error %s." % (
                      location, result.reason))
          return '[%s](https://github.com/%s/%s/blob/master/%s)' % (
              location, self.owner, self.realm, apath)
docs: Upload attachment as required by CommentThread class.
  
          See CommentThread.upload_attachment for details.