Skip to content

Commit a52c77e

Browse files
author
Kieran BW
committed
moved code into lib
1 parent c23172e commit a52c77e

4 files changed

Lines changed: 292 additions & 34 deletions

File tree

.gitignore

Lines changed: 133 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,133 @@
1+
2+
env.*
3+
env
4+
5+
# Byte-compiled / optimized / DLL files
6+
__pycache__/
7+
*.py[cod]
8+
*$py.class
9+
10+
# C extensions
11+
*.so
12+
13+
# Distribution / packaging
14+
.Python
15+
build/
16+
develop-eggs/
17+
dist/
18+
downloads/
19+
eggs/
20+
.eggs/
21+
lib/
22+
lib64/
23+
parts/
24+
sdist/
25+
var/
26+
wheels/
27+
pip-wheel-metadata/
28+
share/python-wheels/
29+
*.egg-info/
30+
.installed.cfg
31+
*.egg
32+
MANIFEST
33+
34+
# PyInstaller
35+
# Usually these files are written by a python script from a template
36+
# before PyInstaller builds the exe, so as to inject date/other infos into it.
37+
*.manifest
38+
*.spec
39+
40+
# Installer logs
41+
pip-log.txt
42+
pip-delete-this-directory.txt
43+
44+
# Unit test / coverage reports
45+
htmlcov/
46+
.tox/
47+
.nox/
48+
.coverage
49+
.coverage.*
50+
.cache
51+
nosetests.xml
52+
coverage.xml
53+
*.cover
54+
*.py,cover
55+
.hypothesis/
56+
.pytest_cache/
57+
58+
# Translations
59+
*.mo
60+
*.pot
61+
62+
# Django stuff:
63+
*.log
64+
local_settings.py
65+
db.sqlite3
66+
db.sqlite3-journal
67+
68+
# Flask stuff:
69+
instance/
70+
.webassets-cache
71+
72+
# Scrapy stuff:
73+
.scrapy
74+
75+
# Sphinx documentation
76+
docs/_build/
77+
78+
# PyBuilder
79+
target/
80+
81+
# Jupyter Notebook
82+
.ipynb_checkpoints
83+
84+
# IPython
85+
profile_default/
86+
ipython_config.py
87+
88+
# pyenv
89+
.python-version
90+
91+
# pipenv
92+
# According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control.
93+
# However, in case of collaboration, if having platform-specific dependencies or dependencies
94+
# having no cross-platform support, pipenv may install dependencies that don't work, or not
95+
# install all needed dependencies.
96+
#Pipfile.lock
97+
98+
# PEP 582; used by e.g. github.com/David-OConnor/pyflow
99+
__pypackages__/
100+
101+
# Celery stuff
102+
celerybeat-schedule
103+
celerybeat.pid
104+
105+
# SageMath parsed files
106+
*.sage.py
107+
108+
# Environments
109+
.env
110+
.venv
111+
env/
112+
venv/
113+
ENV/
114+
env.bak/
115+
venv.bak/
116+
117+
# Spyder project settings
118+
.spyderproject
119+
.spyproject
120+
121+
# Rope project settings
122+
.ropeproject
123+
124+
# mkdocs documentation
125+
/site
126+
127+
# mypy
128+
.mypy_cache/
129+
.dmypy.json
130+
dmypy.json
131+
132+
# Pyre type checker
133+
.pyre/

ActiveGithub.py

Lines changed: 12 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -1,48 +1,26 @@
11
#!/usr/bin/env python3
2-
import requests
3-
import datetime
4-
import sys
5-
6-
def logPrint(printText, printType="standard"):
7-
types = {"standard": "{}", "success": "[\033[92m+ Success\033[00m] {}",
8-
"warning": "[\033[93m/ Warning\033[00m] {}", "error": "[\033[91m- Error\033[00m] {}",
9-
"info": "[\033[96m* Info\033[00m] {}", "bold": "\033[01m{}\033[00m"}
10-
print(types[printType.lower()] .format(printText))
2+
import gitrepo
113

124
death = 36
135
try:
146
death = int(input("Set time considered to be dead (weeks - eg. 1 - default=36)>"))
157
except:
16-
logPrint("Invalid input - using default", "warning")
8+
gitrepo.logPrint("Invalid input - using default", "warning")
179
repo = input("Enter the user and repo name in the form (user/repo - eg. fredhappyface/python.imageround)>")
1810

19-
sourceRepo = requests.get(url="https://api.github.com/repos/"+repo).json()
20-
21-
if "message" in sourceRepo:
22-
logPrint("Some error has occurred", "error")
23-
logPrint(sourceRepo)
24-
sys.exit(1)
25-
26-
sourceRepoPushedAt = sourceRepo["pushed_at"]
27-
28-
forkedRepos = requests.get(
29-
url="https://api.github.com/repos/"+repo+"/forks?sort=stargazers&per_page=100").json()
30-
31-
if datetime.datetime.strptime(sourceRepoPushedAt, "%Y-%m-%dT%H:%M:%SZ") + datetime.timedelta(
32-
weeks=death) > datetime.datetime.now():
33-
logPrint("Source repo is alive! Head to {}\n" .format(sourceRepo["html_url"]), "success")
34-
3511

36-
aliveRepos = []
37-
for forkedRepo in forkedRepos:
38-
forkedRepoPushedAt = forkedRepo["pushed_at"]
39-
if datetime.datetime.strptime(forkedRepoPushedAt, "%Y-%m-%dT%H:%M:%SZ") + datetime.timedelta(
40-
weeks=death) > datetime.datetime.now():
41-
aliveRepos.append(forkedRepo)
12+
"""Is source repo alive?
13+
"""
14+
sourceRepo, _ = gitrepo.sourceData(repo)
15+
if gitrepo.sourceAlive(repo, death):
16+
gitrepo.logPrint("Source repo is alive! Head to {}\n" .format(sourceRepo["html_url"]), "success")
4217

18+
"""Get list of forked repos that are alive and newer than the source repo
19+
"""
20+
aliveRepos, forkedRepos = gitrepo.forksAliveAndNewer(repo, death)
4321

44-
logPrint("{} out of {} Forked repos are alive!" .format(len(aliveRepos), len(forkedRepos)), "bold")
22+
gitrepo.logPrint("{} out of {} Forked repos are alive and newer than the source!" .format(len(aliveRepos), len(forkedRepos)), "bold")
4523
for aliveRepo in aliveRepos:
46-
logPrint("Name: {}\n- Latest update: {}\n- Link: {}\n- Stars: {}"
24+
gitrepo.logPrint("Name: {}\n- Latest update: {}\n- Link: {}\n- Stars: {}"
4725
.format(aliveRepo["full_name"], aliveRepo["pushed_at"], aliveRepo["html_url"],
4826
aliveRepo["stargazers_count"]))

ActiveGithubUser.py

Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
#!/usr/bin/env python3
2+
import gitrepo
3+
import json
4+
5+
def forEachRepo(sourceRepo):
6+
"""Is source repo alive?
7+
"""
8+
repo = sourceRepo["full_name"]
9+
printStr = ["dead", "error"]
10+
if gitrepo.sourceAlive(repo, death):
11+
printStr = ["alive", "success"]
12+
gitrepo.logPrint("Source repo is {}! Head to {}" .format(printStr[0], sourceRepo["html_url"]), printStr[1])
13+
14+
"""Get list of forked repos that are alive and newer than the source repo
15+
"""
16+
aliveRepos, forkedRepos = gitrepo.forksAliveAndNewer(repo, death)
17+
18+
gitrepo.logPrint("{} out of {} Forked repos are alive and newer than the source!" .format(len(aliveRepos), len(forkedRepos)), "bold")
19+
for aliveRepo in aliveRepos:
20+
gitrepo.logPrint("Name: {}\n- Latest update: {}\n- Link: {}\n- Stars: {}"
21+
.format(aliveRepo["full_name"], aliveRepo["pushed_at"], aliveRepo["html_url"],
22+
aliveRepo["stargazers_count"]))
23+
24+
25+
USERNAME = None
26+
try:
27+
authJson = json.loads(open("env.json", "r").read())
28+
USERNAME = authJson["username"]
29+
gitrepo.logPrint("Hello {}!" .format(USERNAME), "success")
30+
except:
31+
USERNAME = input("Enter your username>")
32+
33+
death = 36
34+
try:
35+
death = int(input("Set time considered to be dead (weeks - eg. 1 - default=36)>"))
36+
except:
37+
gitrepo.logPrint("Invalid input - using default", "warning")
38+
39+
40+
choice = input("User repos or watched (R/w)>")
41+
42+
if choice.lower() == "w":
43+
"""Get list of user watched
44+
"""
45+
starredRepos = []
46+
hasRepos = True
47+
page = 1
48+
while hasRepos:
49+
repos = gitrepo.getGithubApiRequest("users/"+USERNAME+"/subscriptions?per_page=100&page="+str(page))
50+
if len(repos) < 1:
51+
hasRepos = False
52+
starredRepos.extend(repos)
53+
page += 1
54+
for repo in starredRepos:
55+
forEachRepo(repo)
56+
57+
else:
58+
"""Get list of user repos
59+
"""
60+
pages = gitrepo.getGithubApiRequest("users/"+USERNAME)["public_repos"] % 100 + 1
61+
sourceRepos = []
62+
for page in range(1, pages+1):
63+
sourceRepos.extend(gitrepo.getGithubApiRequest("users/"+USERNAME+"/repos?per_page=100&page="+str(page)))
64+
for repo in sourceRepos:
65+
forEachRepo(repo)

gitrepo.py

Lines changed: 82 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,82 @@
1+
import requests
2+
import datetime
3+
import sys
4+
import json
5+
import time
6+
7+
8+
def logPrint(printText, printType="standard"):
9+
"""use this to print
10+
"""
11+
types = {"standard": "{}", "success": "[\033[92m+ Success\033[00m] {}",
12+
"warning": "[\033[93m/ Warning\033[00m] {}", "error": "[\033[91m- Error\033[00m] {}",
13+
"info": "[\033[96m* Info\033[00m] {}", "bold": "\033[01m{}\033[00m"}
14+
print(types[printType.lower()] .format(printText))
15+
16+
17+
AUTH = None
18+
try:
19+
authJson = json.loads(open("env.json", "r").read())
20+
AUTH = (authJson["username"], authJson["password"])
21+
logPrint("Authenticated user {}" .format(authJson["username"]), "success")
22+
except:
23+
logPrint("Not authenticated - rate limit is 60 requests per hour", "warning")
24+
25+
26+
27+
def getGithubApiRequest(urlExcBase):
28+
"""use this to get json from api (returns some data to module variables)
29+
"""
30+
fullUrl = "https://api.github.com/"+urlExcBase
31+
request = requests.get(url=fullUrl,
32+
auth=AUTH)
33+
34+
if int(request.headers["X-RateLimit-Remaining"]) < 1:
35+
logPrint("Remaining rate limit is zero. Try again at {}"
36+
.format(str(time.ctime(request.headers["X-RateLimit-Reset"]))), "error")
37+
sys.exit(1)
38+
39+
requestJson = request.json()
40+
if "message" in requestJson:
41+
logPrint("Some error has occurred for {}" .format(fullUrl), "error")
42+
logPrint(requestJson)
43+
sys.exit(1)
44+
45+
return requestJson
46+
47+
48+
def sourceData(repo):
49+
"""Get data for a repo (full data + pushed at time)
50+
"""
51+
sourceRepo = getGithubApiRequest("repos/"+repo)
52+
sourceRepoPushedAt = datetime.datetime.strptime(sourceRepo["pushed_at"], "%Y-%m-%dT%H:%M:%SZ")
53+
return sourceRepo, sourceRepoPushedAt
54+
55+
56+
def sourceAlive(repo, death):
57+
"""Is source repo alive?
58+
"""
59+
_sourceRepo, sourceRepoPushedAt = sourceData(repo)
60+
return sourceRepoPushedAt + datetime.timedelta(weeks=death) > datetime.datetime.now()
61+
62+
63+
def forksAliveAndNewer(repo, death):
64+
"""Get list of forked repos that are alive and newer than the source repo
65+
"""
66+
sourceRepo, sourceRepoPushedAt = sourceData(repo)
67+
pages = sourceRepo["forks_count"] // 100 + 1
68+
if pages > 10:
69+
logPrint("There are {} forks - using top 1k only" .format(str(sourceRepo["forks_count"])), "warning")
70+
pages = 10
71+
forkedRepos = []
72+
for page in range(1, pages+1):
73+
forkedRepos.extend(getGithubApiRequest("repos/"+repo+"/forks?sort=stargazers&per_page=100&page="+str(page)))
74+
75+
aliveRepos = []
76+
for forkedRepo in forkedRepos:
77+
forkedRepoPushedAt = datetime.datetime.strptime(forkedRepo["pushed_at"], "%Y-%m-%dT%H:%M:%SZ")
78+
if forkedRepoPushedAt + datetime.timedelta(
79+
weeks=death) > datetime.datetime.now() and forkedRepoPushedAt > sourceRepoPushedAt:
80+
aliveRepos.append(forkedRepo)
81+
82+
return aliveRepos, forkedRepos

0 commit comments

Comments
 (0)