-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathapp.py
132 lines (103 loc) · 4.66 KB
/
app.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
import json
import base64
import requests
import streamlit as st
import pandas as pd
from configs import LANG_EXT, remove_old_files
from mylines import get_progress
from mysecrets import check_secrets
from statsplots import draw_plots
def get_repos(user):
url = f'https://api.github.com/users/{user}/repos'
params = {'type': 'all', 'sort': 'full_name', 'direction': 'asc'}
try:
repos = requests.get(url, params=json.dumps(params), headers={'Authorization': f'token {st.secrets.GITHUB_TOKEN}'})
repos.raise_for_status()
st.sidebar.success(f'Fetching repositories for {user}')
return [r['name'] for r in repos.json()]
except requests.exceptions.RequestException as e:
if user:
st.sidebar.error(e)
return []
def generate_download_link(filename, ext):
with open(filename, "rb") as f:
b64 = base64.b64encode(f.read()).decode()
href = f'<a href="data:application/{ext};base64,{b64}" download="{filename}">Download {ext}</a>'
st.markdown(href, unsafe_allow_html=True)
def renew_main_window():
if st.session_state.progress:
df = pd.read_csv(st.session_state.progress)
st.empty().title(f'{st.session_state.user}')
st.empty().info(f'Found {len(st.session_state.repos)} repositories.')
st.empty().info(f'Total Lines of {st.session_state.language}: {df["Lines of Code"].sum()}')
draw_plots(df)
if st.session_state.secrets:
with open(st.session_state.secrets, 'r') as file:
data = json.load(file)
st.empty().info(f'Secrets was found in {st.session_state.repository}:')
st.json(data)
def init_states(user):
if user and user == st.session_state.user:
pass
else:
st.session_state.repos = get_repos(user)
st.session_state.language = None
st.session_state.progress = None
st.session_state.repository = None
st.session_state.secrets = None
def main():
st.set_page_config(
page_title="GutHub Statistics",
page_icon=":sparkles:",
layout="wide",
initial_sidebar_state="expanded"
)
logo_url = 'https://raw.githubusercontent.com/NoDataFound/CMC/main/githublogo.png'
st.sidebar.markdown(
f"<div style='text-align: center'><img src='{logo_url}' width='40%'></div>",
unsafe_allow_html=True,
)
user = st.sidebar.text_input('Enter GitHub Username').replace(' ', '')
st.session_state.setdefault('user', None)
init_states(user)
if user:
st.sidebar.code(f'Found {len(st.session_state.repos)} repositories for {user}.')
with st.sidebar.form(key='SidebarForm1'):
st.title('Lines of Code Counter')
language = st.selectbox('Select Language', list(LANG_EXT.keys()))
count_button = st.form_submit_button(label='Count')
if count_button:
if not user or not language:
st.sidebar.error(f'GitHub Username or Language is empty. Please try again!')
elif user == st.session_state.user and language == st.session_state.language:
st.sidebar.warning(f"Neither GitHub Username nor Language has changed.")
else:
st.session_state.progress = get_progress(user, language, st.session_state.repos)
st.session_state.language = language
if st.session_state.progress:
generate_download_link(st.session_state.progress, ext="csv")
elif st.session_state.language:
st.sidebar.code(
f"{st.session_state.language} code is absent in your {len(st.session_state.repos)} repositories.")
with st.sidebar.form(key='SidebarForm2'):
st.title('Check your Repo for Secrets')
repository = st.selectbox('Select Repo', st.session_state.repos)
check_button = st.form_submit_button(label='Check')
if check_button:
if not user or not repository:
st.sidebar.error(f'GitHub Username or Repository is empty. Please try again!')
elif user == st.session_state.user and repository == st.session_state.repository:
st.sidebar.warning(f"Neither GitHub Username nor Repository has changed.")
else:
st.session_state.secrets = check_secrets(user, repository)
st.session_state.repository = repository
if st.session_state.secrets:
generate_download_link(st.session_state.secrets, ext="json")
elif st.session_state.repository:
st.sidebar.code(
f"Secrets are absent in {st.session_state.repository} repository.")
st.session_state.user = user
renew_main_window()
if __name__ == "__main__":
remove_old_files()
main()