Spaces:
Runtime error
Runtime error
Update app.py
Browse files
app.py
CHANGED
@@ -40,8 +40,9 @@ def initialize_environment():
|
|
40 |
|
41 |
# GitHub API handler
|
42 |
class GitHubAPI:
|
43 |
-
def __init__(self, token: str):
|
44 |
self.token = token
|
|
|
45 |
self.headers = {
|
46 |
'Authorization': f'token {token}',
|
47 |
'Accept': 'application/vnd.github.v3+json'
|
@@ -59,12 +60,12 @@ class GitHubAPI:
|
|
59 |
if remaining < 10:
|
60 |
wait_time = max(0, reset_time - int(time.time()))
|
61 |
if wait_time > 0:
|
62 |
-
logger.warning(f"Rate limit nearly exceeded. Waiting {wait_time} seconds before retrying...")
|
63 |
time.sleep(wait_time)
|
64 |
return False
|
65 |
return True
|
66 |
except requests.exceptions.RequestException as e:
|
67 |
-
logger.error(f"Error checking rate limit: {str(e)}. Retrying...")
|
68 |
return True
|
69 |
|
70 |
def get_repository(self, owner: str, repo: str) -> Dict:
|
@@ -73,10 +74,10 @@ class GitHubAPI:
|
|
73 |
response.raise_for_status()
|
74 |
return response.json()
|
75 |
except requests.HTTPError as e:
|
76 |
-
logger.error(f"HTTP error getting repository info for {owner}/{repo}: {str(e)}. Please check the repository details.")
|
77 |
raise
|
78 |
except Exception as e:
|
79 |
-
logger.error(f"Error getting repository info: {str(e)}")
|
80 |
raise
|
81 |
|
82 |
def get_issues(self, owner: str, repo: str, state: str = 'open') -> List[Dict]:
|
@@ -89,23 +90,24 @@ class GitHubAPI:
|
|
89 |
issues = response.json()
|
90 |
return [issue for issue in issues if 'pull_request' not in issue]
|
91 |
except Exception as e:
|
92 |
-
logger.error(f"Error fetching issues for repository {owner}/{repo}: {str(e)}. Please verify the repository and token.")
|
93 |
return []
|
94 |
|
95 |
# GitHub Bot
|
96 |
class GitHubBot:
|
97 |
-
def __init__(self):
|
98 |
self.github_api = None
|
|
|
99 |
|
100 |
def initialize_api(self, token: str):
|
101 |
-
self.github_api = GitHubAPI(token)
|
102 |
|
103 |
def fetch_issues(self, token: str, owner: str, repo: str) -> List[Dict]:
|
104 |
try:
|
105 |
self.initialize_api(token)
|
106 |
return self.github_api.get_issues(owner, repo)
|
107 |
except Exception as e:
|
108 |
-
logger.error(f"Error fetching issues for repository {owner}/{repo}: {str(e)}")
|
109 |
return []
|
110 |
|
111 |
def resolve_issue(self, token: str, owner: str, repo: str, issue_number: int, resolution: str, forked_repo: str) -> str:
|
@@ -120,6 +122,10 @@ class GitHubBot:
|
|
120 |
with open(resolution_file, "w") as f:
|
121 |
f.write(f"# Resolution for Issue #{issue_number}\n\n{resolution}")
|
122 |
|
|
|
|
|
|
|
|
|
123 |
# Clone the forked repo
|
124 |
subprocess.run(['git', 'clone', forked_repo, '/tmp/' + forked_repo.split('/')[-1]], check=True)
|
125 |
|
@@ -141,7 +147,7 @@ class GitHubBot:
|
|
141 |
|
142 |
except Exception as e:
|
143 |
error_msg = f"Error resolving issue #{issue_number} in repository {owner}/{repo}: {str(e)}"
|
144 |
-
logger.error(error_msg)
|
145 |
return error_msg
|
146 |
|
147 |
def suggest_automated_fixes(self, issue_title: str) -> str:
|
@@ -150,7 +156,7 @@ class GitHubBot:
|
|
150 |
return "No automated fix available for this issue."
|
151 |
|
152 |
def handle_issue_selection(token, owner, repo, issue_number, resolution, forked_repo):
|
153 |
-
bot = GitHubBot()
|
154 |
result = bot.resolve_issue(token, owner, repo, issue_number, resolution, forked_repo)
|
155 |
return result
|
156 |
|
@@ -182,7 +188,7 @@ def extract_info_from_url(url: str) -> Dict[str, Any]:
|
|
182 |
return info
|
183 |
|
184 |
# Initialize GitHubBot globally
|
185 |
-
bot = GitHubBot()
|
186 |
|
187 |
# Define missing functions with validation
|
188 |
def fetch_issues(token, repo_url):
|
@@ -261,6 +267,7 @@ def cleanup():
|
|
261 |
def main():
|
262 |
# Initialize environment and logger
|
263 |
initialize_environment()
|
|
|
264 |
logger = initialize_logger()
|
265 |
|
266 |
# Register cleanup handlers
|
|
|
40 |
|
41 |
# GitHub API handler
|
42 |
class GitHubAPI:
|
43 |
+
def __init__(self, token: str, logger: logging.Logger):
|
44 |
self.token = token
|
45 |
+
self.logger = logger
|
46 |
self.headers = {
|
47 |
'Authorization': f'token {token}',
|
48 |
'Accept': 'application/vnd.github.v3+json'
|
|
|
60 |
if remaining < 10:
|
61 |
wait_time = max(0, reset_time - int(time.time()))
|
62 |
if wait_time > 0:
|
63 |
+
self.logger.warning(f"Rate limit nearly exceeded. Waiting {wait_time} seconds before retrying...")
|
64 |
time.sleep(wait_time)
|
65 |
return False
|
66 |
return True
|
67 |
except requests.exceptions.RequestException as e:
|
68 |
+
self.logger.error(f"Error checking rate limit: {str(e)}. Retrying...")
|
69 |
return True
|
70 |
|
71 |
def get_repository(self, owner: str, repo: str) -> Dict:
|
|
|
74 |
response.raise_for_status()
|
75 |
return response.json()
|
76 |
except requests.HTTPError as e:
|
77 |
+
self.logger.error(f"HTTP error getting repository info for {owner}/{repo}: {str(e)}. Please check the repository details.")
|
78 |
raise
|
79 |
except Exception as e:
|
80 |
+
self.logger.error(f"Error getting repository info: {str(e)}")
|
81 |
raise
|
82 |
|
83 |
def get_issues(self, owner: str, repo: str, state: str = 'open') -> List[Dict]:
|
|
|
90 |
issues = response.json()
|
91 |
return [issue for issue in issues if 'pull_request' not in issue]
|
92 |
except Exception as e:
|
93 |
+
self.logger.error(f"Error fetching issues for repository {owner}/{repo}: {str(e)}. Please verify the repository and token.")
|
94 |
return []
|
95 |
|
96 |
# GitHub Bot
|
97 |
class GitHubBot:
|
98 |
+
def __init__(self, logger: logging.Logger):
|
99 |
self.github_api = None
|
100 |
+
self.logger = logger
|
101 |
|
102 |
def initialize_api(self, token: str):
|
103 |
+
self.github_api = GitHubAPI(token, self.logger)
|
104 |
|
105 |
def fetch_issues(self, token: str, owner: str, repo: str) -> List[Dict]:
|
106 |
try:
|
107 |
self.initialize_api(token)
|
108 |
return self.github_api.get_issues(owner, repo)
|
109 |
except Exception as e:
|
110 |
+
self.logger.error(f"Error fetching issues for repository {owner}/{repo}: {str(e )}")
|
111 |
return []
|
112 |
|
113 |
def resolve_issue(self, token: str, owner: str, repo: str, issue_number: int, resolution: str, forked_repo: str) -> str:
|
|
|
122 |
with open(resolution_file, "w") as f:
|
123 |
f.write(f"# Resolution for Issue #{issue_number}\n\n{resolution}")
|
124 |
|
125 |
+
# Validate forked_repo before cloning
|
126 |
+
if not forked_repo:
|
127 |
+
raise ValueError("Forked repository URL cannot be empty.")
|
128 |
+
|
129 |
# Clone the forked repo
|
130 |
subprocess.run(['git', 'clone', forked_repo, '/tmp/' + forked_repo.split('/')[-1]], check=True)
|
131 |
|
|
|
147 |
|
148 |
except Exception as e:
|
149 |
error_msg = f"Error resolving issue #{issue_number} in repository {owner}/{repo}: {str(e)}"
|
150 |
+
self.logger.error(error_msg)
|
151 |
return error_msg
|
152 |
|
153 |
def suggest_automated_fixes(self, issue_title: str) -> str:
|
|
|
156 |
return "No automated fix available for this issue."
|
157 |
|
158 |
def handle_issue_selection(token, owner, repo, issue_number, resolution, forked_repo):
|
159 |
+
bot = GitHubBot(logger)
|
160 |
result = bot.resolve_issue(token, owner, repo, issue_number, resolution, forked_repo)
|
161 |
return result
|
162 |
|
|
|
188 |
return info
|
189 |
|
190 |
# Initialize GitHubBot globally
|
191 |
+
bot = GitHubBot(logger)
|
192 |
|
193 |
# Define missing functions with validation
|
194 |
def fetch_issues(token, repo_url):
|
|
|
267 |
def main():
|
268 |
# Initialize environment and logger
|
269 |
initialize_environment()
|
270 |
+
global logger
|
271 |
logger = initialize_logger()
|
272 |
|
273 |
# Register cleanup handlers
|