Last active
November 26, 2017 23:23
-
-
Save ad-m/319a8365ac11701a28e3e3752d1acd1d to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| *.csv | |
| .idea | |
| *.pyc | |
| *token* |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| etr-warszawa-ical |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| # -*- 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))) |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| 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