From a389087b5beca49e91579ebf30f50a263b92d82f Mon Sep 17 00:00:00 2001 From: apmechev Date: Sun, 18 Feb 2018 17:46:21 +0100 Subject: [PATCH] Made the code from script to module by adding classes, making it more reusable --- get_github_clones.py | 156 ++++++++++++++++++++++++++----------------- requirements.txt | 2 + 2 files changed, 97 insertions(+), 61 deletions(-) create mode 100644 requirements.txt diff --git a/get_github_clones.py b/get_github_clones.py index f16e8bf..837ea57 100644 --- a/get_github_clones.py +++ b/get_github_clones.py @@ -5,77 +5,111 @@ import sys import os from urllib import FancyURLopener +import crontab -def initialize_repo(repo): - if os.path.exists(repo+'_clones.pkl'): - os.remove(repo+'_clones.pkl') - g={} - pickle.dump(g,open(repo+'_clones.pkl','w')) - -user='apmechev' -#repo="GRID_picastools" +class git_creds(object): + def __init__(self,username=None, password=None, gitfile='git_creds'): + self.username=username + self.password=password + if not username or not password: + self.get_creds(gitfile) -print(sys.argv) -if len(sys.argv)>1: - repo=sys.argv[1] -else: - repo="GRID_picastools" + def get_creds(self, creds_file='git_creds'): + creds=[] + with open(creds_file,'r') as auth_file: + for l in auth_file: + creds.append(l.strip()) + self.username=creds[0] + self.password=creds[1] -def get_creds(creds_file='git_creds'): - creds=[] - with open(creds_file,'r') as auth_file: - for l in auth_file: - creds.append(l.strip()) - return creds -if not os.path.exists(repo+'_clones.pkl'): - initialize_repo(repo) +class git_clones_counter(object): + def __init__(self, reponame, username=None, password=None): + self.count=0 + self.color='gray' + if not username: + self.username=git_creds( gitfile='git_creds').username + if not password: + self.password=git_creds( gitfile='git_creds').password + self.repo=reponame + if not os.path.exists('data/'+self.repo+'_clones.pkl'): + self.initialize_repo() + self.clones={} + self.get_previous_clones() -def get_git_clones(user='apmechev',repo=''): - creds=get_creds() - url="https://api.github.com/repos/"+user+"/"+repo+"/traffic/clones" - output=requests.get(url,auth=HTTPBasicAuth(creds[0],creds[1])) - if output.__getstate__()['status_code'] != 200: - if output.__getstate__()['status_code'] == 401: - print("Invalid Username/Password!") - elif output.__getstate__()['status_code'] == 403: - print("Empty Password!") - output.raise_for_status() - return output + def initialize_repo(self): + if os.path.exists('data/'+self.repo+'_clones.pkl'): + os.remove('data/'+self.repo+'_clones.pkl') + pickle.dump({},open('data/'+self.repo+'_clones.pkl','w')) -glrtc=pickle.load(open(repo+'_clones.pkl','r')) -o=get_git_clones(user,repo) -for i in o.json()['clones']: - glrtc[i['timestamp']]=i['count'] + def get_previous_clones(self): + self.clones=pickle.load(open('data/'+self.repo+'_clones.pkl','rb')) -def count_clones(clonedict): - s=0 - for i in clonedict.keys(): - s+=clonedict[i] - if s==0: - return(str(0),"red") - if s<10: - return(str(s),"orange") - if s<100: - return(str(s),"yellow") - if s<1000: - return(str(s),"yellowgreen") - elif s<1000000: - return(str(s/1000)+"K+","green") - elif s<1000000000: - return(str(s/1000)+"M+","brightgreen") - + def get_git_clones_json(self,username=None): + if not username: + username=self.username + url="https://api.github.com/repos/"+username+"/"+self.repo+"/traffic/clones" + output=requests.get(url,auth=HTTPBasicAuth(self.username,self.password)) + if output.__getstate__()['status_code'] != 200: + if output.__getstate__()['status_code'] == 401: + print("Invalid Username/Password!") + elif output.__getstate__()['status_code'] == 403: + print("Empty Password!") + output.raise_for_status() + return output + + def parse_clones_json(self,json_output): + if not 'clones'in json_output.json().keys(): + print("No clones returned by GitHub") + return + for item in json_output.json()['clones']: + self.clones[item['timestamp']]=item['count'] + if len(self.clones.keys()) >= len(pickle.load(open('data/'+self.repo+'_clones.pkl','rb'))): + pickle.dump(self.clones,open('data/'+self.repo+'_clones.pkl','wb')) + def count_clones(self): + s=0 + for i in self.clones.keys(): + s+=self.clones[i] + self.count=str(s) + if s==0: + self.color='red' + if s<10: + self.color="orange" + if s<100: + self.color="yellow" + if s<1000: + self.color="yellowgreen" + elif s<1000000: + self.count=str(s/1000)+"K+" + self.color="green" + elif s<1000000000: + self.count=str(s/1000)+"M+" + self.color="brightgreen" + +import pdb +class badge_creator(object): + def __init__(self,repo,username=None,password=None): + self.clones=git_clones_counter(repo,username,password) + new_clones=self.clones.get_git_clones_json() + print(str(len(new_clones.json().keys()))+ " Number of new entries") + self.clones.parse_clones_json(new_clones) + self.clones.count_clones() + self.count=self.clones.count + self.color=self.clones.color -class MyOpener(FancyURLopener): - version = 'Mozilla/5.0 (Windows; U; Windows NT 5.1; it; rv:1.8.1.11) Gecko/20071127 Firefox/2.0.0.11' + def download_badge(self,dest_path="/var/www/html/apmechev.com/public_html/img/git_repos/"): + mopen = MyOpener() + mopen.retrieve("https://img.shields.io/badge/clones-"+self.count+"-"+self.color+".svg",dest_path+self.clones.repo+"_clones.svg") -def download_badge(repo,numclones,color='green'): - mopen = MyOpener() - mopen.retrieve("https://img.shields.io/badge/clones-"+str(numclones)+"-"+color+".svg","/var/www/html/apmechev.com/public_html/img/git_repos/"+repo+"_clones.svg") -c,col=count_clones(glrtc) -download_badge(repo,c,col) +user='apmechev' + +if len(sys.argv)>1: + repo=sys.argv[1] +else: + repo="GRID_picastools" +class MyOpener(FancyURLopener): + version = 'Mozilla/5.0 (Windows; U; Windows NT 5.1; it; rv:1.8.1.11) Gecko/20071127 Firefox/2.0.0.11' -pickle.dump(glrtc,open(repo+'_clones.pkl','w')) diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..23a7716 --- /dev/null +++ b/requirements.txt @@ -0,0 +1,2 @@ +requests == 2.18.4 +python-crontab