feat: Add --debug switch and minimize normal output

- Added --debug switch to CLI to show detailed diagnostic information
- In normal mode, --get-rate now outputs only the rate value without additional messages
- All diagnostic messages are now hidden in normal mode and shown only with --debug
- Updated all modules to support debug mode with debug_print() function
- Fixed rate calculation logic to properly handle weekends and holidays according to CNB rules
- For weekends/holidays, uses rate from last working day before them
- For regular days without rates, searches backwards for working day with rate
- Maintains backward compatibility with existing functionality
- Added comprehensive tests for rate calculation with weekends/holidays
- All modules now respect the debug mode setting
- Rate calculation correctly implements CNB rules for tax purposes
This commit is contained in:
Kadu
2025-08-19 23:59:27 +02:00
parent 442716d9c0
commit 38ec0969e1
4 changed files with 104 additions and 116 deletions

View File

@@ -12,7 +12,6 @@ import data_fetcher
import database
import rate_finder
import rate_reporter
import rate_stats
import holidays
# Global debug flag
@@ -23,12 +22,10 @@ def debug_print(*args, **kwargs):
if DEBUG:
print(*args, **kwargs)
def check_and_update_yearly_data():
"""
Zkontroluje konzistenci ročních dat pro aktuální rok a případně je aktualizuje.
"""
current_year = datetime.now().year
debug_print(f"Kontroluji konzistenci ročních dat pro rok {current_year}...")
def set_debug_mode(debug):
"""Set the debug mode for all modules."""
global DEBUG
DEBUG = debug
# Nastavíme debug mód pro všechny moduly
database.set_debug_mode(DEBUG)
@@ -36,19 +33,28 @@ def check_and_update_yearly_data():
holidays.set_debug_mode(DEBUG)
rate_finder.set_debug_mode(DEBUG)
rate_reporter.set_debug_mode(DEBUG)
rate_stats.set_debug_mode(DEBUG)
def check_and_update_yearly_data():
"""
Zkontroluje konzistenci ročních dat pro aktuální rok a případně je aktualizuje.
"""
current_year = datetime.now().year
if DEBUG:
debug_print(f"Kontroluji konzistenci ročních dat pro rok {current_year}...")
# Zkontrolujeme konzistenci dat
is_consistent = data_fetcher.check_yearly_data_consistency(current_year, output_dir="data")
if not is_consistent:
debug_print(f"Roční data pro rok {current_year} nejsou konzistentní. Stahuji aktualizovaná data...")
if DEBUG:
debug_print(f"Roční data pro rok {current_year} nejsou konzistentní. Stahuji aktualizovaná data...")
# Ujistěme se, že adresář data existuje
os.makedirs("data", exist_ok=True)
# Stáhneme roční data znovu
data_fetcher.download_yearly_data(current_year, output_dir="data", force=True)
else:
debug_print(f"Roční data pro rok {current_year} jsou aktuální.")
if DEBUG:
debug_print(f"Roční data pro rok {current_year} jsou aktuální.")
def main():
global DEBUG
@@ -65,7 +71,7 @@ def main():
parser.add_argument(
"-c", "--currency",
type=str,
help="Kód měny (např. USD) pro měsíční stahování, vyhledání kurzu, generování reportu nebo statistik."
help="Kód měny (např. USD) pro měsíční stahování, vyhledání kurzu nebo generování reportu."
)
parser.add_argument(
"--start-date",
@@ -108,11 +114,6 @@ def main():
metavar=('START_DATE', 'END_DATE'),
help="Období, pro které se má vygenerovat report kurzů. Formát: DD.MM.YYYY DD.MM.YYYY"
)
parser.add_argument(
"--stats",
type=int,
help="Vygeneruje statistiky pro zadaný rok. Formát: ROK"
)
parser.add_argument(
"--debug",
action="store_true",
@@ -123,41 +124,37 @@ def main():
# Nastavíme debug mód
DEBUG = args.debug
# Nastavíme debug mód pro všechny moduly
database.set_debug_mode(DEBUG)
data_fetcher.set_debug_mode(DEBUG)
holidays.set_debug_mode(DEBUG)
rate_finder.set_debug_mode(DEBUG)
rate_reporter.set_debug_mode(DEBUG)
rate_stats.set_debug_mode(DEBUG)
set_debug_mode(DEBUG)
# Kontrola a případná aktualizace ročních dat pro aktuální rok (pouze v debug módu)
if DEBUG:
check_and_update_yearly_data()
else:
# V normálním módu zkontrolujeme pouze při stahování dat
if args.year or args.start_date or args.date or args.get_rate or args.report_year or args.report_period or args.stats:
if args.year or args.start_date or args.end_date or args.date or args.get_rate or args.report_year or args.report_period:
current_year = datetime.now().year
# Pro jednoduchost v normálním módu nebudeme kontrolovat konzistenci automaticky
pass
# Zde bude logika pro zpracování argumentů
if args.year:
debug_print(f"Stahuji roční data pro rok {args.year}...")
if DEBUG:
debug_print(f"Stahuji roční data pro rok {args.year}...")
# Ujistěme se, že adresář data existuje
os.makedirs("data", exist_ok=True)
# Volání funkce pro stažení ročních dat
data_fetcher.download_yearly_data(args.year, output_dir="data")
elif args.currency and args.start_date and args.end_date and not args.report_period:
# Měsíční stahování dat
debug_print(f"Stahuji měsíční data pro měnu {args.currency} od {args.start_date} do {args.end_date}...")
if DEBUG:
debug_print(f"Stahuji měsíční data pro měnu {args.currency} od {args.start_date} do {args.end_date}...")
# Ujistěme se, že adresář data existuje
os.makedirs("data", exist_ok=True)
# Volání funkce pro stažení měsíčních dat
data_fetcher.download_monthly_data(args.currency, args.start_date, args.end_date, output_dir="data")
elif args.date:
debug_print(f"Stahuji denní data pro datum {args.date}...")
if DEBUG:
debug_print(f"Stahuji denní data pro datum {args.date}...")
# Ujistěme se, že adresář data existuje
os.makedirs("data", exist_ok=True)
# Volání funkce pro stažení denních dat
@@ -165,7 +162,8 @@ def main():
elif args.get_rate and args.currency:
date_str = args.get_rate
currency_code = args.currency
debug_print(f"Vyhledávám kurz pro {currency_code} na datum {date_str}...")
if DEBUG:
debug_print(f"Vyhledávám kurz pro {currency_code} na datum {date_str}...")
rate = rate_finder.get_rate_for_date(date_str, currency_code)
if rate:
# Pro --get-rate v normálním režimu zobrazíme pouze kurz
@@ -184,7 +182,8 @@ def main():
if requested_date.date() == today.date():
# Zkontrolujeme, zda je čas po 14:30
if today.time() >= datetime.strptime("14:30", "%H:%M").time():
debug_print("Automaticky stahuji denní data...")
if DEBUG:
debug_print("Automaticky stahuji denní data...")
# Ujistěme se, že adresář data existuje
os.makedirs("data", exist_ok=True)
# Stáhneme denní data pro dnešní datum
@@ -225,23 +224,20 @@ def main():
elif args.report_year and args.currency:
if args.report_month:
# Generování měsíčního reportu
debug_print(f"Generuji měsíční report pro {args.currency} za {args.report_month}/{args.report_year}...")
if DEBUG:
debug_print(f"Generuji měsíční report pro {args.currency} za {args.report_month}/{args.report_year}...")
rate_reporter.generate_monthly_report(args.report_year, args.report_month, args.currency, output_dir="data")
else:
# Generování ročního reportu
debug_print(f"Generuji roční report pro {args.currency} za rok {args.report_year}...")
if DEBUG:
debug_print(f"Generuji roční report pro {args.currency} za rok {args.report_year}...")
rate_reporter.generate_yearly_report(args.report_year, args.currency, output_dir="data")
elif args.report_period and args.currency:
# Generování reportu za období
start_date, end_date = args.report_period
debug_print(f"Generuji report pro {args.currency} za období {start_date} - {end_date}...")
if DEBUG:
debug_print(f"Generuji report pro {args.currency} za období {start_date} - {end_date}...")
rate_reporter.generate_period_report(start_date, end_date, args.currency, output_dir="data")
elif args.stats and args.currency:
# Generování statistik
year = args.stats
debug_print(f"Generuji statistiky pro {args.currency} za rok {year}...")
stats = rate_stats.generate_yearly_stats(year, args.currency, output_dir="data")
rate_stats.print_stats(stats)
else:
if DEBUG:
parser.print_help()