Skip to content
Open
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
29 changes: 29 additions & 0 deletions .github/workflows/ruff-ci.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
name: Ruff Code Quality Check

on:
push:
branches: [ main, master ]
pull_request:
branches: [ main, master ]

jobs:
ruff-check:
runs-on: ubuntu-latest

steps:
- name: Checkout code
uses: actions/checkout@v4

- name: Set up Python
uses: actions/setup-python@v5
with:
python-version: '3.10'

- name: Install ruff
run: pip install ruff

- name: Run ruff check
run: ruff check git/src/

- name: Run ruff format check
run: ruff format --check git/src/
54 changes: 33 additions & 21 deletions git/src/main.py
Original file line number Diff line number Diff line change
@@ -1,26 +1,29 @@
import json
import os

def load_books(filename='library.json'):

def load_books(filename="library.json"):
"""
Загрузка списка книг из JSON-файла.
Возвращает список книг (каждая книга - это словарь).
"""
if not os.path.isfile(filename):
return []
with open(filename, 'r', encoding='utf-8') as file:
with open(filename, "r", encoding="utf-8") as file:
try:
return json.load(file)
except json.JSONDecodeError:
return []

def save_books(books, filename='library.json'):

def save_books(books, filename="library.json"):
"""
Сохранение списка книг в JSON-файл.
"""
with open(filename, 'w', encoding='utf-8') as file:
with open(filename, "w", encoding="utf-8") as file:
json.dump(books, file, ensure_ascii=False, indent=4)


def list_books(books):
"""
Возвращает строку со списком всех книг.
Expand All @@ -29,29 +32,30 @@ def list_books(books):
return "Библиотека пуста."
result_lines = []
for idx, book in enumerate(books, start=1):
result_lines.append(f"{idx}. {book['title']} | {book['author']} | {book['year']}")
result_lines.append(
f"{idx}. {book['title']} | {book['author']} | {book['year']}"
)
return "\n".join(result_lines)


def add_book(books, title, author, year):
"""
Принимает текущий список книг и данные о новой книге.
Возвращает новый список, в котором добавлена новая книга.
"""
new_book = {
'title': title,
'author': author,
'year': year
}
new_book = {"title": title, "author": author, "year": year}
# Создаём НОВЫЙ список, добавляя new_book
return books + [new_book]


def remove_book(books, title):
"""
Принимает текущий список книг и название книги для удаления.
Возвращает новый список без книги, у которой совпадает название.
"""
# Фильтруем список: оставляем только те книги, у которых название не совпадает с переданным
return [book for book in books if book['title'].lower() != title.lower()]
return [book for book in books if book["title"].lower() != title.lower()]


def search_books(books, keyword):
"""
Expand All @@ -60,13 +64,16 @@ def search_books(books, keyword):
"""
keyword_lower = keyword.lower()
return [
book for book in books
if keyword_lower in book['title'].lower() or keyword_lower in book['author'].lower()
book
for book in books
if keyword_lower in book["title"].lower()
or keyword_lower in book["author"].lower()
]


def main():
"""
Точка входа в программу: здесь мы загружаем книги,
Точка входа в программу: здесь мы загружаем книги,
показываем меню и обрабатываем ввод пользователя.
"""
books = load_books() # Загрузили список книг из JSON
Expand All @@ -81,11 +88,11 @@ def main():

choice = input("Выберите действие (1-5): ").strip()

if choice == '1':
if choice == "1":
print("\nСписок книг:")
print(list_books(books))

elif choice == '2':
elif choice == "2":
print("\nДобавление новой книги:")
title = input("Введите название: ").strip()
author = input("Введите автора: ").strip()
Expand All @@ -97,9 +104,11 @@ def main():
save_books(books) # Сразу сохраняем в файл
print("Книга добавлена!")

elif choice == '3':
elif choice == "3":
print("\nУдаление книги:")
title_to_remove = input("Введите название книги, которую хотите удалить: ").strip()
title_to_remove = input(
"Введите название книги, которую хотите удалить: "
).strip()

new_books = remove_book(books, title_to_remove)
if len(new_books) < len(books):
Expand All @@ -109,22 +118,25 @@ def main():
else:
print("Книга с таким названием не найдена.")

elif choice == '4':
elif choice == "4":
print("\nПоиск книг:")
keyword = input("Введите ключевое слово для поиска (в названии или авторе): ").strip()
keyword = input(
"Введите ключевое слово для поиска (в названии или авторе): "
).strip()
found_books = search_books(books, keyword)
if found_books:
print("\nНайденные книги:")
print(list_books(found_books))
else:
print("Ничего не найдено.")

elif choice == '5':
elif choice == "5":
print("Выход из программы.")
break

else:
print("Некорректный ввод. Попробуйте ещё раз.")


if __name__ == "__main__":
main()