xulbux 1.7.1__tar.gz → 1.7.3__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.

Potentially problematic release.


This version of xulbux might be problematic. Click here for more details.

Files changed (37) hide show
  1. {xulbux-1.7.1/src/xulbux.egg-info → xulbux-1.7.3}/PKG-INFO +17 -14
  2. {xulbux-1.7.1 → xulbux-1.7.3}/README.md +4 -2
  3. {xulbux-1.7.1 → xulbux-1.7.3}/pyproject.toml +16 -15
  4. {xulbux-1.7.1 → xulbux-1.7.3}/src/xulbux/__init__.py +1 -1
  5. {xulbux-1.7.1 → xulbux-1.7.3}/src/xulbux/_consts_.py +2 -4
  6. {xulbux-1.7.1 → xulbux-1.7.3}/src/xulbux/xx_code.py +1 -1
  7. {xulbux-1.7.1 → xulbux-1.7.3}/src/xulbux/xx_console.py +53 -44
  8. {xulbux-1.7.1 → xulbux-1.7.3}/src/xulbux/xx_format_codes.py +54 -26
  9. {xulbux-1.7.1 → xulbux-1.7.3/src/xulbux.egg-info}/PKG-INFO +17 -14
  10. {xulbux-1.7.1 → xulbux-1.7.3}/LICENSE +0 -0
  11. {xulbux-1.7.1 → xulbux-1.7.3}/setup.cfg +0 -0
  12. {xulbux-1.7.1 → xulbux-1.7.3}/src/xulbux/_cli_.py +0 -0
  13. {xulbux-1.7.1 → xulbux-1.7.3}/src/xulbux/xx_color.py +0 -0
  14. {xulbux-1.7.1 → xulbux-1.7.3}/src/xulbux/xx_data.py +0 -0
  15. {xulbux-1.7.1 → xulbux-1.7.3}/src/xulbux/xx_env_path.py +0 -0
  16. {xulbux-1.7.1 → xulbux-1.7.3}/src/xulbux/xx_file.py +0 -0
  17. {xulbux-1.7.1 → xulbux-1.7.3}/src/xulbux/xx_json.py +0 -0
  18. {xulbux-1.7.1 → xulbux-1.7.3}/src/xulbux/xx_path.py +0 -0
  19. {xulbux-1.7.1 → xulbux-1.7.3}/src/xulbux/xx_regex.py +0 -0
  20. {xulbux-1.7.1 → xulbux-1.7.3}/src/xulbux/xx_string.py +0 -0
  21. {xulbux-1.7.1 → xulbux-1.7.3}/src/xulbux/xx_system.py +0 -0
  22. {xulbux-1.7.1 → xulbux-1.7.3}/src/xulbux.egg-info/SOURCES.txt +0 -0
  23. {xulbux-1.7.1 → xulbux-1.7.3}/src/xulbux.egg-info/dependency_links.txt +0 -0
  24. {xulbux-1.7.1 → xulbux-1.7.3}/src/xulbux.egg-info/entry_points.txt +0 -0
  25. {xulbux-1.7.1 → xulbux-1.7.3}/src/xulbux.egg-info/requires.txt +3 -3
  26. {xulbux-1.7.1 → xulbux-1.7.3}/src/xulbux.egg-info/top_level.txt +0 -0
  27. {xulbux-1.7.1 → xulbux-1.7.3}/tests/test_code.py +0 -0
  28. {xulbux-1.7.1 → xulbux-1.7.3}/tests/test_color.py +0 -0
  29. {xulbux-1.7.1 → xulbux-1.7.3}/tests/test_color_types.py +0 -0
  30. {xulbux-1.7.1 → xulbux-1.7.3}/tests/test_console.py +0 -0
  31. {xulbux-1.7.1 → xulbux-1.7.3}/tests/test_data.py +0 -0
  32. {xulbux-1.7.1 → xulbux-1.7.3}/tests/test_env_path.py +0 -0
  33. {xulbux-1.7.1 → xulbux-1.7.3}/tests/test_file.py +0 -0
  34. {xulbux-1.7.1 → xulbux-1.7.3}/tests/test_format_codes.py +0 -0
  35. {xulbux-1.7.1 → xulbux-1.7.3}/tests/test_json.py +0 -0
  36. {xulbux-1.7.1 → xulbux-1.7.3}/tests/test_path.py +0 -0
  37. {xulbux-1.7.1 → xulbux-1.7.3}/tests/test_string.py +0 -0
@@ -1,22 +1,23 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: xulbux
3
- Version: 1.7.1
3
+ Version: 1.7.3
4
4
  Summary: A Python library which includes lots of helpful classes, types and functions aiming to make common programming tasks simpler.
5
5
  Author-email: XulbuX <xulbux.real@gmail.com>
6
6
  License-Expression: MIT
7
- Project-URL: Bug Reports, https://github.com/XulbuX/PythonLibraryXulbuX/issues
8
- Project-URL: Changelog, https://github.com/XulbuX/PythonLibraryXulbuX/blob/main/CHANGELOG.md
9
- Project-URL: Documentation, https://github.com/XulbuX/PythonLibraryXulbuX/wiki
10
7
  Project-URL: Homepage, https://github.com/XulbuX/PythonLibraryXulbuX
11
- Project-URL: License, https://github.com/XulbuX/PythonLibraryXulbuX/blob/main/LICENSE
8
+ Project-URL: Documentation, https://github.com/XulbuX/PythonLibraryXulbuX/wiki
12
9
  Project-URL: Source Code, https://github.com/XulbuX/PythonLibraryXulbuX/tree/main/src
13
- Keywords: args,arguments,attributes,classes,cmd,client,code,codes,color,commands,console,consts,constants,convert,conversion,data,debug,easier,env,environment,error,file,format,formatting,functions,helper,hex,hexa,hsl,hsla,info,input,json,library,log,logging,methods,nice,operations,path,presets,pretty,printing,properties,python,re,regex,rgb,rgba,string,structures,system,tools,types,utility,warn,warning,xulbux
14
- Classifier: Intended Audience :: Developers
10
+ Project-URL: Changelog, https://github.com/XulbuX/PythonLibraryXulbuX/blob/main/CHANGELOG.md
11
+ Project-URL: Bug Reports, https://github.com/XulbuX/PythonLibraryXulbuX/issues
12
+ Project-URL: License, https://github.com/XulbuX/PythonLibraryXulbuX/blob/main/LICENSE
13
+ Keywords: args,arguments,attributes,classes,client,cmd,code,codes,color,commands,console,constants,consts,conversion,convert,data,debug,easier,env,environment,error,file,format,formatting,functions,helper,hex,hexa,hsl,hsla,info,input,json,library,log,logging,methods,nice,operations,path,presets,pretty,printing,properties,python,re,regex,rgb,rgba,string,structures,system,tools,types,utility,warn,warning,xulbux
15
14
  Classifier: Programming Language :: Python :: 3
16
- Classifier: Programming Language :: Python :: 3.10
17
- Classifier: Programming Language :: Python :: 3.11
15
+ Classifier: Programming Language :: Python :: 3.13
18
16
  Classifier: Programming Language :: Python :: 3.12
17
+ Classifier: Programming Language :: Python :: 3.11
18
+ Classifier: Programming Language :: Python :: 3.10
19
19
  Classifier: Operating System :: OS Independent
20
+ Classifier: Intended Audience :: Developers
20
21
  Classifier: Topic :: Software Development :: Libraries :: Python Modules
21
22
  Requires-Python: >=3.10.0
22
23
  Description-Content-Type: text/markdown
@@ -27,20 +28,22 @@ Requires-Dist: prompt_toolkit>=3.0.41
27
28
  Requires-Dist: pyperclip>=1.9.0
28
29
  Requires-Dist: regex>=2023.10.3
29
30
  Provides-Extra: dev
30
- Requires-Dist: pytest>=7.4.2; extra == "dev"
31
31
  Requires-Dist: black>=23.7.0; extra == "dev"
32
- Requires-Dist: isort>=5.12.0; extra == "dev"
33
- Requires-Dist: flake8>=6.1.0; extra == "dev"
34
32
  Requires-Dist: flake8-pyproject>=1.2.3; extra == "dev"
33
+ Requires-Dist: flake8>=6.1.0; extra == "dev"
34
+ Requires-Dist: isort>=5.12.0; extra == "dev"
35
+ Requires-Dist: pytest>=7.4.2; extra == "dev"
35
36
  Dynamic: license-file
36
37
 
37
- # **$\Huge\textsf{XulbuX}$**
38
+ # **XulbuX**
39
+
40
+ ![](https://img.shields.io/pypi/v/xulbux?labelColor=404560&color=7075FF) ![](https://img.shields.io/pypi/dm/xulbux?labelColor=405555&color=70FFEE) ![](https://img.shields.io/github/license/XulbuX/PythonLibraryXulbuX?labelColor=405555&color=70FFEE) ![](https://img.shields.io/github/last-commit/XulbuX/PythonLibraryXulbuX?labelColor=554045&color=FF6065) ![](https://img.shields.io/github/issues/XulbuX/PythonLibraryXulbuX?labelColor=554045&color=FF6065)
38
41
 
39
42
  **XulbuX** is library that contains many useful classes, types, and functions,
40
43
  ranging from console logging and working with colors to file management and system operations.
41
44
  The library is designed to simplify common programming tasks and improve code readability through its collection of tools.
42
45
 
43
- For precise information about the library, see the library's [**wiki page**](https://github.com/XulbuX/PythonLibraryXulbuX/wiki).<br>
46
+ For precise information about the library, see the library's [**documentation**](https://github.com/XulbuX/PythonLibraryXulbuX/wiki).<br>
44
47
  For the libraries latest changes and updates, see the [**change log**](https://github.com/XulbuX/PythonLibraryXulbuX/blob/main/CHANGELOG.md).
45
48
 
46
49
  <br>
@@ -1,10 +1,12 @@
1
- # **$\Huge\textsf{XulbuX}$**
1
+ # **XulbuX**
2
+
3
+ ![](https://img.shields.io/pypi/v/xulbux?labelColor=404560&color=7075FF) ![](https://img.shields.io/pypi/dm/xulbux?labelColor=405555&color=70FFEE) ![](https://img.shields.io/github/license/XulbuX/PythonLibraryXulbuX?labelColor=405555&color=70FFEE) ![](https://img.shields.io/github/last-commit/XulbuX/PythonLibraryXulbuX?labelColor=554045&color=FF6065) ![](https://img.shields.io/github/issues/XulbuX/PythonLibraryXulbuX?labelColor=554045&color=FF6065)
2
4
 
3
5
  **XulbuX** is library that contains many useful classes, types, and functions,
4
6
  ranging from console logging and working with colors to file management and system operations.
5
7
  The library is designed to simplify common programming tasks and improve code readability through its collection of tools.
6
8
 
7
- For precise information about the library, see the library's [**wiki page**](https://github.com/XulbuX/PythonLibraryXulbuX/wiki).<br>
9
+ For precise information about the library, see the library's [**documentation**](https://github.com/XulbuX/PythonLibraryXulbuX/wiki).<br>
8
10
  For the libraries latest changes and updates, see the [**change log**](https://github.com/XulbuX/PythonLibraryXulbuX/blob/main/CHANGELOG.md).
9
11
 
10
12
  <br>
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "xulbux"
7
- version = "1.7.1"
7
+ version = "1.7.3"
8
8
  authors = [{ name = "XulbuX", email = "xulbux.real@gmail.com" }]
9
9
  description = "A Python library which includes lots of helpful classes, types and functions aiming to make common programming tasks simpler."
10
10
  readme = "README.md"
@@ -19,19 +19,20 @@ dependencies = [
19
19
  "regex>=2023.10.3",
20
20
  ]
21
21
  optional-dependencies = { dev = [
22
- "pytest>=7.4.2",
23
22
  "black>=23.7.0",
24
- "isort>=5.12.0",
25
- "flake8>=6.1.0",
26
23
  "flake8-pyproject>=1.2.3",
24
+ "flake8>=6.1.0",
25
+ "isort>=5.12.0",
26
+ "pytest>=7.4.2",
27
27
  ] }
28
28
  classifiers = [
29
- "Intended Audience :: Developers",
30
29
  "Programming Language :: Python :: 3",
31
- "Programming Language :: Python :: 3.10",
32
- "Programming Language :: Python :: 3.11",
30
+ "Programming Language :: Python :: 3.13",
33
31
  "Programming Language :: Python :: 3.12",
32
+ "Programming Language :: Python :: 3.11",
33
+ "Programming Language :: Python :: 3.10",
34
34
  "Operating System :: OS Independent",
35
+ "Intended Audience :: Developers",
35
36
  "Topic :: Software Development :: Libraries :: Python Modules",
36
37
  ]
37
38
  keywords = [
@@ -39,17 +40,17 @@ keywords = [
39
40
  "arguments",
40
41
  "attributes",
41
42
  "classes",
42
- "cmd",
43
43
  "client",
44
+ "cmd",
44
45
  "code",
45
46
  "codes",
46
47
  "color",
47
48
  "commands",
48
49
  "console",
49
- "consts",
50
50
  "constants",
51
- "convert",
51
+ "consts",
52
52
  "conversion",
53
+ "convert",
53
54
  "data",
54
55
  "debug",
55
56
  "easier",
@@ -96,12 +97,12 @@ keywords = [
96
97
  ]
97
98
 
98
99
  [project.urls]
99
- "Bug Reports" = "https://github.com/XulbuX/PythonLibraryXulbuX/issues"
100
- "Changelog" = "https://github.com/XulbuX/PythonLibraryXulbuX/blob/main/CHANGELOG.md"
101
- "Documentation" = "https://github.com/XulbuX/PythonLibraryXulbuX/wiki"
102
100
  "Homepage" = "https://github.com/XulbuX/PythonLibraryXulbuX"
103
- "License" = "https://github.com/XulbuX/PythonLibraryXulbuX/blob/main/LICENSE"
101
+ "Documentation" = "https://github.com/XulbuX/PythonLibraryXulbuX/wiki"
104
102
  "Source Code" = "https://github.com/XulbuX/PythonLibraryXulbuX/tree/main/src"
103
+ "Changelog" = "https://github.com/XulbuX/PythonLibraryXulbuX/blob/main/CHANGELOG.md"
104
+ "Bug Reports" = "https://github.com/XulbuX/PythonLibraryXulbuX/issues"
105
+ "License" = "https://github.com/XulbuX/PythonLibraryXulbuX/blob/main/LICENSE"
105
106
 
106
107
 
107
108
  [project.scripts]
@@ -152,8 +153,8 @@ addopts = "-ra -q"
152
153
  pythonpath = ["src"]
153
154
  testpaths = [
154
155
  "tests/test_code.py",
155
- "tests/test_color.py",
156
156
  "tests/test_color_types.py",
157
+ "tests/test_color.py",
157
158
  "tests/test_console.py",
158
159
  "tests/test_data.py",
159
160
  "tests/test_env_path.py",
@@ -1,4 +1,4 @@
1
- __version__ = "1.7.1"
1
+ __version__ = "1.7.3"
2
2
  __author__ = "XulbuX"
3
3
  __email__ = "xulbux.real@gmail.com"
4
4
  __license__ = "MIT"
@@ -94,8 +94,6 @@ class ANSI:
94
94
  """The separator between ANSI escape sequence parts."""
95
95
  END = end = "m"
96
96
  """The end of an ANSI escape sequence."""
97
- default_color_modifiers: dict[str, str] = {"lighten": "+l", "darken": "-d"}
98
- """Characters to modify the lightness of the default color with."""
99
97
 
100
98
  @classmethod
101
99
  def seq(cls, parts: int = 1) -> FormattableString:
@@ -107,7 +105,7 @@ class ANSI:
107
105
  seq_bg_color: FormattableString = CHAR + START + "48" + SEP + "2" + SEP + "{}" + SEP + "{}" + SEP + "{}" + END
108
106
  """The ANSI escape sequence for setting the background RGB color."""
109
107
 
110
- color_map: list[str] = [
108
+ color_map: tuple[str, ...] = (
111
109
  ########### DEFAULT CONSOLE COLOR NAMES ############
112
110
  "black",
113
111
  "red",
@@ -117,7 +115,7 @@ class ANSI:
117
115
  "magenta",
118
116
  "cyan",
119
117
  "white",
120
- ]
118
+ )
121
119
  """The console default color names."""
122
120
 
123
121
  codes_map: dict[str | tuple[str, ...], int] = {
@@ -53,7 +53,7 @@ class Code:
53
53
  return list(Data.remove_duplicates(funcs + nested_func_calls))
54
54
 
55
55
  @staticmethod
56
- def is_js(code: str, funcs: list = ["__", "$t", "$lang"]) -> bool:
56
+ def is_js(code: str, funcs: list[str] = ["__", "$t", "$lang"]) -> bool:
57
57
  """Will check if the code is very likely to be JavaScript."""
58
58
  if not code or len(code.strip()) < 3:
59
59
  return False
@@ -25,20 +25,29 @@ import os as _os
25
25
  class _ConsoleWidth:
26
26
 
27
27
  def __get__(self, obj, owner=None):
28
- return _os.get_terminal_size().columns
28
+ try:
29
+ return _os.get_terminal_size().columns
30
+ except OSError:
31
+ return 80
29
32
 
30
33
 
31
34
  class _ConsoleHeight:
32
35
 
33
36
  def __get__(self, obj, owner=None):
34
- return _os.get_terminal_size().lines
37
+ try:
38
+ return _os.get_terminal_size().lines
39
+ except OSError:
40
+ return 24
35
41
 
36
42
 
37
43
  class _ConsoleSize:
38
44
 
39
45
  def __get__(self, obj, owner=None):
40
- size = _os.get_terminal_size()
41
- return (size.columns, size.lines)
46
+ try:
47
+ size = _os.get_terminal_size()
48
+ return (size.columns, size.lines)
49
+ except OSError:
50
+ return (80, 24)
42
51
 
43
52
 
44
53
  class _ConsoleUser:
@@ -231,13 +240,13 @@ class Console:
231
240
  exit_code: int = 0,
232
241
  reset_ansi: bool = False,
233
242
  ) -> None:
234
- """Will print the `last_prompt` and then pause the program if `pause` is set
243
+ """Will print the `prompt` and then pause the program if `pause` is set
235
244
  to `True` and after the pause, exit the program if `exit` is set to `True`."""
236
245
  print(prompt, end="", flush=True)
237
246
  if reset_ansi:
238
247
  FormatCodes.print("[_]", end="")
239
248
  if pause:
240
- _keyboard.read_event()
249
+ _keyboard.read_key(suppress=True)
241
250
  if exit:
242
251
  _sys.exit(exit_code)
243
252
 
@@ -344,8 +353,7 @@ class Console:
344
353
  format_linebreaks: bool = True,
345
354
  start: str = "",
346
355
  end: str = "\n",
347
- title_bg_color: Rgba | Hexa = COLOR.yellow,
348
- default_color: Rgba | Hexa = COLOR.text,
356
+ default_color: Optional[Rgba | Hexa] = COLOR.text,
349
357
  pause: bool = False,
350
358
  exit: bool = False,
351
359
  ) -> None:
@@ -353,7 +361,7 @@ class Console:
353
361
  at the message and exit the program after the message was printed.
354
362
  If `active` is false, no debug message will be printed."""
355
363
  if active:
356
- Console.log("DEBUG", prompt, format_linebreaks, start, end, title_bg_color, default_color)
364
+ Console.log("DEBUG", prompt, format_linebreaks, start, end, COLOR.yellow, default_color)
357
365
  Console.pause_exit(pause, exit)
358
366
 
359
367
  @staticmethod
@@ -362,14 +370,13 @@ class Console:
362
370
  format_linebreaks: bool = True,
363
371
  start: str = "",
364
372
  end: str = "\n",
365
- title_bg_color: Rgba | Hexa = COLOR.blue,
366
- default_color: Rgba | Hexa = COLOR.text,
373
+ default_color: Optional[Rgba | Hexa] = COLOR.text,
367
374
  pause: bool = False,
368
375
  exit: bool = False,
369
376
  ) -> None:
370
377
  """A preset for `log()`: `INFO` log message with the options to pause
371
378
  at the message and exit the program after the message was printed."""
372
- Console.log("INFO", prompt, format_linebreaks, start, end, title_bg_color, default_color)
379
+ Console.log("INFO", prompt, format_linebreaks, start, end, COLOR.blue, default_color)
373
380
  Console.pause_exit(pause, exit)
374
381
 
375
382
  @staticmethod
@@ -378,14 +385,13 @@ class Console:
378
385
  format_linebreaks: bool = True,
379
386
  start: str = "",
380
387
  end: str = "\n",
381
- title_bg_color: Rgba | Hexa = COLOR.teal,
382
- default_color: Rgba | Hexa = COLOR.text,
388
+ default_color: Optional[Rgba | Hexa] = COLOR.text,
383
389
  pause: bool = False,
384
390
  exit: bool = False,
385
391
  ) -> None:
386
392
  """A preset for `log()`: `DONE` log message with the options to pause
387
393
  at the message and exit the program after the message was printed."""
388
- Console.log("DONE", prompt, format_linebreaks, start, end, title_bg_color, default_color)
394
+ Console.log("DONE", prompt, format_linebreaks, start, end, COLOR.teal, default_color)
389
395
  Console.pause_exit(pause, exit)
390
396
 
391
397
  @staticmethod
@@ -394,14 +400,13 @@ class Console:
394
400
  format_linebreaks: bool = True,
395
401
  start: str = "",
396
402
  end: str = "\n",
397
- title_bg_color: Rgba | Hexa = COLOR.orange,
398
- default_color: Rgba | Hexa = COLOR.text,
403
+ default_color: Optional[Rgba | Hexa] = COLOR.text,
399
404
  pause: bool = False,
400
405
  exit: bool = False,
401
406
  ) -> None:
402
407
  """A preset for `log()`: `WARN` log message with the options to pause
403
408
  at the message and exit the program after the message was printed."""
404
- Console.log("WARN", prompt, format_linebreaks, start, end, title_bg_color, default_color)
409
+ Console.log("WARN", prompt, format_linebreaks, start, end, COLOR.orange, default_color)
405
410
  Console.pause_exit(pause, exit)
406
411
 
407
412
  @staticmethod
@@ -410,15 +415,14 @@ class Console:
410
415
  format_linebreaks: bool = True,
411
416
  start: str = "",
412
417
  end: str = "\n",
413
- title_bg_color: Rgba | Hexa = COLOR.red,
414
- default_color: Rgba | Hexa = COLOR.text,
418
+ default_color: Optional[Rgba | Hexa] = COLOR.text,
415
419
  pause: bool = False,
416
420
  exit: bool = True,
417
- reset_ansi=True,
421
+ reset_ansi: bool = True,
418
422
  ) -> None:
419
423
  """A preset for `log()`: `FAIL` log message with the options to pause
420
424
  at the message and exit the program after the message was printed."""
421
- Console.log("FAIL", prompt, format_linebreaks, start, end, title_bg_color, default_color)
425
+ Console.log("FAIL", prompt, format_linebreaks, start, end, COLOR.red, default_color)
422
426
  Console.pause_exit(pause, exit, reset_ansi=reset_ansi)
423
427
 
424
428
  @staticmethod
@@ -427,15 +431,14 @@ class Console:
427
431
  format_linebreaks: bool = True,
428
432
  start: str = "",
429
433
  end: str = "\n",
430
- title_bg_color: Rgba | Hexa = COLOR.magenta,
431
- default_color: Rgba | Hexa = COLOR.text,
434
+ default_color: Optional[Rgba | Hexa] = COLOR.text,
432
435
  pause: bool = False,
433
436
  exit: bool = True,
434
- reset_ansi=True,
437
+ reset_ansi: bool = True,
435
438
  ) -> None:
436
439
  """A preset for `log()`: `EXIT` log message with the options to pause
437
440
  at the message and exit the program after the message was printed."""
438
- Console.log("EXIT", prompt, format_linebreaks, start, end, title_bg_color, default_color)
441
+ Console.log("EXIT", prompt, format_linebreaks, start, end, COLOR.magenta, default_color)
439
442
  Console.pause_exit(pause, exit, reset_ansi=reset_ansi)
440
443
 
441
444
  @staticmethod
@@ -443,10 +446,11 @@ class Console:
443
446
  *values: object,
444
447
  start: str = "",
445
448
  end: str = "\n",
446
- box_bg_color: Rgba | Hexa = "green",
447
- default_color: Rgba | Hexa = "#000",
449
+ box_bg_color: str | Rgba | Hexa = "green",
450
+ default_color: Optional[Rgba | Hexa] = None,
448
451
  w_padding: int = 2,
449
452
  w_full: bool = False,
453
+ indent: int = 0,
450
454
  ) -> None:
451
455
  """Will print a box with a colored background, containing a formatted log message:
452
456
  - `*values` -⠀the box content (each value is on a new line)
@@ -455,7 +459,8 @@ class Console:
455
459
  - `box_bg_color` -⠀the background color of the box
456
460
  - `default_color` -⠀the default text color of the `*values`
457
461
  - `w_padding` -⠀the horizontal padding (in chars) to the box content
458
- - `w_full` -⠀whether to make the box be the full console width or not\n
462
+ - `w_full` -⠀whether to make the box be the full console width or not
463
+ - `indent` -⠀the indentation of the box (in chars)\n
459
464
  -----------------------------------------------------------------------------------
460
465
  The box content can be formatted with special formatting codes. For more detailed
461
466
  information about formatting codes, see `xx_format_codes` module documentation."""
@@ -463,15 +468,16 @@ class Console:
463
468
  pad_w_full = (Console.w - (max_line_len + (2 * w_padding))) if w_full else 0
464
469
  if box_bg_color is not None and Color.is_valid(box_bg_color):
465
470
  box_bg_color = Color.to_hexa(box_bg_color)
471
+ spaces_l = " " * indent
466
472
  lines = [
467
- f"[bg:{box_bg_color}]{' ' * w_padding}{line}" + " " *
468
- ((w_padding + max_line_len - len(unfmt)) + pad_w_full) + "[*]" for line, unfmt in zip(lines, unfmt_lines)
473
+ f"{spaces_l}[bg:{box_bg_color}]{' ' * w_padding}"
474
+ + _COMPILED["formatting"].sub(lambda m: f"{m.group(0)}[bg:{box_bg_color}]", line) +
475
+ (" " * ((w_padding + max_line_len - len(unfmt)) + pad_w_full)) + "[*]" for line, unfmt in zip(lines, unfmt_lines)
469
476
  ]
470
477
  pady = " " * (Console.w if w_full else max_line_len + (2 * w_padding))
471
478
  FormatCodes.print(
472
- f"{start}[bg:{box_bg_color}]{pady}[*]\n"
473
- + _COMPILED["formatting"].sub(lambda m: f"{m.group(0)}[bg:{box_bg_color}]", "\n".join(lines))
474
- + f"\n[bg:{box_bg_color}]{pady}[_]",
479
+ f"{start}{spaces_l}[bg:{box_bg_color}]{pady}[*]\n" + "\n".join(lines)
480
+ + f"\n{spaces_l}[bg:{box_bg_color}]{pady}[_]",
475
481
  default_color=default_color or "#000",
476
482
  sep="\n",
477
483
  end=end,
@@ -487,6 +493,7 @@ class Console:
487
493
  default_color: Optional[Rgba | Hexa] = None,
488
494
  w_padding: int = 1,
489
495
  w_full: bool = False,
496
+ indent: int = 0,
490
497
  _border_chars: Optional[tuple[str, str, str, str, str, str, str, str]] = None,
491
498
  ) -> None:
492
499
  """Will print a bordered box, containing a formatted log message:
@@ -494,9 +501,11 @@ class Console:
494
501
  - `start` -⠀something to print before the log box is printed (e.g. `\\n`)
495
502
  - `end` -⠀something to print after the log box is printed (e.g. `\\n`)
496
503
  - `border_type` -⠀one of the predefined border character sets
504
+ - `border_style` -⠀the style of the border (special formatting codes)
497
505
  - `default_color` -⠀the default text color of the `*values`
498
506
  - `w_padding` -⠀the horizontal padding (in chars) to the box content
499
507
  - `w_full` -⠀whether to make the box be the full console width or not
508
+ - `indent` -⠀the indentation of the box (in chars)
500
509
  - `_border_chars` -⠀define your own border characters set (overwrites `border_type`)\n
501
510
  ---------------------------------------------------------------------------------------
502
511
  The box content can be formatted with special formatting codes. For more detailed
@@ -524,18 +533,18 @@ class Console:
524
533
  }
525
534
  border_chars = borders.get(border_type, borders["standard"]) if _border_chars is None else _border_chars
526
535
  lines, unfmt_lines, max_line_len = Console.__prepare_log_box(values, default_color)
527
- print(unfmt_lines)
528
536
  pad_w_full = (Console.w - (max_line_len + (2 * w_padding)) - (len(border_chars[1] * 2))) if w_full else 0
529
537
  if border_style is not None and Color.is_valid(border_style):
530
538
  border_style = Color.to_hexa(border_style)
539
+ spaces_l = " " * indent
531
540
  border_l = f"[{border_style}]{border_chars[7]}[*]"
532
541
  border_r = f"[{border_style}]{border_chars[3]}[_]"
533
542
  lines = [
534
- f"{border_l}{' ' * w_padding}{line}[_]" + " " * ((w_padding + max_line_len - len(unfmt)) + pad_w_full) + border_r
535
- for line, unfmt in zip(lines, unfmt_lines)
543
+ f"{spaces_l}{border_l}{' ' * w_padding}{line}[_]" + " " *
544
+ ((w_padding + max_line_len - len(unfmt)) + pad_w_full) + border_r for line, unfmt in zip(lines, unfmt_lines)
536
545
  ]
537
- border_t = f"[{border_style}]{border_chars[0]}{border_chars[1] * (Console.w - (len(border_chars[1] * 2)) if w_full else max_line_len + (2 * w_padding))}{border_chars[2]}[_]"
538
- border_b = f"[{border_style}]{border_chars[6]}{border_chars[5] * (Console.w - (len(border_chars[1] * 2)) if w_full else max_line_len + (2 * w_padding))}{border_chars[4]}[_]"
546
+ border_t = f"{spaces_l}[{border_style}]{border_chars[0]}{border_chars[1] * (Console.w - (len(border_chars[1] * 2)) if w_full else max_line_len + (2 * w_padding))}{border_chars[2]}[_]"
547
+ border_b = f"{spaces_l}[{border_style}]{border_chars[6]}{border_chars[5] * (Console.w - (len(border_chars[1] * 2)) if w_full else max_line_len + (2 * w_padding))}{border_chars[4]}[_]"
539
548
  FormatCodes.print(
540
549
  f"{start}{border_t}[_]\n" + "\n".join(lines) + f"\n{border_b}[_]",
541
550
  default_color=default_color,
@@ -559,7 +568,7 @@ class Console:
559
568
  prompt: object = "Do you want to continue?",
560
569
  start="",
561
570
  end="\n",
562
- default_color: Rgba | Hexa = COLOR.cyan,
571
+ default_color: Optional[Rgba | Hexa] = COLOR.cyan,
563
572
  default_is_yes: bool = True,
564
573
  ) -> bool:
565
574
  """Ask a yes/no question.\n
@@ -569,7 +578,7 @@ class Console:
569
578
  confirmed = input(
570
579
  FormatCodes.to_ansi(
571
580
  f'{start} {str(prompt)} [_|dim](({"Y" if default_is_yes else "y"}/{"n" if default_is_yes else "N"}): )',
572
- default_color,
581
+ default_color=default_color,
573
582
  )
574
583
  ).strip().lower() in (("", "y", "yes") if default_is_yes else ("y", "yes"))
575
584
  if end:
@@ -581,7 +590,7 @@ class Console:
581
590
  prompt: object = "",
582
591
  start="",
583
592
  end="\n",
584
- default_color: Rgba | Hexa = COLOR.cyan,
593
+ default_color: Optional[Rgba | Hexa] = COLOR.cyan,
585
594
  show_keybindings=True,
586
595
  input_prefix=" ⮡ ",
587
596
  reset_ansi=True,
@@ -616,7 +625,7 @@ class Console:
616
625
  prompt: object = "",
617
626
  start="",
618
627
  end="\n",
619
- default_color: Rgba | Hexa = COLOR.cyan,
628
+ default_color: Optional[Rgba | Hexa] = COLOR.cyan,
620
629
  allowed_chars: str = CHARS.all, # type: ignore[assignment]
621
630
  min_len: Optional[int] = None,
622
631
  max_len: Optional[int] = None,
@@ -720,7 +729,7 @@ class Console:
720
729
  prompt: object = "Password: ",
721
730
  start="",
722
731
  end="\n",
723
- default_color: Rgba | Hexa = COLOR.cyan,
732
+ default_color: Optional[Rgba | Hexa] = COLOR.cyan,
724
733
  allowed_chars: str = CHARS.standard_ascii,
725
734
  min_len: Optional[int] = None,
726
735
  max_len: Optional[int] = None,
@@ -56,11 +56,13 @@ the formatting code:
56
56
  - `[(255, 0, 136)]`
57
57
  - `[255, 0, 136]`
58
58
  - HEX colors:
59
- Change the text color directly with a HEX color inside the square brackets. (If `RGB` or `RRGGBB` formatting code is used,
59
+ Change the text color directly with a HEX color inside the square brackets. (Whether the `RGB` or `RRGGBB` HEX format is used,
60
60
  and if there's a `#` or `0x` prefix, doesn't matter.)
61
61
  Examples:
62
+ - `[0x7788FF]`
62
63
  - `[#7788FF]`
63
64
  - `[7788FF]`
65
+ - `[0x78F]`
64
66
  - `[#78F]`
65
67
  - `[78F]`
66
68
  - background RGB / HEX colors:
@@ -133,10 +135,13 @@ the formatting code:
133
135
  #### Additional Formatting Codes when a `default_color` is set
134
136
 
135
137
  1. `[*]` resets everything, just like `[_]`, but the text color will remain in `default_color`
136
- (*if no `default_color` it resets everything, including the text color*)
138
+ (if no `default_color` is set, it resets everything, exactly like `[_]`)
137
139
  2. `[*color]` `[*c]` will reset the text color, just like `[_color]`, but then also make it `default_color`
140
+ (if no `default_color` is set, both are treated as invalid formatting codes)
138
141
  3. `[default]` will just color the text in `default_color`
142
+ (if no `default_color` is set, it's treated as an invalid formatting code)
139
143
  4. `[background:default]` `[BG:default]` will color the background in `default_color`
144
+ (if no `default_color` is set, both are treated as invalid formatting codes)\n
140
145
 
141
146
  Unlike the standard console colors, the default color can be changed by using the following modifiers:
142
147
 
@@ -149,6 +154,7 @@ Unlike the standard console colors, the default color can be changed by using th
149
154
  - `[ddd]` will darken the `default_color` text by `3 × brightness_steps`%
150
155
  - ... etc.
151
156
  Per default, you can also use `+` and `-` to get lighter and darker `default_color` versions.
157
+ All of these lighten/darken formatting codes are treated as invalid if no `default_color` is set.
152
158
  """
153
159
 
154
160
  from ._consts_ import ANSI
@@ -165,6 +171,11 @@ import re as _re
165
171
 
166
172
  _CONSOLE_ANSI_CONFIGURED: bool = False
167
173
 
174
+ _ANSI_SEQ_1: str = ANSI.seq(1)
175
+ _DEFAULT_COLOR_MODS: dict[str, str] = {
176
+ "lighten": "+l",
177
+ "darken": "-d",
178
+ }
168
179
  _PREFIX: dict[str, set[str]] = {
169
180
  "BG": {"background", "bg"},
170
181
  "BR": {"bright", "br"},
@@ -190,7 +201,7 @@ _COMPILED: dict[str, Pattern] = { # PRECOMPILE REGULAR EXPRESSIONS
190
201
  "modifier": _re.compile(
191
202
  r"(?i)((?:BG\s*:)?)\s*("
192
203
  + "|".join(
193
- [f"{_re.escape(m)}+" for m in ANSI.default_color_modifiers["lighten"] + ANSI.default_color_modifiers["darken"]]
204
+ [f"{_re.escape(m)}+" for m in _DEFAULT_COLOR_MODS["lighten"] + _DEFAULT_COLOR_MODS["darken"]]
194
205
  )
195
206
  + r")$"
196
207
  ),
@@ -247,6 +258,7 @@ class FormatCodes:
247
258
  default_color: Optional[Rgba | Hexa] = None,
248
259
  brightness_steps: int = 20,
249
260
  _default_start: bool = True,
261
+ _validate_default: bool = True,
250
262
  ) -> str:
251
263
  """Convert the formatting codes inside a string to ANSI formatting.\n
252
264
  -------------------------------------------------------------------------
@@ -254,16 +266,20 @@ class FormatCodes:
254
266
  `xx_format_codes` module documentation."""
255
267
  if not isinstance(string, str):
256
268
  string = str(string)
257
- if default_color and Color.is_valid_rgba(default_color, False):
258
- use_default = True
259
- elif default_color and Color.is_valid_hexa(default_color, False):
260
- use_default, default_color = True, Color.to_rgba(default_color)
269
+ use_default, default_specified = False, default_color is not None
270
+ if _validate_default and default_specified:
271
+ if Color.is_valid_rgba(default_color, False):
272
+ use_default = True
273
+ elif Color.is_valid_hexa(default_color, False):
274
+ use_default, default_color = True, Color.to_rgba(default_color) # type: ignore[assignment]
261
275
  else:
262
- use_default = False
263
- default_color = cast(rgba, default_color) if use_default else None
276
+ use_default = default_specified
277
+ default_color = cast(Optional[rgba], default_color)
264
278
  if use_default:
265
279
  string = _COMPILED["*"].sub(r"[\1_|default\2]", string) # REPLACE `[…|*|…]` WITH `[…|_|default|…]`
266
- string = _COMPILED["*color"].sub(r"[\1default\2]", string) # REPLACE `[…|*color|…]` OR `[…|*c|…]` WITH `[…|default|…]`
280
+ string = _COMPILED["*color"].sub(
281
+ r"[\1default\2]", string
282
+ ) # REPLACE `[…|*color|…]` OR `[…|*c|…]` WITH `[…|default|…]`
267
283
  else:
268
284
  string = _COMPILED["*"].sub(r"[\1_\2]", string) # REPLACE `[…|*|…]` WITH `[…|_|…]`
269
285
 
@@ -277,11 +293,23 @@ class FormatCodes:
277
293
  if formats_escaped := bool(_COMPILED["escape_char_cond"].match(match.group(0))):
278
294
  _formats = formats = _COMPILED["escape_char"].sub(r"\1", formats) # REMOVE / OR \\
279
295
  if auto_reset_txt and auto_reset_txt.count("[") > 0 and auto_reset_txt.count("]") > 0:
280
- auto_reset_txt = FormatCodes.to_ansi(auto_reset_txt, default_color, brightness_steps, False)
296
+ auto_reset_txt = FormatCodes.to_ansi(
297
+ auto_reset_txt,
298
+ default_color,
299
+ brightness_steps,
300
+ _default_start=False,
301
+ _validate_default=False,
302
+ )
281
303
  if not formats:
282
304
  return match.group(0)
283
305
  if formats.count("[") > 0 and formats.count("]") > 0:
284
- formats = FormatCodes.to_ansi(formats, default_color, brightness_steps, False)
306
+ formats = FormatCodes.to_ansi(
307
+ formats,
308
+ default_color,
309
+ brightness_steps,
310
+ _default_start=False,
311
+ _validate_default=False,
312
+ )
285
313
  format_keys = [k.strip() for k in formats.split("|") if k.strip()]
286
314
  ansi_formats = [
287
315
  r if (r := FormatCodes.__get_replacement(k, default_color, brightness_steps)) != k else f"[{k}]"
@@ -323,13 +351,13 @@ class FormatCodes:
323
351
  else:
324
352
  return (
325
353
  "".join(ansi_formats) + (
326
- f"({FormatCodes.to_ansi(auto_reset_txt, default_color, brightness_steps, False)})"
354
+ f"({FormatCodes.to_ansi(auto_reset_txt, default_color, brightness_steps, _default_start=False, _validate_default=False)})"
327
355
  if auto_reset_escaped and auto_reset_txt else auto_reset_txt if auto_reset_txt else ""
328
356
  ) + ("" if auto_reset_escaped else "".join(ansi_resets))
329
357
  )
330
358
 
331
359
  string = "\n".join(_COMPILED["formatting"].sub(replace_keys, line) for line in string.split("\n"))
332
- return (((FormatCodes.__get_default_ansi(default_color.values()) or "") if _default_start else "")
360
+ return (((FormatCodes.__get_default_ansi(default_color) or "") if _default_start else "")
333
361
  + string) if default_color is not None else string
334
362
 
335
363
  @staticmethod
@@ -399,19 +427,21 @@ class FormatCodes:
399
427
 
400
428
  @staticmethod
401
429
  def __get_default_ansi(
402
- default_color: tuple[int, int, int],
430
+ default_color: rgba,
403
431
  format_key: Optional[str] = None,
404
432
  brightness_steps: Optional[int] = None,
405
- _modifiers: tuple[str, str] = (ANSI.default_color_modifiers["lighten"], ANSI.default_color_modifiers["darken"]),
433
+ _modifiers: tuple[str, str] = (_DEFAULT_COLOR_MODS["lighten"], _DEFAULT_COLOR_MODS["darken"]),
406
434
  ) -> Optional[str]:
407
435
  """Get the `default_color` and lighter/darker versions of it as ANSI code."""
408
- if not brightness_steps or (format_key and _COMPILED["bg?_default"].search(format_key)):
436
+ if not isinstance(default_color, rgba):
437
+ return None
438
+ _default_color: tuple[int, int, int] = tuple(default_color)[:3]
439
+ if brightness_steps is None or (format_key and _COMPILED["bg?_default"].search(format_key)):
409
440
  return (ANSI.seq_bg_color if format_key and _COMPILED["bg_default"].search(format_key) else ANSI.seq_color).format(
410
- *default_color[:3]
441
+ *_default_color
411
442
  )
412
443
  if format_key is None or not (format_key in _modifiers[0] or format_key in _modifiers[1]):
413
444
  return None
414
- assert format_key is not None
415
445
  match = _COMPILED["modifier"].match(format_key)
416
446
  if not match:
417
447
  return None
@@ -422,7 +452,7 @@ class FormatCodes:
422
452
  if adjust and adjust > 0:
423
453
  modifiers = mod
424
454
  break
425
- new_rgb = default_color
455
+ new_rgb = _default_color
426
456
  if adjust == 0:
427
457
  return None
428
458
  elif modifiers in _modifiers[0]:
@@ -436,15 +466,13 @@ class FormatCodes:
436
466
  """Gives you the corresponding ANSI code for the given format key.
437
467
  If `default_color` is not `None`, the text color will be `default_color` if all formats
438
468
  are reset or you can get lighter or darker version of `default_color` (also as BG)"""
439
- use_default = default_color and Color.is_valid_rgba(default_color, False)
440
- _default_color = tuple(Color.to_rgba(default_color)) if default_color is not None else tuple()
441
469
  _format_key, format_key = format_key, FormatCodes.__normalize_key(format_key) # NORMALIZE KEY AND SAVE ORIGINAL
442
- if use_default:
443
- if new_default_color := FormatCodes.__get_default_ansi(_default_color, format_key, brightness_steps):
444
- return new_default_color
470
+ if default_color and (new_default_color := FormatCodes.__get_default_ansi(default_color, format_key,
471
+ brightness_steps)):
472
+ return new_default_color
445
473
  for map_key in ANSI.codes_map:
446
474
  if (isinstance(map_key, tuple) and format_key in map_key) or format_key == map_key:
447
- return ANSI.seq().format(
475
+ return _ANSI_SEQ_1.format(
448
476
  next((
449
477
  v for k, v in ANSI.codes_map.items() if format_key == k or (isinstance(k, tuple) and format_key in k)
450
478
  ), None)
@@ -1,22 +1,23 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: xulbux
3
- Version: 1.7.1
3
+ Version: 1.7.3
4
4
  Summary: A Python library which includes lots of helpful classes, types and functions aiming to make common programming tasks simpler.
5
5
  Author-email: XulbuX <xulbux.real@gmail.com>
6
6
  License-Expression: MIT
7
- Project-URL: Bug Reports, https://github.com/XulbuX/PythonLibraryXulbuX/issues
8
- Project-URL: Changelog, https://github.com/XulbuX/PythonLibraryXulbuX/blob/main/CHANGELOG.md
9
- Project-URL: Documentation, https://github.com/XulbuX/PythonLibraryXulbuX/wiki
10
7
  Project-URL: Homepage, https://github.com/XulbuX/PythonLibraryXulbuX
11
- Project-URL: License, https://github.com/XulbuX/PythonLibraryXulbuX/blob/main/LICENSE
8
+ Project-URL: Documentation, https://github.com/XulbuX/PythonLibraryXulbuX/wiki
12
9
  Project-URL: Source Code, https://github.com/XulbuX/PythonLibraryXulbuX/tree/main/src
13
- Keywords: args,arguments,attributes,classes,cmd,client,code,codes,color,commands,console,consts,constants,convert,conversion,data,debug,easier,env,environment,error,file,format,formatting,functions,helper,hex,hexa,hsl,hsla,info,input,json,library,log,logging,methods,nice,operations,path,presets,pretty,printing,properties,python,re,regex,rgb,rgba,string,structures,system,tools,types,utility,warn,warning,xulbux
14
- Classifier: Intended Audience :: Developers
10
+ Project-URL: Changelog, https://github.com/XulbuX/PythonLibraryXulbuX/blob/main/CHANGELOG.md
11
+ Project-URL: Bug Reports, https://github.com/XulbuX/PythonLibraryXulbuX/issues
12
+ Project-URL: License, https://github.com/XulbuX/PythonLibraryXulbuX/blob/main/LICENSE
13
+ Keywords: args,arguments,attributes,classes,client,cmd,code,codes,color,commands,console,constants,consts,conversion,convert,data,debug,easier,env,environment,error,file,format,formatting,functions,helper,hex,hexa,hsl,hsla,info,input,json,library,log,logging,methods,nice,operations,path,presets,pretty,printing,properties,python,re,regex,rgb,rgba,string,structures,system,tools,types,utility,warn,warning,xulbux
15
14
  Classifier: Programming Language :: Python :: 3
16
- Classifier: Programming Language :: Python :: 3.10
17
- Classifier: Programming Language :: Python :: 3.11
15
+ Classifier: Programming Language :: Python :: 3.13
18
16
  Classifier: Programming Language :: Python :: 3.12
17
+ Classifier: Programming Language :: Python :: 3.11
18
+ Classifier: Programming Language :: Python :: 3.10
19
19
  Classifier: Operating System :: OS Independent
20
+ Classifier: Intended Audience :: Developers
20
21
  Classifier: Topic :: Software Development :: Libraries :: Python Modules
21
22
  Requires-Python: >=3.10.0
22
23
  Description-Content-Type: text/markdown
@@ -27,20 +28,22 @@ Requires-Dist: prompt_toolkit>=3.0.41
27
28
  Requires-Dist: pyperclip>=1.9.0
28
29
  Requires-Dist: regex>=2023.10.3
29
30
  Provides-Extra: dev
30
- Requires-Dist: pytest>=7.4.2; extra == "dev"
31
31
  Requires-Dist: black>=23.7.0; extra == "dev"
32
- Requires-Dist: isort>=5.12.0; extra == "dev"
33
- Requires-Dist: flake8>=6.1.0; extra == "dev"
34
32
  Requires-Dist: flake8-pyproject>=1.2.3; extra == "dev"
33
+ Requires-Dist: flake8>=6.1.0; extra == "dev"
34
+ Requires-Dist: isort>=5.12.0; extra == "dev"
35
+ Requires-Dist: pytest>=7.4.2; extra == "dev"
35
36
  Dynamic: license-file
36
37
 
37
- # **$\Huge\textsf{XulbuX}$**
38
+ # **XulbuX**
39
+
40
+ ![](https://img.shields.io/pypi/v/xulbux?labelColor=404560&color=7075FF) ![](https://img.shields.io/pypi/dm/xulbux?labelColor=405555&color=70FFEE) ![](https://img.shields.io/github/license/XulbuX/PythonLibraryXulbuX?labelColor=405555&color=70FFEE) ![](https://img.shields.io/github/last-commit/XulbuX/PythonLibraryXulbuX?labelColor=554045&color=FF6065) ![](https://img.shields.io/github/issues/XulbuX/PythonLibraryXulbuX?labelColor=554045&color=FF6065)
38
41
 
39
42
  **XulbuX** is library that contains many useful classes, types, and functions,
40
43
  ranging from console logging and working with colors to file management and system operations.
41
44
  The library is designed to simplify common programming tasks and improve code readability through its collection of tools.
42
45
 
43
- For precise information about the library, see the library's [**wiki page**](https://github.com/XulbuX/PythonLibraryXulbuX/wiki).<br>
46
+ For precise information about the library, see the library's [**documentation**](https://github.com/XulbuX/PythonLibraryXulbuX/wiki).<br>
44
47
  For the libraries latest changes and updates, see the [**change log**](https://github.com/XulbuX/PythonLibraryXulbuX/blob/main/CHANGELOG.md).
45
48
 
46
49
  <br>
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
@@ -5,8 +5,8 @@ pyperclip>=1.9.0
5
5
  regex>=2023.10.3
6
6
 
7
7
  [dev]
8
- pytest>=7.4.2
9
8
  black>=23.7.0
10
- isort>=5.12.0
11
- flake8>=6.1.0
12
9
  flake8-pyproject>=1.2.3
10
+ flake8>=6.1.0
11
+ isort>=5.12.0
12
+ pytest>=7.4.2
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes