clapp-pm 1.0.17__py3-none-any.whl → 1.0.19__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.
cache_manager.py ADDED
@@ -0,0 +1,376 @@
1
+ #!/usr/bin/env python3
2
+ """
3
+ cache_manager.py - Performans Optimizasyonu ve Önbellekleme Sistemi
4
+
5
+ Bu modül clapp'in performansını artırmak için:
6
+ - Paket meta verilerini önbellekleme
7
+ - Registry verilerini önbellekleme
8
+ - Dosya checksum'larını önbellekleme
9
+ - Akıllı cache yönetimi
10
+ - Paralel indirme desteği
11
+ """
12
+
13
+ import os
14
+ import json
15
+ import hashlib
16
+ import pickle
17
+ import threading
18
+ import time
19
+ from pathlib import Path
20
+ from typing import Dict, Any, Optional, List, Tuple
21
+ from datetime import datetime, timedelta
22
+ import concurrent.futures
23
+ import requests
24
+ from functools import wraps
25
+
26
+ class CacheManager:
27
+ """Akıllı önbellekleme yöneticisi"""
28
+
29
+ def __init__(self, cache_dir: Optional[str] = None):
30
+ """
31
+ CacheManager başlatıcısı
32
+
33
+ Args:
34
+ cache_dir: Cache dizini (varsayılan: ~/.clapp/cache)
35
+ """
36
+ if cache_dir is None:
37
+ cache_dir = os.path.join(os.path.expanduser("~"), ".clapp", "cache")
38
+
39
+ self.cache_dir = Path(cache_dir)
40
+ self.cache_dir.mkdir(parents=True, exist_ok=True)
41
+
42
+ # Cache türleri
43
+ self.metadata_cache = self.cache_dir / "metadata"
44
+ self.registry_cache = self.cache_dir / "registry"
45
+ self.checksum_cache = self.cache_dir / "checksums"
46
+ self.download_cache = self.cache_dir / "downloads"
47
+
48
+ # Cache dizinlerini oluştur
49
+ for cache_path in [self.metadata_cache, self.registry_cache,
50
+ self.checksum_cache, self.download_cache]:
51
+ cache_path.mkdir(exist_ok=True)
52
+
53
+ # Cache istatistikleri
54
+ self.stats = {
55
+ "hits": 0,
56
+ "misses": 0,
57
+ "evictions": 0,
58
+ "size": 0
59
+ }
60
+
61
+ # Thread-safe cache
62
+ self._lock = threading.Lock()
63
+
64
+ def _get_cache_key(self, key: str, cache_type: str = "metadata") -> Path:
65
+ """Cache anahtarı için dosya yolu oluşturur"""
66
+ if cache_type == "metadata":
67
+ return self.metadata_cache / f"{key}.json"
68
+ elif cache_type == "registry":
69
+ return self.registry_cache / f"{key}.json"
70
+ elif cache_type == "checksum":
71
+ return self.checksum_cache / f"{key}.txt"
72
+ elif cache_type == "download":
73
+ return self.download_cache / f"{key}.zip"
74
+ else:
75
+ raise ValueError(f"Geçersiz cache türü: {cache_type}")
76
+
77
+ def get(self, key: str, cache_type: str = "metadata", max_age: int = 3600) -> Optional[Any]:
78
+ """
79
+ Cache'den veri alır
80
+
81
+ Args:
82
+ key: Cache anahtarı
83
+ cache_type: Cache türü
84
+ max_age: Maksimum yaş (saniye)
85
+
86
+ Returns:
87
+ Cache'lenmiş veri veya None
88
+ """
89
+ cache_file = self._get_cache_key(key, cache_type)
90
+
91
+ if not cache_file.exists():
92
+ self.stats["misses"] += 1
93
+ return None
94
+
95
+ # Dosya yaşını kontrol et
96
+ file_age = time.time() - cache_file.stat().st_mtime
97
+ if file_age > max_age:
98
+ cache_file.unlink()
99
+ self.stats["misses"] += 1
100
+ return None
101
+
102
+ try:
103
+ with self._lock:
104
+ if cache_type in ["metadata", "registry"]:
105
+ with open(cache_file, 'r', encoding='utf-8') as f:
106
+ data = json.load(f)
107
+ elif cache_type == "checksum":
108
+ with open(cache_file, 'r', encoding='utf-8') as f:
109
+ data = f.read().strip()
110
+ else:
111
+ # Binary dosyalar için pickle kullan
112
+ with open(cache_file, 'rb') as f:
113
+ data = pickle.load(f)
114
+
115
+ self.stats["hits"] += 1
116
+ return data
117
+
118
+ except Exception as e:
119
+ print(f"Cache okuma hatası: {e}")
120
+ cache_file.unlink()
121
+ self.stats["misses"] += 1
122
+ return None
123
+
124
+ def set(self, key: str, data: Any, cache_type: str = "metadata") -> bool:
125
+ """
126
+ Cache'e veri kaydeder
127
+
128
+ Args:
129
+ key: Cache anahtarı
130
+ data: Kaydedilecek veri
131
+ cache_type: Cache türü
132
+
133
+ Returns:
134
+ Başarılıysa True
135
+ """
136
+ cache_file = self._get_cache_key(key, cache_type)
137
+
138
+ try:
139
+ with self._lock:
140
+ if cache_type in ["metadata", "registry"]:
141
+ with open(cache_file, 'w', encoding='utf-8') as f:
142
+ json.dump(data, f, indent=2, ensure_ascii=False)
143
+ elif cache_type == "checksum":
144
+ with open(cache_file, 'w', encoding='utf-8') as f:
145
+ f.write(str(data))
146
+ else:
147
+ # Binary dosyalar için pickle kullan
148
+ with open(cache_file, 'wb') as f:
149
+ pickle.dump(data, f)
150
+
151
+ return True
152
+
153
+ except Exception as e:
154
+ print(f"Cache yazma hatası: {e}")
155
+ return False
156
+
157
+ def delete(self, key: str, cache_type: str = "metadata") -> bool:
158
+ """Cache'den veri siler"""
159
+ cache_file = self._get_cache_key(key, cache_type)
160
+
161
+ try:
162
+ if cache_file.exists():
163
+ cache_file.unlink()
164
+ return True
165
+ return False
166
+ except Exception:
167
+ return False
168
+
169
+ def clear(self, cache_type: Optional[str] = None) -> int:
170
+ """
171
+ Cache'i temizler
172
+
173
+ Args:
174
+ cache_type: Temizlenecek cache türü (None ise tümü)
175
+
176
+ Returns:
177
+ Silinen dosya sayısı
178
+ """
179
+ deleted_count = 0
180
+
181
+ if cache_type:
182
+ cache_path = self._get_cache_key("", cache_type).parent
183
+ if cache_path.exists():
184
+ for file in cache_path.iterdir():
185
+ if file.is_file():
186
+ file.unlink()
187
+ deleted_count += 1
188
+ else:
189
+ # Tüm cache'leri temizle
190
+ for cache_path in [self.metadata_cache, self.registry_cache,
191
+ self.checksum_cache, self.download_cache]:
192
+ if cache_path.exists():
193
+ for file in cache_path.iterdir():
194
+ if file.is_file():
195
+ file.unlink()
196
+ deleted_count += 1
197
+
198
+ return deleted_count
199
+
200
+ def get_stats(self) -> Dict[str, Any]:
201
+ """Cache istatistiklerini döndürür"""
202
+ total_size = 0
203
+
204
+ # Cache boyutunu hesapla
205
+ for cache_path in [self.metadata_cache, self.registry_cache,
206
+ self.checksum_cache, self.download_cache]:
207
+ if cache_path.exists():
208
+ for file in cache_path.iterdir():
209
+ if file.is_file():
210
+ total_size += file.stat().st_size
211
+
212
+ return {
213
+ **self.stats,
214
+ "size_bytes": total_size,
215
+ "size_mb": round(total_size / (1024 * 1024), 2),
216
+ "hit_rate": round(self.stats["hits"] / max(1, self.stats["hits"] + self.stats["misses"]) * 100, 2)
217
+ }
218
+
219
+ def calculate_checksum(self, file_path: str) -> str:
220
+ """Dosyanın SHA-256 checksum'unu hesaplar ve cache'ler"""
221
+ cache_key = hashlib.md5(file_path.encode()).hexdigest()
222
+ cached_checksum = self.get(cache_key, "checksum", max_age=86400) # 24 saat
223
+
224
+ if cached_checksum:
225
+ return cached_checksum
226
+
227
+ # Checksum hesapla
228
+ sha256_hash = hashlib.sha256()
229
+ with open(file_path, "rb") as f:
230
+ for chunk in iter(lambda: f.read(4096), b""):
231
+ sha256_hash.update(chunk)
232
+
233
+ checksum = sha256_hash.hexdigest()
234
+ self.set(cache_key, checksum, "checksum")
235
+
236
+ return checksum
237
+
238
+ def cache_package_metadata(self, package_path: str, metadata: Dict[str, Any]) -> bool:
239
+ """Paket meta verilerini cache'ler"""
240
+ cache_key = hashlib.md5(package_path.encode()).hexdigest()
241
+ return self.set(cache_key, metadata, "metadata")
242
+
243
+ def get_cached_package_metadata(self, package_path: str) -> Optional[Dict[str, Any]]:
244
+ """Cache'lenmiş paket meta verilerini alır"""
245
+ cache_key = hashlib.md5(package_path.encode()).hexdigest()
246
+ return self.get(cache_key, "metadata", max_age=3600) # 1 saat
247
+
248
+ def cache_registry_data(self, registry_url: str, data: List[Dict[str, Any]]) -> bool:
249
+ """Registry verilerini cache'ler"""
250
+ cache_key = hashlib.md5(registry_url.encode()).hexdigest()
251
+ return self.set(cache_key, data, "registry")
252
+
253
+ def get_cached_registry_data(self, registry_url: str) -> Optional[List[Dict[str, Any]]]:
254
+ """Cache'lenmiş registry verilerini alır"""
255
+ cache_key = hashlib.md5(registry_url.encode()).hexdigest()
256
+ return self.get(cache_key, "registry", max_age=1800) # 30 dakika
257
+
258
+ class ParallelDownloader:
259
+ """Paralel indirme yöneticisi"""
260
+
261
+ def __init__(self, max_workers: int = 4):
262
+ """
263
+ ParallelDownloader başlatıcısı
264
+
265
+ Args:
266
+ max_workers: Maksimum paralel işçi sayısı
267
+ """
268
+ self.max_workers = max_workers
269
+ self.session = requests.Session()
270
+ self.session.headers.update({
271
+ 'User-Agent': 'clapp-package-manager/1.0'
272
+ })
273
+
274
+ def download_file(self, url: str, destination: str) -> Tuple[bool, str]:
275
+ """Tek dosya indirir"""
276
+ try:
277
+ response = self.session.get(url, stream=True, timeout=30)
278
+ response.raise_for_status()
279
+
280
+ with open(destination, 'wb') as f:
281
+ for chunk in response.iter_content(chunk_size=8192):
282
+ f.write(chunk)
283
+
284
+ return True, f"Dosya indirildi: {destination}"
285
+
286
+ except Exception as e:
287
+ return False, f"İndirme hatası: {str(e)}"
288
+
289
+ def download_files_parallel(self, download_tasks: List[Tuple[str, str]]) -> List[Tuple[bool, str]]:
290
+ """
291
+ Birden fazla dosyayı paralel indirir
292
+
293
+ Args:
294
+ download_tasks: [(url, destination), ...] listesi
295
+
296
+ Returns:
297
+ [(success, message), ...] listesi
298
+ """
299
+ results = []
300
+
301
+ with concurrent.futures.ThreadPoolExecutor(max_workers=self.max_workers) as executor:
302
+ # İndirme görevlerini başlat
303
+ future_to_task = {
304
+ executor.submit(self.download_file, url, dest): (url, dest)
305
+ for url, dest in download_tasks
306
+ }
307
+
308
+ # Sonuçları topla
309
+ for future in concurrent.futures.as_completed(future_to_task):
310
+ task = future_to_task[future]
311
+ try:
312
+ result = future.result()
313
+ results.append(result)
314
+ except Exception as e:
315
+ results.append((False, f"İndirme hatası: {str(e)}"))
316
+
317
+ return results
318
+
319
+ # Cache decorator
320
+ def cached(max_age: int = 3600, cache_type: str = "metadata"):
321
+ """Cache decorator'ı"""
322
+ def decorator(func):
323
+ @wraps(func)
324
+ def wrapper(*args, **kwargs):
325
+ # Cache anahtarı oluştur
326
+ cache_key = f"{func.__name__}_{hash(str(args) + str(sorted(kwargs.items())))}"
327
+
328
+ # Cache manager oluştur
329
+ cache_manager = CacheManager()
330
+
331
+ # Cache'den kontrol et
332
+ cached_result = cache_manager.get(cache_key, cache_type, max_age)
333
+ if cached_result is not None:
334
+ return cached_result
335
+
336
+ # Fonksiyonu çalıştır
337
+ result = func(*args, **kwargs)
338
+
339
+ # Sonucu cache'le
340
+ cache_manager.set(cache_key, result, cache_type)
341
+
342
+ return result
343
+ return wrapper
344
+ return decorator
345
+
346
+ # Yardımcı fonksiyonlar
347
+ def create_cache_manager() -> CacheManager:
348
+ """Varsayılan ayarlarla CacheManager oluşturur"""
349
+ return CacheManager()
350
+
351
+ def create_parallel_downloader(max_workers: int = 4) -> ParallelDownloader:
352
+ """ParallelDownloader oluşturur"""
353
+ return ParallelDownloader(max_workers)
354
+
355
+ def get_cache_stats() -> Dict[str, Any]:
356
+ """Cache istatistiklerini alır"""
357
+ cache_manager = create_cache_manager()
358
+ return cache_manager.get_stats()
359
+
360
+ def clear_all_caches() -> int:
361
+ """Tüm cache'leri temizler"""
362
+ cache_manager = create_cache_manager()
363
+ return cache_manager.clear()
364
+
365
+ def download_packages_parallel(package_urls: List[str], destination_dir: str) -> List[Tuple[bool, str]]:
366
+ """Paketleri paralel indirir"""
367
+ downloader = create_parallel_downloader()
368
+
369
+ # İndirme görevlerini hazırla
370
+ download_tasks = []
371
+ for url in package_urls:
372
+ filename = os.path.basename(url)
373
+ destination = os.path.join(destination_dir, filename)
374
+ download_tasks.append((url, destination))
375
+
376
+ return downloader.download_files_parallel(download_tasks)
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "app_name": "clapp",
3
- "version": "1.0.17",
3
+ "version": "1.0.19",
4
4
  "author": "Melih Burak Memiş",
5
5
  "description": "Basit ve güçlü paket yöneticisi",
6
6
  "source": "https://github.com/melihburak/clapp",
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: clapp-pm
3
- Version: 1.0.17
3
+ Version: 1.0.19
4
4
  Summary: Lightweight cross-language app manager for Python and Lua
5
5
  Home-page: https://github.com/mburakmmm/clapp
6
6
  Author: Melih Burak Memiş
@@ -1,25 +1,29 @@
1
+ cache_manager.py,sha256=HdQ3vnZO_YP0vyotzjP5wozltVNgkJAxrvYFXhGLGCI,13287
1
2
  check_env.py,sha256=9O8CrdWGcxd_WBV5bsAAZG9iAaiO-nGYDYY-gYZ9G3M,4132
2
3
  clapp_core.py,sha256=5tkzt7J4GKSv7Chv5Zoe9N0dv_sWlYGqYxmIn3dhEPY,1764
3
4
  clean_command.py,sha256=nmzitkdNo0Ovgi-tGPUxa9mkAIFzwEzGNaTm82MUdvw,6806
4
- cli_commands.py,sha256=7tXrBE0pPkuaFIbsIGXg3RxH7GwisL-Zz2N2oMGe2GQ,12682
5
+ cli_commands.py,sha256=CLKimHefiMjXzBfS4wHiG1tj7C54BpwVIlVU_fDjRqI,12740
5
6
  dependency_resolver.py,sha256=OyzWOW45OWTr8BX0gcy5fFbk9qIVBP9JQyMtXrKPmEM,24499
6
7
  doctor_command.py,sha256=8Tv_em4mp-ibaDPXli6uyhYV--Fb6lHyDnnS2S0_d7c,7654
7
8
  info_command.py,sha256=b74Pl1-x_PSezALx-lS3FkEcVNTF7a9McTKk5XTDhjM,5629
8
9
  install_command.py,sha256=1Ogy_4nOsnLXzoUBys9yeLf5jKkGv9C40wuGZo2COC0,9445
9
10
  installer.py,sha256=EkQ5Z1Cq_Z5u_Ssv2Nc8hryI5E97x4D1QVjSqEHe0dE,10619
10
11
  list_command.py,sha256=qbeocvrg2eXRklxbYS3audQhYHGXTlMBk_tNh1cMxd0,8391
11
- main.py,sha256=qunqz-FMwmnyat5bLP3YpZLkyCcEgL7vuUsY3UTDJpc,14493
12
- manifest_schema.py,sha256=IxfKuYgcIhILJrDMOm5vjSJn2jp7hPpUoxtjPMCPvbE,2201
13
- manifest_validator.py,sha256=MTI6c_sYfVakQ6aQUu5_qkukTh4H1FcSrT4uRdE6xIg,7990
12
+ main.py,sha256=uf2-LzBBFIwIiyg1kcyZG4J1B9f5U33VHieBXu1uLi8,23889
13
+ manifest_schema.py,sha256=qR6dIpYL1zwAJmrij05gkgE_urN3qVamoUi2BgR7Lv4,2801
14
+ manifest_validator.py,sha256=JW0mETHDQCSMhodZ5sntr5KPU8T5LYv4IiVoAp4zOIY,8092
14
15
  package_registry.py,sha256=Rco15cvz-6lpCEDdCzwGZNCKtvVhlFIsEPy-WFAESMM,4233
15
- package_runner.py,sha256=jbn9OJDU4p-v63dO66C5EBSbT0dlWQIjtp7x2VE6lU0,2758
16
+ package_runner.py,sha256=GqLPlQRxh7g3bDgGDSVpmHdeRXaP5f6s8kp8QVnw5LM,5783
17
+ package_signing.py,sha256=ModMAzLk08rkI6zd8QKhyCH5BFbB-7dy8pwqKYatFQo,4579
16
18
  post_install_hint.py,sha256=wjMPCgRurZiGu6hv_se-XA36KqBCdeYdRCD1q7FrJzQ,4918
17
19
  publish_command.py,sha256=P05AFbu_mxcc1yAiwShN5Yi9PX1o_7TFXD1mowJcqJE,8589
18
20
  remote_registry.py,sha256=rPBIM_ESXUt0br5cARQ4YbzUoTda0G4e1KGzfyYMbpQ,8235
21
+ smart_search.py,sha256=R5O5CDXqlQc-N-6R6D5k36_-arCB-wnKfmWr5zMYWUI,15741
19
22
  uninstall_command.py,sha256=rQYbZ-XMw8Xxw1fmgGdDaBQmgBGqyJ_rTBZkvEV5HV0,7066
20
23
  validate_command.py,sha256=idaujErzrwuZNT6DYCVTVwZqBDEEi1GTxIXAGBgKMKM,7623
21
- version.py,sha256=XEqhZyhyLhrZuumzeLRv8V-qUr6ZnhBflxUqeJoa5O8,224
24
+ version.py,sha256=OnZFRa6JP1bAWkOBVf8P5NTFNziBsBUhGuKbE1Kzuy4,224
22
25
  version_command.py,sha256=DZuYWtohSeM5PJNYCflBy36_k0vex3tYV2C8ixEA9ho,4259
26
+ version_manager.py,sha256=fpC7jxhIW1wZhJ9IkVwyqkgJN4mhBjUUbaLefXLDMiM,11423
23
27
  where_command.py,sha256=TcLoXLGmrPSHQuvlceVuuKBsfeadIwz-E0G_5okH14g,6420
24
28
  backup_current/build_index.py,sha256=8yKrUnh1Wre31Jt-kgMRxLiW6AIWpmZoNR4wEwAsP2E,4195
25
29
  backup_current/check_env.py,sha256=5DJwdALpRe1TLbzF_Zta-zD312J065-pPmsJZ17xRDg,4425
@@ -56,16 +60,25 @@ clapp-packages-repo/packages/test-app/main.py,sha256=rN4Zo9u53bIVjcUlul059knx6v-
56
60
  clapp-packages-repo/packages/test-app/manifest.json,sha256=kJe4sjYdPRNZD5hEeca80jj3lxeEWBMJoZ59RW7tiKI,118
57
61
  clapp-packages-repo/packages/test-app2/main.py,sha256=lHkbjTmehFY4VuYYF2dYiVBH7W0oqHHeY0I5W85iPTY,35
58
62
  clapp-packages-repo/packages/test-app2/manifest.json,sha256=vshXJrtRxBc_ISM6E8KT5BSmveMbjWszenlgxgSN86w,121
59
- clapp_pm-1.0.17.data/data/version.json,sha256=TYr5wHOVYMNqBf1po8leLbZ-0Wct7oI6pUTr4bB3WvY,239
60
- clapp_pm-1.0.17.dist-info/licenses/LICENSE,sha256=_hryv9pKR6udRexceUYuoYCJGmYBz7e-vRuFWmm38UY,1075
63
+ clapp_pm-1.0.19.data/data/version.json,sha256=XPwOQqKgrCzt75qizoYTYTOOtnYG9KEw9v0kX_E7OV0,239
64
+ clapp_pm-1.0.19.dist-info/licenses/LICENSE,sha256=_hryv9pKR6udRexceUYuoYCJGmYBz7e-vRuFWmm38UY,1075
65
+ docs/developer_guide.md,sha256=B-S141TSNy7e8T9KaV6Fr-ZAFhYqqgcwqWijjX0C2Xc,7336
61
66
  packages/hello-python/main.py,sha256=Dy-Ov-Vumj8oQYI6qKWU6fIKD0gCB8b7KzAJVrGyLMg,1429
62
67
  packages/hello-python/manifest.json,sha256=fJOVJk_2rwpRJ6IeWMPieklJD3gAR279jvuqRH69s90,179
63
68
  packages/test-app/main.py,sha256=rN4Zo9u53bIVjcUlul059knx6v-2Cd1MFftPS57FIRU,33
64
69
  packages/test-app/manifest.json,sha256=kJe4sjYdPRNZD5hEeca80jj3lxeEWBMJoZ59RW7tiKI,118
65
70
  packages/test-app2/main.py,sha256=lHkbjTmehFY4VuYYF2dYiVBH7W0oqHHeY0I5W85iPTY,35
66
71
  packages/test-app2/manifest.json,sha256=vshXJrtRxBc_ISM6E8KT5BSmveMbjWszenlgxgSN86w,121
67
- clapp_pm-1.0.17.dist-info/METADATA,sha256=QNDy_t4uA1R1bkqK17lFNvRCS2z1ik_nMnY345JyOdY,3980
68
- clapp_pm-1.0.17.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
69
- clapp_pm-1.0.17.dist-info/entry_points.txt,sha256=7j-3pQVpQfnaVzUV83g7zlCA30ePlnXkhHLAGGz9xrQ,36
70
- clapp_pm-1.0.17.dist-info/top_level.txt,sha256=xNs9KmF0kILnBLPWg1VS_nhG2G0lbzy06AInJkq1Ilo,374
71
- clapp_pm-1.0.17.dist-info/RECORD,,
72
+ templates/dart/manifest.json,sha256=ycVKZxrArzcSoRZ5LKKe8aOerwk5Z-7VX0td86aim0M,267
73
+ templates/lua/manifest.json,sha256=CRIy0dP6Pr3vH6IV4dObGs4KqqJ_sURsY0wAgK2av7E,262
74
+ templates/python/README.md,sha256=AqVgCZ-cwXBuDHFoJdYkAHAuB6SjSjqXQrjhLu0q7cc,964
75
+ templates/python/main.py,sha256=24IEuyHSuPWJp2-xYhInUNEWqeueGxAO3NBgHkEgLdQ,1562
76
+ templates/python/manifest.json,sha256=hjmKqsEkWEBTwxFgm35MkvuwWZ2CQWq9Zo8uHodqHrE,273
77
+ test-app/README.md,sha256=AqVgCZ-cwXBuDHFoJdYkAHAuB6SjSjqXQrjhLu0q7cc,964
78
+ test-app/main.py,sha256=24IEuyHSuPWJp2-xYhInUNEWqeueGxAO3NBgHkEgLdQ,1562
79
+ test-app/manifest.json,sha256=MM1nl5Bljrnsik3fwsrgFBchfgwIb2REoBwwzNpFHQU,284
80
+ clapp_pm-1.0.19.dist-info/METADATA,sha256=iuBWYnuIEotxHmSd-FXUKu15kOJNUPYoIGG7Udzncsk,3980
81
+ clapp_pm-1.0.19.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
82
+ clapp_pm-1.0.19.dist-info/entry_points.txt,sha256=7j-3pQVpQfnaVzUV83g7zlCA30ePlnXkhHLAGGz9xrQ,36
83
+ clapp_pm-1.0.19.dist-info/top_level.txt,sha256=sXrnwBW_jVjAEv4wOWMwbUXRZ22PpUseU9O9XOnCtFY,457
84
+ clapp_pm-1.0.19.dist-info/RECORD,,
@@ -1,10 +1,12 @@
1
1
  backup_current
2
+ cache_manager
2
3
  check_env
3
4
  clapp-packages-repo
4
5
  clapp_core
5
6
  clean_command
6
7
  cli_commands
7
8
  dependency_resolver
9
+ docs
8
10
  doctor_command
9
11
  info_command
10
12
  install_command
@@ -15,12 +17,17 @@ manifest_schema
15
17
  manifest_validator
16
18
  package_registry
17
19
  package_runner
20
+ package_signing
18
21
  packages
19
22
  post_install_hint
20
23
  publish_command
21
24
  remote_registry
25
+ smart_search
26
+ templates
27
+ test-app
22
28
  uninstall_command
23
29
  validate_command
24
30
  version
25
31
  version_command
32
+ version_manager
26
33
  where_command
cli_commands.py CHANGED
@@ -118,7 +118,11 @@ def list_installed_apps(format_type="table", language_filter=None, search_term=N
118
118
  tuple: (success: bool, message: str)
119
119
  """
120
120
  try:
121
- output = list_apps(format_type, language_filter, search_term)
121
+ output = list_apps(
122
+ format_type,
123
+ language_filter or "",
124
+ search_term or ""
125
+ )
122
126
  print(output)
123
127
  return True, "Liste gösterildi"
124
128
  except Exception as e: