8
8
import ast
9
9
import datetime
10
10
11
- from utils import read_gitignore , is_ignored
11
+ from utils import read_gitignore , is_ignored , find_projects
12
+
12
13
13
14
def analyze_project_structure (directory , task_queue ):
14
15
ignored_paths = read_gitignore (directory )
@@ -48,12 +49,15 @@ def analyze_project_structure(directory, task_queue):
48
49
49
50
50
51
51
- """
52
+
52
53
def parse_python_files (projects_dir ):
53
54
project_stats = {}
54
55
55
- for root, dirs, files in os.walk(projects_dir):
56
- project_name = os.path.relpath(root, projects_dir).split(os.sep)[0]
56
+ # Используем find_projects для поиска папок с проектами
57
+ projects = find_projects (projects_dir )
58
+
59
+ for project_dir in projects :
60
+ project_name = os .path .relpath (project_dir , projects_dir ).split (os .sep )[0 ]
57
61
58
62
if project_name not in project_stats :
59
63
project_stats [project_name ] = {
@@ -63,40 +67,42 @@ def parse_python_files(projects_dir):
63
67
"dirs" : set ()
64
68
}
65
69
66
- for file in files:
67
- if file.endswith(".py"):
68
- file_path = os.path.join(root, file)
69
-
70
- # Обновляем счётчик Python файлов
71
- project_stats[project_name]["py_count"] += 1
72
-
73
- # Обновляем дату создания проекта
74
- creation_time = os.path.getctime(file_path)
75
- creation_date = datetime.datetime.fromtimestamp(creation_time)
76
-
77
- current_created = project_stats[project_name]["created"]
78
- if current_created is None or creation_date < current_created:
79
- project_stats[project_name]["created"] = creation_date
80
-
81
- # Сбор директорий
82
- rel_dir = os.path.relpath(root, os.path.join(projects_dir, project_name))
83
- if rel_dir != ".":
84
- project_stats[project_name]["dirs"].add(rel_dir)
85
-
86
- # Парсим файл для библиотек
87
- try:
88
- with open(file_path, "r", encoding="utf-8") as f:
89
- node = ast.parse(f.read(), filename=file_path)
90
-
91
- for sub_node in ast.walk(node):
92
- if isinstance(sub_node, ast.Import):
93
- for alias in sub_node.names:
94
- project_stats[project_name]["libs"].add(alias.name.split('.')[0])
95
- elif isinstance(sub_node, ast.ImportFrom):
96
- if sub_node.module:
97
- project_stats[project_name]["libs"].add(sub_node.module.split('.')[0])
98
- except Exception:
99
- continue
70
+ # Склонение директорий с проектами
71
+ for root , dirs , files in os .walk (project_dir ):
72
+ for file in files :
73
+ if file .endswith (".py" ):
74
+ file_path = os .path .join (root , file )
75
+
76
+ # Обновляем счётчик Python файлов
77
+ project_stats [project_name ]["py_count" ] += 1
78
+
79
+ # Обновляем дату создания проекта
80
+ creation_time = os .path .getctime (file_path )
81
+ creation_date = datetime .datetime .fromtimestamp (creation_time )
82
+
83
+ current_created = project_stats [project_name ]["created" ]
84
+ if current_created is None or creation_date < current_created :
85
+ project_stats [project_name ]["created" ] = creation_date
86
+
87
+ # Сбор директорий
88
+ rel_dir = os .path .relpath (root , os .path .join (projects_dir , project_name ))
89
+ if rel_dir != "." :
90
+ project_stats [project_name ]["dirs" ].add (rel_dir )
91
+
92
+ # Парсим файл для библиотек
93
+ try :
94
+ with open (file_path , "r" , encoding = "utf-8" ) as f :
95
+ node = ast .parse (f .read (), filename = file_path )
96
+
97
+ for sub_node in ast .walk (node ):
98
+ if isinstance (sub_node , ast .Import ):
99
+ for alias in sub_node .names :
100
+ project_stats [project_name ]["libs" ].add (alias .name .split ('.' )[0 ])
101
+ elif isinstance (sub_node , ast .ImportFrom ):
102
+ if sub_node .module :
103
+ project_stats [project_name ]["libs" ].add (sub_node .module .split ('.' )[0 ])
104
+ except Exception :
105
+ continue
100
106
101
107
# Приведение к нужному формату
102
108
for proj in project_stats :
@@ -106,20 +112,30 @@ def parse_python_files(projects_dir):
106
112
project_stats [proj ]["created" ] = project_stats [proj ]["created" ].strftime ("%Y-%m-%d %H:%M:%S" )
107
113
108
114
return project_stats
109
- """
110
115
111
116
112
117
def open_stats_window (root , project_data : list [dict ]):
113
118
stats_win = tk .Toplevel (root )
114
119
stats_win .title ("Статистика проектов" )
115
120
stats_win .geometry ("800x600" )
116
121
122
+ # Проверка наличия данных в project_data
123
+ if not project_data :
124
+ tk .Label (stats_win , text = "Нет данных для отображения статистики." ).pack (pady = 20 )
125
+ return
126
+
117
127
df = pd .DataFrame (project_data )
128
+
129
+ # Если данных в столбце 'date' нет, выводим сообщение
118
130
if df .empty or 'date' not in df .columns :
119
131
tk .Label (stats_win , text = "Недостаточно данных для отображения статистики." ).pack (pady = 20 )
120
132
return
121
133
122
- df ['date' ] = pd .to_datetime (df ['date' ])
134
+ # Конвертируем 'date' в формат datetime для графиков
135
+ df ['date' ] = pd .to_datetime (df ['date' ], errors = 'coerce' )
136
+
137
+ # Убираем записи с некорректными датами
138
+ df = df .dropna (subset = ['date' ])
123
139
124
140
stats_canvas = tk .Frame (stats_win )
125
141
stats_canvas .pack (fill = "both" , expand = True )
0 commit comments