Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@
[![License](https://img.shields.io/badge/License-MIT-green.svg)](LICENSE)
[![Tests](https://img.shields.io/badge/Tests-85-success.svg)](tests/)
[![Coverage](https://img.shields.io/badge/Coverage-78%25-success.svg)](tests/)
[![Code Quality](https://img.shields.io/badge/Pylint-10.00%2F10-brightgreen.svg)](src/currate/)
[![Code Quality](https://img.shields.io/badge/Pylint-9.41%2F10-brightgreen.svg)](src/currate/)

GUI приложение на Python для конвертации USD и EUR в рубли по официальным курсам Центрального Банка РФ

Expand Down Expand Up @@ -229,7 +229,7 @@ poetry run pytest

### Качество кода

- ✅ **Pylint**: 10.00/10 для всех модулей
- ✅ **Pylint**: 9.41/10
- ✅ **Mypy**: без ошибок типов
- ✅ **Black**: автоматическое форматирование
- ✅ **Pytest**: 85 тестов с покрытием 78%
Expand Down
12 changes: 8 additions & 4 deletions src/currate/cbr_parser.py
Original file line number Diff line number Diff line change
Expand Up @@ -166,11 +166,11 @@ def get_currency_rate(currency: str, date: str, timeout: int = 10) -> Optional[f
# Извлекаем номинал (столбец 3, индекс 2)
nominal_str = cols[2].text.strip()
nominal = int(nominal_str)

# Извлекаем курс (столбец 5, индекс 4)
rate_str = cols[4].text.strip().replace(',', '.')
rate = float(rate_str)

# Возвращаем курс за 1 единицу валюты
return rate / nominal
except (ValueError, IndexError) as e:
Expand All @@ -180,10 +180,14 @@ def get_currency_rate(currency: str, date: str, timeout: int = 10) -> Optional[f
raise CBRParseError(f"Валюта {currency} не найдена в таблице курсов")

except requests.exceptions.Timeout as exc:
raise CBRConnectionError(f"Превышено время ожидания ({timeout}с) при запросе к сайту ЦБ РФ") from exc
raise CBRConnectionError(
f"Превышено время ожидания ({timeout}с) при запросе к сайту ЦБ РФ"
) from exc

except requests.exceptions.ConnectionError as exc:
raise CBRConnectionError("Ошибка соединения с сайтом ЦБ РФ. Проверьте подключение к интернету") from exc
raise CBRConnectionError(
"Ошибка соединения с сайтом ЦБ РФ. Проверьте подключение к интернету"
) from exc

except requests.exceptions.HTTPError as e:
raise CBRConnectionError(f"HTTP ошибка при запросе к ЦБ РФ: {e}") from e
Expand Down
15 changes: 11 additions & 4 deletions src/currate/currency_converter.py
Original file line number Diff line number Diff line change
Expand Up @@ -46,8 +46,10 @@ def convert(
date: Дата курса в формате DD.MM.YYYY.

Returns:
Tuple[float | None, float | None, str | None]: (результат в рублях, курс валюты, сообщение об ошибке).
Если успешно - (результат, курс, None), если ошибка - (None, None, сообщение).
Tuple[float | None, float | None, str | None]:
(результат в рублях, курс валюты, сообщение об ошибке).
Если успешно - (результат, курс, None),
если ошибка - (None, None, сообщение).
"""
# Валидация валюты
if from_currency not in self.SUPPORTED_CURRENCIES:
Expand Down Expand Up @@ -170,7 +172,12 @@ def format_result(
currency_symbol = "$" if currency == "USD" else "€"

# Форматируем: разделитель тысяч - пробел, десятичный разделитель - запятая
result_str = f"{result_in_rub:,.2f} руб. ({currency_symbol}{amount:,.2f} по курсу {rate:,.4f})"
result_str = result_str.replace(',', ' ').replace('.', ',').replace('руб,', 'руб.')
result_str = (
f"{result_in_rub:,.2f} руб. "
f"({currency_symbol}{amount:,.2f} по курсу {rate:,.4f})"
)
result_str = result_str.replace(',', ' ').replace('.', ',').replace(
'руб,', 'руб.'
)

return result_str
5 changes: 3 additions & 2 deletions src/currate/gui.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,10 +5,11 @@
"""

import tkinter as tk
from tkinter import ttk, messagebox
from tkcalendar import Calendar
from datetime import datetime
from tkinter import ttk, messagebox

import pyperclip
from tkcalendar import Calendar

from .currency_converter import CurrencyConverter

Expand Down
1 change: 0 additions & 1 deletion src/currate/main.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,6 @@
"""

import sys
import os
from pathlib import Path

# Добавляем корневую директорию проекта в путь для поддержки прямого запуска
Expand Down
Loading