From c6bf9a76b4222ea637fd1d0578ad3c9c51f8ebdb Mon Sep 17 00:00:00 2001 From: Michael Vasiliev Date: Fri, 7 Nov 2025 15:31:39 +0300 Subject: [PATCH 01/11] Add LICENSE (MIT) --- LICENSE | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) create mode 100644 LICENSE diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..025ab70 --- /dev/null +++ b/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2025 Michael Vasiliev + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. From 56bb8ff2867b96a0e5d7d62435918b08b5ca2161 Mon Sep 17 00:00:00 2001 From: MichaelVasiliev24 Date: Fri, 7 Nov 2025 15:35:06 +0300 Subject: [PATCH 02/11] Add gitignore for python, VS Code, and Linux --- .gitignore | 210 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 210 insertions(+) create mode 100644 .gitignore diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..330f0e6 --- /dev/null +++ b/.gitignore @@ -0,0 +1,210 @@ +# Created by https://www.toptal.com/developers/gitignore/api/python,visualstudiocode,linux +# Edit at https://www.toptal.com/developers/gitignore?templates=python,visualstudiocode,linux + +### Linux ### +*~ + +# temporary files which can be created if a process still has a handle open of a deleted file +.fuse_hidden* + +# KDE directory preferences +.directory + +# Linux trash folder which might appear on any partition or disk +.Trash-* + +# .nfs files are created when an open file is removed but is still being accessed +.nfs* + +### Python ### +# Byte-compiled / optimized / DLL files +__pycache__/ +*.py[cod] +*$py.class + +# C extensions +*.so + +# Distribution / packaging +.Python +build/ +develop-eggs/ +dist/ +downloads/ +eggs/ +.eggs/ +lib/ +lib64/ +parts/ +sdist/ +var/ +wheels/ +share/python-wheels/ +*.egg-info/ +.installed.cfg +*.egg +MANIFEST + +# PyInstaller +# Usually these files are written by a python script from a template +# before PyInstaller builds the exe, so as to inject date/other infos into it. +*.manifest +*.spec + +# Installer logs +pip-log.txt +pip-delete-this-directory.txt + +# Unit test / coverage reports +htmlcov/ +.tox/ +.nox/ +.coverage +.coverage.* +.cache +nosetests.xml +coverage.xml +*.cover +*.py,cover +.hypothesis/ +.pytest_cache/ +cover/ + +# Translations +*.mo +*.pot + +# Django stuff: +*.log +local_settings.py +db.sqlite3 +db.sqlite3-journal + +# Flask stuff: +instance/ +.webassets-cache + +# Scrapy stuff: +.scrapy + +# Sphinx documentation +docs/_build/ + +# PyBuilder +.pybuilder/ +target/ + +# Jupyter Notebook +.ipynb_checkpoints + +# IPython +profile_default/ +ipython_config.py + +# pyenv +# For a library or package, you might want to ignore these files since the code is +# intended to run in multiple environments; otherwise, check them in: +# .python-version + +# pipenv +# According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control. +# However, in case of collaboration, if having platform-specific dependencies or dependencies +# having no cross-platform support, pipenv may install dependencies that don't work, or not +# install all needed dependencies. +#Pipfile.lock + +# poetry +# Similar to Pipfile.lock, it is generally recommended to include poetry.lock in version control. +# This is especially recommended for binary packages to ensure reproducibility, and is more +# commonly ignored for libraries. +# https://python-poetry.org/docs/basic-usage/#commit-your-poetrylock-file-to-version-control +#poetry.lock + +# pdm +# Similar to Pipfile.lock, it is generally recommended to include pdm.lock in version control. +#pdm.lock +# pdm stores project-wide configurations in .pdm.toml, but it is recommended to not include it +# in version control. +# https://pdm.fming.dev/#use-with-ide +.pdm.toml + +# PEP 582; used by e.g. github.com/David-OConnor/pyflow and github.com/pdm-project/pdm +__pypackages__/ + +# Celery stuff +celerybeat-schedule +celerybeat.pid + +# SageMath parsed files +*.sage.py + +# Environments +.env +.venv +env/ +venv/ +ENV/ +env.bak/ +venv.bak/ + +# Spyder project settings +.spyderproject +.spyproject + +# Rope project settings +.ropeproject + +# mkdocs documentation +/site + +# mypy +.mypy_cache/ +.dmypy.json +dmypy.json + +# Pyre type checker +.pyre/ + +# pytype static type analyzer +.pytype/ + +# Cython debug symbols +cython_debug/ + +# PyCharm +# JetBrains specific template is maintained in a separate JetBrains.gitignore that can +# be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore +# and can be added to the global gitignore or merged into this file. For a more nuclear +# option (not recommended) you can uncomment the following to ignore the entire idea folder. +#.idea/ + +### Python Patch ### +# Poetry local configuration file - https://python-poetry.org/docs/configuration/#local-configuration +poetry.toml + +# ruff +.ruff_cache/ + +# LSP config files +pyrightconfig.json + +### VisualStudioCode ### +.vscode/* +!.vscode/settings.json +!.vscode/tasks.json +!.vscode/launch.json +!.vscode/extensions.json +!.vscode/*.code-snippets + +# Local History for Visual Studio Code +.history/ + +# Built Visual Studio Code Extensions +*.vsix + +### VisualStudioCode Patch ### +# Ignore all local history of files +.history +.ionide + +# End of https://www.toptal.com/developers/gitignore/api/python,visualstudiocode,linux \ No newline at end of file From 389c6541d2db6429577f7777e62d43f3d44d81de Mon Sep 17 00:00:00 2001 From: MichaelVasiliev24 Date: Fri, 7 Nov 2025 15:44:10 +0300 Subject: [PATCH 03/11] Add requirement file --- requirements.txt | 7 +++++++ 1 file changed, 7 insertions(+) create mode 100644 requirements.txt diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..b5d47ed --- /dev/null +++ b/requirements.txt @@ -0,0 +1,7 @@ +# Python 3.12.3 + +# For tests +pytest==8.4.2 + +# For linting and formatting +ruff==0.14.2 From f7b4317fa87ee3f2f5c76b08941776b00fb74600 Mon Sep 17 00:00:00 2001 From: Michael Vasiliev Date: Fri, 7 Nov 2025 15:54:54 +0300 Subject: [PATCH 04/11] Update CI for tests --- .github/workflows/tests.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index d09842c..43d547d 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -12,12 +12,12 @@ jobs: - name: Set up Python uses: actions/setup-python@v5 with: - python-version: "3.13" + python-version: "3.12.3" - name: Install dependencies run: | python -m pip install --upgrade pip - pip install pytest + pip install -r requirements.txt - name: Run Pytest tests run: | From 9612d81a6307d9fc50898e54eafcc6e63631dd85 Mon Sep 17 00:00:00 2001 From: Michael Vasiliev Date: Fri, 7 Nov 2025 16:05:27 +0300 Subject: [PATCH 05/11] Update CI for ruff (linting and formatting) --- .github/workflows/ruff.yml | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/.github/workflows/ruff.yml b/.github/workflows/ruff.yml index 164630d..f58e14e 100644 --- a/.github/workflows/ruff.yml +++ b/.github/workflows/ruff.yml @@ -5,4 +5,11 @@ jobs: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - - uses: astral-sh/ruff-action@v3 + - name: Run Ruff Linter + uses: astral-sh/ruff-action@v3 + with: + args: "check --output-format=github" + - name: Run Ruff Formatter + uses: astral-sh/ruff-action@v3 + with: + args: "format --check --diff" From f7604a7e59a35f17489a8324c138118e6c4111ba Mon Sep 17 00:00:00 2001 From: MichaelVasiliev24 Date: Fri, 7 Nov 2025 16:31:32 +0300 Subject: [PATCH 06/11] Correcting the naming of function and variables --- src/checksum.py | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/src/checksum.py b/src/checksum.py index 74b4fb0..560c61f 100644 --- a/src/checksum.py +++ b/src/checksum.py @@ -1,8 +1,7 @@ -def modulo11Checksum(ISBNNumber: str): +def modulo_11_checksum(isbn_number: str) -> bool: + digits = [int(char) for char in isbn_number if char.isdigit()] - digits = [int(char) for char in ISBNNumber if char.isdigit()] - - checkDigit = digits[-1] + check_digit = digits[-1] total = 0 for i in range(len(digits) - 1): @@ -10,5 +9,5 @@ def modulo11Checksum(ISBNNumber: str): digit = digits[i] total += digit * weight - checksum = total + checkDigit + checksum = total + check_digit return checksum % 11 == 0 From 57611e8d133df8fb47809fffbf0c20827ab0b977 Mon Sep 17 00:00:00 2001 From: MichaelVasiliev24 Date: Fri, 7 Nov 2025 16:39:13 +0300 Subject: [PATCH 07/11] Fix: weight loss --- src/checksum.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/checksum.py b/src/checksum.py index 560c61f..79601db 100644 --- a/src/checksum.py +++ b/src/checksum.py @@ -4,10 +4,11 @@ def modulo_11_checksum(isbn_number: str) -> bool: check_digit = digits[-1] total = 0 + weight = 10 for i in range(len(digits) - 1): - weight = 10 digit = digits[i] total += digit * weight + weight -= 1 - checksum = total + check_digit + checksum = total + (check_digit * weight) return checksum % 11 == 0 From 79b571446efaa1d24eb74dd5ff635bb9014da8a6 Mon Sep 17 00:00:00 2001 From: MichaelVasiliev24 Date: Fri, 7 Nov 2025 17:16:28 +0300 Subject: [PATCH 08/11] Fix: Added exceptions, added ability to work with Roman numeral checksum --- src/checksum.py | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/src/checksum.py b/src/checksum.py index 79601db..c790159 100644 --- a/src/checksum.py +++ b/src/checksum.py @@ -1,14 +1,24 @@ def modulo_11_checksum(isbn_number: str) -> bool: - digits = [int(char) for char in isbn_number if char.isdigit()] + digits_str = "".join(isbn_number.replace("-", " ").split()) - check_digit = digits[-1] + if len(digits_str) != 10: + raise Exception( + "Количество значащих символов, то есть не считая пробелов и тире, в ISBN номере должно равняться 10." + ) + if not digits_str[:9].isdigit() or digits_str[9] not in "0123456789Xx": + raise Exception( + "ISBN может содержать только арабские цифры, а также римскую цифру X для контрольной цифры." + ) + + digits = [int(char) for char in digits_str[:9]] + + check_digit = 10 if digits_str[-1] in "Xx" else int(digits_str[-1]) total = 0 weight = 10 - for i in range(len(digits) - 1): + for i in range(len(digits_str) - 1): digit = digits[i] total += digit * weight weight -= 1 - checksum = total + (check_digit * weight) return checksum % 11 == 0 From 7f0dacfcc86890c920ee16b9569d06eccb62a2f5 Mon Sep 17 00:00:00 2001 From: MichaelVasiliev24 Date: Fri, 7 Nov 2025 17:21:31 +0300 Subject: [PATCH 09/11] Fix: Test Extension --- test/test_checksum.py | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/test/test_checksum.py b/test/test_checksum.py index f64a64c..cadbc75 100644 --- a/test/test_checksum.py +++ b/test/test_checksum.py @@ -1,9 +1,21 @@ -from src.checksum import modulo11Checksum +import pytest + +from src.checksum import modulo_11_checksum def test_good(): - assert modulo11Checksum("2-266-11156-8") + assert modulo_11_checksum("2-266-11156-8") def test_bad(): - assert not modulo11Checksum("2-266-11156-3") + assert not modulo_11_checksum("2-266-11156-3") + + +def test_less_chars(): + with pytest.raises(Exception): + modulo_11_checksum("2 35") + + +def test_inappropriate_chars(): + with pytest.raises(Exception): + modulo_11_checksum("dfgdfg") From 70009b3e35e2958624208214449ff1e5838e10f0 Mon Sep 17 00:00:00 2001 From: MichaelVasiliev24 Date: Fri, 7 Nov 2025 17:25:20 +0300 Subject: [PATCH 10/11] Fix: Adding a new test, fixing the logic of the previous ones --- test/test_checksum.py | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/test/test_checksum.py b/test/test_checksum.py index cadbc75..49de6e0 100644 --- a/test/test_checksum.py +++ b/test/test_checksum.py @@ -12,10 +12,24 @@ def test_bad(): def test_less_chars(): - with pytest.raises(Exception): + with pytest.raises( + Exception, + match="Количество значащих символов, то есть не считая пробелов и тире, в ISBN номере должно равняться 10.", + ): modulo_11_checksum("2 35") +def test_more_chars(): + with pytest.raises( + Exception, + match="Количество значащих символов, то есть не считая пробелов и тире, в ISBN номере должно равняться 10.", + ): + modulo_11_checksum("123456789011") + + def test_inappropriate_chars(): - with pytest.raises(Exception): + with pytest.raises( + Exception, + match="ISBN может содержать только арабские цифры, а также римскую цифру X для контрольной цифры.", + ): modulo_11_checksum("dfgdfg") From 06fecf8356af5f93250b1acee2bf1c6a4670f4c5 Mon Sep 17 00:00:00 2001 From: Michael Vasiliev Date: Fri, 7 Nov 2025 17:30:08 +0300 Subject: [PATCH 11/11] Update README --- README.md | 18 +----------------- 1 file changed, 1 insertion(+), 17 deletions(-) diff --git a/README.md b/README.md index e93444f..1068581 100644 --- a/README.md +++ b/README.md @@ -2,20 +2,4 @@ Темы: Git и GitHub, стандарты оформления кода, хорошие практики, тестирование. -## Этапы выполнения работы - -- Сделать **fork** этого репозитория - - Добавить недостающие файлы для "хорошо оформленного" репозитория -- Исправить ошибки, из-за которых не проходит CI -- Найти и исправить баг(и), которые есть в `src/checksum.py` и `src/bin_search.py` - - Добавить исключения в соответствующих случаях (например, когда когда поиск) - - Исправить и/или дополнить тесты так, чтобы они покрывали найденные ошибки - - Для каждого бага должен быть отдельный **commit** с его исправлением, в его описании должно быть пояснение (можно на русском) решённой проблемы -- На основе [ISBN10](https://ru.wikipedia.org/wiki/%D0%9C%D0%B5%D0%B6%D0%B4%D1%83%D0%BD%D0%B0%D1%80%D0%BE%D0%B4%D0%BD%D1%8B%D0%B9_%D1%81%D1%82%D0%B0%D0%BD%D0%B4%D0%B0%D1%80%D1%82%D0%BD%D1%8B%D0%B9_%D0%BA%D0%BD%D0%B8%D0%B6%D0%BD%D1%8B%D0%B9_%D0%BD%D0%BE%D0%BC%D0%B5%D1%80) реализовать простую консольную утилиту - - Пользователь вводит в консоль номер ISBN $\to$ ему выводится "correct" или "incorrect" в зависимости от правильности номера - - Выход из утилиты происходит по вводу пользователем `-1` - - Ошибки не должны прерывать прерывать работу утилиты, но пользователь должен быть уведомлен о том, что он сделал что-то не так - - Реализация утилиты должна быть в модуле `src/checksum.py` -- Сделать **pull request** (один на обе задачи) с решением в main ветку этого репозитория - - **pull request** должен содержать описание проделанной работы, ваше ФИО и номер группы - - Если не получилось/забыли сделать адекватное описание исправленных ошибок в описании к **commit**, то нужно сделать это хотя бы в комментариях к **pull request** +Выполнил Васильев Михаил, группа 25.Б42-мм