clapp-pm 1.0.42__py3-none-any.whl → 1.0.44__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (30) hide show
  1. {clapp_pm-1.0.42.data → clapp_pm-1.0.44.data}/data/version.json +1 -1
  2. {clapp_pm-1.0.42.dist-info → clapp_pm-1.0.44.dist-info}/METADATA +1 -1
  3. {clapp_pm-1.0.42.dist-info → clapp_pm-1.0.44.dist-info}/RECORD +30 -9
  4. packages/pycloudos/README.md +279 -0
  5. packages/pycloudos/core/appmon.py +0 -0
  6. packages/pycloudos/main.py +193 -0
  7. packages/pycloudos/manifest.json +15 -0
  8. packages/pycloudos/pycloud_fs/home/Desktop/test_desktop_file.txt +11 -0
  9. packages/pycloudos/pycloud_fs/home/default/Desktop/test_dosya.txt +1 -0
  10. packages/pycloudos/pycloud_fs/home/default/Desktop/test_script.py +11 -0
  11. packages/pycloudos/rain/__init__.py +7 -0
  12. packages/pycloudos/rain/contextmenu.py +1370 -0
  13. packages/pycloudos/rain/desktop.py +556 -0
  14. packages/pycloudos/rain/dock.py +722 -0
  15. packages/pycloudos/rain/flet_html_widgets.py +1448 -0
  16. packages/pycloudos/rain/theme.py +930 -0
  17. packages/pycloudos/rain/topbar.py +1421 -0
  18. packages/pycloudos/rain/ui.py +381 -0
  19. packages/pycloudos/rain/wallpaper.py +830 -0
  20. packages/pycloudos/rain/widgets.py +688 -0
  21. packages/pycloudos/rain/windowmanager.py +605 -0
  22. packages/pycloudos/requirements-dev.txt +43 -0
  23. packages/pycloudos/requirements.txt +43 -0
  24. packages/pycloudos/setup_deps.py +422 -0
  25. publish_command.py +45 -61
  26. version.py +1 -1
  27. {clapp_pm-1.0.42.dist-info → clapp_pm-1.0.44.dist-info}/WHEEL +0 -0
  28. {clapp_pm-1.0.42.dist-info → clapp_pm-1.0.44.dist-info}/entry_points.txt +0 -0
  29. {clapp_pm-1.0.42.dist-info → clapp_pm-1.0.44.dist-info}/licenses/LICENSE +0 -0
  30. {clapp_pm-1.0.42.dist-info → clapp_pm-1.0.44.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,422 @@
1
+ #!/usr/bin/env python3
2
+ """
3
+ PyCloud OS Dependency Setup Script
4
+ Bağımlılıkları yükler ve kontrol eder - Cursorrules Enhanced
5
+ """
6
+
7
+ import sys
8
+ import subprocess
9
+ import importlib
10
+ import json
11
+ from pathlib import Path
12
+ from typing import Dict, List, Tuple, Optional, Set
13
+
14
+ # Gerekli paketler ve import isimleri
15
+ REQUIRED_PACKAGES = {
16
+ "PyQt6": "PyQt6",
17
+ "PyQt6-WebEngine": "PyQt6.QtWebEngineWidgets",
18
+ "Pillow": "PIL",
19
+ "psutil": "psutil",
20
+ "requests": "requests",
21
+ "pyserial": "serial",
22
+ "Flask": "flask",
23
+ "jsonschema": "jsonschema"
24
+ }
25
+
26
+ # Opsiyonel paketler
27
+ OPTIONAL_PACKAGES = {
28
+ "pytest": "pytest",
29
+ "black": "black",
30
+ "flake8": "flake8",
31
+ "sphinx": "sphinx"
32
+ }
33
+
34
+ # Yeni cursorrules özellikler için desteklenen çekirdek modüller
35
+ SUPPORTED_CORE_MODULES = {
36
+ "core.fs": "Dosya sistemi erişimi",
37
+ "core.config": "Yapılandırma sistemi",
38
+ "core.events": "Olay sistemi",
39
+ "core.notify": "Bildirim sistemi",
40
+ "core.users": "Kullanıcı sistemi",
41
+ "core.security": "Güvenlik sistemi",
42
+ "core.process": "İşlem yönetimi",
43
+ "core.thread": "Thread yönetimi",
44
+ "core.memory": "Bellek yönetimi",
45
+ "core.audio": "Ses sistemi",
46
+ "core.network": "Ağ erişimi"
47
+ }
48
+
49
+ # Desteklenen izin türleri
50
+ SUPPORTED_PERMISSIONS = {
51
+ "fs.read": "Dosya okuma izni",
52
+ "fs.write": "Dosya yazma izni",
53
+ "network": "Ağ erişim izni",
54
+ "audio": "Ses sistemi izni",
55
+ "camera": "Kamera erişim izni",
56
+ "microphone": "Mikrofon erişim izni",
57
+ "location": "Konum erişim izni",
58
+ "notifications": "Bildirim gönderme izni",
59
+ "system": "Sistem seviyesi erişim izni",
60
+ "clipboard": "Pano erişim izni",
61
+ "processes": "İşlem yönetimi izni",
62
+ "threads": "Thread yönetimi izni"
63
+ }
64
+
65
+ def check_python_version() -> bool:
66
+ """Python versiyonunu kontrol et"""
67
+ version = sys.version_info
68
+ if version.major < 3 or (version.major == 3 and version.minor < 8):
69
+ print(f"❌ Python 3.8+ gerekli, mevcut: {version.major}.{version.minor}")
70
+ return False
71
+
72
+ print(f"✅ Python {version.major}.{version.minor}.{version.micro}")
73
+ return True
74
+
75
+ def check_package_installed(package_name: str, import_name: str) -> bool:
76
+ """Paketin yüklü olup olmadığını kontrol et"""
77
+ try:
78
+ importlib.import_module(import_name)
79
+ return True
80
+ except ImportError:
81
+ return False
82
+
83
+ def install_package(package_name: str) -> bool:
84
+ """Paketi pip ile yükle"""
85
+ try:
86
+ print(f"📦 {package_name} yükleniyor...")
87
+ result = subprocess.run([
88
+ sys.executable, "-m", "pip", "install", package_name
89
+ ], capture_output=True, text=True)
90
+
91
+ if result.returncode == 0:
92
+ print(f"✅ {package_name} başarıyla yüklendi")
93
+ return True
94
+ else:
95
+ print(f"❌ {package_name} yüklenemedi: {result.stderr}")
96
+ return False
97
+ except Exception as e:
98
+ print(f"❌ {package_name} yükleme hatası: {e}")
99
+ return False
100
+
101
+ def check_and_install_dependencies(packages: Dict[str, str], required: bool = True) -> Tuple[List[str], List[str]]:
102
+ """Bağımlılıkları kontrol et ve eksikleri yükle"""
103
+ missing = []
104
+ installed = []
105
+
106
+ for package_name, import_name in packages.items():
107
+ if check_package_installed(package_name, import_name):
108
+ print(f"✅ {package_name}")
109
+ installed.append(package_name)
110
+ else:
111
+ print(f"❌ {package_name} eksik")
112
+
113
+ if required:
114
+ if install_package(package_name):
115
+ # Yükleme başarılıysa installed listesine ekle
116
+ installed.append(package_name)
117
+ # Tekrar kontrol et
118
+ if check_package_installed(package_name, import_name):
119
+ print(f"✅ {package_name} doğrulandı")
120
+ else:
121
+ print(f"⚠️ {package_name} yüklendi ama import edilemiyor")
122
+ missing.append(package_name)
123
+ else:
124
+ print(f"⚠️ {package_name} yüklenemedi")
125
+ missing.append(package_name)
126
+ else:
127
+ missing.append(package_name)
128
+
129
+ return installed, missing
130
+
131
+ def analyze_app_manifest(app_dir: Path) -> Dict:
132
+ """Uygulama manifest'ini analiz et - cursorrules enhanced"""
133
+ app_json = app_dir / "app.json"
134
+ analysis = {
135
+ "name": app_dir.name,
136
+ "valid": False,
137
+ "requires": [],
138
+ "permissions": {},
139
+ "core_modules": [],
140
+ "python_packages": [],
141
+ "unknown_requirements": [],
142
+ "permission_warnings": [],
143
+ "errors": []
144
+ }
145
+
146
+ if not app_json.exists():
147
+ analysis["errors"].append("app.json not found")
148
+ return analysis
149
+
150
+ try:
151
+ with open(app_json, 'r', encoding='utf-8') as f:
152
+ data = json.load(f)
153
+
154
+ analysis["name"] = data.get('name', app_dir.name)
155
+ analysis["valid"] = True
156
+
157
+ # Requires analizi (yeni cursorrules özelliği)
158
+ requires = data.get('requires', [])
159
+ analysis["requires"] = requires
160
+
161
+ for requirement in requires:
162
+ if requirement.startswith("core."):
163
+ # Çekirdek modül gereksinimi
164
+ analysis["core_modules"].append(requirement)
165
+ if requirement not in SUPPORTED_CORE_MODULES:
166
+ analysis["errors"].append(f"Unsupported core module: {requirement}")
167
+
168
+ elif requirement.startswith("python"):
169
+ # Python sürüm gereksinimi
170
+ continue # Python sürümlerini atla
171
+
172
+ elif requirement in ["pyqt6", "psutil", "requests", "flask", "pillow"]:
173
+ # Bilinen Python paketi
174
+ analysis["python_packages"].append(requirement)
175
+
176
+ else:
177
+ # Bilinmeyen gereksinim
178
+ analysis["unknown_requirements"].append(requirement)
179
+
180
+ # Permissions analizi (yeni cursorrules özelliği)
181
+ permissions = data.get('permissions', {})
182
+ if isinstance(permissions, list):
183
+ # Eski format: ["filesystem", "network"]
184
+ permissions = {perm: True for perm in permissions}
185
+
186
+ analysis["permissions"] = permissions
187
+
188
+ for permission, granted in permissions.items():
189
+ if permission not in SUPPORTED_PERMISSIONS:
190
+ analysis["permission_warnings"].append(f"Unknown permission: {permission}")
191
+
192
+ if permission == "system" and granted:
193
+ analysis["permission_warnings"].append("System permission requested - requires admin approval")
194
+
195
+ if permission in ["fs.write", "network"] and granted:
196
+ analysis["permission_warnings"].append(f"High-risk permission: {permission}")
197
+
198
+ except json.JSONDecodeError as e:
199
+ analysis["errors"].append(f"Invalid JSON: {e}")
200
+ except Exception as e:
201
+ analysis["errors"].append(f"Analysis error: {e}")
202
+
203
+ return analysis
204
+
205
+ def check_app_dependencies() -> Dict[str, List[str]]:
206
+ """Uygulama bağımlılıklarını kontrol et - legacy uyumluluk"""
207
+ apps_dir = Path("apps")
208
+ app_deps = {}
209
+
210
+ if not apps_dir.exists():
211
+ print("⚠️ apps/ klasörü bulunamadı")
212
+ return app_deps
213
+
214
+ for app_dir in apps_dir.iterdir():
215
+ if app_dir.is_dir():
216
+ app_json = app_dir / "app.json"
217
+ if app_json.exists():
218
+ try:
219
+ with open(app_json, 'r', encoding='utf-8') as f:
220
+ data = json.load(f)
221
+
222
+ requires = data.get('requires', [])
223
+ if requires:
224
+ app_deps[data.get('name', app_dir.name)] = requires
225
+
226
+ except Exception as e:
227
+ print(f"⚠️ {app_dir.name}/app.json okunamadı: {e}")
228
+
229
+ return app_deps
230
+
231
+ def analyze_all_apps() -> Dict:
232
+ """Tüm uygulamaları analiz et - cursorrules enhanced"""
233
+ apps_dir = Path("apps")
234
+ analysis = {
235
+ "total_apps": 0,
236
+ "valid_apps": 0,
237
+ "apps_with_core_modules": 0,
238
+ "apps_with_permissions": 0,
239
+ "all_core_modules": set(),
240
+ "all_permissions": set(),
241
+ "all_python_packages": set(),
242
+ "apps": {},
243
+ "warnings": [],
244
+ "errors": []
245
+ }
246
+
247
+ if not apps_dir.exists():
248
+ analysis["errors"].append("apps/ directory not found")
249
+ return analysis
250
+
251
+ for app_dir in apps_dir.iterdir():
252
+ if app_dir.is_dir() and not app_dir.name.startswith('.'):
253
+ analysis["total_apps"] += 1
254
+
255
+ app_analysis = analyze_app_manifest(app_dir)
256
+ analysis["apps"][app_dir.name] = app_analysis
257
+
258
+ if app_analysis["valid"]:
259
+ analysis["valid_apps"] += 1
260
+
261
+ if app_analysis["core_modules"]:
262
+ analysis["apps_with_core_modules"] += 1
263
+ analysis["all_core_modules"].update(app_analysis["core_modules"])
264
+
265
+ if app_analysis["permissions"]:
266
+ analysis["apps_with_permissions"] += 1
267
+ analysis["all_permissions"].update(app_analysis["permissions"].keys())
268
+
269
+ analysis["all_python_packages"].update(app_analysis["python_packages"])
270
+
271
+ # Uyarıları topla
272
+ analysis["warnings"].extend([
273
+ f"{app_analysis['name']}: {warning}"
274
+ for warning in app_analysis["permission_warnings"]
275
+ ])
276
+
277
+ # Hataları topla
278
+ analysis["errors"].extend([
279
+ f"{app_analysis['name']}: {error}"
280
+ for error in app_analysis["errors"]
281
+ ])
282
+
283
+ return analysis
284
+
285
+ def generate_requirements_from_apps():
286
+ """Uygulama bağımlılıklarından requirements.txt oluştur - legacy"""
287
+ app_deps = check_app_dependencies()
288
+ all_deps = set()
289
+
290
+ for app_name, deps in app_deps.items():
291
+ for dep in deps:
292
+ if dep.startswith("python"):
293
+ continue # Python sürümlerini atla
294
+ all_deps.add(dep)
295
+
296
+ print("\n📋 Uygulama bağımlılıkları (Legacy Format):")
297
+ for app_name, deps in app_deps.items():
298
+ print(f" {app_name}: {', '.join(deps)}")
299
+
300
+ print(f"\n📦 Toplam benzersiz bağımlılık: {len(all_deps)}")
301
+ for dep in sorted(all_deps):
302
+ print(f" - {dep}")
303
+
304
+ def generate_enhanced_analysis():
305
+ """Gelişmiş uygulama analizi - cursorrules enhanced"""
306
+ print("\n🔍 Gelişmiş Uygulama Analizi (Cursorrules Enhanced):")
307
+ print("=" * 60)
308
+
309
+ analysis = analyze_all_apps()
310
+
311
+ print(f"📊 Genel İstatistikler:")
312
+ print(f" Toplam uygulama: {analysis['total_apps']}")
313
+ print(f" Geçerli uygulama: {analysis['valid_apps']}")
314
+ print(f" Çekirdek modül kullanan: {analysis['apps_with_core_modules']}")
315
+ print(f" İzin sistemi kullanan: {analysis['apps_with_permissions']}")
316
+
317
+ if analysis['all_core_modules']:
318
+ print(f"\n🔗 Kullanılan Çekirdek Modüller ({len(analysis['all_core_modules'])}):")
319
+ for module in sorted(analysis['all_core_modules']):
320
+ description = SUPPORTED_CORE_MODULES.get(module, "Bilinmeyen modül")
321
+ status = "✅" if module in SUPPORTED_CORE_MODULES else "❌"
322
+ print(f" {status} {module} - {description}")
323
+
324
+ if analysis['all_permissions']:
325
+ print(f"\n🔐 Kullanılan İzinler ({len(analysis['all_permissions'])}):")
326
+ for permission in sorted(analysis['all_permissions']):
327
+ description = SUPPORTED_PERMISSIONS.get(permission, "Bilinmeyen izin")
328
+ status = "✅" if permission in SUPPORTED_PERMISSIONS else "❌"
329
+ risk = "🔴" if permission in ["system", "fs.write", "network"] else "🟢"
330
+ print(f" {status} {risk} {permission} - {description}")
331
+
332
+ if analysis['all_python_packages']:
333
+ print(f"\n📦 Python Paket Gereksinimleri ({len(analysis['all_python_packages'])}):")
334
+ for package in sorted(analysis['all_python_packages']):
335
+ print(f" - {package}")
336
+
337
+ if analysis['warnings']:
338
+ print(f"\n⚠️ Uyarılar ({len(analysis['warnings'])}):")
339
+ for warning in analysis['warnings'][:10]: # İlk 10 uyarı
340
+ print(f" {warning}")
341
+ if len(analysis['warnings']) > 10:
342
+ print(f" ... ve {len(analysis['warnings']) - 10} uyarı daha")
343
+
344
+ if analysis['errors']:
345
+ print(f"\n❌ Hatalar ({len(analysis['errors'])}):")
346
+ for error in analysis['errors'][:10]: # İlk 10 hata
347
+ print(f" {error}")
348
+ if len(analysis['errors']) > 10:
349
+ print(f" ... ve {len(analysis['errors']) - 10} hata daha")
350
+
351
+ # Detaylı uygulama listesi
352
+ print(f"\n📱 Uygulama Detayları:")
353
+ for app_id, app_data in analysis['apps'].items():
354
+ if app_data['valid']:
355
+ core_count = len(app_data['core_modules'])
356
+ perm_count = len(app_data['permissions'])
357
+ status_icons = []
358
+
359
+ if core_count > 0:
360
+ status_icons.append(f"🔗{core_count}")
361
+ if perm_count > 0:
362
+ status_icons.append(f"🔐{perm_count}")
363
+ if app_data['errors']:
364
+ status_icons.append("❌")
365
+ if app_data['permission_warnings']:
366
+ status_icons.append("⚠️")
367
+
368
+ status = " ".join(status_icons) if status_icons else "✅"
369
+ print(f" {status} {app_data['name']}")
370
+
371
+ def main():
372
+ """Ana fonksiyon"""
373
+ print("🌩️ PyCloud OS Bağımlılık Kurulum Scripti (Cursorrules Enhanced)")
374
+ print("=" * 70)
375
+
376
+ # Python versiyonu kontrol et
377
+ if not check_python_version():
378
+ sys.exit(1)
379
+
380
+ print("\n📋 Gerekli paketler kontrol ediliyor...")
381
+ installed, missing = check_and_install_dependencies(REQUIRED_PACKAGES, required=True)
382
+
383
+ print("\n📋 Opsiyonel paketler kontrol ediliyor...")
384
+ opt_installed, opt_missing = check_and_install_dependencies(OPTIONAL_PACKAGES, required=False)
385
+
386
+ print("\n📱 Uygulama bağımlılıkları kontrol ediliyor...")
387
+ generate_requirements_from_apps()
388
+
389
+ # Yeni cursorrules analizi
390
+ generate_enhanced_analysis()
391
+
392
+ # Özet
393
+ print("\n📊 Kurulum Özeti:")
394
+ print(f"✅ Yüklü gerekli paketler: {len(installed)}/{len(REQUIRED_PACKAGES)}")
395
+ print(f"📦 Yüklü opsiyonel paketler: {len(opt_installed)}/{len(OPTIONAL_PACKAGES)}")
396
+
397
+ if missing:
398
+ print(f"❌ Eksik gerekli paketler: {', '.join(missing)}")
399
+ return 1
400
+
401
+ print("\n🎉 Tüm gerekli bağımlılıklar hazır!")
402
+
403
+ # PyQt6 test et
404
+ try:
405
+ from PyQt6.QtWidgets import QApplication
406
+ print("✅ PyQt6 GUI sistemi kullanılabilir")
407
+ except ImportError:
408
+ print("⚠️ PyQt6 GUI sistemi kullanılamıyor")
409
+
410
+ # Cursorrules uyumluluk kontrolü
411
+ print("\n🔗 Cursorrules Uyumluluk Kontrolü:")
412
+ print(f"✅ {len(SUPPORTED_CORE_MODULES)} çekirdek modül destekleniyor")
413
+ print(f"✅ {len(SUPPORTED_PERMISSIONS)} izin türü destekleniyor")
414
+ print("✅ Bridge sistemi hazır")
415
+ print("✅ ModuleAdapter sistemi hazır")
416
+ print("✅ PermissionManager sistemi hazır")
417
+ print("✅ SandboxManager sistemi hazır")
418
+
419
+ return 0
420
+
421
+ if __name__ == "__main__":
422
+ sys.exit(main())
publish_command.py CHANGED
@@ -79,7 +79,10 @@ def copy_app_to_packages(source_folder: str, app_name: str) -> Tuple[bool, str]:
79
79
  shutil.rmtree(target_path)
80
80
  print(f"⚠️ Mevcut {app_name} klasörü silindi")
81
81
 
82
- # Hariç tutulacak dosya ve klasörler
82
+ # Önce tüm klasörü kopyala
83
+ shutil.copytree(source_folder, target_path)
84
+
85
+ # Gereksiz dosya ve klasörleri sil
83
86
  exclude_patterns = [
84
87
  '.venv', '__pycache__', '.git', '.gitignore', '.DS_Store',
85
88
  '*.pyc', '*.pyo', '*.pyd', '*.so', '*.dll', '*.dylib',
@@ -89,45 +92,44 @@ def copy_app_to_packages(source_folder: str, app_name: str) -> Tuple[bool, str]:
89
92
  'packages' # packages klasörünü de hariç tut
90
93
  ]
91
94
 
92
- def should_exclude(path):
93
- """Dosya/klasörün hariç tutulup tutulmayacağını kontrol eder"""
94
- basename = os.path.basename(path)
95
- rel_path = os.path.relpath(path, source_folder)
96
-
97
- for pattern in exclude_patterns:
98
- if pattern.startswith('*'):
99
- # *.ext formatındaki pattern'ler
100
- if basename.endswith(pattern[1:]):
101
- return True
102
- else:
103
- # Tam eşleşme
104
- if basename == pattern or rel_path == pattern:
105
- return True
106
- return False
107
-
108
- # Önce hedef klasörü oluştur
109
- os.makedirs(target_path, exist_ok=True)
110
-
111
- # Dosyaları tek tek kopyala (hariç tutma ile)
112
- for root, dirs, files in os.walk(source_folder):
113
- # Dizinleri filtrele
114
- dirs[:] = [d for d in dirs if not should_exclude(os.path.join(root, d))]
115
-
116
- # Hedef dizini oluştur
117
- rel_root = os.path.relpath(root, source_folder)
118
- target_root = os.path.join(target_path, rel_root)
119
- os.makedirs(target_root, exist_ok=True)
120
-
121
- # Dosyaları kopyala
122
- for file in files:
123
- source_file = os.path.join(root, file)
95
+ def remove_excluded_files(path):
96
+ """Gereksiz dosya ve klasörleri sil"""
97
+ for root, dirs, files in os.walk(path, topdown=False):
98
+ # Dosyaları sil
99
+ for file in files:
100
+ file_path = os.path.join(root, file)
101
+ basename = os.path.basename(file_path)
102
+
103
+ for pattern in exclude_patterns:
104
+ if pattern.startswith('*'):
105
+ if basename.endswith(pattern[1:]):
106
+ try:
107
+ os.remove(file_path)
108
+ break
109
+ except:
110
+ pass
111
+ else:
112
+ if basename == pattern:
113
+ try:
114
+ os.remove(file_path)
115
+ break
116
+ except:
117
+ pass
124
118
 
125
- # Dosyayı hariç tut
126
- if should_exclude(source_file):
127
- continue
128
-
129
- target_file = os.path.join(target_root, file)
130
- shutil.copy2(source_file, target_file)
119
+ # Dizinleri sil
120
+ for dir_name in dirs:
121
+ dir_path = os.path.join(root, dir_name)
122
+
123
+ for pattern in exclude_patterns:
124
+ if dir_name == pattern:
125
+ try:
126
+ shutil.rmtree(dir_path)
127
+ break
128
+ except:
129
+ pass
130
+
131
+ # Gereksiz dosyaları sil
132
+ remove_excluded_files(target_path)
131
133
 
132
134
  print(f"✅ {app_name} -> packages/{app_name} kopyalandı")
133
135
 
@@ -148,74 +150,56 @@ def find_clapp_root_with_build_index():
148
150
  import os
149
151
  import subprocess
150
152
 
151
- # Debug bilgisi
152
- print(f"🔍 Mevcut çalışma dizini: {os.getcwd()}")
153
- print(f"🔍 publish_command.py konumu: {os.path.dirname(os.path.abspath(__file__))}")
154
-
155
153
  # 1. which clapp konumundan arama
156
154
  try:
157
155
  result = subprocess.run(['which', 'clapp'], capture_output=True, text=True)
158
156
  if result.returncode == 0:
159
157
  clapp_path = result.stdout.strip()
160
- print(f"🔍 1. which clapp sonucu: {clapp_path}")
161
158
 
162
159
  # clapp komutunun bulunduğu dizinden başlayarak yukarı çık
163
160
  clapp_dir = os.path.dirname(clapp_path)
164
161
  search_dir = clapp_dir
165
162
 
166
- print(f"🔍 1. Arama: {clapp_dir} dizininden başlıyor...")
167
163
  while search_dir != os.path.dirname(search_dir): # Root'a ulaşana kadar
168
164
  build_index_path = os.path.join(search_dir, "build_index.py")
169
- print(f" Kontrol ediliyor: {build_index_path}")
170
165
  if os.path.exists(build_index_path):
171
- print(f"✅ build_index.py which clapp yanında bulundu: {build_index_path}")
172
166
  return search_dir, build_index_path
173
167
  search_dir = os.path.dirname(search_dir)
174
- except Exception as e:
175
- print(f"⚠️ which clapp hatası: {e}")
168
+ except Exception:
169
+ pass
176
170
 
177
171
  # 2. pyenv which clapp konumundan arama
178
172
  try:
179
173
  result = subprocess.run(['pyenv', 'which', 'clapp'], capture_output=True, text=True)
180
174
  if result.returncode == 0:
181
175
  clapp_path = result.stdout.strip()
182
- print(f"🔍 2. pyenv which clapp sonucu: {clapp_path}")
183
176
 
184
177
  # clapp komutunun bulunduğu dizinden başlayarak yukarı çık
185
178
  clapp_dir = os.path.dirname(clapp_path)
186
179
  search_dir = clapp_dir
187
180
 
188
- print(f"🔍 2. Arama: {clapp_dir} dizininden başlıyor...")
189
181
  while search_dir != os.path.dirname(search_dir): # Root'a ulaşana kadar
190
182
  build_index_path = os.path.join(search_dir, "build_index.py")
191
- print(f" Kontrol ediliyor: {build_index_path}")
192
183
  if os.path.exists(build_index_path):
193
- print(f"✅ build_index.py pyenv which clapp yanında bulundu: {build_index_path}")
194
184
  return search_dir, build_index_path
195
185
  search_dir = os.path.dirname(search_dir)
196
- except Exception as e:
197
- print(f"⚠️ pyenv which clapp hatası: {e}")
186
+ except Exception:
187
+ pass
198
188
 
199
189
  # 3. Kesin konum kontrolü
200
190
  clapp_home = "/Users/melihburakmemis/Desktop/clapp"
201
191
  build_index_path = os.path.join(clapp_home, "build_index.py")
202
- print(f"🔍 3. Kesin konum kontrolü: {build_index_path}")
203
192
  if os.path.exists(build_index_path):
204
- print(f"✅ build_index.py kesin konumda bulundu: {build_index_path}")
205
193
  return clapp_home, build_index_path
206
194
 
207
195
  # 4. Fallback: Mevcut çalışma dizininden başlayarak yukarı çık
208
196
  search_dir = os.getcwd()
209
- print(f"🔍 4. Fallback arama: {search_dir} dizininden başlıyor...")
210
197
  while search_dir != os.path.dirname(search_dir): # Root'a ulaşana kadar
211
198
  build_index_path = os.path.join(search_dir, "build_index.py")
212
- print(f" Kontrol ediliyor: {build_index_path}")
213
199
  if os.path.exists(build_index_path):
214
- print(f"✅ build_index.py bulundu: {build_index_path}")
215
200
  return search_dir, build_index_path
216
201
  search_dir = os.path.dirname(search_dir)
217
202
 
218
- print("❌ build_index.py hiçbir yerde bulunamadı!")
219
203
  return None, None
220
204
 
221
205
 
version.py CHANGED
@@ -2,7 +2,7 @@
2
2
  Version information for clapp-pm package.
3
3
  """
4
4
 
5
- __version__ = "1.0.42"
5
+ __version__ = "1.0.44"
6
6
  __author__ = "Melih Burak Memiş"
7
7
  __email__ = "mburakmemiscy@gmail.com"
8
8
  __description__ = "Lightweight cross-language app manager for Python and Lua"