pyappify 0.0.5__tar.gz → 1.0.1__tar.gz
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.
- {pyappify-0.0.5 → pyappify-1.0.1}/PKG-INFO +1 -1
- {pyappify-0.0.5 → pyappify-1.0.1}/pyappify/__init__.py +43 -10
- {pyappify-0.0.5 → pyappify-1.0.1}/pyappify.egg-info/PKG-INFO +1 -1
- {pyappify-0.0.5 → pyappify-1.0.1}/pyappify.egg-info/SOURCES.txt +2 -1
- {pyappify-0.0.5 → pyappify-1.0.1}/pyproject.toml +1 -1
- pyappify-1.0.1/tests/TestVersion.py +33 -0
- {pyappify-0.0.5 → pyappify-1.0.1}/pyappify/main.py +0 -0
- {pyappify-0.0.5 → pyappify-1.0.1}/pyappify.egg-info/dependency_links.txt +0 -0
- {pyappify-0.0.5 → pyappify-1.0.1}/pyappify.egg-info/entry_points.txt +0 -0
- {pyappify-0.0.5 → pyappify-1.0.1}/pyappify.egg-info/requires.txt +0 -0
- {pyappify-0.0.5 → pyappify-1.0.1}/pyappify.egg-info/top_level.txt +0 -0
- {pyappify-0.0.5 → pyappify-1.0.1}/setup.cfg +0 -0
|
@@ -74,37 +74,47 @@ def hide_pyappify():
|
|
|
74
74
|
pass
|
|
75
75
|
|
|
76
76
|
def upgrade(to_version, executable_sha256, executable_zip_urls, stop_event=None):
|
|
77
|
-
if not pyappify_upgradeable or (to_version
|
|
77
|
+
if not pyappify_upgradeable or not is_greater_version(to_version, pyappify_version):
|
|
78
|
+
if logger:
|
|
79
|
+
logger.info(f"pyappify no need to upgrade {pyappify_upgradeable} {to_version} {executable_sha256} {executable_zip_urls}")
|
|
78
80
|
return
|
|
79
|
-
|
|
81
|
+
if logger:
|
|
82
|
+
logger.info(
|
|
83
|
+
f"pyappify start to upgrade {pyappify_upgradeable} {to_version} {executable_sha256} {executable_zip_urls}")
|
|
80
84
|
def _do_upgrade():
|
|
81
|
-
tmp_dir = os.path.join(os.getcwd(), "
|
|
85
|
+
tmp_dir = os.path.join(os.getcwd(), "pyappify_tmp")
|
|
82
86
|
try:
|
|
83
87
|
os.makedirs(tmp_dir, exist_ok=True)
|
|
84
88
|
downloaded_zip_path = None
|
|
85
89
|
for url in executable_zip_urls:
|
|
86
90
|
try:
|
|
91
|
+
if logger:
|
|
92
|
+
logger.info(
|
|
93
|
+
f"pyappify start to download {url}")
|
|
87
94
|
local_zip_path = os.path.join(tmp_dir, os.path.basename(url))
|
|
88
95
|
with urllib.request.urlopen(url) as response, open(local_zip_path, 'wb') as out_file:
|
|
89
96
|
while True:
|
|
90
97
|
if stop_event and stop_event.is_set():
|
|
91
98
|
if logger:
|
|
92
|
-
logger.info("Upgrade download cancelled by stop event.")
|
|
99
|
+
logger.info("pyappify Upgrade download cancelled by stop event.")
|
|
93
100
|
return
|
|
94
101
|
chunk = response.read(8192)
|
|
95
102
|
if not chunk:
|
|
96
103
|
break
|
|
97
104
|
out_file.write(chunk)
|
|
98
105
|
downloaded_zip_path = local_zip_path
|
|
106
|
+
if logger:
|
|
107
|
+
logger.info(
|
|
108
|
+
f"pyappify download success {url}")
|
|
99
109
|
break
|
|
100
110
|
except Exception as e:
|
|
101
111
|
if logger:
|
|
102
|
-
logger.warning(f"Failed to download from {url}: {e}")
|
|
112
|
+
logger.warning(f"pyappify Failed to download from {url}: {e}")
|
|
103
113
|
continue
|
|
104
114
|
|
|
105
115
|
if not downloaded_zip_path:
|
|
106
116
|
if logger:
|
|
107
|
-
logger.error("Failed to download upgrade.")
|
|
117
|
+
logger.error("pyappify Failed to download upgrade.")
|
|
108
118
|
return
|
|
109
119
|
|
|
110
120
|
with zipfile.ZipFile(downloaded_zip_path, 'r') as zip_ref:
|
|
@@ -119,7 +129,7 @@ def upgrade(to_version, executable_sha256, executable_zip_urls, stop_event=None)
|
|
|
119
129
|
|
|
120
130
|
if not found_executable_path:
|
|
121
131
|
if logger:
|
|
122
|
-
logger.error("Executable not found in zip.")
|
|
132
|
+
logger.error("pyappify Executable not found in zip.")
|
|
123
133
|
return
|
|
124
134
|
|
|
125
135
|
sha256_hash = hashlib.sha256()
|
|
@@ -129,18 +139,41 @@ def upgrade(to_version, executable_sha256, executable_zip_urls, stop_event=None)
|
|
|
129
139
|
|
|
130
140
|
if sha256_hash.hexdigest() != executable_sha256:
|
|
131
141
|
if logger:
|
|
132
|
-
logger.error("SHA256 checksum mismatch.")
|
|
142
|
+
logger.error("pyappify SHA256 checksum mismatch.")
|
|
133
143
|
return
|
|
134
144
|
|
|
135
145
|
kill_pyappify()
|
|
136
146
|
shutil.move(found_executable_path, pyappify_executable)
|
|
147
|
+
if logger:
|
|
148
|
+
logger.info(f"pyappify Upgrade success")
|
|
137
149
|
except Exception as e:
|
|
138
150
|
if logger:
|
|
139
|
-
logger.error(f"Upgrade failed: {e}")
|
|
151
|
+
logger.error(f"pyappify Upgrade failed: {e}")
|
|
140
152
|
finally:
|
|
141
153
|
if os.path.exists(tmp_dir):
|
|
142
154
|
shutil.rmtree(tmp_dir)
|
|
143
155
|
|
|
144
156
|
thread = threading.Thread(target=_do_upgrade)
|
|
145
157
|
thread.daemon = True
|
|
146
|
-
thread.start()
|
|
158
|
+
thread.start()
|
|
159
|
+
|
|
160
|
+
def is_greater_version(version1, version2):
|
|
161
|
+
"""
|
|
162
|
+
Compares two semantic version strings.
|
|
163
|
+
|
|
164
|
+
Args:
|
|
165
|
+
version1 (str): The first version string.
|
|
166
|
+
version2 (str): The second version string.
|
|
167
|
+
|
|
168
|
+
Returns:
|
|
169
|
+
bool: True if version1 is strictly greater than version2,
|
|
170
|
+
False otherwise or if parsing fails.
|
|
171
|
+
"""
|
|
172
|
+
try:
|
|
173
|
+
version1 = version1.lstrip('v')
|
|
174
|
+
version2 = version2.lstrip('v')
|
|
175
|
+
v1_parts = [int(p) for p in version1.split('.')]
|
|
176
|
+
v2_parts = [int(p) for p in version2.split('.')]
|
|
177
|
+
return v1_parts > v2_parts
|
|
178
|
+
except (ValueError, AttributeError):
|
|
179
|
+
return False
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
# filename: test_pyappify.is_greater_version.py
|
|
2
|
+
import unittest
|
|
3
|
+
import pyappify
|
|
4
|
+
|
|
5
|
+
class TestIsGreaterVersion(unittest.TestCase):
|
|
6
|
+
|
|
7
|
+
def test_version1_is_greater(self):
|
|
8
|
+
self.assertTrue(pyappify.is_greater_version("2.0.0", "1.9.9"))
|
|
9
|
+
self.assertTrue(pyappify.is_greater_version("1.2.0", "v1.1.9"))
|
|
10
|
+
self.assertTrue(pyappify.is_greater_version("v1.1.2", "1.1.1"))
|
|
11
|
+
self.assertTrue(pyappify.is_greater_version("1.1.0", "1.1"))
|
|
12
|
+
self.assertTrue(pyappify.is_greater_version("v10.0.0", "9.0.0"))
|
|
13
|
+
|
|
14
|
+
def test_version1_is_not_greater(self):
|
|
15
|
+
self.assertFalse(pyappify.is_greater_version("v1.0.0", "2.0.0"))
|
|
16
|
+
self.assertFalse(pyappify.is_greater_version("1.1.0", "v1.2.0"))
|
|
17
|
+
self.assertFalse(pyappify.is_greater_version("1.1.1", "1.1.2"))
|
|
18
|
+
self.assertFalse(pyappify.is_greater_version("1.1", "1.1.0"))
|
|
19
|
+
|
|
20
|
+
def test_versions_are_equal(self):
|
|
21
|
+
self.assertFalse(pyappify.is_greater_version("qwer", "1.0.0"))
|
|
22
|
+
self.assertFalse(pyappify.is_greater_version("1.2.3", "1.2.3"))
|
|
23
|
+
|
|
24
|
+
def test_invalid_or_edge_cases(self):
|
|
25
|
+
self.assertFalse(pyappify.is_greater_version(None, "1.0.0"))
|
|
26
|
+
self.assertFalse(pyappify.is_greater_version("1.0.0", None))
|
|
27
|
+
self.assertFalse(pyappify.is_greater_version(None, None))
|
|
28
|
+
self.assertFalse(pyappify.is_greater_version("v1.a.0", "1.0.0"))
|
|
29
|
+
self.assertFalse(pyappify.is_greater_version("1.0.0", "invalid"))
|
|
30
|
+
self.assertFalse(pyappify.is_greater_version("", "1.0.0"))
|
|
31
|
+
|
|
32
|
+
if __name__ == '__main__':
|
|
33
|
+
unittest.main(argv=['first-arg-is-ignored'], exit=False)
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|