absfuyu 2.8.1__py3-none-any.whl → 3.1.0__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.
Potentially problematic release.
This version of absfuyu might be problematic. Click here for more details.
- absfuyu/__init__.py +13 -10
- absfuyu/__main__.py +55 -38
- absfuyu/config/config.json +3 -3
- absfuyu/core.py +39 -25
- absfuyu/everything.py +4 -5
- absfuyu/extensions/__init__.py +3 -2
- absfuyu/extensions/dev/__init__.py +162 -19
- absfuyu/extensions/dev/password_hash.py +11 -10
- absfuyu/extensions/dev/passwordlib.py +256 -0
- absfuyu/extensions/dev/pkglib.py +53 -57
- absfuyu/extensions/dev/project_starter.py +58 -0
- absfuyu/extensions/dev/shutdownizer.py +8 -0
- absfuyu/extensions/extra/data_analysis.py +687 -119
- absfuyu/fun/__init__.py +88 -118
- absfuyu/fun/tarot.py +32 -34
- absfuyu/game/tictactoe2.py +90 -78
- absfuyu/{collections → general}/__init__.py +14 -12
- absfuyu/{collections → general}/content.py +105 -87
- absfuyu/{collections → general}/data_extension.py +652 -172
- absfuyu/{collections → general}/generator.py +65 -4
- absfuyu/{collections → general}/human.py +28 -3
- absfuyu/pkg_data/__init__.py +14 -36
- absfuyu/pkg_data/chemistry.pkl +0 -0
- absfuyu/pkg_data/tarot.pkl +0 -0
- absfuyu/tools/converter.py +58 -31
- absfuyu/tools/obfuscator.py +4 -4
- absfuyu/tools/stats.py +4 -4
- absfuyu/tools/web.py +2 -2
- absfuyu/util/lunar.py +144 -123
- absfuyu/util/path.py +22 -3
- absfuyu/util/performance.py +101 -14
- absfuyu/version.py +93 -84
- {absfuyu-2.8.1.dist-info → absfuyu-3.1.0.dist-info}/METADATA +63 -33
- absfuyu-3.1.0.dist-info/RECORD +55 -0
- {absfuyu-2.8.1.dist-info → absfuyu-3.1.0.dist-info}/WHEEL +1 -1
- absfuyu-3.1.0.dist-info/entry_points.txt +2 -0
- absfuyu/pkg_data/chemistry.json +0 -6268
- absfuyu/pkg_data/tarot.json +0 -2593
- absfuyu-2.8.1.dist-info/RECORD +0 -52
- absfuyu-2.8.1.dist-info/entry_points.txt +0 -2
- {absfuyu-2.8.1.dist-info → absfuyu-3.1.0.dist-info}/LICENSE +0 -0
- {absfuyu-2.8.1.dist-info → absfuyu-3.1.0.dist-info}/top_level.txt +0 -0
absfuyu/util/performance.py
CHANGED
|
@@ -1,11 +1,10 @@
|
|
|
1
|
-
# -*- coding: utf-8 -*-
|
|
2
1
|
"""
|
|
3
2
|
Absfuyu: Performance
|
|
4
3
|
--------------------
|
|
5
4
|
Performance Check
|
|
6
5
|
|
|
7
|
-
Version: 1.0
|
|
8
|
-
Date updated:
|
|
6
|
+
Version: 1.1.0
|
|
7
|
+
Date updated: 11/12/2023 (dd/mm/yyyy)
|
|
9
8
|
|
|
10
9
|
Feature:
|
|
11
10
|
--------
|
|
@@ -21,16 +20,20 @@ __all__ = [
|
|
|
21
20
|
# Wrapper
|
|
22
21
|
"measure_performance",
|
|
23
22
|
# Functions
|
|
24
|
-
"var_check",
|
|
23
|
+
"var_check",
|
|
24
|
+
"source_this",
|
|
25
25
|
]
|
|
26
26
|
|
|
27
27
|
|
|
28
28
|
# Library
|
|
29
29
|
###########################################################################
|
|
30
30
|
from functools import wraps as __wraps
|
|
31
|
-
from inspect import getsource
|
|
31
|
+
from inspect import getsource
|
|
32
32
|
from time import perf_counter as __perf_counter
|
|
33
33
|
import tracemalloc as __tracemalloc
|
|
34
|
+
from typing import Any, Callable, List, Optional, Tuple, Union
|
|
35
|
+
|
|
36
|
+
from absfuyu.general.data_extension import ListNoDunder
|
|
34
37
|
|
|
35
38
|
|
|
36
39
|
# Function
|
|
@@ -47,7 +50,7 @@ def measure_performance(func):
|
|
|
47
50
|
--------
|
|
48
51
|
>>> @measure_performance
|
|
49
52
|
>>> def test():
|
|
50
|
-
|
|
53
|
+
... return 1 + 1
|
|
51
54
|
>>> test()
|
|
52
55
|
----------------------------------------
|
|
53
56
|
Function: test
|
|
@@ -104,10 +107,20 @@ def measure_performance(func):
|
|
|
104
107
|
return wrapper
|
|
105
108
|
|
|
106
109
|
|
|
107
|
-
def var_check(variable):
|
|
110
|
+
def var_check(variable: Any, full: bool = False):
|
|
108
111
|
"""
|
|
109
112
|
Check a variable
|
|
110
|
-
|
|
113
|
+
|
|
114
|
+
Parameters
|
|
115
|
+
----------
|
|
116
|
+
variable : Any
|
|
117
|
+
Variable that needed to check
|
|
118
|
+
|
|
119
|
+
full : bool
|
|
120
|
+
| ``True``: Shows full detail
|
|
121
|
+
| ``False``: Hides ``dir`` and ``docstring``
|
|
122
|
+
|
|
123
|
+
|
|
111
124
|
Example:
|
|
112
125
|
--------
|
|
113
126
|
>>> test = "test"
|
|
@@ -140,14 +153,22 @@ def var_check(variable):
|
|
|
140
153
|
dict,
|
|
141
154
|
set, frozenset,
|
|
142
155
|
bool,
|
|
143
|
-
bytes,bytearray, memoryview,
|
|
144
|
-
type(None)
|
|
156
|
+
bytes, bytearray, memoryview,
|
|
157
|
+
type(None),
|
|
145
158
|
]
|
|
146
159
|
if type(variable) in lc:
|
|
147
160
|
pass
|
|
148
161
|
else:
|
|
149
162
|
docs = variable.__doc__
|
|
150
|
-
|
|
163
|
+
if full:
|
|
164
|
+
output["docstring"] = docs
|
|
165
|
+
except:
|
|
166
|
+
pass
|
|
167
|
+
|
|
168
|
+
# Dir
|
|
169
|
+
try:
|
|
170
|
+
if full:
|
|
171
|
+
output["dir"] = ListNoDunder(variable.__dir__())
|
|
151
172
|
except:
|
|
152
173
|
pass
|
|
153
174
|
|
|
@@ -155,7 +176,7 @@ def var_check(variable):
|
|
|
155
176
|
return output
|
|
156
177
|
|
|
157
178
|
|
|
158
|
-
def source_this(function) -> str:
|
|
179
|
+
def source_this(function: Callable) -> str:
|
|
159
180
|
"""
|
|
160
181
|
Show the source code of a function
|
|
161
182
|
|
|
@@ -169,10 +190,76 @@ def source_this(function) -> str:
|
|
|
169
190
|
str
|
|
170
191
|
Source code
|
|
171
192
|
"""
|
|
172
|
-
return
|
|
193
|
+
return getsource(function)
|
|
194
|
+
|
|
195
|
+
|
|
196
|
+
# Class
|
|
197
|
+
###########################################################################
|
|
198
|
+
class Checker:
|
|
199
|
+
"""Check a variable"""
|
|
200
|
+
def __init__(self, checker: Any) -> None:
|
|
201
|
+
self.item_to_check = checker
|
|
202
|
+
def __str__(self) -> str:
|
|
203
|
+
return self.item_to_check.__str__()
|
|
204
|
+
def __repr__(self) -> str:
|
|
205
|
+
return f"{self.__class__.__name__}({self.item_to_check})"
|
|
206
|
+
|
|
207
|
+
@property
|
|
208
|
+
def name(self) -> Union[Any, None]:
|
|
209
|
+
try:
|
|
210
|
+
return self.item_to_check.__name__
|
|
211
|
+
except:
|
|
212
|
+
return None
|
|
213
|
+
|
|
214
|
+
@property
|
|
215
|
+
def value(self) -> Any:
|
|
216
|
+
return self.item_to_check
|
|
217
|
+
|
|
218
|
+
@property
|
|
219
|
+
def docstring(self) -> Union[str, None]:
|
|
220
|
+
""":returns: ``self.item_to_check.__doc__``"""
|
|
221
|
+
return self.item_to_check.__doc__
|
|
222
|
+
|
|
223
|
+
@property
|
|
224
|
+
def class_(self) -> Any:
|
|
225
|
+
return type(self.item_to_check)
|
|
226
|
+
|
|
227
|
+
@property
|
|
228
|
+
def id_(self) -> int:
|
|
229
|
+
return id(self.item_to_check)
|
|
230
|
+
|
|
231
|
+
@property
|
|
232
|
+
def dir_(self) -> List[str]:
|
|
233
|
+
""":returns: ``dir(self.item_to_check)``"""
|
|
234
|
+
# return self.item_to_check.__dir__()
|
|
235
|
+
return ListNoDunder(self.item_to_check.__dir__())
|
|
236
|
+
|
|
237
|
+
@property
|
|
238
|
+
def source(self) -> Union[str, None]:
|
|
239
|
+
""":returns: Source code"""
|
|
240
|
+
try:
|
|
241
|
+
return getsource(self.item_to_check)
|
|
242
|
+
except:
|
|
243
|
+
return None
|
|
244
|
+
|
|
245
|
+
def check(self, full: bool = False):
|
|
246
|
+
"""
|
|
247
|
+
Check
|
|
248
|
+
"""
|
|
249
|
+
out = {
|
|
250
|
+
"name": self.name,
|
|
251
|
+
"value": self.value,
|
|
252
|
+
"class": self.class_,
|
|
253
|
+
"id": self.id_,
|
|
254
|
+
}
|
|
255
|
+
if full:
|
|
256
|
+
out["dir"] = self.dir_
|
|
257
|
+
out["docs"] = self.docstring
|
|
258
|
+
out["source"] = self.source
|
|
259
|
+
return out
|
|
173
260
|
|
|
174
261
|
|
|
175
262
|
# Run
|
|
176
263
|
###########################################################################
|
|
177
264
|
if __name__ == "__main__":
|
|
178
|
-
pass
|
|
265
|
+
pass
|
absfuyu/version.py
CHANGED
|
@@ -3,18 +3,23 @@ Absfuyu: Version
|
|
|
3
3
|
----------------
|
|
4
4
|
Package versioning module
|
|
5
5
|
|
|
6
|
-
Version: 2.0.
|
|
7
|
-
Date updated:
|
|
6
|
+
Version: 2.0.4
|
|
7
|
+
Date updated: 25/11/2023 (dd/mm/yyyy)
|
|
8
8
|
"""
|
|
9
9
|
|
|
10
10
|
|
|
11
11
|
# Module level
|
|
12
12
|
###########################################################################
|
|
13
13
|
__all__ = [
|
|
14
|
+
# Version
|
|
14
15
|
"__version__",
|
|
15
|
-
|
|
16
|
-
"
|
|
17
|
-
"
|
|
16
|
+
# Options
|
|
17
|
+
"ReleaseOption",
|
|
18
|
+
"ReleaseLevel",
|
|
19
|
+
# Class
|
|
20
|
+
"Version",
|
|
21
|
+
"Bumper",
|
|
22
|
+
"PkgVersion",
|
|
18
23
|
]
|
|
19
24
|
|
|
20
25
|
# Library
|
|
@@ -36,6 +41,7 @@ class ReleaseOption:
|
|
|
36
41
|
"""
|
|
37
42
|
``MAJOR``, ``MINOR``, ``PATCH``
|
|
38
43
|
"""
|
|
44
|
+
|
|
39
45
|
MAJOR: str = "major"
|
|
40
46
|
MINOR: str = "minor"
|
|
41
47
|
PATCH: str = "patch"
|
|
@@ -45,13 +51,15 @@ class ReleaseOption:
|
|
|
45
51
|
"""Return a list of release options"""
|
|
46
52
|
return [__class__.MAJOR, __class__.MINOR, __class__.PATCH]
|
|
47
53
|
|
|
54
|
+
|
|
48
55
|
class ReleaseLevel:
|
|
49
56
|
"""
|
|
50
57
|
``FINAL``, ``DEV``, ``RC``
|
|
51
58
|
"""
|
|
59
|
+
|
|
52
60
|
FINAL: str = "final"
|
|
53
61
|
DEV: str = "dev"
|
|
54
|
-
RC: str = "rc"
|
|
62
|
+
RC: str = "rc" # Release candidate
|
|
55
63
|
|
|
56
64
|
# @staticmethod
|
|
57
65
|
def all_level() -> List[str]:
|
|
@@ -61,14 +69,15 @@ class ReleaseLevel:
|
|
|
61
69
|
|
|
62
70
|
class Version:
|
|
63
71
|
"""Version"""
|
|
72
|
+
|
|
64
73
|
def __init__(
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
74
|
+
self,
|
|
75
|
+
major: int,
|
|
76
|
+
minor: int,
|
|
77
|
+
patch: int,
|
|
78
|
+
release_level: str = ReleaseLevel.FINAL,
|
|
79
|
+
serial: int = 0,
|
|
80
|
+
) -> None:
|
|
72
81
|
"""
|
|
73
82
|
Create ``Version`` instance
|
|
74
83
|
|
|
@@ -88,15 +97,16 @@ class Version:
|
|
|
88
97
|
self.patch: int = patch
|
|
89
98
|
self.release_level: str = release_level
|
|
90
99
|
self.serial: int = serial
|
|
91
|
-
|
|
100
|
+
|
|
92
101
|
def __str__(self) -> str:
|
|
93
102
|
return self.version
|
|
103
|
+
|
|
94
104
|
def __repr__(self) -> str:
|
|
95
105
|
if self.release_level.startswith(ReleaseLevel.FINAL):
|
|
96
106
|
return f"{self.__class__.__name__}(major={self.major}, minor={self.minor}, patch={self.patch})"
|
|
97
107
|
else:
|
|
98
108
|
return f"{self.__class__.__name__}(major={self.major}, minor={self.minor}, patch={self.patch}, release_level={self.release_level}, serial={self.serial})"
|
|
99
|
-
|
|
109
|
+
|
|
100
110
|
@property
|
|
101
111
|
def version(self) -> str:
|
|
102
112
|
"""
|
|
@@ -118,12 +128,12 @@ class Version:
|
|
|
118
128
|
return f"{self.major}.{self.minor}.{self.patch}"
|
|
119
129
|
else:
|
|
120
130
|
return f"{self.major}.{self.minor}.{self.patch}.{self.release_level}{self.serial}"
|
|
121
|
-
|
|
131
|
+
|
|
122
132
|
@classmethod
|
|
123
133
|
def from_tuple(cls, iterable: tuple):
|
|
124
134
|
"""
|
|
125
135
|
Convert to ``Version`` from a ``tuple``
|
|
126
|
-
|
|
136
|
+
|
|
127
137
|
Returns
|
|
128
138
|
-------
|
|
129
139
|
Version
|
|
@@ -137,9 +147,11 @@ class Version:
|
|
|
137
147
|
1.0.0
|
|
138
148
|
"""
|
|
139
149
|
if len(iterable) == 5:
|
|
140
|
-
return cls(
|
|
150
|
+
return cls(
|
|
151
|
+
iterable[0], iterable[1], iterable[2], iterable[3], iterable[4]
|
|
152
|
+
) # Full
|
|
141
153
|
elif len(iterable) == 3:
|
|
142
|
-
return cls(iterable[0], iterable[1], iterable[2])
|
|
154
|
+
return cls(iterable[0], iterable[1], iterable[2]) # major.minor.patch only
|
|
143
155
|
else:
|
|
144
156
|
raise ValueError("iterable must have len of 5 or 3")
|
|
145
157
|
|
|
@@ -167,12 +179,13 @@ class Version:
|
|
|
167
179
|
"minor": self.minor,
|
|
168
180
|
"patch": self.patch,
|
|
169
181
|
"release_level": self.release_level,
|
|
170
|
-
"serial": self.serial
|
|
182
|
+
"serial": self.serial,
|
|
171
183
|
}
|
|
172
184
|
|
|
173
185
|
|
|
174
186
|
class Bumper(Version):
|
|
175
187
|
"""Version bumper"""
|
|
188
|
+
|
|
176
189
|
def _bump_ver(self, release_option: str) -> None:
|
|
177
190
|
"""
|
|
178
191
|
Bumping major, minor, patch
|
|
@@ -188,15 +201,12 @@ class Bumper(Version):
|
|
|
188
201
|
self.patch = 0
|
|
189
202
|
else:
|
|
190
203
|
self.patch += 1
|
|
191
|
-
|
|
204
|
+
|
|
192
205
|
logger.debug(f"After: {self.version}")
|
|
193
206
|
|
|
194
207
|
def bump(
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
option: str = ReleaseOption.PATCH,
|
|
198
|
-
channel: str = ReleaseLevel.FINAL
|
|
199
|
-
) -> None:
|
|
208
|
+
self, *, option: str = ReleaseOption.PATCH, channel: str = ReleaseLevel.FINAL
|
|
209
|
+
) -> None:
|
|
200
210
|
"""
|
|
201
211
|
Bump current version (internally)
|
|
202
212
|
|
|
@@ -205,11 +215,11 @@ class Bumper(Version):
|
|
|
205
215
|
option : str
|
|
206
216
|
Release option
|
|
207
217
|
(Default: ``"patch"``)
|
|
208
|
-
|
|
218
|
+
|
|
209
219
|
channel : str
|
|
210
220
|
Release channel
|
|
211
221
|
(Default: ``"final"``)
|
|
212
|
-
|
|
222
|
+
|
|
213
223
|
|
|
214
224
|
Example:
|
|
215
225
|
--------
|
|
@@ -228,31 +238,36 @@ class Bumper(Version):
|
|
|
228
238
|
logger.debug(ReleaseLevel.all_level())
|
|
229
239
|
channel = ReleaseLevel.FINAL
|
|
230
240
|
logger.debug(f"Target: {option} {channel}")
|
|
231
|
-
|
|
241
|
+
|
|
232
242
|
# Bump ver
|
|
233
|
-
if channel.startswith(ReleaseLevel.FINAL):
|
|
234
|
-
if self.release_level in [
|
|
243
|
+
if channel.startswith(ReleaseLevel.FINAL): # Final release level
|
|
244
|
+
if self.release_level in [
|
|
245
|
+
ReleaseLevel.RC,
|
|
246
|
+
ReleaseLevel.DEV,
|
|
247
|
+
]: # current release channel is dev or rc
|
|
235
248
|
self.release_level = ReleaseLevel.FINAL
|
|
236
249
|
self.serial = 0
|
|
237
250
|
else:
|
|
238
|
-
self.serial = 0
|
|
251
|
+
self.serial = 0 # final channel does not need serial
|
|
239
252
|
self._bump_ver(option)
|
|
240
|
-
|
|
241
|
-
elif channel.startswith(ReleaseLevel.RC):
|
|
242
|
-
if self.release_level.startswith(
|
|
253
|
+
|
|
254
|
+
elif channel.startswith(ReleaseLevel.RC): # release candidate release level
|
|
255
|
+
if self.release_level.startswith(
|
|
256
|
+
ReleaseLevel.DEV
|
|
257
|
+
): # current release channel is dev
|
|
243
258
|
self.release_level = ReleaseLevel.RC
|
|
244
|
-
self.serial = 0
|
|
245
|
-
elif channel == self.release_level:
|
|
259
|
+
self.serial = 0 # reset serial
|
|
260
|
+
elif channel == self.release_level: # current release channel is rc
|
|
246
261
|
self.serial += 1
|
|
247
|
-
else:
|
|
262
|
+
else: # current release channel is final
|
|
248
263
|
self.release_level = channel
|
|
249
|
-
self.serial = 0
|
|
264
|
+
self.serial = 0 # reset serial
|
|
250
265
|
self._bump_ver(option)
|
|
251
|
-
|
|
252
|
-
else:
|
|
253
|
-
if channel == self.release_level:
|
|
266
|
+
|
|
267
|
+
else: # dev release level
|
|
268
|
+
if channel == self.release_level: # current release channel is dev
|
|
254
269
|
self.serial += 1
|
|
255
|
-
else:
|
|
270
|
+
else: # current release channel is final or rc
|
|
256
271
|
self.release_level = channel
|
|
257
272
|
self.serial = 0
|
|
258
273
|
self._bump_ver(option)
|
|
@@ -262,16 +277,13 @@ class PkgVersion(Bumper):
|
|
|
262
277
|
"""
|
|
263
278
|
Versioning module
|
|
264
279
|
"""
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
package_name: str,
|
|
268
|
-
config_file_handler: Config
|
|
269
|
-
) -> None:
|
|
280
|
+
|
|
281
|
+
def __init__(self, package_name: str, config_file_handler: Config) -> None:
|
|
270
282
|
"""
|
|
271
283
|
package_name: Name of the package
|
|
272
284
|
config_file_handler: Config file handler
|
|
273
285
|
"""
|
|
274
|
-
|
|
286
|
+
|
|
275
287
|
# Get config
|
|
276
288
|
try:
|
|
277
289
|
self.config_file = config_file_handler
|
|
@@ -303,7 +315,7 @@ class PkgVersion(Bumper):
|
|
|
303
315
|
logger.error("Failed to reach server.")
|
|
304
316
|
logger.error("Reason: ", e.reason)
|
|
305
317
|
elif hasattr(e, "code"):
|
|
306
|
-
logger.error("The server couldn
|
|
318
|
+
logger.error("The server couldn't fulfill the request.")
|
|
307
319
|
logger.error("Error code: ", e.code)
|
|
308
320
|
except:
|
|
309
321
|
logger.error("Fetch failed!")
|
|
@@ -316,8 +328,8 @@ class PkgVersion(Bumper):
|
|
|
316
328
|
"""
|
|
317
329
|
rss = f"https://pypi.org/rss/project/{self.package_name}/releases.xml"
|
|
318
330
|
xml_file: str = self._fetch_data_from_server(rss)
|
|
319
|
-
ver = xml_file[xml_file.find("<item>"):xml_file.find("</item>")]
|
|
320
|
-
version = ver[ver.find("<title>")+len("<title>"):ver.find("</title>")]
|
|
331
|
+
ver = xml_file[xml_file.find("<item>") : xml_file.find("</item>")] # First item
|
|
332
|
+
version = ver[ver.find("<title>") + len("<title>") : ver.find("</title>")]
|
|
321
333
|
return version
|
|
322
334
|
|
|
323
335
|
def _load_data_from_json(self, json_link: str) -> dict:
|
|
@@ -344,24 +356,24 @@ class PkgVersion(Bumper):
|
|
|
344
356
|
return subprocess.run(cmd)
|
|
345
357
|
|
|
346
358
|
def check_for_update(
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
359
|
+
self,
|
|
360
|
+
*,
|
|
361
|
+
force_update: bool = False,
|
|
362
|
+
) -> None:
|
|
351
363
|
"""
|
|
352
364
|
Check for latest update
|
|
353
365
|
|
|
354
366
|
:param force_update: Auto update the package when run (Default: ``False``)
|
|
355
367
|
:type force_update: bool
|
|
356
368
|
"""
|
|
357
|
-
|
|
369
|
+
|
|
358
370
|
try:
|
|
359
371
|
latest = self._get_latest_version()
|
|
360
372
|
except:
|
|
361
373
|
latest = self._get_latest_version_legacy()
|
|
362
374
|
current = __version__
|
|
363
375
|
logger.debug(f"Current: {current} | Lastest: {latest}")
|
|
364
|
-
|
|
376
|
+
|
|
365
377
|
if current == latest:
|
|
366
378
|
print(f"You are using the latest version ({latest})")
|
|
367
379
|
else:
|
|
@@ -370,21 +382,22 @@ class PkgVersion(Bumper):
|
|
|
370
382
|
try:
|
|
371
383
|
self._get_update()
|
|
372
384
|
except:
|
|
373
|
-
print(
|
|
385
|
+
print(
|
|
386
|
+
f"""
|
|
374
387
|
Unable to perform update.
|
|
375
388
|
Please update manually with:
|
|
376
389
|
pip install -U {self.package_name}=={latest}
|
|
377
|
-
"""
|
|
390
|
+
"""
|
|
391
|
+
)
|
|
378
392
|
else:
|
|
379
|
-
print(
|
|
380
|
-
|
|
393
|
+
print(
|
|
394
|
+
f"Newer version ({latest}) available. Upgrade with:\npip install -U {self.package_name}=={latest}"
|
|
395
|
+
)
|
|
381
396
|
|
|
382
397
|
# Bump version
|
|
383
398
|
def bump_version(
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
channel: str = ReleaseLevel.FINAL
|
|
387
|
-
) -> str:
|
|
399
|
+
self, option: str = ReleaseOption.PATCH, channel: str = ReleaseLevel.FINAL
|
|
400
|
+
) -> str:
|
|
388
401
|
"""
|
|
389
402
|
Bump current version and save
|
|
390
403
|
|
|
@@ -393,50 +406,46 @@ class PkgVersion(Bumper):
|
|
|
393
406
|
option : str
|
|
394
407
|
Release option
|
|
395
408
|
(Default: ``"patch"``)
|
|
396
|
-
|
|
409
|
+
|
|
397
410
|
channel : str
|
|
398
411
|
Release channel
|
|
399
412
|
(Default: ``"final"``)
|
|
400
|
-
|
|
413
|
+
|
|
401
414
|
Returns
|
|
402
415
|
-------
|
|
403
416
|
str
|
|
404
417
|
Bumped version string
|
|
405
418
|
"""
|
|
406
|
-
self.bump(option=option, channel=channel)
|
|
407
|
-
self.config_file.update_version(self.to_dict())
|
|
419
|
+
self.bump(option=option, channel=channel) # Bump
|
|
420
|
+
self.config_file.update_version(self.to_dict()) # Save to config
|
|
408
421
|
return self.version
|
|
409
422
|
|
|
410
|
-
|
|
411
423
|
# Release package
|
|
412
424
|
def _release_to_pypi(
|
|
413
|
-
|
|
414
|
-
|
|
415
|
-
|
|
416
|
-
|
|
417
|
-
|
|
425
|
+
self,
|
|
426
|
+
option: str = ReleaseOption.PATCH,
|
|
427
|
+
channel: str = ReleaseLevel.FINAL,
|
|
428
|
+
safety_lock_off: bool = False,
|
|
429
|
+
) -> None:
|
|
418
430
|
"""
|
|
419
431
|
Developer only! Not intended for end-user
|
|
420
|
-
|
|
432
|
+
|
|
421
433
|
option: ReleaseOption
|
|
422
434
|
channel: ReleaseLevel
|
|
423
435
|
safety_lock_off: Set to `True` to execute this function
|
|
424
436
|
"""
|
|
425
437
|
if not safety_lock_off:
|
|
426
438
|
return None
|
|
427
|
-
|
|
439
|
+
|
|
428
440
|
logger.debug("Bumping version...")
|
|
429
|
-
|
|
441
|
+
|
|
430
442
|
self.bump_version(option=option, channel=channel)
|
|
431
443
|
|
|
432
444
|
logger.debug(f"Version bumped. Current verion: {self.version}")
|
|
433
445
|
logger.debug("Building package...")
|
|
434
|
-
|
|
446
|
+
|
|
435
447
|
try:
|
|
436
|
-
cmds = [
|
|
437
|
-
"python -m build".split(),
|
|
438
|
-
"twine upload dist/*".split()
|
|
439
|
-
]
|
|
448
|
+
cmds = ["python -m build".split(), "twine upload dist/*".split()]
|
|
440
449
|
for cmd in cmds:
|
|
441
450
|
subprocess.run(cmd)
|
|
442
451
|
logger.debug("Release published!")
|