Skip to content

Commit 86708d7

Browse files
committed
v4.0
Další verze je tu! Konečně! Po půl roce... Souhlasím, tohle byla hodně dlouhá doba, ale bohužel mám na práci i jiné věci. Upřímně pořádně nevím, co vše se změnilo, odkáži proto na changelog, kde by to snad mělo být vše. Ale tuším, že největší upgrade jsou barvičky a autorun... a ano, na samotné `bakalariapi` se opět naneštěstí nedostalo... Ale to by se mělo změnit další verzí PauseChamp Tahle verze je dost osekaná oproti mým představám. Chtěl jsem alespoň udělat rozvrh, ale když jsem se do toho dal, zjistil jsem, že `Looting` je naprosto nedostatečný a přepisovat se mi ho v této verzi nechtělo. Tzn., že v příští verzi bude nový `Looting` (a dost možná se konečně spojí s `ResultSet`em). Tak to bylo zase takové krátké povídání o tom, jak se vymlouvám, ale tak už jste si snad zvykli (teda ne že by tohle někdo četl). :)
1 parent 2dd6ccc commit 86708d7

5 files changed

Lines changed: 106 additions & 28 deletions

File tree

CHANGELOG.md

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ Formát je založen na [Keep a Changelog](https://keepachangelog.com/en/1.0.0/)
88
### Added
99
- Přidána možnost "inliningu" při komplexní serializaci (defaultně) - Reference, které odkazují na objekt, který je referencován pouze touto referencí se při "inliningu" nahradí referencovaným objektem; více informací v [dokumentu o serializaci](/Dokumentace/BakalariAPI/serializace.md#Inlining).
1010
- `bakalarishell` nyní automaticky importuje předešlá data; Lze vypnout novým parametrem `--no-import`
11+
- `bakalarishell` nyní automaticky exportuje data při vypnutí; Lze vypnout novým parametrem `-n/--no-export` u příkazu `exit`
1112
- `bakalarishell` nyní po zapnutí vypíše obecné shrnutí
1213

1314
### Changed
@@ -17,11 +18,17 @@ Formát je založen na [Keep a Changelog](https://keepachangelog.com/en/1.0.0/)
1718
- Lepší porovnávání podporované verze Bakalářů a hranice zvýšena na "1.45"
1819
- `bakalarishell` nyní všechny soubory vytváří s utf-8 kódováním; Tohle je drastická změna a bohužel může nastat situace, kdy nastane `UnicodeDecodeError` při importu starých dat. V tom případě je potřeba manuálně změnit kódování starých souborů na utf-8.
1920
- `bakalarishell` nyní používá progress bary z `rich` modulu
21+
- Autorun obdžel několik vylepšení a je nyní ve výchozím stavu zapnut
22+
- Uložená konfigurace nyní neobsahuje hodnoty, které byly automaticky doplněny
2023
- Různé další vylepšení `bakalarishell`u
2124

25+
### Removed
26+
- Odtraněn parametr `-n` (alias parametru `--no-init`), jelikož `--no-*` parametrů je již více a již to zavání nedorozuměním
27+
2228
### Fixed
2329
- Opravena serializace `list` instancí
2430
- Opraven `SeleniumHandler`
31+
- Opraven bug při spouštění `bakalarishell`, pokud nebyla vytvořena konfigurace
2532

2633
### Deprecated
2734
- Data, která byla serilizována starší verzí, nebudou v dalších verzích podporována - aby data byla aktualizována na novou verzi, je potřeba je načíst a opětovně uložit

pyproject.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[project]
22
name = "BakalariAPI"
3-
version = "4.0.0-dev"
3+
version = "4.0.0"
44
description = "API pro Bakaláře"
55
readme = "README.md"
66
python-requires = ">=3.9"

setup.cfg

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[metadata]
22
name = BakalariAPI
3-
version = 4.0.0-dev
3+
version = 4.0.0
44
author = Hackrrr
55
description = Rádoby API pro Bakaláře
66
long_description = file:README.md

src/bakalariapi/__init__.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@
2929
"Student",
3030
"Homework",
3131
]
32-
__version__ = "4.0.0-dev"
32+
__version__ = "4.0.0"
3333

3434
from . import (
3535
bakalari,

src/bakalarishell/main.py

Lines changed: 96 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -27,8 +27,11 @@
2727
from prompt_toolkit.keys import Keys
2828
from rich.console import Console
2929
from rich.logging import RichHandler
30-
from rich.progress import BarColumn, Progress, TaskID, TimeRemainingColumn
30+
from rich.progress import BarColumn, Progress, ProgressColumn
31+
from rich.progress import Task as _Task
32+
from rich.progress import TaskID
3133
from rich.syntax import Syntax
34+
from rich.text import Text
3235
from rich.traceback import install as tb_install
3336
from urllib3.exceptions import InsecureRequestWarning
3437

@@ -72,14 +75,15 @@ class Args:
7275
verbose: int = 0
7376

7477
test: int | None = None
75-
auto_run: bool = False
78+
auto_run: bool = True
7679
no_init: bool = False
7780
no_import: bool = False
7881
disable_config: bool = False
7982

8083
commands: list[str] = field(default_factory=list)
8184

8285

86+
cmdArgs: dict[str, Any]
8387
args: Args
8488

8589

@@ -200,7 +204,14 @@ def show(obj: bakalariapi.objects.BakalariObject, title: str | None = None):
200204
if isinstance(obj, bakalariapi.Komens):
201205
rich_print(obj.format(True))
202206
print("\n\n")
203-
print_keys([("P - Potrvrdí přečtení zprávy", "" if obj.confirmed else "green")])
207+
print_keys(
208+
[
209+
(
210+
"P - Potrvrdí přečtení zprávy",
211+
"bright_black" if obj.confirmed else "green",
212+
)
213+
]
214+
)
204215

205216
def komens_key_handler(key_press: KeyPress, done: Callable):
206217
if key_press.key == "p":
@@ -253,8 +264,11 @@ def meeting_key_handler(key_press: KeyPress, done: Callable):
253264

254265
print_keys(
255266
[
256-
("H - Označí úkol jako hotový", "" if obj.done else "green"),
257-
"N - Označí úkol jako nehotový",
267+
(
268+
"H - Označí úkol jako hotový",
269+
"bright_black" if obj.done else "green",
270+
),
271+
("N - Označí úkol jako nehotový", "" if obj.done else "bright_black"),
258272
"Z - Zobrazí HTML úkolu",
259273
]
260274
)
@@ -358,7 +372,7 @@ def save_config():
358372
with get_io_file(CONFIG_FILE, True) as f:
359373
# Indent, protože chci, aby to šlo přehledně upravit i z editoru (i když k tomu nejspíše nikdy nedojde)
360374
# (a navíc alespoň nemusí řešit formátování při "config show")
361-
json.dump(args.__dict__, f, indent=4)
375+
json.dump(cmdArgs, f, indent=4)
362376

363377

364378
def disable_ssl():
@@ -701,7 +715,11 @@ def Command_Ukoly(fast: bool = False, force_fresh: bool = False):
701715
print("Nebyly nalezeny žádné aktualní úkoly")
702716
return
703717
print(f"Úkoly načteny (hotové {hotove}, nehotové {nehotove})")
704-
zobraz_hotove = fast or dialog_ano_ne("Chte zobrazit již hotové úkoly?")
718+
try:
719+
zobraz_hotove = fast or dialog_ano_ne("Chte zobrazit již hotové úkoly?")
720+
except KeyboardInterrupt:
721+
print("\n")
722+
return
705723
count = 1
706724
for ukol in ukoly:
707725
try:
@@ -718,9 +736,13 @@ def Command_Ukoly(fast: bool = False, force_fresh: bool = False):
718736
break
719737

720738

721-
def Command_Konec(nice: bool = True):
739+
def Command_Konec(nice: bool = True, export_data: bool = True):
722740
shell_instance.stop_loop()
723741
api.kill(nice)
742+
if export_data:
743+
with get_io_file("main", True) as f:
744+
json.dump(api.looting.export_data(), f, ensure_ascii=False)
745+
f.truncate()
724746

725747

726748
def Command_Export(file_name: str = "main"):
@@ -981,13 +1003,16 @@ def Test6():
9811003
##################################################
9821004
def main():
9831005
global api
1006+
global cmdArgs
9841007
global args
9851008

986-
def load_args_from_config() -> dict | None:
987-
global args
988-
with get_io_file(CONFIG_FILE, True) as f:
989-
parsed = json.load(f)
990-
return parsed
1009+
def load_args_from_config() -> dict[str, Any] | None:
1010+
try:
1011+
with get_io_file(CONFIG_FILE, False) as f:
1012+
parsed = json.load(f)
1013+
return parsed
1014+
except FileNotFoundError:
1015+
return None
9911016

9921017
parser = argparse.ArgumentParser(
9931018
description="Shell integrující funkcionalitu BakalářiAPI",
@@ -1040,15 +1065,13 @@ def load_args_from_config() -> dict | None:
10401065
default=None,
10411066
)
10421067
parser.add_argument(
1043-
"-a",
1044-
"--auto-run",
1045-
help="Pokud je tato flaga přítomna, spustí se automatické úlohy",
1046-
action="store_true",
1068+
"--no-auto-run",
1069+
help="Pokud je tato flaga přítomna, automatické úlohy se nespustí",
1070+
action="store_false",
10471071
dest="auto_run",
10481072
default=None,
10491073
)
10501074
parser.add_argument(
1051-
"-n",
10521075
"--no-init",
10531076
help="Pokud je tato flaga přítomna, nebude BakalariAPI instance automaticky inicializována",
10541077
action="store_true",
@@ -1092,9 +1115,20 @@ def load_args_from_config() -> dict | None:
10921115
# Jelikož hodnoty filtrujeme, tak pokud i po filtrování je "disable_config"
10931116
# v "parsed" tak má hodnotu `True`, tudíž se můžeme dotazovat (jen) přes `in`
10941117
if not ("disable_config" in parsed):
1095-
from_config = load_args_from_config()
1096-
if from_config is not None:
1118+
try:
1119+
from_config = load_args_from_config()
1120+
except json.JSONDecodeError:
1121+
from_config = None
1122+
rich_print(
1123+
"Konfigurační soubor je poškozen, zvaž vytvoření nového pomocí příkazu 'config save'"
1124+
)
1125+
if from_config is None:
1126+
rich_print(
1127+
"Konfigurační soubor nenalezen, nový lze vytvořit pomocí příkazu 'config save'"
1128+
)
1129+
else:
10971130
parsed = from_config | parsed
1131+
cmdArgs = parsed
10981132
args = Args(**parsed)
10991133

11001134
# Verbose:
@@ -1162,9 +1196,11 @@ def load_args_from_config() -> dict | None:
11621196

11631197
rich_print(
11641198
f"Bakalarishell připraven - verze BakalářiAPI je "
1165-
+ f"[green_yellow]{bakalariapi.__version__}[/green_yellow]"
1166-
if "dev" in bakalariapi.__version__
1167-
else f"[bright_cyan]{bakalariapi.__version__}[/bright_cyan]"
1199+
+ (
1200+
f"[green_yellow]{bakalariapi.__version__}[/green_yellow]"
1201+
if "dev" in bakalariapi.__version__
1202+
else f"[bright_cyan]{bakalariapi.__version__}[/bright_cyan]"
1203+
)
11681204
)
11691205

11701206
lasttime: datetime = datetime.max
@@ -1224,10 +1260,37 @@ class Task:
12241260
]
12251261

12261262
def autorun():
1263+
# Zkusil jsem implementovat vlastní řešení pro 0-length progress bary,
1264+
# ale vypadá to, že se progress bar nakonci nerefreshne
1265+
# Uvidím, jestli se to nějak nespraví tímto https://github.com/Textualize/rich/issues/1054
1266+
# jinak asi otevřu issue
1267+
class TimeRemainingColumn(ProgressColumn):
1268+
max_refresh = 0.5
1269+
1270+
def render(self, task: _Task):
1271+
remaining = 0 if task.finished else task.time_remaining
1272+
if remaining is None:
1273+
return Text("-:--:--", style="progress.remaining")
1274+
return Text(
1275+
str(timedelta(seconds=int(remaining))),
1276+
style="progress.remaining",
1277+
)
1278+
1279+
class PercentageColumn(ProgressColumn):
1280+
max_refresh = 0.5
1281+
1282+
def render(self, task: _Task):
1283+
return Text(
1284+
"100%"
1285+
if task.finished
1286+
else "{task.percentage:>3.0f}%".format(task=task),
1287+
style="progress.percentage",
1288+
)
1289+
12271290
with Progress(
12281291
"[progress.description]{task.description}",
12291292
BarColumn(),
1230-
"[progress.percentage]{task.percentage:>3.0f}%",
1293+
PercentageColumn(),
12311294
"{task.completed}/{task.total}",
12321295
TimeRemainingColumn(),
12331296
) as progress:
@@ -1473,6 +1536,14 @@ def prepare_shell():
14731536
default=True,
14741537
dest="nice",
14751538
)
1539+
parser.add_argument(
1540+
"-n",
1541+
"--no-export",
1542+
help="Pokud je tato flaga přítomna, neprovede export dat",
1543+
action="store_false",
1544+
default=True,
1545+
dest="export_data",
1546+
)
14761547
shell_instance.add_command(
14771548
shell.Command(
14781549
"exit",
@@ -1495,7 +1566,7 @@ def prepare_shell():
14951566
"export",
14961567
Command_Export,
14971568
argparser=parser,
1498-
short_help="Exportuje data z daného souboru",
1569+
short_help="Exportuje data do daného souboru",
14991570
spread_arguments=True,
15001571
)
15011572
)

0 commit comments

Comments
 (0)