2013-02-27 17:02:25 +00:00
|
|
|
import requests
|
|
|
|
import json
|
|
|
|
from collections import Counter
|
2013-03-01 19:04:14 +00:00
|
|
|
import os
|
2013-02-27 17:02:25 +00:00
|
|
|
|
|
|
|
API_URL = 'https://api.github.com/'
|
2013-03-01 19:04:14 +00:00
|
|
|
CLIENT_ID = os.getenv('GH_CLIENT_ID')
|
|
|
|
CLIENT_SECRET = os.getenv('GH_CLIENT_SECRET')
|
2013-02-27 17:02:25 +00:00
|
|
|
def get_url(url,relative=True):
|
|
|
|
if relative:
|
|
|
|
url=API_URL+url
|
|
|
|
r = requests.get(url, params={"client_id":CLIENT_ID, "client_secret":CLIENT_SECRET})
|
|
|
|
if(r.ok):
|
|
|
|
print r.headers
|
|
|
|
print 'Rate remaining: %s' % r.headers['x-ratelimit-remaining']
|
|
|
|
data= r.text or r.content
|
|
|
|
if len(data) == 0:
|
|
|
|
return None
|
|
|
|
else:
|
|
|
|
return json.loads(data)
|
|
|
|
def get_org(org):
|
|
|
|
return get_url('orgs/%s'%org)
|
|
|
|
|
|
|
|
def get_user(user):
|
|
|
|
return get_url('users/%s'%user)
|
|
|
|
|
|
|
|
def get_members(org):
|
|
|
|
return get_url('orgs/%s/members'%org)
|
|
|
|
|
|
|
|
class Store(dict):
|
|
|
|
def __init__(self):
|
|
|
|
self[u'repos']={}
|
|
|
|
self[u'users']={}
|
|
|
|
self[u'orgs']={}
|
|
|
|
|
|
|
|
@property
|
|
|
|
def orgs(self):
|
|
|
|
return self[u'orgs']
|
|
|
|
|
|
|
|
@property
|
|
|
|
def users(self):
|
|
|
|
return self[u'users']
|
|
|
|
|
|
|
|
@property
|
|
|
|
def repos(self):
|
|
|
|
return self[u'repos']
|
|
|
|
|
|
|
|
def add_org(self,org):
|
|
|
|
self[u'orgs'][org.name]=org
|
|
|
|
|
|
|
|
def add_repo(self,repo):
|
|
|
|
self[u'repos'][repo[u'url']]=repo
|
|
|
|
|
|
|
|
def add_user(self,user):
|
|
|
|
self[u'users'][user[u'login']]=user
|
|
|
|
|
2013-02-27 17:13:40 +00:00
|
|
|
def load_all(self,file='lcs.json'):
|
|
|
|
lcs=json.load(open(file))
|
|
|
|
self[u'lcs']=lcs
|
|
|
|
for lcrepo in lcs.keys():
|
|
|
|
repo=Org(lcrepo,store=self)
|
|
|
|
self.add_org(repo)
|
|
|
|
for org in self.orgs.values():
|
|
|
|
print "ORG: %s:" % org
|
|
|
|
org.reload_repos()
|
|
|
|
org.reload_members()
|
|
|
|
for user in self.users.values():
|
|
|
|
print "USER: %s" %user
|
|
|
|
user.reload_repos()
|
|
|
|
|
2013-03-01 18:55:54 +00:00
|
|
|
def get_langs_in_orgs(self,orgs):
|
2013-02-27 17:13:40 +00:00
|
|
|
usedlanguages={}
|
|
|
|
linesperlanguage={}
|
2013-03-01 18:55:54 +00:00
|
|
|
for org in orgs:
|
|
|
|
for repo in org.repos:
|
|
|
|
languages=repo[u'languages']
|
|
|
|
for language,lines in languages.iteritems():
|
|
|
|
linesperlanguage[language]=linesperlanguage[language]+lines if language in linesperlanguage else lines
|
|
|
|
usedlanguages[language]=usedlanguages[language]+[repo[u'name'],] if language in usedlanguages else [repo[u'url']]
|
|
|
|
return usedlanguages,linesperlanguage
|
|
|
|
|
|
|
|
def get_stats(self):
|
|
|
|
statistics={}
|
|
|
|
usedlanguagesint,linesperlanguageint=self.get_langs_in_orgs(self.orgs.values())
|
|
|
|
usedlanguagesext,linesperlanguageext=self.get_langs_in_orgs(self.users.values())
|
|
|
|
statistics[u'usedlanguagesint']=usedlanguagesint
|
|
|
|
statistics[u'linesperlanguageint']=linesperlanguageint
|
|
|
|
statistics[u'usedlanguagesext']=usedlanguagesext
|
|
|
|
statistics[u'linesperlanguageext']=linesperlanguageext
|
2013-02-27 17:13:40 +00:00
|
|
|
lcrepos=0
|
2013-03-01 18:55:54 +00:00
|
|
|
for lc in self.orgs:
|
2013-02-27 17:13:40 +00:00
|
|
|
lcrepos+=len(self.orgs[lc][u'repos'])
|
|
|
|
statistics["lc-repos"]=lcrepos
|
|
|
|
statistics["total-repos"]=len(self.repos)
|
|
|
|
statistics["total-users"]=len(self.users)
|
|
|
|
totalfollowers=0
|
|
|
|
totalfollowing=0
|
|
|
|
totalstarred=0
|
|
|
|
for user in self.users.values():
|
|
|
|
totalfollowing+=len(user.following)
|
|
|
|
totalfollowers+=len(user.followers)
|
|
|
|
totalstarred+=len(user.starred)
|
|
|
|
user.repos
|
|
|
|
totalwatching=0
|
|
|
|
totalforks=0
|
|
|
|
for repo in self.repos.values():
|
|
|
|
totalwatching+=repo[u'watchers_count']
|
|
|
|
totalforks+=repo[u'forks_count']
|
|
|
|
statistics['total-followers']=totalfollowers
|
|
|
|
statistics['total-following']=totalfollowing
|
|
|
|
statistics['total-starred']=totalstarred
|
|
|
|
statistics['total-watching']=totalwatching
|
|
|
|
statistics['total-forks']=totalforks
|
2013-03-01 18:55:54 +00:00
|
|
|
return statistics
|
2013-02-27 17:13:40 +00:00
|
|
|
|
2013-02-27 17:02:25 +00:00
|
|
|
class BasicItem(dict):
|
|
|
|
def __init__(self,name,dic=None,method=get_url,name_key=u'url',store=None):
|
|
|
|
self.store=store
|
|
|
|
asdict=dic
|
|
|
|
if name and not dic:
|
|
|
|
asdict=method(name)
|
|
|
|
if dic:
|
|
|
|
asdict=dic
|
|
|
|
for key in asdict.keys():
|
|
|
|
self[key]=asdict[key]
|
|
|
|
if name:
|
|
|
|
self.name=name
|
|
|
|
elif dic:
|
|
|
|
self.name=self[name_key]
|
|
|
|
|
|
|
|
class Repo(BasicItem):
|
|
|
|
def __init__(self,dic,store=None):
|
|
|
|
super(Repo,self).__init__(name,dic,method=get_repo,name_key=u'url',store=store)
|
|
|
|
|
|
|
|
class BasicLogin(BasicItem):
|
|
|
|
def __init__(self,name,dic=None,method=get_url,store=None):
|
|
|
|
super(BasicLogin,self).__init__(name,dic,method=method,name_key=u'login',store=store)
|
|
|
|
|
|
|
|
def reload_repos(self):
|
|
|
|
repos=get_url(self[u'repos_url'],relative=False)
|
|
|
|
for repo in repos:
|
|
|
|
repo['languages']=get_url(repo[u'languages_url'],relative=False)
|
|
|
|
self.repos=repos
|
|
|
|
|
|
|
|
@property
|
|
|
|
def repos(self):
|
|
|
|
if not u'repos' in self:
|
|
|
|
self.reload_repos()
|
|
|
|
if self.store is not None:
|
2013-03-01 18:55:54 +00:00
|
|
|
return [self.store['repos'][name] for name in self[u'repos']]
|
2013-02-27 17:02:25 +00:00
|
|
|
return self[u'repos']
|
|
|
|
|
|
|
|
@repos.setter
|
|
|
|
def repos(self,dic):
|
|
|
|
repos=dic
|
|
|
|
if self.store is not None:
|
|
|
|
self[u'repos']=[]
|
|
|
|
for repo in repos:
|
|
|
|
url=repo[u'url']
|
2013-03-01 18:55:54 +00:00
|
|
|
self.store.add_repo(repo)
|
2013-02-27 17:02:25 +00:00
|
|
|
self[u'repos'].append(url)
|
|
|
|
|
|
|
|
else:
|
|
|
|
self[u'repos']=repos
|
|
|
|
return self[u'repos']
|
|
|
|
|
|
|
|
def from_dict(dic,store=None):
|
|
|
|
name=dic[u'login']
|
|
|
|
newUser = User(None,dic,store)
|
|
|
|
return newUser
|
|
|
|
|
|
|
|
class User(BasicLogin):
|
|
|
|
def __init__(self,name,dic=None,store=None,getAll=True):
|
|
|
|
super(User,self).__init__(name,dic,method=get_user,store=store)
|
|
|
|
if(getAll):
|
|
|
|
self.reload_all()
|
|
|
|
|
|
|
|
def reload_all(self):
|
|
|
|
self.reload_starred()
|
|
|
|
self.reload_followers()
|
|
|
|
self.reload_following()
|
|
|
|
|
|
|
|
def reload_starred(self):
|
|
|
|
starred=get_url('users/%s/starred'%self.name)
|
|
|
|
self[u'starred']=[repo[u'url'] for repo in starred]
|
|
|
|
|
|
|
|
def reload_followers(self):
|
|
|
|
followers=get_url(self['followers_url'],relative=False)
|
|
|
|
self[u'followers']=[user[u'login'] for user in followers]
|
|
|
|
|
|
|
|
def reload_following(self):
|
|
|
|
following=get_url(self['following_url'],relative=False)
|
|
|
|
self[u'following']=[user[u'login'] for user in following]
|
|
|
|
|
|
|
|
@property
|
|
|
|
def starred(self):
|
|
|
|
if not u'starred' in self:
|
|
|
|
self.reload_starred()
|
|
|
|
else:
|
|
|
|
return self[u'starred']
|
|
|
|
|
|
|
|
@property
|
|
|
|
def following(self):
|
|
|
|
if not u'following' in self:
|
|
|
|
self.reload_following()
|
|
|
|
else:
|
|
|
|
return self[u'following']
|
|
|
|
|
|
|
|
@property
|
|
|
|
def followers(self):
|
|
|
|
if not u'followers' in self:
|
|
|
|
self.reload_followers()
|
|
|
|
else:
|
|
|
|
return self[u'followers']
|
|
|
|
|
|
|
|
|
|
|
|
class Org(BasicLogin):
|
|
|
|
def __init__(self,name,dic=None,store=None):
|
|
|
|
super(Org,self).__init__(name,dic,method=get_org,store=store)
|
|
|
|
|
|
|
|
def deep_load_members(self):
|
|
|
|
for member in self.members:
|
|
|
|
member.reload_repos()
|
|
|
|
|
|
|
|
@property
|
|
|
|
def members(self):
|
|
|
|
if not u'members' in self:
|
|
|
|
self.reload_members()
|
|
|
|
if self.store is not None:
|
|
|
|
return [store[u'users'][name] for name in self[u'members']]
|
|
|
|
else:
|
|
|
|
return self[u'members']
|
|
|
|
|
|
|
|
def reload_members(self):
|
|
|
|
dic=get_members(self.name)
|
|
|
|
arr=[]
|
|
|
|
for member in dic:
|
|
|
|
arr.append(User(None,member,store=self.store))
|
|
|
|
if self.store is not None:
|
|
|
|
self[u'members']=[member.name for member in arr]
|
|
|
|
for member in arr:
|
|
|
|
self.store.add_user(member)
|
|
|
|
else:
|
|
|
|
self[u'members']=arr
|
|
|
|
|