Skip to content

Instantly share code, notes, and snippets.

@ad-m
Last active November 26, 2017 23:23
Show Gist options
  • Select an option

  • Save ad-m/319a8365ac11701a28e3e3752d1acd1d to your computer and use it in GitHub Desktop.

Select an option

Save ad-m/319a8365ac11701a28e3e3752d1acd1d to your computer and use it in GitHub Desktop.
*.csv
.idea
*.pyc
*token*
etr-warszawa-ical
# -*- coding: utf-8 -*-
from __future__ import unicode_literals
from requests import ConnectionError
from tqdm import tqdm
import argparse
import unicodecsv as csv
import pprint
import requests
from itertools import islice, ifilter
from urlparse import urljoin
class GitHub(object):
API_HOST = "https://api.github.com"
def __init__(self, username, token, timezone='Europe/Amsterdam'):
self.username = username
self.s = self._get_connection(username, token, timezone)
def _get_connection(self, username, token, timezone='Europe/Amsterdam'):
s = requests.Session()
s.headers = {'Time-Zone': timezone, 'User-Agent': 'Internal Billing App of watchdogpolska'}
s.auth = (username, token)
return s
def get_events_for_user(self, username=None):
username = username or self.username
url = urljoin(self.API_HOST, '/users/{}/events'.format(username))
while True:
response = self.s.get(url)
data = response.json()
if response.status_code != 200:
raise ConnectionError("The status code for '{}' is not equal to 200. It's {}.".format(
url,
response.status_code
))
if not data:
break
for event in data:
yield event
if "next" not in response.links:
break
url = response.links["next"]['url']
class GitHubFormat(object):
def __init__(self, client):
self.connection = client
def get_format_label(self, event):
return getattr(self, event['type'])(event)
def PushEvent(self, event):
label = "Publikacja poprawek: \n"
for commit in event['payload']['commits']:
label += "- {} ({} - {})\n".format(commit['message'],
commit['author']['name'],
commit['url'])
return label.strip()
def IssueCommentEvent(self, event):
return getattr(self, "{}__{}".format(event['type'], event['payload']['action']))(event)
def IssueCommentEvent__created(self, event):
return "W projekcie {} skomentował '{}' - {}".format(event['repo']['name'],
event['payload']['issue']['title'],
event['payload']['comment']['html_url'])
def IssuesEvent(self, event):
return getattr(self, "{}__{}".format(event['type'], event['payload']['action']))(event)
def IssuesEvent__opened(self, event):
return "W projekcie {} zgłoszenie '{}' utworzył - {}".format(event['repo']['name'],
event['payload']['issue']['title'],
event['payload']['issue']['html_url'])
def IssuesEvent__closed(self, event):
return "W projekcie {} zgłoszenie '{}' zamknął - {}".format(event['repo']['name'],
event['payload']['issue']['title'],
event['payload']['issue']['html_url'])
def IssuesEvent__reopened(self, event):
return "W projekcie {} zgłoszenie '{}' ponownie otworzył - {}".format(event['repo']['name'],
event['payload']['issue']['title'],
event['payload']['issue']['html_url'])
def CreateEvent(self, event):
return "Pracował w projekcie {} na branchu '{}'".format(event['repo']['name'],
event['payload']['ref'])
def DeleteEvent(self, event):
return "Pracował w projekcie {} na branchu '{}'".format(event['repo']['name'],
event['payload']['ref'])
def ForkEvent(self, event):
return "Sforkował projekt '{}' do '{}' - ".format(event['repo']['name'],
event['payload']['forkee']['full_name'],
event['payload']['forkee']['html_url'])
def CommitCommentEvent(self, event):
return "W projekcie '{}' skomentował poprawkę - {}".format(event['repo']['name'],
event['payload']['comment']['html_url'])
def PullRequestEvent(self, event):
return getattr(self, "{}__{}".format(event['type'], event['payload']['action']))(event)
def PullRequestEvent__opened(self, event):
return "W projekcie '{}' zaproponował poprawki " \
"'{}' z '{}' - {}".format(event['repo']['name'],
event['payload']['pull_request']['title'],
event['payload']['pull_request']['head']['label'],
event['payload']['pull_request']['html_url'])
def PullRequestEvent__closed(self, event):
return "W projekcie '{}' zamknął temat poprawki '{}'" \
"z '{}' - {}".format(event['repo']['name'],
event['payload']['pull_request']['title'],
event['payload']['pull_request']['head']['label'],
event['payload']['pull_request']['html_url'])
def PullRequestEvent__reopened(self, event):
return "W projekcie '{}' ponownie otworzył poprawki '{}'" \
"z '{}' - {}".format(event['repo']['name'],
event['payload']['pull_request']['title'],
event['payload']['pull_request']['head']['label'],
event['payload']['pull_request']['html_url'])
def PullRequestReviewCommentEvent(self, event):
return "W projekcie '{} skomentował poprawki '{}' od '{} - {}".format(event['repo']['name'],
event['payload']['pull_request']['title'],
event['payload']['pull_request']['user']['login'],
event['payload']['pull_request']['html_url'])
def MemberEvent(self, event):
return getattr(self, "{}__{}".format(event['type'], event['payload']['action']))(event)
def MemberEvent__added(self, event):
return "Do projektu {} dodał {}".format(event['repo']['name'],
event['payload']['member']['login'])
def ReleaseEvent(self, event):
return getattr(self, "{}__{}".format(event['type'], event['payload']['action']))(event)
def ReleaseEvent__published(self, event):
return "Wydał wersje {} dla projektu {}".format(event['payload']['release']['tag_name'],
event['repo']['name'])
def WatchEvent(self, event):
return getattr(self, "{}__{}".format(event['type'], event['payload']['action']))(event)
def WatchEvent__started(self, event):
return "Rozpoczął obserwowanie {}".format(event['repo']['name'])
def WatchEvent(self, event):
return getattr(self, "{}__{}".format(event['type'], event['payload']['action']))(event)
def WatchEvent__started(self, event):
return "Rozpoczął obserwowanie {}".format(event['repo']['name'])
def get_args():
parser = argparse.ArgumentParser()
parser.add_argument('-u', '--username', required=True)
parser.add_argument('-t', '--token-file', type=argparse.FileType('r'), required=True)
parser.add_argument('-o', '--output', type=argparse.FileType('w'), required=True)
parser.add_argument('--timezone', default='Europe/Amsterdam')
parser.add_argument('--start', default=0, type=int)
parser.add_argument('--stop', default=500, type=int)
parser.add_argument('-q', '--quiet', action='store_true')
parser.add_argument('--blacklist', type=argparse.FileType('r'), default=None)
return parser.parse_args()
def blacklist_test(event, blacklist):
if not blacklist:
return True
text = str(event)
for keyword in blacklist:
if keyword in text:
return False
return True
if __name__ == '__main__':
args = get_args()
client = GitHub(args.username, args.token_file.read().strip(), args.timezone)
formatter = GitHubFormat(client)
f_csv = csv.writer(args.output)
f_csv.writerow(('created_at', 'title'))
if args.blacklist:
blacklist = filter(lambda x: x, args.blacklist.read().split("\n"))
else:
blacklist = None
events = client.get_events_for_user()
events = islice(events, args.start, args.stop)
if not args.quiet:
events = tqdm(events, total=args.stop - args.start)
events = ifilter(lambda x: blacklist_test(x, blacklist), events)
for event in events:
f_csv.writerow((event['created_at'], formatter.get_format_label(event)))
requests==2.18.4
tqdm==4.15.0
unicodecsv==0.14.1
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment