test.py 2.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768
  1. from __future__ import annotations
  2. import sys
  3. import time
  4. from dataclasses import dataclass
  5. from pathlib import Path
  6. from urllib.request import urlretrieve
  7. from hyfetch.color_util import printc, color
  8. from hyfetch.neofetch_util import term_size
  9. @dataclass
  10. class Theme:
  11. done_char: str
  12. todo_char: str
  13. prefix: str = ''
  14. suffix: str = ''
  15. done_len: int = 1
  16. todo_len: int = 1
  17. CLASSIC_THEME = Theme('█', '.', '[', ']')
  18. NEW_THEME = Theme('&a━', '&c━')
  19. EMOJI_THEME = Theme('✅', '🕑', done_len=2, todo_len=2)
  20. EGG_THEME = Theme('🐣', '🥚', done_len=2, todo_len=2)
  21. FLOWER_THEME = Theme('🌸', '🥀', done_len=2, todo_len=2)
  22. def print_progressbar(total: int, i: int, length: int | None = None, theme: Theme = EMOJI_THEME, unit=''):
  23. if not length:
  24. length = term_size()[0]
  25. i += 1
  26. completed = f'{i * 100 / total:.0f}%'
  27. placeholder = 'PLACEHOLDER_BAR'
  28. template = f'{theme.prefix}{placeholder}{theme.suffix}&r {completed} {i}/{total}{unit}'
  29. length -= len(template) - len(placeholder) + 2
  30. progress = int(i / total * length)
  31. bar = f'{theme.done_char * (progress // theme.todo_len)}{theme.todo_char * ((length - progress) // theme.done_len)}'
  32. print(color(template.replace(placeholder, bar)), end='\r', flush=True)
  33. def download_pbar(url: str, path: Path):
  34. def hook(b: int, bsize: int, tsize: int):
  35. print_progressbar(tsize // 1024 // 1024, b * bsize // 1024 // 1024, unit=' MB')
  36. if path.is_dir():
  37. filename = url.split('/')[-1]
  38. path = path / filename
  39. path.parent.mkdir(exist_ok=True, parents=True)
  40. urlretrieve(url, filename=path, reporthook=hook)
  41. print()
  42. if __name__ == '__main__':
  43. # theme = {'emoji': EMOJI_THEME, 'flower': FLOWER_THEME, 'egg': EGG_THEME, 'classic': CLASSIC_THEME, 'new': NEW_THEME}
  44. #
  45. # for name, t in theme.items():
  46. # print(f'\n{name} theme:')
  47. # for i in range(100):
  48. # print_progressbar(100, i, theme=t)
  49. # time.sleep(0.015)
  50. # print()
  51. download_pbar('https://github.com/git-for-windows/git/releases/download/v2.37.2.windows.2/MinGit-2.37.2.2-busybox-64-bit.zip', Path('Downloads'))