44from interface_wrapper import IRepositoryAPI , RepositoryFactory
55
66
7- def login (source , token , base_url ):
8- client = RepositoryFactory .create_api (source , token , base_url )
9- return client
7+ def login (token , base_url ):
8+ try :
9+ client = RepositoryFactory .create_api (token , base_url )
10+ return client
11+ except Exception :
12+ return None
1013
1114
1215def get_tokens_from_file (tokens_path : str ) -> list [str ]:
@@ -24,61 +27,37 @@ def get_repos_from_file(repos_path: str) -> list[str]:
2427
2528
2629class Clients :
27- def __init__ (self , source : str , tokens : list [str ], base_url : str | None = None ):
28- # Возможно это можно переписать покрасивее
29- if source == 'github' :
30- self .clients = self ._init_clients (source , tokens , base_url )
31- elif base_url == 'forgejo' :
32- self .client = RepositoryFactory .create_api (source , tokens [0 ], base_url )
33- self .token = tokens [0 ]
34- else :
35- print (f"Unavailable source { source } , use [ 'github' | 'forgejo' ] instead" )
36-
37- self .source = source
30+ def __init__ (self , tokens : list [str ], base_url : str | None = None ):
31+ self .clients = []
32+ self .token_map = {}
3833
39- def _init_clients (
40- self , source : str , tokens : list [str ], base_url : str | None
41- ) -> list [dict ]:
42- clients = [
43- {
44- "client" : RepositoryFactory .create_api (source , token , base_url ),
45- "token" : token ,
46- }
47- for token in tokens
48- ]
34+ for token in tokens :
35+ client = login (token , base_url )
36+ if client :
37+ self .clients .append (client )
38+ self .token_map [client ] = token
4939
50- return clients
40+ if not self .clients :
41+ raise Exception ("No valid tokens for either GitHub or Forgejo" )
5142
52- def _get_next_git_client (self ) -> tuple [IRepositoryAPI , str ]:
43+ def _get_next_client (self ) -> tuple [IRepositoryAPI , str ]:
5344 client = None
5445 max_remaining_limit = - 1
5546
56- for client_tmp in self .clients :
57- remaining_limit , limit = client_tmp ["client" ].get_rate_limiting ()
58-
59- # можно добавить вывод износа токена
60- # можно дополнительно проверять на 403 и временно пропускать эти токены,
61- # либо завести константу "минимальный коэффициент износа" и не трогать "изношенные" токены
62-
63- if remaining_limit > max_remaining_limit :
64- client = client_tmp
65- max_remaining_limit = remaining_limit
66-
47+ for c in self .clients :
48+ remaining , _ = c .get_rate_limiting ()
49+ if remaining > max_remaining_limit :
50+ client = c
51+ max_remaining_limit = remaining
6752 sleep (TIMEDELTA )
6853
6954 if client is None :
7055 raise Exception ("No git clients available" )
7156
72- return client ['client' ], client ['token' ]
73-
74- def _get_next_forgejo_client (self ) -> tuple [IRepositoryAPI , str ]:
75- return self .client , self .token
57+ return client , self .token_map [client ]
7658
7759 def get_next_client (self ) -> tuple [IRepositoryAPI , str ]:
78- if self .source == 'github' :
79- return self ._get_next_git_client ()
80- elif self .source == 'forgejo' :
81- return self ._get_next_forgejo_client
60+ return self ._get_next_client ()
8261
8362
8463def get_next_binded_repo (clients : Clients , repositories : list [str ]):
0 commit comments