<SYSTEM_TASK:>
Solve the following problem using Python, implementing the functions described below, one line at a time
<END_TASK>
<USER_TASK:>
Description:
 def report_status_to_github(self, state: str, description: str, context: str, target_url: Optional[str] = None):
 """Sets a commit status indicator on github. If not running from a pull request (i.e. repository is None), then this just prints to stderr. Args: state: The state of the status indicator. Must be 'error', 'failure', 'pending', or 'success'. description: A summary of why the state is what it is, e.g. '5 lint errors' or 'tests passed!'. context: The name of the status indicator, e.g. 'pytest' or 'lint'. target_url: Optional location where additional details about the status can be found, e.g. an online test results page. Raises: ValueError: Not one of the allowed states. IOError: The HTTP post request failed, or the response didn't have a 201 code indicating success in the expected way. """

        if state not in ['error', 'failure', 'pending', 'success']:
            raise ValueError('Unrecognized state: {!r}'.format(state))

        if self.repository is None or self.repository.access_token is None:
            return

        print(repr(('report_status',
                    context,
                    state,
                    description,
                    target_url)), file=sys.stderr)

        payload = {
            'state': state,
            'description': description,
            'context': context,
        }
        if target_url is not None:
            payload['target_url'] = target_url

        url = (
            "https://api.github.com/repos/{}/{}/statuses/{}?access_token={}"
            .format(self.repository.organization,
                    self.repository.name,
                    self.actual_commit_id,
                    self.repository.access_token))

        response = requests.post(url, json=payload)

        if response.status_code != 201:
            raise IOError('Request failed. Code: {}. Content: {}.'.format(
                response.status_code, response.content))