File size: 2,318 Bytes
1903343
 
 
a5f8603
95a3fe5
a908fc5
1903343
 
 
 
 
 
 
 
 
 
 
7a699a5
 
1903343
7a699a5
82531de
643dcb7
7a699a5
643dcb7
 
 
1903343
 
95a3fe5
643dcb7
 
12a0822
 
95a3fe5
12a0822
 
 
 
95a3fe5
12a0822
 
 
 
95a3fe5
12a0822
ed41156
12a0822
 
643dcb7
 
 
 
eb1b7b9
643dcb7
ed41156
643dcb7
 
 
 
 
 
 
 
 
 
 
 
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
import streamlit as st
import streamlit.components.v1 as components

from py_code_analyzer import CodeFetcher, CodeImportsAnalyzer, ImportsGraphVisualizer
from utils import time_function

TITLE = "Python Code Analyzer"
st.set_page_config(page_title=TITLE, layout="wide")
st.title(TITLE)
st.markdown(
    "The main purpose of the app is to allow Python developers navigate Python code base much "
    + "easier by showing dependencies among files included in the directory with better visualization."
)
st.markdown(
    "**Checkout the source code [here](https://github.com/cyyeh/py-code-analyzer)**"
)

owner = st.text_input("Fill in the GitHub username", value="cyyeh")
repo = st.text_input("Fill in the GitHib repository", value="py-code-analyzer")
path = st.text_input(
    "Fill in the target directory path. Default: the root directory",
)
ref = st.text_input(
    "Fill in the name of the commit/branch/tag. Default: the repository's default branch",
)
clicked_ok_button = st.button("OK")
st.markdown("---")


@time_function
def get_python_files(owner, repo, path, ref=""):
    return CodeFetcher().get_python_files(owner, repo, path, ref=ref)


@time_function
def generate_imports_graph(python_files):
    return CodeImportsAnalyzer(python_files).analyze().generate_imports_graph()


@time_function
def generate_graph_visualization_file(imports_graph):
    ImportsGraphVisualizer().visualize(imports_graph)


@time_function
def read_graph_visualization_file():
    return open("nx.html", "r", encoding="utf-8").read()


if clicked_ok_button and owner and repo:
    with st.spinner("Getting python files..."):
        python_files = get_python_files(owner, repo, path, ref=ref)

    with st.spinner("Parsing python files and generating imports graph..."):
        imports_graph = generate_imports_graph(python_files)

    with st.spinner("Generating graph visualization file..."):
        generate_graph_visualization_file(imports_graph)

    with st.spinner("Showing the graph..."):
        graph_visualization_file = read_graph_visualization_file()
        st.download_button(
            "Download the result file",
            graph_visualization_file,
            file_name="result.html",
            mime="text/html",
        )
        components.html(graph_visualization_file, height=600, scrolling=True)