Source code for i3pystatus.github
import json
import requests
from i3pystatus import IntervalModule
from i3pystatus import logger
from i3pystatus.core import ConfigError
from i3pystatus.core.util import user_open, internet, require
from requests import Timeout, ConnectionError
[docs]class Github(IntervalModule):
"""
Check GitHub for pending notifications.
Requires `requests`
Availables authentication methods:
* username + password
* access_token (manually generate a new token at https://github.com/settings/tokens)
See https://developer.github.com/v3/#authentication for more informations.
Formatters:
* `{unread}` — contains the value of unread_marker when there are pending notifications
* `{unread_count}` — number of unread notifications, empty if 0
"""
max_error_len = 50
unread_marker = "●"
unread = ''
color = '#78EAF2'
username = ''
password = ''
access_token = ''
format = '{unread}'
interval = 600
keyring_backend = None
on_leftclick = 'open_github'
settings = (
('format', 'format string'),
('keyring_backend', 'alternative keyring backend for retrieving credentials'),
('unread_marker', 'sets the string that the "unread" formatter shows when there are pending notifications'),
("username", ""),
("password", ""),
("access_token", "see https://developer.github.com/v3/#authentication"),
("color", "")
)
def open_github(self):
user_open('https://github.com/' + self.username)
@require(internet)
def run(self):
try:
if self.access_token:
response = requests.get('https://api.github.com/notifications?access_token=' + self.access_token)
else:
response = requests.get('https://api.github.com/notifications', auth=(self.username, self.password))
data = json.loads(response.text)
except (ConnectionError, Timeout) as e:
logger.warn(e)
data = []
# Bad credentials
if isinstance(data, dict):
err_msg = data['message']
raise ConfigError(err_msg)
format_values = dict(unread_count='', unread='')
unread = len(data)
if unread > 0:
format_values['unread_count'] = unread
format_values['unread'] = self.unread_marker
self.data = format_values
self.output = {
'full_text': self.format.format(**format_values),
'color': self.color
}