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.

Files changed (42) hide show
  1. absfuyu/__init__.py +13 -10
  2. absfuyu/__main__.py +55 -38
  3. absfuyu/config/config.json +3 -3
  4. absfuyu/core.py +39 -25
  5. absfuyu/everything.py +4 -5
  6. absfuyu/extensions/__init__.py +3 -2
  7. absfuyu/extensions/dev/__init__.py +162 -19
  8. absfuyu/extensions/dev/password_hash.py +11 -10
  9. absfuyu/extensions/dev/passwordlib.py +256 -0
  10. absfuyu/extensions/dev/pkglib.py +53 -57
  11. absfuyu/extensions/dev/project_starter.py +58 -0
  12. absfuyu/extensions/dev/shutdownizer.py +8 -0
  13. absfuyu/extensions/extra/data_analysis.py +687 -119
  14. absfuyu/fun/__init__.py +88 -118
  15. absfuyu/fun/tarot.py +32 -34
  16. absfuyu/game/tictactoe2.py +90 -78
  17. absfuyu/{collections → general}/__init__.py +14 -12
  18. absfuyu/{collections → general}/content.py +105 -87
  19. absfuyu/{collections → general}/data_extension.py +652 -172
  20. absfuyu/{collections → general}/generator.py +65 -4
  21. absfuyu/{collections → general}/human.py +28 -3
  22. absfuyu/pkg_data/__init__.py +14 -36
  23. absfuyu/pkg_data/chemistry.pkl +0 -0
  24. absfuyu/pkg_data/tarot.pkl +0 -0
  25. absfuyu/tools/converter.py +58 -31
  26. absfuyu/tools/obfuscator.py +4 -4
  27. absfuyu/tools/stats.py +4 -4
  28. absfuyu/tools/web.py +2 -2
  29. absfuyu/util/lunar.py +144 -123
  30. absfuyu/util/path.py +22 -3
  31. absfuyu/util/performance.py +101 -14
  32. absfuyu/version.py +93 -84
  33. {absfuyu-2.8.1.dist-info → absfuyu-3.1.0.dist-info}/METADATA +63 -33
  34. absfuyu-3.1.0.dist-info/RECORD +55 -0
  35. {absfuyu-2.8.1.dist-info → absfuyu-3.1.0.dist-info}/WHEEL +1 -1
  36. absfuyu-3.1.0.dist-info/entry_points.txt +2 -0
  37. absfuyu/pkg_data/chemistry.json +0 -6268
  38. absfuyu/pkg_data/tarot.json +0 -2593
  39. absfuyu-2.8.1.dist-info/RECORD +0 -52
  40. absfuyu-2.8.1.dist-info/entry_points.txt +0 -2
  41. {absfuyu-2.8.1.dist-info → absfuyu-3.1.0.dist-info}/LICENSE +0 -0
  42. {absfuyu-2.8.1.dist-info → absfuyu-3.1.0.dist-info}/top_level.txt +0 -0
@@ -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.1
8
- Date updated: 24/11/2023 (dd/mm/yyyy)
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", "source_this"
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 as __source
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
- >>> return 1 + 1
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
- output["docstring"] = docs
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 __source(function)
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.3
7
- Date updated: 24/11/2023 (dd/mm/yyyy)
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
- "ReleaseOption", "ReleaseLevel",
16
- "Version", "Bumper",
17
- "PkgVersion"
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" # Release candidate
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
- self,
66
- major: int,
67
- minor: int,
68
- patch: int,
69
- release_level: str = ReleaseLevel.FINAL,
70
- serial: int = 0,
71
- ) -> None:
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(iterable[0], iterable[1], iterable[2], iterable[3], iterable[4]) # Full
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]) # major.minor.patch only
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
- self,
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): # Final release level
234
- if self.release_level in [ReleaseLevel.RC, ReleaseLevel.DEV]: # current release channel is dev or rc
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 # final channel does not need serial
251
+ self.serial = 0 # final channel does not need serial
239
252
  self._bump_ver(option)
240
-
241
- elif channel.startswith(ReleaseLevel.RC): # release candidate release level
242
- if self.release_level.startswith(ReleaseLevel.DEV): # current release channel is dev
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 # reset serial
245
- elif channel == self.release_level: # current release channel is rc
259
+ self.serial = 0 # reset serial
260
+ elif channel == self.release_level: # current release channel is rc
246
261
  self.serial += 1
247
- else: # current release channel is final
262
+ else: # current release channel is final
248
263
  self.release_level = channel
249
- self.serial = 0 # reset serial
264
+ self.serial = 0 # reset serial
250
265
  self._bump_ver(option)
251
-
252
- else: # dev release level
253
- if channel == self.release_level: # current release channel is dev
266
+
267
+ else: # dev release level
268
+ if channel == self.release_level: # current release channel is dev
254
269
  self.serial += 1
255
- else: # current release channel is final or rc
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
- def __init__(
266
- self,
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\'t fulfill the request.")
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>")] # First 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
- self,
348
- *,
349
- force_update: bool = False,
350
- ) -> None:
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(f"""
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(f"Newer version ({latest}) available. Upgrade with:\npip install -U {self.package_name}=={latest}")
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
- self,
385
- option: str = ReleaseOption.PATCH,
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) # Bump
407
- self.config_file.update_version(self.to_dict()) # Save to config
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
- self,
414
- option: str = ReleaseOption.PATCH,
415
- channel: str = ReleaseLevel.FINAL,
416
- safety_lock_off: bool = False,
417
- ) -> None:
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!")