File size: 5,410 Bytes
f7d5fda
 
 
 
 
 
 
 
 
 
 
 
42f52cb
 
f7d5fda
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
42f52cb
 
 
f7d5fda
 
42f52cb
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
f7d5fda
42f52cb
 
 
 
 
 
 
 
 
 
 
 
f7d5fda
42f52cb
 
 
 
 
 
 
f7d5fda
42f52cb
 
 
 
 
 
 
 
 
 
 
 
f7d5fda
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
#!/usr/bin/env python3
"""
پچ خودکار برای رفع باگ gradio_client
رفع خطای: TypeError: argument of type 'bool' is not iterable
"""

import os
import sys
import glob

def apply_gradio_client_patch():
    """
    اعمال پچ کامل برای رفع باگ gradio_client
    رفع خطای: TypeError: argument of type 'bool' is not iterable
    """
    try:
        print("🔍 جستجوی فایل gradio_client/utils.py...")
        
        # جستجوی فایل utils.py در تمام مسیرهای ممکن
        possible_paths = [
            "/usr/local/lib/python*/site-packages/gradio_client/utils.py",
            "/opt/conda/lib/python*/site-packages/gradio_client/utils.py", 
            "/home/user/.local/lib/python*/site-packages/gradio_client/utils.py",
            f"{sys.prefix}/lib/python*/site-packages/gradio_client/utils.py",
            "/app/.local/lib/python*/site-packages/gradio_client/utils.py"
        ]
        
        utils_file = None
        for pattern in possible_paths:
            matches = glob.glob(pattern)
            if matches:
                utils_file = matches[0]
                print(f"📁 فایل پیدا شد: {utils_file}")
                break
        
        if not utils_file or not os.path.exists(utils_file):
            print("⚠️ فایل gradio_client/utils.py پیدا نشد")
            print("💡 احتمالاً gradio_client نصب نشده یا در مسیر متفاوتی قرار دارد")
            return False
            
        # خواندن محتوای فایل
        print("📖 خواندن محتوای فایل...")
        with open(utils_file, 'r', encoding='utf-8') as f:
            content = f.read()
        
        # بررسی اینکه آیا پچ کامل قبلاً اعمال شده یا نه
        if 'if not isinstance(schema, dict):' in content and 'return "any"' in content:
            print("✅ پچ کامل gradio_client قبلاً اعمال شده است")
            return True
            
        # بک‌آپ فایل اصلی
        backup_file = utils_file + '.backup'
        if not os.path.exists(backup_file):
            with open(backup_file, 'w', encoding='utf-8') as f:
                f.write(content)
            print(f"💾 بک‌آپ ایجاد شد: {backup_file}")
            
        # اعمال پچ کامل
        print("🔧 اعمال پچ کامل...")
        
        # پچ کامل - جایگزینی تابع get_type
        import re
        old_function_pattern = r'def get_type\(schema\):\s*if isinstance\(schema, dict\) and "const" in schema:'
        new_function = '''def get_type(schema):
    # پچ کامل برای رفع باگ TypeError
    if not isinstance(schema, dict):
        return "any"  # مقدار پیش‌فرض برای schema های غیر dict
    if "const" in schema:'''
        
        if re.search(old_function_pattern, content):
            content = re.sub(old_function_pattern, new_function, content)
            print("✅ پچ کامل با regex اعمال شد")
        else:
            # پچ مرحله‌ای اگر الگوی کامل پیدا نشد
            simple_patches = [
                # مرحله 1: پچ ساده
                ('if "const" in schema:', 'if isinstance(schema, dict) and "const" in schema:'),
                # مرحله 2: پچ کامل
                ('if isinstance(schema, dict) and "const" in schema:', 
                 'if not isinstance(schema, dict):\n        return "any"\n    if "const" in schema:')
            ]
            
            patched = False
            for i, (old_line, new_line) in enumerate(simple_patches, 1):
                if old_line in content and new_line not in content:
                    content = content.replace(old_line, new_line)
                    print(f"✅ پچ مرحله {i} اعمال شد")
                    patched = True
                    break
            
            if not patched:
                print("⚠️ هیچ الگوی قابل پچ پیدا نشد")
                print("💡 احتمالاً نسخه gradio_client متفاوت است")
                return False
        
        # نوشتن فایل اصلاح شده
        with open(utils_file, 'w', encoding='utf-8') as f:
            f.write(content)
            
        print(f"✅ پچ کامل gradio_client با موفقیت اعمال شد!")
        print(f"📍 مسیر فایل: {utils_file}")
        return True
            
    except PermissionError:
        print("❌ خطای دسترسی: برای اعمال پچ به دسترسی نوشتن نیاز است")
        print("💡 در Hugging Face Space این مشکل معمولاً خودکار حل می‌شود")
        return False
    except Exception as e:
        print(f"❌ خطا در اعمال پچ: {str(e)}")
        return False

if __name__ == "__main__":
    print("🚀 شروع اعمال پچ gradio_client...")
    success = apply_gradio_client_patch()
    
    if success:
        print("\n🎉 پچ با موفقیت اعمال شد!")
        print("✨ حالا می‌توانید app.py را اجرا کنید")
    else:
        print("\n⚠️ پچ اعمال نشد")
        print("💡 در صورت بروز خطا، از نسخه‌های جدیدتر gradio استفاده کنید")