xulbux 1.5.5__py3-none-any.whl → 1.5.7__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 xulbux might be problematic. Click here for more details.

xulbux/xx_regex.py CHANGED
@@ -9,12 +9,9 @@ Really long regex code presets:<br>
9
9
  `hsla_str` match a HSLA color
10
10
  """
11
11
 
12
-
13
12
  import re as _re
14
13
 
15
14
 
16
-
17
-
18
15
  class Regex:
19
16
 
20
17
  @staticmethod
@@ -25,42 +22,54 @@ class Regex:
25
22
  **`quote`** the quote type (single or double)<br>
26
23
  **`string`** everything inside the found quote pair\n
27
24
  ------------------------------------------------------------------------------------
28
- **Attention:** Requires non standard library `regex` not standard library `re`!"""
25
+ **Attention:** Requires non standard library `regex` not standard library `re`!
26
+ """
29
27
  return r'(?P<quote>[\'"])(?P<string>(?:\\.|(?!\g<quote>).)*?)\g<quote>'
30
28
 
31
29
  @staticmethod
32
- def brackets(bracket1:str = '(', bracket2:str = ')', is_group:bool = False) -> str:
30
+ def brackets(bracket1: str = "(", bracket2: str = ")", is_group: bool = False) -> str:
33
31
  """Matches everything inside brackets, including other nested brackets.\n
34
32
  ------------------------------------------------------------------------------------
35
- **Attention:** Requires non standard library `regex` not standard library `re`!"""
36
- g, b1, b2 = '' if is_group else '?:', _re.escape(bracket1) if len(bracket1) == 1 else bracket1, _re.escape(bracket2) if len(bracket2) == 1 else bracket2
33
+ **Attention:** Requires non standard library `regex` not standard library `re`!
34
+ """
35
+ g, b1, b2 = (
36
+ "" if is_group else "?:",
37
+ _re.escape(bracket1) if len(bracket1) == 1 else bracket1,
38
+ _re.escape(bracket2) if len(bracket2) == 1 else bracket2,
39
+ )
37
40
  return rf'{b1}\s*({g}(?:[^{b1}{b2}"\']|"(?:\\.|[^"\\])*"|\'(?:\\.|[^\'\\])*\'|{b1}(?:[^{b1}{b2}"\']|"(?:\\.|[^"\\])*"|\'(?:\\.|[^\'\\])*\'|(?R))*{b2})*)\s*{b2}'
38
41
 
39
42
  @staticmethod
40
- def outside_strings(pattern:str = r'.*') -> str:
43
+ def outside_strings(pattern: str = r".*") -> str:
41
44
  """Matches the `pattern` only when it is not found inside a string (`'...'` or `"..."`)."""
42
45
  return rf'(?<!["\'])(?:{pattern})(?!["\'])'
43
46
 
44
47
  @staticmethod
45
- def all_except(disallowed_pattern:str, ignore_pattern:str = '', is_group:bool = False) -> str:
48
+ def all_except(
49
+ disallowed_pattern: str,
50
+ ignore_pattern: str = "",
51
+ is_group: bool = False,
52
+ ) -> str:
46
53
  """Matches everything except `disallowed_pattern`, unless the `disallowed_pattern` is found inside a string (`'...'` or `"..."`).\n
47
54
  ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
48
55
  The `ignore_pattern` is just always ignored. For example if `disallowed_pattern` is `>` and `ignore_pattern` is `->`, the `->`-arrows will be allowed, even though they have `>` in them.<br>
49
- If `is_group` is `True`, you will be able to reference the matched content as a group (e.g. <code>match.group(<i>int</i>)</code> or <code>r'\\<i>int</i>'</code>)."""
56
+ If `is_group` is `True`, you will be able to reference the matched content as a group (e.g. <code>match.group(<i>int</i>)</code> or <code>r'\\<i>int</i>'</code>).
57
+ """
50
58
  return rf'({"" if is_group else "?:"}(?:(?!{ignore_pattern}).)*(?:(?!{Regex.outside_strings(disallowed_pattern)}).)*)'
51
59
 
52
60
  @staticmethod
53
- def func_call(func_name:str = None) -> str:
61
+ def func_call(func_name: str = None) -> str:
54
62
  """Match a function call<br>
55
63
  **`1`** function name<br>
56
64
  **`2`** the function's arguments\n
57
65
  If no `func_name` is given, it will match any function call.\n
58
66
  ------------------------------------------------------------------------------------
59
- **Attention:** Requires non standard library `regex` not standard library `re`!"""
60
- return r'(?<=\b)(' + (func_name if func_name else r'[\w_]+') + r')\s*' + Regex.brackets("(", ")", is_group=True)
67
+ **Attention:** Requires non standard library `regex` not standard library `re`!
68
+ """
69
+ return r"(?<=\b)(" + (func_name if func_name else r"[\w_]+") + r")\s*" + Regex.brackets("(", ")", is_group=True)
61
70
 
62
71
  @staticmethod
63
- def rgba_str(fix_sep:str = ',', allow_alpha:bool = False) -> str:
72
+ def rgba_str(fix_sep: str = ",", allow_alpha: bool = False) -> str:
64
73
  """Matches an RGBA color inside a string.\n
65
74
  --------------------------------------------------------------------------------
66
75
  The RGBA color can be in the formats (for `fix_sep = ','`):<br>
@@ -79,20 +88,24 @@ class Regex:
79
88
  --------------------------------------------------------------------------------
80
89
  If the `fix_sep` is set to nothing, any char that is not a letter or number<br>
81
90
  can be used to separate the RGB values, including just a space."""
82
- if fix_sep in (None, ''):
83
- fix_sep = r'[^0-9A-Z]'
91
+ if fix_sep in (None, ""):
92
+ fix_sep = r"[^0-9A-Z]"
84
93
  else:
85
94
  fix_sep = _re.escape(fix_sep)
86
- rgb_part = rf'''((?:0*(?:25[0-5]|2[0-4][0-9]|1?[0-9]{{1,2}})))
95
+ rgb_part = rf"""((?:0*(?:25[0-5]|2[0-4][0-9]|1?[0-9]{{1,2}})))
87
96
  (?:\s*{fix_sep}\s*)((?:0*(?:25[0-5]|2[0-4][0-9]|1?[0-9]{{1,2}})))
88
- (?:\s*{fix_sep}\s*)((?:0*(?:25[0-5]|2[0-4][0-9]|1?[0-9]{{1,2}})))'''
89
- return rf'''(?ix)
97
+ (?:\s*{fix_sep}\s*)((?:0*(?:25[0-5]|2[0-4][0-9]|1?[0-9]{{1,2}})))"""
98
+ return (
99
+ rf"""(?ix)
90
100
  (?:rgb|rgba)?\s*(?:\(?\s*{rgb_part}
91
101
  (?:(?:\s*{fix_sep}\s*)((?:0*(?:0?\.[0-9]+|1\.0+|[0-9]+\.[0-9]+|[0-9]+))))?
92
- \s*\)?)''' if allow_alpha else rf'(?ix)(?:rgb|rgba)?\s*(?:\(?\s*{rgb_part}\s*\)?)'
102
+ \s*\)?)"""
103
+ if allow_alpha
104
+ else rf"(?ix)(?:rgb|rgba)?\s*(?:\(?\s*{rgb_part}\s*\)?)"
105
+ )
93
106
 
94
107
  @staticmethod
95
- def hsla_str(fix_sep:str = ',', allow_alpha:bool = False) -> str:
108
+ def hsla_str(fix_sep: str = ",", allow_alpha: bool = False) -> str:
96
109
  """Matches a HSLA color inside a string.\n
97
110
  --------------------------------------------------------------------------------
98
111
  The HSLA color can be in the formats (for `fix_sep = ','`):<br>
@@ -111,14 +124,18 @@ class Regex:
111
124
  --------------------------------------------------------------------------------
112
125
  If the `fix_sep` is set to nothing, any char that is not a letter or number<br>
113
126
  can be used to separate the HSL values, including just a space."""
114
- if fix_sep in (None, ''):
115
- fix_sep = r'[^0-9A-Z]'
127
+ if fix_sep in (None, ""):
128
+ fix_sep = r"[^0-9A-Z]"
116
129
  else:
117
130
  fix_sep = _re.escape(fix_sep)
118
- hsl_part = rf'''((?:0*(?:360|3[0-5][0-9]|[12][0-9][0-9]|[1-9]?[0-9])))
131
+ hsl_part = rf"""((?:0*(?:360|3[0-5][0-9]|[12][0-9][0-9]|[1-9]?[0-9])))
119
132
  (?:\s*{fix_sep}\s*)((?:0*(?:100|[1-9][0-9]|[0-9])))
120
- (?:\s*{fix_sep}\s*)((?:0*(?:100|[1-9][0-9]|[0-9])))'''
121
- return rf'''(?ix)
133
+ (?:\s*{fix_sep}\s*)((?:0*(?:100|[1-9][0-9]|[0-9])))"""
134
+ return (
135
+ rf"""(?ix)
122
136
  (?:hsl|hsla)?\s*(?:\(?\s*{hsl_part}
123
137
  (?:(?:\s*{fix_sep}\s*)((?:0*(?:0?\.[0-9]+|1\.0+|[0-9]+\.[0-9]+|[0-9]+))))?
124
- \s*\)?)''' if allow_alpha else rf'(?ix)(?:hsl|hsla)?\s*(?:\(?\s*{hsl_part}\s*\)?)'
138
+ \s*\)?)"""
139
+ if allow_alpha
140
+ else rf"(?ix)(?:hsl|hsla)?\s*(?:\(?\s*{hsl_part}\s*\)?)"
141
+ )
xulbux/xx_string.py CHANGED
@@ -1,64 +1,87 @@
1
1
  import re as _re
2
2
 
3
3
 
4
-
5
-
6
4
  class String:
7
5
 
8
6
  @staticmethod
9
- def to_type(value:str) -> any:
7
+ def to_type(string: str) -> any:
10
8
  """Will convert a string to a type."""
11
- if value.lower() in ['true', 'false']: # BOOLEAN
12
- return value.lower() == 'true'
13
- elif value.lower() in ['none', 'null', 'undefined']: # NONE
9
+ if string.lower() in ("true", "false"): # BOOLEAN
10
+ return string.lower() == "true"
11
+ elif string.lower() in ("none", "null", "undefined"): # NONE
14
12
  return None
15
- elif value.startswith('[') and value.endswith(']'): # LIST
16
- return [String.to_type(item.strip()) for item in value[1:-1].split(',') if item.strip()]
17
- elif value.startswith('(') and value.endswith(')'): # TUPLE
18
- return tuple(String.to_type(item.strip()) for item in value[1:-1].split(',') if item.strip())
19
- elif value.startswith('{') and value.endswith('}'): # SET
20
- return {String.to_type(item.strip()) for item in value[1:-1].split(',') if item.strip()}
21
- elif value.startswith('{') and value.endswith('}') and ':' in value: # DICTIONARY
22
- return {String.to_type(k.strip()): String.to_type(v.strip()) for k, v in [item.split(':') for item in value[1:-1].split(',') if item.strip()]}
13
+ elif string.startswith("[") and string.endswith("]"): # LIST
14
+ return [String.to_type(item.strip()) for item in string[1:-1].split(",") if item.strip()]
15
+ elif string.startswith("(") and string.endswith(")"): # TUPLE
16
+ return tuple(String.to_type(item.strip()) for item in string[1:-1].split(",") if item.strip())
17
+ elif string.startswith("{") and string.endswith("}"): # SET
18
+ return {String.to_type(item.strip()) for item in string[1:-1].split(",") if item.strip()}
19
+ elif string.startswith("{") and string.endswith("}") and ":" in string: # DICTIONARY
20
+ return {
21
+ String.to_type(k.strip()): String.to_type(v.strip())
22
+ for k, v in (item.split(":") for item in string[1:-1].split(",") if item.strip())
23
+ }
23
24
  try: # NUMBER (INT OR FLOAT)
24
- if '.' in value or 'e' in value.lower():
25
- return float(value)
25
+ if "." in string or "e" in string.lower():
26
+ return float(string)
26
27
  else:
27
- return int(value)
28
- except ValueError: pass
29
- if value.startswith(("'", '"')) and value.endswith(("'", '"')): # STRING (WITH OR WITHOUT QUOTES)
30
- return value[1:-1]
28
+ return int(string)
29
+ except ValueError:
30
+ pass
31
+ if string.startswith(("'", '"')) and string.endswith(("'", '"')): # STRING (WITH OR WITHOUT QUOTES)
32
+ return string[1:-1]
31
33
  try: # COMPLEX
32
- return complex(value)
33
- except ValueError: pass
34
- return value # IF NOTHING ELSE MATCHES, RETURN AS IS
34
+ return complex(string)
35
+ except ValueError:
36
+ pass
37
+ return string # IF NOTHING ELSE MATCHES, RETURN AS IS
38
+
39
+ @staticmethod
40
+ def normalize_spaces(string: str, tab_spaces: int = 4) -> str:
41
+ """Replaces all special space characters with normal spaces.<br>
42
+ Also replaces tab characters with `tab_spaces` spaces."""
43
+ return (
44
+ string.replace("\t", " " * tab_spaces)
45
+ .replace("\u2000", " ")
46
+ .replace("\u2001", " ")
47
+ .replace("\u2002", " ")
48
+ .replace("\u2003", " ")
49
+ .replace("\u2004", " ")
50
+ .replace("\u2005", " ")
51
+ .replace("\u2006", " ")
52
+ .replace("\u2007", " ")
53
+ .replace("\u2008", " ")
54
+ .replace("\u2009", " ")
55
+ .replace("\u200A", " ")
56
+ )
35
57
 
36
58
  @staticmethod
37
- def get_repeated_symbol(string:str, symbol:str) -> int|bool:
38
- """If the string consists of one repeating `symbol`, it returns the number of times it is repeated.<br>
39
- If the string doesn't consist of one repeating symbol, it returns `False`."""
40
- if len(string) == len(symbol) * string.count(symbol):
41
- return string.count(symbol)
59
+ def single_char_repeats(string: str, char: str) -> int | bool:
60
+ """If the string consists of only the same `char`, it returns the number of times it is present.<br>
61
+ If the string doesn't consist of only the same character, it returns `False`.
62
+ """
63
+ if len(string) == len(char) * string.count(char):
64
+ return string.count(char)
42
65
  else:
43
66
  return False
44
67
 
45
68
  @staticmethod
46
- def decompose(case_string:str, seps:str = '-_', lower_all:bool = True) -> list[str]:
69
+ def decompose(case_string: str, seps: str = "-_", lower_all: bool = True) -> list[str]:
47
70
  """Will decompose the string (*any type of casing, also mixed*) into parts."""
48
- return [(part.lower() if lower_all else part) for part in _re.split(rf'(?<=[a-z])(?=[A-Z])|[{seps}]', case_string)]
71
+ return [(part.lower() if lower_all else part) for part in _re.split(rf"(?<=[a-z])(?=[A-Z])|[{seps}]", case_string)]
49
72
 
50
73
  @staticmethod
51
- def to_camel_case(string:str) -> str:
74
+ def to_camel_case(string: str) -> str:
52
75
  """Will convert the string of any type of casing to camel case."""
53
- return ''.join(part.capitalize() for part in String.decompose(string))
76
+ return "".join(part.capitalize() for part in String.decompose(string))
54
77
 
55
78
  @staticmethod
56
- def to_snake_case(string:str, sep:str = '_', screaming:bool = False) -> str:
79
+ def to_snake_case(string: str, sep: str = "_", screaming: bool = False) -> str:
57
80
  """Will convert the string of any type of casing to snake case."""
58
81
  return sep.join(part.upper() if screaming else part for part in String.decompose(string))
59
82
 
60
83
  @staticmethod
61
- def get_string_lines(string:str, remove_empty_lines:bool = False) -> list[str]:
84
+ def get_string_lines(string: str, remove_empty_lines: bool = False) -> list[str]:
62
85
  """Will split the string into lines."""
63
86
  if not remove_empty_lines:
64
87
  return string.splitlines()
@@ -71,46 +94,51 @@ class String:
71
94
  return non_empty_lines
72
95
 
73
96
  @staticmethod
74
- def remove_consecutive_empty_lines(string:str, max_consecutive:int = 0) -> str:
97
+ def remove_consecutive_empty_lines(string: str, max_consecutive: int = 0) -> str:
75
98
  """Will remove consecutive empty lines from the string.\n
76
99
  ----------------------------------------------------------------------------------------------
77
100
  If `max_consecutive` is `0`, it will remove all consecutive empty lines.<br>
78
101
  If `max_consecutive` is bigger than `0`, it will only allow `max_consecutive` consecutive<br>
79
- empty lines and everything above it will be cut down to `max_consecutive` empty lines."""
80
- return _re.sub(r'(\n\s*){2,}', r'\1' * (max_consecutive + 1), string)
102
+ empty lines and everything above it will be cut down to `max_consecutive` empty lines.
103
+ """
104
+ return _re.sub(r"(\n\s*){2,}", r"\1" * (max_consecutive + 1), string)
81
105
 
82
106
  @staticmethod
83
- def split_every_chars(string:str, split:int) -> list[str]:
84
- """Will split the string every `split` characters."""
85
- return [string[i:i + split] for i in range(0, len(string), split)]
107
+ def split_count(string: str, count: int) -> list[str]:
108
+ """Will split the string every `count` characters."""
109
+ return [string[i : i + count] for i in range(0, len(string), count)]
86
110
 
87
111
  @staticmethod
88
- def multi_strip(string:str, strip_chars:str = ' _-') -> str:
112
+ def multi_strip(string: str, strip_chars: str = " _-") -> str:
89
113
  """Will remove all leading and trailing `strip_chars` from the string."""
90
114
  for char in string:
91
115
  if char in strip_chars:
92
116
  string = string[1:]
93
- else: break
117
+ else:
118
+ break
94
119
  for char in string[::-1]:
95
120
  if char in strip_chars:
96
121
  string = string[:-1]
97
- else: break
122
+ else:
123
+ break
98
124
  return string
99
125
 
100
126
  @staticmethod
101
- def multi_lstrip(string:str, strip_chars:str = ' _-') -> str:
127
+ def multi_lstrip(string: str, strip_chars: str = " _-") -> str:
102
128
  """Will remove all leading `strip_chars` from the string."""
103
129
  for char in string:
104
130
  if char in strip_chars:
105
131
  string = string[1:]
106
- else: break
132
+ else:
133
+ break
107
134
  return string
108
135
 
109
136
  @staticmethod
110
- def multi_rstrip(string:str, strip_chars:str = ' _-') -> str:
137
+ def multi_rstrip(string: str, strip_chars: str = " _-") -> str:
111
138
  """Will remove all trailing `strip_chars` from the string."""
112
139
  for char in string[::-1]:
113
140
  if char in strip_chars:
114
141
  string = string[:-1]
115
- else: break
142
+ else:
143
+ break
116
144
  return string
xulbux/xx_system.py CHANGED
@@ -5,71 +5,82 @@ import sys as _sys
5
5
  import os as _os
6
6
 
7
7
 
8
-
9
-
10
8
  class System:
11
9
 
12
10
  @staticmethod
13
- def restart(prompt:object = None, wait:int = 0, continue_program:bool = False, force:bool = False) -> None:
11
+ def restart(
12
+ prompt: object = None,
13
+ wait: int = 0,
14
+ continue_program: bool = False,
15
+ force: bool = False,
16
+ ) -> None:
14
17
  """Starts a system restart:<br>
15
18
  `prompt` is the message to be displayed in the systems restart notification.<br>
16
19
  `wait` is the time to wait until restarting in seconds.<br>
17
20
  `continue_program` is whether to continue the current Python program after calling this function.<br>
18
- `force` is whether to force a restart even if other processes are still running."""
21
+ `force` is whether to force a restart even if other processes are still running.
22
+ """
19
23
  system = _platform.system().lower()
20
- if system == 'windows':
24
+ if system == "windows":
21
25
  if not force:
22
- output = _subprocess.check_output('tasklist', shell=True).decode()
26
+ output = _subprocess.check_output("tasklist", shell=True).decode()
23
27
  processes = [line.split()[0] for line in output.splitlines()[3:] if line.strip()]
24
28
  if len(processes) > 2: # EXCLUDING THE PYTHON PROCESS AND CMD
25
- raise RuntimeError('Processes are still running. Use the parameter `force=True` to restart anyway.')
29
+ raise RuntimeError("Processes are still running. Use the parameter `force=True` to restart anyway.")
26
30
  if prompt:
27
31
  _os.system(f'shutdown /r /t {wait} /c "{prompt}"')
28
32
  else:
29
- _os.system('shutdown /r /t 0')
33
+ _os.system("shutdown /r /t 0")
30
34
  if continue_program:
31
- print(f'Restarting in {wait} seconds...')
35
+ print(f"Restarting in {wait} seconds...")
32
36
  _time.sleep(wait)
33
- elif system in ['linux', 'darwin']:
37
+ elif system in ("linux", "darwin"):
34
38
  if not force:
35
- output = _subprocess.check_output(['ps', '-A']).decode()
39
+ output = _subprocess.check_output(["ps", "-A"]).decode()
36
40
  processes = output.splitlines()[1:] # EXCLUDE HEADER
37
41
  if len(processes) > 2: # EXCLUDING THE PYTHON PROCESS AND PS
38
- raise RuntimeError('Processes are still running. Use the parameter `force=True` to restart anyway.')
42
+ raise RuntimeError("Processes are still running. Use the parameter `force=True` to restart anyway.")
39
43
  if prompt:
40
- _subprocess.Popen(['notify-send', 'System Restart', prompt])
44
+ _subprocess.Popen(["notify-send", "System Restart", prompt])
41
45
  _time.sleep(wait)
42
46
  try:
43
- _subprocess.run(['sudo', 'shutdown', '-r', 'now'])
47
+ _subprocess.run(["sudo", "shutdown", "-r", "now"])
44
48
  except _subprocess.CalledProcessError:
45
- raise PermissionError('Failed to restart: insufficient privileges. Ensure sudo permissions are granted.')
49
+ raise PermissionError("Failed to restart: insufficient privileges. Ensure sudo permissions are granted.")
46
50
  if continue_program:
47
- print(f'Restarting in {wait} seconds...')
51
+ print(f"Restarting in {wait} seconds...")
48
52
  _time.sleep(wait)
49
53
  else:
50
- raise NotImplementedError(f'Restart not implemented for `{system}`')
54
+ raise NotImplementedError(f"Restart not implemented for `{system}`")
51
55
 
52
56
  @staticmethod
53
- def check_libs(lib_names:list[str], install_missing:bool = False, confirm_install:bool = True) -> None|list[str]:
57
+ def check_libs(
58
+ lib_names: list[str],
59
+ install_missing: bool = False,
60
+ confirm_install: bool = True,
61
+ ) -> None | list[str]:
54
62
  """Checks if the given list of libraries are installed. If not:
55
63
  - If `install_missing` is `False` the missing libraries will be returned as a list.
56
- - If `install_missing` is `True` the missing libraries will be installed. If `confirm_install` is `True` the user will first be asked if they want to install the missing libraries."""
64
+ - If `install_missing` is `True` the missing libraries will be installed. If `confirm_install` is `True` the user will first be asked if they want to install the missing libraries.
65
+ """
57
66
  missing = []
58
67
  for lib in lib_names:
59
- try: __import__(lib)
60
- except ImportError: missing.append(lib)
68
+ try:
69
+ __import__(lib)
70
+ except ImportError:
71
+ missing.append(lib)
61
72
  if not missing:
62
73
  return None
63
74
  elif not install_missing:
64
75
  return missing
65
76
  if confirm_install:
66
- print('The following required libraries are missing:')
77
+ print("The following required libraries are missing:")
67
78
  for lib in missing:
68
- print(f'- {lib}')
69
- if input('Do you want to install them now (Y/n): ').strip().lower() not in ['', 'y', 'yes']:
70
- raise ImportError('Missing required libraries.')
79
+ print(f"- {lib}")
80
+ if input("Do you want to install them now (Y/n): ").strip().lower() not in ("", "y", "yes"):
81
+ raise ImportError("Missing required libraries.")
71
82
  try:
72
- _subprocess.check_call([_sys.executable, '-m', 'pip', 'install'] + missing)
83
+ _subprocess.check_call([_sys.executable, "-m", "pip", "install"] + missing)
73
84
  return None
74
85
  except _subprocess.CalledProcessError:
75
86
  return missing
@@ -1,12 +1,12 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: XulbuX
3
- Version: 1.5.5
3
+ Version: 1.5.7
4
4
  Summary: A library which includes a lot of really helpful functions.
5
- Project-URL: Homepage, https://github.com/XulbuX-dev/Python/tree/main/Libraries/XulbuX
6
- Project-URL: Bug Reports, https://github.com/XulbuX-dev/Python/issues
7
- Project-URL: Documentation, https://github.com/XulbuX-dev/Python/wiki
8
- Project-URL: Source Code, https://github.com/XulbuX-dev/Python/tree/main/Libraries/XulbuX/src
9
- Project-URL: Changelog, https://github.com/XulbuX-dev/Python/blob/main/Libraries/XulbuX/CHANGELOG.md
5
+ Project-URL: Homepage, https://github.com/XulbuX-dev/PythonLibraryXulbuX
6
+ Project-URL: Bug Reports, https://github.com/XulbuX-dev/PythonLibraryXulbuX/issues
7
+ Project-URL: Documentation, https://github.com/XulbuX-dev/PythonLibraryXulbuX/wiki
8
+ Project-URL: Source Code, https://github.com/XulbuX-dev/PythonLibraryXulbuX/tree/main/src
9
+ Project-URL: Changelog, https://github.com/XulbuX-dev/PythonLibraryXulbuX/blob/main/CHANGELOG.md
10
10
  Author-email: XulbuX <xulbux.real@gmail.com>
11
11
  License: MIT License
12
12
 
@@ -29,7 +29,7 @@ License: MIT License
29
29
  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
30
30
  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
31
31
  SOFTWARE.
32
- Keywords: classes,cmd,code,color,data,env,environment,file,format,functions,helper,helpful,json,library,methods,operations,path,presets,python,regex,string,structures,system,tools,types,utility,xulbux
32
+ Keywords: classes,cmd,code,color,data,env,environment,file,format,functions,helper,json,library,methods,operations,path,presets,python,regex,string,structures,system,tools,types,utility,xulbux
33
33
  Classifier: Intended Audience :: Developers
34
34
  Classifier: License :: OSI Approved :: MIT License
35
35
  Classifier: Operating System :: OS Independent
@@ -41,17 +41,21 @@ Classifier: Topic :: Software Development :: Libraries :: Python Modules
41
41
  Requires-Python: >=3.10.0
42
42
  Requires-Dist: keyboard>=0.13.5
43
43
  Requires-Dist: mouse>=0.7.1
44
+ Requires-Dist: pyperclip>=1.9.0
44
45
  Requires-Dist: regex>=2023.10.3
45
46
  Provides-Extra: dev
46
- Requires-Dist: pytest>=7.0; extra == 'dev'
47
+ Requires-Dist: black>=23.7.0; extra == 'dev'
48
+ Requires-Dist: flake8>=6.1.0; extra == 'dev'
49
+ Requires-Dist: isort>=5.12.0; extra == 'dev'
50
+ Requires-Dist: pytest>=7.4.2; extra == 'dev'
47
51
  Description-Content-Type: text/markdown
48
52
 
49
53
  # **$\color{#8085FF}\Huge\textsf{XulbuX}$**
50
54
 
51
55
  **$\color{#8085FF}\textsf{XulbuX}$** is a library which includes a lot of really helpful classes, types and functions.
52
56
 
53
- For the libraries latest changes, see the [change log](https://github.com/XulbuX-dev/Python/blob/main/Libraries/XulbuX/CHANGELOG.md).<br>
54
- For precise information about the library, see the library's [Wiki page](https://github.com/XulbuX-dev/Python/wiki).
57
+ For the libraries latest changes, see the [change log](https://github.com/XulbuX-dev/PythonLibraryXulbuX/blob/main/CHANGELOG.md).<br>
58
+ For precise information about the library, see the library's [Wiki page](https://github.com/XulbuX-dev/PythonLibraryXulbuX/wiki).
55
59
 
56
60
 
57
61
  ## Installation
@@ -0,0 +1,20 @@
1
+ xulbux/__init__.py,sha256=h6v5Ld_jy1LeTD8hZLfOZUIljUScCRu1FnHRJP1Dp54,1660
2
+ xulbux/_cli_.py,sha256=W6qLGAY5F17bVDCkgtU-XOwqe_UyXBxBonW8e0Gso74,3437
3
+ xulbux/_consts_.py,sha256=HqBCzFYSk9LS2TrxPCQBQcEjEB8McLodH4ZGZ8yP3Ec,4858
4
+ xulbux/xx_cmd.py,sha256=K8U96QSAbLgDG65zIQdniSFtJUqUgKoaHhxgyaq5qBQ,15315
5
+ xulbux/xx_code.py,sha256=PDZi1HNzGfEfoI646N5FQOAL3nZ7cE8eETmW6pl-szA,5146
6
+ xulbux/xx_color.py,sha256=sUZKZdx6dMNL48G5o_SHYMnYPx3sbGoGiu6NpeJkPSw,44053
7
+ xulbux/xx_data.py,sha256=2lYt0kiZxgqqA0e8u8k6VQr8juVzrZRAgio4ehUteSc,27876
8
+ xulbux/xx_env_vars.py,sha256=nJQtddsfDo2HDG1vzmcmz2h79N3jV-J-fLayGpASRUE,2706
9
+ xulbux/xx_file.py,sha256=pQrTsTvaa8tBHOrN9pu2r7qxi8Wzon5V43TfVGitxko,2608
10
+ xulbux/xx_format_codes.py,sha256=OqzegaaiLJ09id6LI842bH4oyXOXbVrBM5q5jh6-z7I,13562
11
+ xulbux/xx_json.py,sha256=wAIwC5IO8oepsYoF1tN5c4DOjSBvT2HZakUxmA-F3BE,5050
12
+ xulbux/xx_path.py,sha256=KB1HGYCxFB3_T97RVACajy3-QiksbviZVIW9-iQcr4s,4558
13
+ xulbux/xx_regex.py,sha256=yTGtNtuW2Cng714iuwxWz9wDN3Bw06rzXfPUVvfiXvk,7159
14
+ xulbux/xx_string.py,sha256=znfeRrAu8OA3Dd0cmMsOm2zXZKzudS4ZuH2Pny2ulEw,6212
15
+ xulbux/xx_system.py,sha256=yehO57ggWDRJbeFoTE1VisW4QrbkqZzAyjKoL3xHx9k,3935
16
+ xulbux-1.5.7.dist-info/METADATA,sha256=dLdhkqGBSyklBIzk_A4zgViiXfxTKoPlYuWigz_rr-0,4336
17
+ xulbux-1.5.7.dist-info/WHEEL,sha256=C2FUgwZgiLbznR-k0b_5k3Ai_1aASOXDss3lzCUsUug,87
18
+ xulbux-1.5.7.dist-info/entry_points.txt,sha256=KX2dtQr5OW5WdHcNqgj6rxFTqliIBNcNQq_FBOGS-0A,94
19
+ xulbux-1.5.7.dist-info/licenses/LICENSE,sha256=6NflEcvzFEe8_JFVNCPVwZBwBhlLLd4vqQi8WiX_Xk4,1084
20
+ xulbux-1.5.7.dist-info/RECORD,,
@@ -1,4 +1,4 @@
1
1
  Wheel-Version: 1.0
2
- Generator: hatchling 1.26.1
2
+ Generator: hatchling 1.26.3
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any
@@ -0,0 +1,3 @@
1
+ [console_scripts]
2
+ xulbux-help = XulbuX._cli_:help_command
3
+ xx-help = XulbuX._cli_:help_command
@@ -1,20 +0,0 @@
1
- xulbux/__help__.py,sha256=2p_CLFMoEu4Coqs2d3dFuoZ16NQTI6aZkctVjSmq7mE,4098
2
- xulbux/__init__.py,sha256=8I7GLhkT_P3-KIDDZmAlbIgxmQfoh3ujgv5_aPzQt8g,1644
3
- xulbux/_consts_.py,sha256=vquutpFVjJsGqRi78EboXbyMczqMdAPZVnAyqcwzJ6k,5313
4
- xulbux/xx_cmd.py,sha256=9rmnq7YkgfzBoCpcyai0FKZTcBPpMjw3L15-FORUdnI,14070
5
- xulbux/xx_code.py,sha256=wnQuA0gfxd-Q_sCW-R3Sqw4Ld6u4TQMRAJGzMgTDiqk,5520
6
- xulbux/xx_color.py,sha256=TqsY5akT9vzHMWJZQ0Ggev5DIzfHaCcq0Tgd-sp15TM,42106
7
- xulbux/xx_data.py,sha256=U9qzEZFVV_I6CgjbENfz2SuhvIN31Y9t_EtOhccF-6c,26127
8
- xulbux/xx_env_vars.py,sha256=zN0xFtqukQO9TdR-Ci7sky4s5m2wjQQUfhrhdcNaS1Y,2394
9
- xulbux/xx_file.py,sha256=CEv5n-ZG_l7HK2ClVQWRiqlERaHhHeGvy0W4rr8OrMI,2513
10
- xulbux/xx_format_codes.py,sha256=O7DnVnzwa1riiHP9DbRtpMD1LNrOKMT4xpwngt49iPo,12939
11
- xulbux/xx_json.py,sha256=Z4617tA2VJIdHxQIGCbx99ubLTYj1Dky75C7qiORkWg,4827
12
- xulbux/xx_path.py,sha256=P_r8WzJygtDCFuQxcEONlkW_exkHxRaqJoUxnPBetyo,4338
13
- xulbux/xx_regex.py,sha256=s3AsnlMrwblz57BjygV-fjgFn0AguopvZLCKWHVd3ZA,6921
14
- xulbux/xx_string.py,sha256=gwwY8pTB7d6gJgp8lo8pUftnyJBna0VQ4oFFc_AmOjo,5297
15
- xulbux/xx_system.py,sha256=2zqqT_oqCPDPzaUBSNMC8awRhSUHQtwIwju9pIQQQQ4,3797
16
- xulbux-1.5.5.dist-info/METADATA,sha256=PorHfyAoYZ3R8blKx0TAlsqqT9qcZ5auVdlVBJ97L5Y,4162
17
- xulbux-1.5.5.dist-info/WHEEL,sha256=3U_NnUcV_1B1kPkYaPzN-irRckL5VW_lytn0ytO_kRY,87
18
- xulbux-1.5.5.dist-info/entry_points.txt,sha256=hfQ1MjdOLVbINRpbJVzNcqRbAouwYF4a-5kzO69zcHE,46
19
- xulbux-1.5.5.dist-info/licenses/LICENSE,sha256=6NflEcvzFEe8_JFVNCPVwZBwBhlLLd4vqQi8WiX_Xk4,1084
20
- xulbux-1.5.5.dist-info/RECORD,,
@@ -1,2 +0,0 @@
1
- [console_scripts]
2
- xulbux-help = __help__:help