clapp-pm 1.0.17__py3-none-any.whl → 1.0.18__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 +376 -0
- {clapp_pm-1.0.17.data → clapp_pm-1.0.18.data}/data/version.json +1 -1
- {clapp_pm-1.0.17.dist-info → clapp_pm-1.0.18.dist-info}/METADATA +1 -1
- {clapp_pm-1.0.17.dist-info → clapp_pm-1.0.18.dist-info}/RECORD +13 -9
- {clapp_pm-1.0.17.dist-info → clapp_pm-1.0.18.dist-info}/top_level.txt +4 -0
- main.py +183 -0
- package_signing.py +370 -0
- smart_search.py +451 -0
- version.py +1 -1
- version_manager.py +351 -0
- {clapp_pm-1.0.17.dist-info → clapp_pm-1.0.18.dist-info}/WHEEL +0 -0
- {clapp_pm-1.0.17.dist-info → clapp_pm-1.0.18.dist-info}/entry_points.txt +0 -0
- {clapp_pm-1.0.17.dist-info → clapp_pm-1.0.18.dist-info}/licenses/LICENSE +0 -0
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)
|
File without changes
|
File without changes
|
File without changes
|