Update app.py
Browse files
app.py
CHANGED
@@ -172,6 +172,34 @@ async def try_openai_api(openai_messages):
|
|
172 |
print(f"OpenAI API error: {str(e)}")
|
173 |
raise e
|
174 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
175 |
|
176 |
# Import to Package Name Mapping Dictionary
|
177 |
IMPORT_TO_PACKAGE = {
|
@@ -291,11 +319,23 @@ IMPORT_TO_PACKAGE = {
|
|
291 |
'resampy': 'resampy'
|
292 |
}
|
293 |
|
|
|
294 |
def get_package_name(import_name):
|
295 |
"""์ํฌํธ๋ช
์ผ๋ก๋ถํฐ ์ค์ ํจํค์ง๋ช
์ ๋ฐํ"""
|
|
|
|
|
|
|
|
|
296 |
# ์ ์ด ์๋ ๊ฒฝ์ฐ ์ฒซ ๋ถ๋ถ๋ง ์ฌ์ฉ (์: matplotlib.pyplot -> matplotlib)
|
297 |
base_import = import_name.split('.')[0]
|
|
|
|
|
|
|
|
|
|
|
298 |
return IMPORT_TO_PACKAGE.get(base_import, base_import)
|
|
|
|
|
299 |
|
300 |
def analyze_code(code: str) -> str:
|
301 |
"""์ฝ๋ ๋ถ์ ๊ฒฐ๊ณผ๋ฅผ HTML ํ์์ผ๋ก ๋ฐํ"""
|
@@ -324,8 +364,11 @@ def analyze_code(code: str) -> str:
|
|
324 |
package = line.split('import ')[1].split()[0].split('.')[0]
|
325 |
else:
|
326 |
package = line.split('from ')[1].split()[0].split('.')[0]
|
327 |
-
|
328 |
-
|
|
|
|
|
|
|
329 |
|
330 |
if imports:
|
331 |
analysis.append("<h2>๐ ํ์ํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ</h2>")
|
@@ -339,10 +382,11 @@ def analyze_code(code: str) -> str:
|
|
339 |
analysis.append("<p>์ด ์ฑ์ ์คํํ๊ธฐ ์ํด ํ์ํ ํจํค์ง๋ค์
๋๋ค:</p>")
|
340 |
analysis.append("<pre>")
|
341 |
for pkg in sorted(required_packages):
|
342 |
-
if pkg
|
343 |
-
|
344 |
-
|
345 |
-
|
|
|
346 |
analysis.append("</pre>")
|
347 |
|
348 |
# 2. ํจ์ ๋ถ์
|
|
|
172 |
print(f"OpenAI API error: {str(e)}")
|
173 |
raise e
|
174 |
|
175 |
+
# Built-in modules that don't need to be in requirements.txt
|
176 |
+
BUILTIN_MODULES = {
|
177 |
+
'os', 'sys', 're', 'time', 'json', 'csv', 'math', 'random', 'datetime', 'calendar',
|
178 |
+
'collections', 'copy', 'functools', 'itertools', 'operator', 'string', 'textwrap',
|
179 |
+
'threading', 'queue', 'multiprocessing', 'subprocess', 'socket', 'email', 'mime',
|
180 |
+
'http', 'urllib', 'xmlrpc', 'base64', 'binhex', 'binascii', 'quopri', 'uu',
|
181 |
+
'html', 'xml', 'webbrowser', 'cgi', 'cgitb', 'wsgiref', 'uuid', 'argparse',
|
182 |
+
'getopt', 'logging', 'platform', 'ctypes', 'typing', 'array', 'asyncio', 'concurrent',
|
183 |
+
'contextlib', 'dataclasses', 'enum', 'graphlib', 'hashlib', 'hmac', 'io', 'pathlib',
|
184 |
+
'pickle', 'shelve', 'shutil', 'signal', 'stat', 'struct', 'tempfile', 'warnings',
|
185 |
+
'weakref', 'zipfile', 'zlib', 'mmap', 'msvcrt', 'winreg', 'winsound', 'crypt',
|
186 |
+
'dbm', 'gzip', 'bz2', 'lzma', 'pwd', 'grp', 'termios', 'tty', 'pty', 'fcntl',
|
187 |
+
'pipes', 'resource', 'nis', 'syslog', 'optparse', 'imp', 'posix', '_thread',
|
188 |
+
'builtins', 'traceback', 'gc', 'inspect', 'site', 'user', 'distutils', 'test',
|
189 |
+
'unittest', 'venv', 'code', 'codeop', 'pdb', 'profile', 'pstats', 'timeit',
|
190 |
+
'trace', 'tracemalloc', 'sched', 'secrets', 'mimetypes', 'base64', 'binhex',
|
191 |
+
'binascii', 'quopri', 'uu', 'xdrlib', 'zipapp', 'importlib', 'pkgutil', 'modulefinder',
|
192 |
+
'runpy', 'parser', 'ast', 'symtable', 'symbol', 'token', 'keyword', 'tokenize',
|
193 |
+
'tabnanny', 'pyclbr', 'py_compile', 'compileall', 'dis', 'pickletools', 'formatter',
|
194 |
+
'types', 'abc', 'numbers', 'decimal', 'fractions', 'statistics', 'bisect', 'heapq',
|
195 |
+
'reprlib', 'pprint', 'cmd', 'shlex', 'glob', 'fnmatch', 'linecache', 'rlcompleter',
|
196 |
+
'configparser', 'netrc', 'xdrlib', 'plistlib', 'aifc', 'asynchat', 'asyncore',
|
197 |
+
'audioop', 'crypt', 'imghdr', 'sndhdr', 'sunau', 'fileinput', 'stat', 'filecmp',
|
198 |
+
'formatterclass', 'getpass', 'gettext', 'locale', 'macpath', 'mailcap', 'mailbox',
|
199 |
+
'msilib', 'nis', 'nntplib', 'ntpath', 'ossaudiodev', 'pipes', 'poplib', 'posixpath',
|
200 |
+
'pty', 'pwd', 'pyclbr', 'py_compile', 'sched', 'site', 'smtpd', 'spwd', 'sunau',
|
201 |
+
'telnetlib', 'this', 'wave', 'webbrowser', 'winreg', 'winsound', 'wsgiref', 'xdrlib'
|
202 |
+
}
|
203 |
|
204 |
# Import to Package Name Mapping Dictionary
|
205 |
IMPORT_TO_PACKAGE = {
|
|
|
319 |
'resampy': 'resampy'
|
320 |
}
|
321 |
|
322 |
+
|
323 |
def get_package_name(import_name):
|
324 |
"""์ํฌํธ๋ช
์ผ๋ก๋ถํฐ ์ค์ ํจํค์ง๋ช
์ ๋ฐํ"""
|
325 |
+
# ๋ด์ฅ ๋ชจ๋์ด๋ฉด None ๋ฐํ
|
326 |
+
if import_name in BUILTIN_MODULES:
|
327 |
+
return None
|
328 |
+
|
329 |
# ์ ์ด ์๋ ๊ฒฝ์ฐ ์ฒซ ๋ถ๋ถ๋ง ์ฌ์ฉ (์: matplotlib.pyplot -> matplotlib)
|
330 |
base_import = import_name.split('.')[0]
|
331 |
+
|
332 |
+
# ๋ด์ฅ ๋ชจ๋์ด๋ฉด None ๋ฐํ
|
333 |
+
if base_import in BUILTIN_MODULES:
|
334 |
+
return None
|
335 |
+
|
336 |
return IMPORT_TO_PACKAGE.get(base_import, base_import)
|
337 |
+
|
338 |
+
|
339 |
|
340 |
def analyze_code(code: str) -> str:
|
341 |
"""์ฝ๋ ๋ถ์ ๊ฒฐ๊ณผ๋ฅผ HTML ํ์์ผ๋ก ๋ฐํ"""
|
|
|
364 |
package = line.split('import ')[1].split()[0].split('.')[0]
|
365 |
else:
|
366 |
package = line.split('from ')[1].split()[0].split('.')[0]
|
367 |
+
|
368 |
+
# ๋ด์ฅ ๋ชจ๋์ด ์๋ ๊ฒฝ์ฐ๋ง ํจํค์ง ์ถ๊ฐ
|
369 |
+
package_name = get_package_name(package)
|
370 |
+
if package_name: # None์ด ์๋ ๊ฒฝ์ฐ๋ง ์ถ๊ฐ
|
371 |
+
required_packages.add(package_name)
|
372 |
|
373 |
if imports:
|
374 |
analysis.append("<h2>๐ ํ์ํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ</h2>")
|
|
|
382 |
analysis.append("<p>์ด ์ฑ์ ์คํํ๊ธฐ ์ํด ํ์ํ ํจํค์ง๋ค์
๋๋ค:</p>")
|
383 |
analysis.append("<pre>")
|
384 |
for pkg in sorted(required_packages):
|
385 |
+
if pkg and pkg not in BUILTIN_MODULES: # None์ด ์๋๊ณ ๋ด์ฅ ๋ชจ๋์ด ์๋ ๊ฒฝ์ฐ๋ง ์ถ๊ฐ
|
386 |
+
if pkg == 'gradio':
|
387 |
+
analysis.append("gradio==5.5.0")
|
388 |
+
else:
|
389 |
+
analysis.append(pkg)
|
390 |
analysis.append("</pre>")
|
391 |
|
392 |
# 2. ํจ์ ๋ถ์
|