feat(refactor): refactored code
the code from earlier was a class ridden sloppy mess with a bug in one part. i have refactored it to only contain one class full of the data needed, and added some personal changes which i think are nice!
This commit is contained in:
parent
01d825e4d7
commit
8cc4f4e0ac
4 changed files with 113 additions and 157 deletions
19
flake.nix
19
flake.nix
|
@ -29,21 +29,14 @@
|
||||||
#
|
#
|
||||||
# Use this shell for developing your app.
|
# Use this shell for developing your app.
|
||||||
devShells.default = pkgs.mkShell {
|
devShells.default = pkgs.mkShell {
|
||||||
inputsFrom = [ self.packages.${system}.whyfetch ];
|
inputsFrom = [
|
||||||
|
self.packages.${system}.whyfetch
|
||||||
|
pkgs.pyright
|
||||||
|
pkgs.black
|
||||||
|
pkgs.isort
|
||||||
|
];
|
||||||
};
|
};
|
||||||
|
|
||||||
apps = {
|
|
||||||
whyfetch = {
|
|
||||||
program = "${self.packages.${system}.whyfetch}/bin/whyfetch";
|
|
||||||
type = "app";
|
|
||||||
};
|
|
||||||
default = {
|
|
||||||
program = "${self.packages.${system}.default}/bin/whyfetch";
|
|
||||||
type = "app";
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
# Shell for poetry.
|
# Shell for poetry.
|
||||||
#
|
#
|
||||||
# nix develop .#poetry
|
# nix develop .#poetry
|
||||||
|
|
|
@ -1,41 +1,44 @@
|
||||||
import whyfetch.system_properties as w
|
from whyfetch.data import Data
|
||||||
|
|
||||||
|
def separator_from_longest_prop(props: list[str]):
|
||||||
def separator_from_longest_prop(properties: list[w.Prop]):
|
|
||||||
j: int = 0
|
j: int = 0
|
||||||
|
|
||||||
for i in properties:
|
for i in props:
|
||||||
if i.length > j:
|
if len(i) > j:
|
||||||
j = i.length
|
j = len(i)
|
||||||
continue
|
continue
|
||||||
else:
|
else:
|
||||||
continue
|
continue
|
||||||
|
|
||||||
return "━"*j
|
return "━"*j
|
||||||
|
|
||||||
colours = {
|
class Colours:
|
||||||
"red": "\x1b[1;31m",
|
red: str = "\x1b[1;31m"
|
||||||
"blue": "\x1b[1;34m",
|
blue: str = "\x1b[1;34m"
|
||||||
"white": "\x1b[1;39m",
|
white: str = "\x1b[1;39m"
|
||||||
}
|
magenta: str = "\x1b[1;35m"
|
||||||
|
|
||||||
def __main__():
|
def __main__():
|
||||||
kernel: w.Kernel = w.Kernel()
|
d: Data = Data()
|
||||||
ram: w.Ram = w.Ram()
|
|
||||||
username: w.Username = w.Username()
|
props: list[str] = [
|
||||||
os: w.Os = w.Os()
|
f"{d.username}@{d.hostname}",
|
||||||
shell: w.Shell = w.Shell()
|
f"kernel: {d.kernel}",
|
||||||
uptime: w.Uptime = w.Uptime()
|
f"os: {d.os}",
|
||||||
locale: w.Locale = w.Locale()
|
f"shell: {d.shell}",
|
||||||
|
f"ram: {d.ram}",
|
||||||
|
f"up: {d.uptime}",
|
||||||
|
f"locale: {d.locale}"
|
||||||
|
]
|
||||||
|
|
||||||
properties: list[w.Prop] = [ kernel.prop, ram.prop, username.prop, os.prop, uptime.prop, locale.prop ]
|
separator: str = separator_from_longest_prop(props)
|
||||||
|
|
||||||
print(f'{colours["white"]}━━━━━━━━━━━━━━━{separator_from_longest_prop(properties)}')
|
print(f'{Colours.white}━━━━━━━━━━━━━━━{separator}')
|
||||||
print(f' {colours["red"]}_.----._{colours["white"]} {username.prop.content}@{kernel.node}')
|
print(f' {Colours.red}_.----._{Colours.white} {Colours.magenta}{d.username}{Colours.white}@{Colours.magenta}{d.hostname}')
|
||||||
print(f' {colours["red"]}.\' \'.{colours["white"]} {kernel.prop.content}')
|
print(f' {Colours.red}.\' \'.{Colours.white} {Colours.magenta}kernel:{Colours.white} {d.kernel}')
|
||||||
print(f'{colours["red"]}/{colours["white"]}._ _.--._ {colours["red"]}\\{colours["white"]} {os.prop.content}')
|
print(f'{Colours.red}/{Colours.white}._ _.--._ {Colours.red}\\{Colours.white} {Colours.magenta}os:{Colours.white} {d.os}')
|
||||||
print(f'|_ \'-\' _.._ `| {shell.prop.content}')
|
print(f'|_ \'-\' _.._ `| {Colours.magenta}shell:{Colours.white} {d.shell}')
|
||||||
print(f'{colours["blue"]}\\{colours["white"]} `---\' `-{colours["blue"]}/{colours["white"]} {ram.prop.content}')
|
print(f'{Colours.blue}\\{Colours.white} `---\' `-{Colours.blue}/{Colours.white} {Colours.magenta}ram:{Colours.white} {d.ram}')
|
||||||
print(f' {colours["blue"]}\'._ _.\'{colours["white"]} {uptime.prop.content}')
|
print(f' {Colours.blue}\'._ _.\'{Colours.white} {Colours.magenta}up:{Colours.white} {d.uptime}')
|
||||||
print(f' {colours["blue"]}\'----\'{colours["white"]} {locale.prop.content}')
|
print(f' {Colours.blue}\'----\'{Colours.white} {Colours.magenta}locale:{Colours.white} {d.locale}')
|
||||||
print(f'━━━━━━━━━━━━━━━{separator_from_longest_prop(properties)}')
|
print(f'━━━━━━━━━━━━━━━{separator}')
|
||||||
|
|
76
whyfetch/data.py
Normal file
76
whyfetch/data.py
Normal file
|
@ -0,0 +1,76 @@
|
||||||
|
from typing import Callable, NamedTuple
|
||||||
|
import getpass as gp
|
||||||
|
import socket as sk
|
||||||
|
import platform as pl
|
||||||
|
import psutil as ps
|
||||||
|
import shellingham as sh
|
||||||
|
import locale as lc
|
||||||
|
import datetime as dt
|
||||||
|
import time as tm
|
||||||
|
import os
|
||||||
|
|
||||||
|
ures: pl.uname_result = pl.uname()
|
||||||
|
sys: str = pl.system()
|
||||||
|
|
||||||
|
class Data:
|
||||||
|
def __init__(self) -> None:
|
||||||
|
self.username: str = gp.getuser()
|
||||||
|
self.hostname: str = sk.gethostname()
|
||||||
|
self.kernel: str = f"{ures.system} {ures.release} {ures.machine}"
|
||||||
|
self.os: str = self.get_os()
|
||||||
|
self.shell: str = self.get_shell()
|
||||||
|
self.ram: str = self.get_ram()
|
||||||
|
self.uptime: str = self.get_uptime()
|
||||||
|
self.locale: str = lc.setlocale(lc.LC_CTYPE)
|
||||||
|
pass
|
||||||
|
|
||||||
|
def get_os(self) -> str:
|
||||||
|
if "Linux" == ures.system:
|
||||||
|
linux_res: dict[str, str] = pl.freedesktop_os_release()
|
||||||
|
return linux_res['PRETTY_NAME']
|
||||||
|
|
||||||
|
if [ "FreeBSD", "OpenBSD", "NetBSD" ] not in [ ures.system ]:
|
||||||
|
return ures.system
|
||||||
|
|
||||||
|
if sys == "Darwin":
|
||||||
|
mac_res: tuple[str, tuple[str, str, str], str] = pl.mac_ver()
|
||||||
|
mac_release: str = mac_res[0]
|
||||||
|
mac_version: str = mac_res[1][0]
|
||||||
|
return f"{mac_release} {mac_version}"
|
||||||
|
|
||||||
|
if sys == "Windows":
|
||||||
|
win_res: tuple[str, str, str, str] = pl.win32_ver()
|
||||||
|
win_edition: str = pl.win32_edition()
|
||||||
|
win_release: str = win_res[0]
|
||||||
|
win_ver: str = win_res[1]
|
||||||
|
return f"{win_release} {win_edition} {win_ver}"
|
||||||
|
|
||||||
|
raise ValueError("Unknown operating system. %r" % sys)
|
||||||
|
|
||||||
|
def get_shell(self) -> str:
|
||||||
|
try:
|
||||||
|
shell_info = sh.detect_shell()
|
||||||
|
shell: str = shell_info[0]
|
||||||
|
except sh.ShellDetectionFailure:
|
||||||
|
shell: str = provide_default_shell()
|
||||||
|
|
||||||
|
return shell
|
||||||
|
|
||||||
|
def get_ram(self) -> str:
|
||||||
|
to_gb: Callable[[int], float] = lambda s: s / (1024 ** 3)
|
||||||
|
vm: NamedTuple = ps.virtual_memory()
|
||||||
|
total: float = to_gb(vm.total)
|
||||||
|
used: float = to_gb(vm.used)
|
||||||
|
percent: int = int(vm.percent)
|
||||||
|
return f"{used:.1f}GB / {total:.1f}GB ({percent}%)"
|
||||||
|
|
||||||
|
def get_uptime(self) -> str:
|
||||||
|
current_uptime: tm.struct_time = tm.gmtime(tm.time() - ps.boot_time())
|
||||||
|
return tm.strftime("%H hours, %M minutes, %S seconds", current_uptime)
|
||||||
|
|
||||||
|
def provide_default_shell() -> str:
|
||||||
|
if os.name == 'nt':
|
||||||
|
return os.environ['COMSPEC']
|
||||||
|
elif os.name == 'posix':
|
||||||
|
return os.environ['SHELL']
|
||||||
|
raise NotImplementedError(f'OS {os.name!r} support not available')
|
|
@ -1,116 +0,0 @@
|
||||||
import platform
|
|
||||||
import psutil
|
|
||||||
import os
|
|
||||||
from sys import platform as platform2
|
|
||||||
import csv
|
|
||||||
import pathlib
|
|
||||||
import shellingham as shelling
|
|
||||||
import time
|
|
||||||
import locale
|
|
||||||
|
|
||||||
uname = platform.uname()
|
|
||||||
svmem = psutil.virtual_memory()
|
|
||||||
b_to_mb = lambda s : int(s / pow(1024, 2))
|
|
||||||
|
|
||||||
|
|
||||||
class Prop:
|
|
||||||
def __init__(self, content) -> None:
|
|
||||||
self.content = content
|
|
||||||
self.length = len(self.content)
|
|
||||||
pass
|
|
||||||
|
|
||||||
class Kernel:
|
|
||||||
def __init__(self) -> None:
|
|
||||||
self.system: str = uname.system
|
|
||||||
self.release: str = uname.release
|
|
||||||
self.machine: str = uname.machine
|
|
||||||
self.node: str = uname.node
|
|
||||||
self.prop: Prop = Prop(f"kernel: {self.system} {self.release} {self.machine}")
|
|
||||||
pass
|
|
||||||
|
|
||||||
class Ram:
|
|
||||||
def __init__(self) -> None:
|
|
||||||
self.total: int = svmem.total
|
|
||||||
self.used: int = svmem.used
|
|
||||||
self.available = svmem.available
|
|
||||||
self.prop: Prop = Prop(self.format())
|
|
||||||
pass
|
|
||||||
|
|
||||||
def format(self) -> str:
|
|
||||||
total_in_gb: int = b_to_mb(self.total)
|
|
||||||
used_in_gb: int = b_to_mb(self.used)
|
|
||||||
available_in_gb: int = b_to_mb(self.available)
|
|
||||||
|
|
||||||
return f"ram: {used_in_gb}MB/{total_in_gb}MB ({available_in_gb}MB free)"
|
|
||||||
|
|
||||||
class Username:
|
|
||||||
def __init__(self) -> None:
|
|
||||||
content: str = self.get_username()
|
|
||||||
self.prop: Prop = Prop(content)
|
|
||||||
pass
|
|
||||||
|
|
||||||
def get_username(self) -> str:
|
|
||||||
username: str = ""
|
|
||||||
|
|
||||||
user_home: str = os.path.expanduser('~')
|
|
||||||
if platform2 == "win32":
|
|
||||||
username = user_home.split("\\")[-1]
|
|
||||||
else:
|
|
||||||
username = user_home.split("/")[-1]
|
|
||||||
|
|
||||||
return username
|
|
||||||
|
|
||||||
class Os:
|
|
||||||
def __init__(self) -> None:
|
|
||||||
content: str = self.get_os_pretty_name()
|
|
||||||
self.prop: Prop = Prop(content)
|
|
||||||
pass
|
|
||||||
def get_os_pretty_name(self) -> str:
|
|
||||||
path = pathlib.Path("/etc/os-release")
|
|
||||||
with open(path) as stream:
|
|
||||||
reader = csv.reader(stream, delimiter="=")
|
|
||||||
os_release = dict(reader)
|
|
||||||
|
|
||||||
return f"os: {os_release['PRETTY_NAME']}"
|
|
||||||
|
|
||||||
class Shell:
|
|
||||||
def __init__(self) -> None:
|
|
||||||
content: str = self.get_shell()
|
|
||||||
self.prop: Prop = Prop(content)
|
|
||||||
pass
|
|
||||||
|
|
||||||
def get_shell(self) -> str:
|
|
||||||
try:
|
|
||||||
shell = shelling.detect_shell()
|
|
||||||
except shelling.shellDetectionFailure:
|
|
||||||
shell = self.provide_default()
|
|
||||||
|
|
||||||
return f"shell: {shell[0]}"
|
|
||||||
|
|
||||||
def provide_default():
|
|
||||||
if os.name == 'posix':
|
|
||||||
return os.environ['SHELL']
|
|
||||||
elif os.name == 'nt':
|
|
||||||
return os.environ['COMSPEC']
|
|
||||||
raise NotImplementedError(f'OS {os.name!r} support not available')
|
|
||||||
|
|
||||||
class Uptime:
|
|
||||||
def __init__(self) -> None:
|
|
||||||
content: str = f"up: {self.get_uptime()}"
|
|
||||||
self.prop = Prop(content)
|
|
||||||
pass
|
|
||||||
|
|
||||||
def get_uptime(self) -> str:
|
|
||||||
seconds_elapsed = time.time() - psutil.boot_time()
|
|
||||||
seconds: int = int(seconds_elapsed % 60)
|
|
||||||
minutes: int = int(seconds_elapsed / 60) % 60
|
|
||||||
hours: int = int(seconds_elapsed / pow(60, 2))
|
|
||||||
|
|
||||||
return f"{hours} hours, {minutes} minutes and {seconds} seconds"
|
|
||||||
|
|
||||||
class Locale:
|
|
||||||
def __init__(self) -> None:
|
|
||||||
content: str = f"locale: {locale.setlocale(locale.LC_CTYPE)}"
|
|
||||||
self.prop: Prop = Prop(content)
|
|
||||||
pass
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue