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.
test-app/manifest.json ADDED
@@ -0,0 +1,15 @@
1
+ {
2
+ "name": "test-app",
3
+ "version": "1.0.0",
4
+ "language": "python",
5
+ "entry": "main.py",
6
+ "description": "Basit bir Python Hello World uygulaması",
7
+ "author": "clapp Developer",
8
+ "license": "MIT",
9
+ "tags": [
10
+ "example",
11
+ "hello",
12
+ "python"
13
+ ],
14
+ "category": "demo"
15
+ }
version.py CHANGED
@@ -2,7 +2,7 @@
2
2
  Version information for clapp-pm package.
3
3
  """
4
4
 
5
- __version__ = "1.0.17"
5
+ __version__ = "1.0.19"
6
6
  __author__ = "Melih Burak Memiş"
7
7
  __email__ = "mburakmemiscy@gmail.com"
8
8
  __description__ = "Lightweight cross-language app manager for Python and Lua"
version_manager.py ADDED
@@ -0,0 +1,351 @@
1
+ #!/usr/bin/env python3
2
+ """
3
+ version_manager.py - Gelişmiş Versiyon Yönetimi Sistemi
4
+
5
+ Bu modül clapp paketlerinin versiyon yönetimini sağlar:
6
+ - Semantic versioning
7
+ - Versiyon karşılaştırma
8
+ - Otomatik versiyon artırma
9
+ - Versiyon geçmişi
10
+ - Güncelleme kontrolü
11
+ """
12
+
13
+ import os
14
+ import json
15
+ import re
16
+ import requests
17
+ from typing import Dict, List, Tuple, Optional, Any
18
+ from packaging import version as pkg_version
19
+ from datetime import datetime, timezone
20
+
21
+ class VersionManager:
22
+ """Gelişmiş versiyon yönetimi sınıfı"""
23
+
24
+ def __init__(self, registry_url: str = "https://raw.githubusercontent.com/mburakmmm/clapp-packages/main/index.json"):
25
+ """
26
+ VersionManager başlatıcısı
27
+
28
+ Args:
29
+ registry_url: Paket registry URL'si
30
+ """
31
+ self.registry_url = registry_url
32
+ self.cache_file = os.path.join(os.path.expanduser("~"), ".clapp", "version_cache.json")
33
+ self._ensure_cache_dir()
34
+
35
+ def _ensure_cache_dir(self):
36
+ """Cache dizinini oluşturur"""
37
+ cache_dir = os.path.dirname(self.cache_file)
38
+ os.makedirs(cache_dir, exist_ok=True)
39
+
40
+ def parse_version(self, version_string: str) -> pkg_version.Version:
41
+ """
42
+ Versiyon string'ini parse eder
43
+
44
+ Args:
45
+ version_string: Versiyon string'i (örn: "1.2.3")
46
+
47
+ Returns:
48
+ Version objesi
49
+ """
50
+ try:
51
+ return pkg_version.parse(version_string)
52
+ except pkg_version.InvalidVersion:
53
+ raise ValueError(f"Geçersiz versiyon formatı: {version_string}")
54
+
55
+ def compare_versions(self, version1: str, version2: str) -> int:
56
+ """
57
+ İki versiyonu karşılaştırır
58
+
59
+ Args:
60
+ version1: İlk versiyon
61
+ version2: İkinci versiyon
62
+
63
+ Returns:
64
+ -1: version1 < version2
65
+ 0: version1 == version2
66
+ 1: version1 > version2
67
+ """
68
+ v1 = self.parse_version(version1)
69
+ v2 = self.parse_version(version2)
70
+
71
+ if v1 < v2:
72
+ return -1
73
+ elif v1 == v2:
74
+ return 0
75
+ else:
76
+ return 1
77
+
78
+ def increment_version(self, current_version: str, increment_type: str = "patch") -> str:
79
+ """
80
+ Versiyonu artırır
81
+
82
+ Args:
83
+ current_version: Mevcut versiyon
84
+ increment_type: Artırma tipi ("major", "minor", "patch")
85
+
86
+ Returns:
87
+ Yeni versiyon
88
+ """
89
+ v = self.parse_version(current_version)
90
+
91
+ if increment_type == "major":
92
+ return f"{v.major + 1}.0.0"
93
+ elif increment_type == "minor":
94
+ return f"{v.major}.{v.minor + 1}.0"
95
+ elif increment_type == "patch":
96
+ return f"{v.major}.{v.minor}.{v.micro + 1}"
97
+ else:
98
+ raise ValueError(f"Geçersiz artırma tipi: {increment_type}")
99
+
100
+ def get_latest_version(self, app_name: str) -> Optional[str]:
101
+ """
102
+ Uygulamanın en son versiyonunu alır
103
+
104
+ Args:
105
+ app_name: Uygulama adı
106
+
107
+ Returns:
108
+ En son versiyon veya None
109
+ """
110
+ try:
111
+ # Cache'den kontrol et
112
+ cached_data = self._load_cache()
113
+ if app_name in cached_data:
114
+ cache_time = cached_data[app_name].get("timestamp", 0)
115
+ # 1 saat cache geçerli
116
+ if datetime.now().timestamp() - cache_time < 3600:
117
+ return cached_data[app_name].get("latest_version")
118
+
119
+ # Registry'den al
120
+ registry_data = self._fetch_registry()
121
+ if not registry_data:
122
+ return None
123
+
124
+ # Uygulamayı bul
125
+ app_info = None
126
+ for app in registry_data:
127
+ if app.get("name") == app_name:
128
+ app_info = app
129
+ break
130
+
131
+ if not app_info:
132
+ return None
133
+
134
+ latest_version = app_info.get("version", "0.0.0")
135
+
136
+ # Cache'e kaydet
137
+ self._update_cache(app_name, latest_version)
138
+
139
+ return latest_version
140
+
141
+ except Exception as e:
142
+ print(f"Versiyon kontrolü hatası: {e}")
143
+ return None
144
+
145
+ def check_for_updates(self, app_name: str, current_version: str) -> Dict[str, Any]:
146
+ """
147
+ Uygulama güncellemelerini kontrol eder
148
+
149
+ Args:
150
+ app_name: Uygulama adı
151
+ current_version: Mevcut versiyon
152
+
153
+ Returns:
154
+ Güncelleme bilgileri
155
+ """
156
+ latest_version = self.get_latest_version(app_name)
157
+
158
+ if not latest_version:
159
+ return {
160
+ "has_update": False,
161
+ "current_version": current_version,
162
+ "latest_version": None,
163
+ "update_type": None,
164
+ "message": "Versiyon bilgisi alınamadı"
165
+ }
166
+
167
+ comparison = self.compare_versions(current_version, latest_version)
168
+
169
+ if comparison < 0:
170
+ # Güncelleme var
171
+ update_type = self._determine_update_type(current_version, latest_version)
172
+ return {
173
+ "has_update": True,
174
+ "current_version": current_version,
175
+ "latest_version": latest_version,
176
+ "update_type": update_type,
177
+ "message": f"Güncelleme mevcut: {current_version} → {latest_version}"
178
+ }
179
+ else:
180
+ return {
181
+ "has_update": False,
182
+ "current_version": current_version,
183
+ "latest_version": latest_version,
184
+ "update_type": None,
185
+ "message": "En son versiyon kullanılıyor"
186
+ }
187
+
188
+ def _determine_update_type(self, current_version: str, latest_version: str) -> str:
189
+ """Güncelleme tipini belirler"""
190
+ current = self.parse_version(current_version)
191
+ latest = self.parse_version(latest_version)
192
+
193
+ if latest.major > current.major:
194
+ return "major"
195
+ elif latest.minor > current.minor:
196
+ return "minor"
197
+ else:
198
+ return "patch"
199
+
200
+ def get_version_history(self, app_name: str) -> List[Dict[str, Any]]:
201
+ """
202
+ Uygulama versiyon geçmişini alır
203
+
204
+ Args:
205
+ app_name: Uygulama adı
206
+
207
+ Returns:
208
+ Versiyon geçmişi
209
+ """
210
+ try:
211
+ registry_data = self._fetch_registry()
212
+ if not registry_data:
213
+ return []
214
+
215
+ # Uygulamayı bul
216
+ app_info = None
217
+ for app in registry_data:
218
+ if app.get("name") == app_name:
219
+ app_info = app
220
+ break
221
+
222
+ if not app_info:
223
+ return []
224
+
225
+ # Şimdilik sadece mevcut versiyonu döndür
226
+ # Gelecekte GitHub releases'den alınabilir
227
+ return [{
228
+ "version": app_info.get("version", "0.0.0"),
229
+ "release_date": app_info.get("release_date", "Unknown"),
230
+ "description": app_info.get("description", ""),
231
+ "changes": app_info.get("changelog", [])
232
+ }]
233
+
234
+ except Exception as e:
235
+ print(f"Versiyon geçmişi hatası: {e}")
236
+ return []
237
+
238
+ def validate_version_format(self, version_string: str) -> bool:
239
+ """
240
+ Versiyon formatını doğrular
241
+
242
+ Args:
243
+ version_string: Versiyon string'i
244
+
245
+ Returns:
246
+ Geçerliyse True
247
+ """
248
+ try:
249
+ self.parse_version(version_string)
250
+ return True
251
+ except ValueError:
252
+ return False
253
+
254
+ def get_version_info(self, version_string: str) -> Dict[str, Any]:
255
+ """
256
+ Versiyon hakkında detaylı bilgi verir
257
+
258
+ Args:
259
+ version_string: Versiyon string'i
260
+
261
+ Returns:
262
+ Versiyon bilgileri
263
+ """
264
+ try:
265
+ v = self.parse_version(version_string)
266
+ return {
267
+ "major": v.major,
268
+ "minor": v.minor,
269
+ "micro": v.micro,
270
+ "is_prerelease": v.is_prerelease,
271
+ "is_devrelease": v.is_devrelease,
272
+ "is_postrelease": v.is_postrelease,
273
+ "epoch": v.epoch,
274
+ "local": v.local,
275
+ "public": v.public
276
+ }
277
+ except ValueError as e:
278
+ return {"error": str(e)}
279
+
280
+ def _fetch_registry(self) -> Optional[List[Dict]]:
281
+ """Registry'den veri alır"""
282
+ try:
283
+ response = requests.get(self.registry_url, timeout=10)
284
+ response.raise_for_status()
285
+ return response.json()
286
+ except Exception as e:
287
+ print(f"Registry fetch hatası: {e}")
288
+ return None
289
+
290
+ def _load_cache(self) -> Dict:
291
+ """Cache'i yükler"""
292
+ try:
293
+ if os.path.exists(self.cache_file):
294
+ with open(self.cache_file, 'r', encoding='utf-8') as f:
295
+ return json.load(f)
296
+ except Exception:
297
+ pass
298
+ return {}
299
+
300
+ def _update_cache(self, app_name: str, latest_version: str):
301
+ """Cache'i günceller"""
302
+ try:
303
+ cache_data = self._load_cache()
304
+ cache_data[app_name] = {
305
+ "latest_version": latest_version,
306
+ "timestamp": datetime.now().timestamp()
307
+ }
308
+
309
+ with open(self.cache_file, 'w', encoding='utf-8') as f:
310
+ json.dump(cache_data, f, indent=2)
311
+ except Exception as e:
312
+ print(f"Cache güncelleme hatası: {e}")
313
+
314
+ def clear_cache(self):
315
+ """Cache'i temizler"""
316
+ try:
317
+ if os.path.exists(self.cache_file):
318
+ os.remove(self.cache_file)
319
+ print("✅ Versiyon cache temizlendi")
320
+ except Exception as e:
321
+ print(f"Cache temizleme hatası: {e}")
322
+
323
+ # Yardımcı fonksiyonlar
324
+ def create_version_manager() -> VersionManager:
325
+ """Varsayılan ayarlarla VersionManager oluşturur"""
326
+ return VersionManager()
327
+
328
+ def check_app_updates(app_name: str, current_version: str) -> Dict[str, Any]:
329
+ """Uygulama güncellemelerini kontrol eder"""
330
+ vm = create_version_manager()
331
+ return vm.check_for_updates(app_name, current_version)
332
+
333
+ def get_app_latest_version(app_name: str) -> Optional[str]:
334
+ """Uygulamanın en son versiyonunu alır"""
335
+ vm = create_version_manager()
336
+ return vm.get_latest_version(app_name)
337
+
338
+ def compare_app_versions(version1: str, version2: str) -> int:
339
+ """İki versiyonu karşılaştırır"""
340
+ vm = create_version_manager()
341
+ return vm.compare_versions(version1, version2)
342
+
343
+ def increment_app_version(current_version: str, increment_type: str = "patch") -> str:
344
+ """Versiyonu artırır"""
345
+ vm = create_version_manager()
346
+ return vm.increment_version(current_version, increment_type)
347
+
348
+ def validate_app_version(version_string: str) -> bool:
349
+ """Versiyon formatını doğrular"""
350
+ vm = create_version_manager()
351
+ return vm.validate_version_format(version_string)