From 0b8e7edf1423d370adeee0d2a313aade5f7ebedf Mon Sep 17 00:00:00 2001 From: ada1ra Date: Fri, 7 Nov 2025 23:25:36 +0300 Subject: [PATCH 01/14] Add configure for ruff and tests --- pyproject.toml | 82 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 82 insertions(+) create mode 100644 pyproject.toml diff --git a/pyproject.toml b/pyproject.toml new file mode 100644 index 0000000..1495dba --- /dev/null +++ b/pyproject.toml @@ -0,0 +1,82 @@ +# ruff.toml +target-version = "py311" +line-length = 100 + +# включить все основные правила +select = [ + "E", # pycodestyle errors + "W", # pycodestyle warnings + "F", # Pyflakes + "I", # isort + "N", # pep8-naming + "UP", # pyupgrade + "YTT", # flake8-2020 + "S", # flake8-bandit + "A", # flake8-builtins + "COM", # flake8-commas + "C4", # flake8-comprehensions + "DTZ", # flake8-datetimez + "T10", # flake8-debugger + "EM", # flake8-errmsg + "EXE", # flake8-executable + "ISC", # flake8-implicit-str-concat + "ICN", # flake8-import-conventions + "G", # flake8-logging-format + "INP", # flake8-no-pep420 + "PIE", # flake8-pie + "T20", # flake8-print + "PYI", # flake8-pyi + "PT", # flake8-pytest-style + "Q", # flake8-quotes + "RSE", # flake8-raise + "RET", # flake8-return + "SLF", # flake8-self + "SIM", # flake8-simplify + "TID", # flake8-tidy-imports + "TCH", # flake8-type-checking + "INT", # flake8-gettext + "ARG", # flake8-unused-arguments + "FBT", # flake8-boolean-trap + "B", # flake8-bugbear + "AIR", # flake8-airflow + "PERF", # flake8-perflint +] + +# игнорировать правила +ignore = [ + "E501", # line too long - handled by formatter + "S101", # assert used - ok in tests + "T201", # print found - sometimes needed + "COM812", # trailing comma missing - not always required +] + +# настройки для конкретных файлов +[per-file-ignores] +"__init__.py" = ["F401"] # Unused imports allowed in __init__.py +"tests/**" = ["S101", "SLF001"] # Allow assert and self in tests +"**/migrations/**" = ["ALL"] # Ignore all in migrations + +# настройки форматтера +[format] +indent-style = "space" +quote-style = "double" +skip-magic-trailing-comma = false +line-ending = "auto" + +# настройки для конкретных правил +[flake8-quotes] +docstring-quotes = "double" +inline-quotes = "double" + +[flake8-tidy-imports] +ban-relative-imports = "all" + +[isort] +known-first-party = ["myapp"] +lines-after-imports = 2 +combine-as-imports = true +split-on-trailing-comma = true + +[tool.pytest.ini_options] +pythonpath = ["src"] +testpaths = ["tests"] From 167f899660170ee0c0c72ccfb799ea0a07d475c4 Mon Sep 17 00:00:00 2001 From: ada1ra Date: Fri, 7 Nov 2025 23:26:39 +0300 Subject: [PATCH 02/14] Add CI --- .github/workflows/python-test.yml | 60 +++++++++++++++++++++++++++++++ 1 file changed, 60 insertions(+) create mode 100644 .github/workflows/python-test.yml diff --git a/.github/workflows/python-test.yml b/.github/workflows/python-test.yml new file mode 100644 index 0000000..5ed5528 --- /dev/null +++ b/.github/workflows/python-test.yml @@ -0,0 +1,60 @@ +name: Python Tests + +on: + push: + branches: [ main ] + pull_request: + branches: [ main ] + +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: true + +jobs: + test: + runs-on: ubuntu-latest + strategy: + matrix: + python-version: [3.9, 3.10, 3.11, 3.12] + + steps: + - name: Checkout repository + uses: actions/checkout@v4 + with: + fetch-depth: 0 + + - name: Set up Python + uses: actions/setup-python@v4 + with: + python-version: ${{ matrix.python-version }} + + - name: Install dependencies + run: | + pip install -e . + pip install -r requirements-dev.txt + + - name: Run tests + run: | + pytest --cov=sorting_algorithms --cov-report=term -v + + ruff: + name: Ruff Check + runs-on: ubuntu-latest + + steps: + - name: Checkout repository + uses: actions/checkout@v4 + with: + fetch-depth: 0 + + - name: Set up Python + uses: actions/setup-python@v4 + with: + python-version: '3.12' + + - name: Install Ruff + run: pip install ruff + + - name: Run linting + run: ruff check . + From 7b218bfdf4b85df7c1ddb86716730c3f9ce7b6ac Mon Sep 17 00:00:00 2001 From: ada1ra Date: Fri, 7 Nov 2025 23:27:52 +0300 Subject: [PATCH 03/14] Add quick sort --- src/quick_sort.py | 12 ++++++++++++ 1 file changed, 12 insertions(+) create mode 100644 src/quick_sort.py diff --git a/src/quick_sort.py b/src/quick_sort.py new file mode 100644 index 0000000..45ae9c2 --- /dev/null +++ b/src/quick_sort.py @@ -0,0 +1,12 @@ +def quick_sort(arr): + if len(arr) <= 1: + return arr # Базовый случай: массив из 0 или 1 элемента уже отсортирован + + pivot = arr[len(arr) // 2] # Выбираем середину в качестве опорного элемента + + left = [x for x in arr if x < pivot] # Массив элементов меньше опорного + middle = [x for x in arr if x == pivot] # Массив элементов, равных опорному + right = [x for x in arr if x > pivot] # Массив элементов больше опорного + + # Рекурсивно сортируем левую и правую части, объединяем все вместе + return quick_sort(left) + middle + quick_sort(right) From 8f0e8cc6520210ae03685fb77f16d0233e601b50 Mon Sep 17 00:00:00 2001 From: ada1ra Date: Fri, 7 Nov 2025 23:28:04 +0300 Subject: [PATCH 04/14] Add merge sort --- src/merge_sort.py | 55 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 55 insertions(+) create mode 100644 src/merge_sort.py diff --git a/src/merge_sort.py b/src/merge_sort.py new file mode 100644 index 0000000..a93193f --- /dev/null +++ b/src/merge_sort.py @@ -0,0 +1,55 @@ +def merge(left, right): + """ + Сливает два отсортированных массива в один отсортированный + + Args: + left: левый отсортированный массив + right: правый отсортированный массив + + Returns: + объединенный отсортированный массив + """ + result = [] + i = j = 0 # указатели для left и right + + # Сравниваем элементы и добавляем меньший в результат + while i < len(left) and j < len(right): + if left[i] <= right[j]: + result.append(left[i]) + i += 1 + else: + result.append(right[j]) + j += 1 + + # Добавляем оставшиеся элементы (если есть) + result.extend(left[i:]) + result.extend(right[j:]) + + return result + + +def merge_sort(arr): + """ + Основная функция сортировки слиянием + + Args: + arr: массив для сортировки + + Returns: + отсортированный массив + """ + # Базовый случай: массивы длиной 0 или 1 уже отсортированы + if len(arr) <= 1: + return arr + + # Разделяем массив на две половины + mid = len(arr) // 2 + left_half = arr[:mid] + right_half = arr[mid:] + + # Рекурсивно сортируем каждую половину + left_sorted = merge_sort(left_half) + right_sorted = merge_sort(right_half) + + # Сливаем отсортированные половины + return merge(left_sorted, right_sorted) From 6634c055382dd3ed24ca495fd9dc753af9843163 Mon Sep 17 00:00:00 2001 From: ada1ra Date: Fri, 7 Nov 2025 23:28:17 +0300 Subject: [PATCH 05/14] Add heap sort --- src/heap_sort.py | 36 ++++++++++++++++++++++++++++++++++++ 1 file changed, 36 insertions(+) create mode 100644 src/heap_sort.py diff --git a/src/heap_sort.py b/src/heap_sort.py new file mode 100644 index 0000000..d9bdd7d --- /dev/null +++ b/src/heap_sort.py @@ -0,0 +1,36 @@ +# преобразование в двоичную кучу с корнем i (индекс в arr); n - размер кучи +def heapify(arr, n, i): + largest = i + left = 2 * i + 1 + right = 2 * i + 2 + + # проверяем существует ли левый дочерний элемент больший, чем корень + if left < n and arr[i] < arr[left]: + largest = left + + # проверяем существует ли правый дочерний элемент больший, чем корень + if right < n and arr[largest] < arr[right]: + largest = right + + # заменяем корень, если нашёлся элемент больше + if largest != i: + arr[i], arr[largest] = arr[largest], arr[i] + + # применяем heapify к корню + heapify(arr, n, largest) + + +# сортировка массива (основная функция) +def heap_sort(arr): + n = len(arr) + + # строим max-heap + for i in range(n, -1, -1): + heapify(arr, n, i) + + # переворачиваем массив + for i in range(n - 1, 0, -1): + arr[i], arr[0] = arr[0], arr[i] # свап + heapify(arr, i, 0) + + return arr From ac73d3df63e103c940934dfae3254b5b30e631ca Mon Sep 17 00:00:00 2001 From: ada1ra Date: Fri, 7 Nov 2025 23:28:32 +0300 Subject: [PATCH 06/14] Add bubble sort --- src/bubble_sort.py | 10 ++++++++++ 1 file changed, 10 insertions(+) create mode 100644 src/bubble_sort.py diff --git a/src/bubble_sort.py b/src/bubble_sort.py new file mode 100644 index 0000000..30bc1bc --- /dev/null +++ b/src/bubble_sort.py @@ -0,0 +1,10 @@ +def bubble_sort(arr): + if not arr: + return arr.copy() + result = arr.copy() + n = len(result) + for i in range(n): + for j in range(0, n - i - 1): + if result[j] > result[j + 1]: + result[j], result[j + 1] = result[j + 1], result[j] + return result From 1f072747d6d83bdbc949594cfb67045514237408 Mon Sep 17 00:00:00 2001 From: ada1ra Date: Fri, 7 Nov 2025 23:29:11 +0300 Subject: [PATCH 07/14] Add tests for quick sort --- tests/test_quick_sort.py | 62 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 62 insertions(+) create mode 100644 tests/test_quick_sort.py diff --git a/tests/test_quick_sort.py b/tests/test_quick_sort.py new file mode 100644 index 0000000..0999d2e --- /dev/null +++ b/tests/test_quick_sort.py @@ -0,0 +1,62 @@ +from quick_sort import quick_sort +from random import randint, uniform +import pytest + +"""Обычные тесты""" + +@pytest.mark.parametrize( + ["n"], [(([randint(0, 300) for _ in range(10)]),) for _ in range(10)] +) +def test_heap_sort_positive(n): + """Тест с неотрицательными числами""" + assert quick_sort(n) == sorted(n) + + +@pytest.mark.parametrize( + ["n"], [(([randint(-300, -1) for _ in range(10)]),) for _ in range(10)] +) +def test_heap_sort_negative(n): + """Тест с отрицательными числами""" + assert quick_sort(n) == sorted(n) + + +@pytest.mark.parametrize( + ["n"], [(([uniform(-50, 50) for _ in range(10)]),) for _ in range(10)] +) +def test_float_numbers(n): + """Тест с числами с плавающей точкой""" + assert quick_sort(n) == sorted(n) + + +"""Тесты крайних случаев""" + + +def test_empty_list(): + """Тест пустого списка""" + assert quick_sort([]) == [] + + +def test_single_element(): + """Тест одного элемента""" + assert quick_sort([5]) == [5] + + +def test_large_random_list(): + """Тест большого случайного списка""" + test_list = [randint(-1000, 1000) for _ in range(1000)] + assert quick_sort(test_list) == sorted(test_list) + + +def test_very_large_numbers(): + """Тест с очень большими числами""" + assert quick_sort([2 ** 100, 0, -1, -2 ** 11]) == [-2 ** 11, -1, 0, 2 ** 100] + + +def test_already_sorted(): + """Тест уже отсортированного массива""" + assert quick_sort([1, 2, 3, 4, 5]) == [1, 2, 3, 4, 5] + + +def test_duplicates(): + """Тест с дубликатами""" + assert quick_sort([3, 1, 4, 1, 5, 9, 2, 6, 5]) == [1, 1, 2, 3, 4, 5, 5, 6, 9] From 1690e6cb99a247af100ee4e6f6688cd02b80661d Mon Sep 17 00:00:00 2001 From: ada1ra Date: Fri, 7 Nov 2025 23:29:31 +0300 Subject: [PATCH 08/14] Add tests for merge sort --- tests/test_merge_sort.py | 114 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 114 insertions(+) create mode 100644 tests/test_merge_sort.py diff --git a/tests/test_merge_sort.py b/tests/test_merge_sort.py new file mode 100644 index 0000000..b407082 --- /dev/null +++ b/tests/test_merge_sort.py @@ -0,0 +1,114 @@ +from merge_sort import merge_sort, merge +from random import randint, uniform +import pytest + +"""Тесты для функции merge""" + +def test_merge_empty_lists(): + """Слияние двух пустых списков""" + assert merge([], []) == [] + +def test_merge_left_empty(): + """Слияние когда левый список пустой""" + assert merge([], [1, 2, 3]) == [1, 2, 3] + +def test_merge_right_empty(): + """Слияние когда правый список пустой""" + assert merge([1, 2, 3], []) == [1, 2, 3] + +def test_merge_all_duplicates(): + """Слияние когда все элементы одинаковые""" + left = [5, 5, 5] + right = [5, 5] + expected = [5, 5, 5, 5, 5] + assert merge(left, right) == expected + +def test_merge_single_element_lists(): + """Слияние списков из одного элемента""" + assert merge([1], [2]) == [1, 2] + assert merge([2], [1]) == [1, 2] + +def test_merge_mixed_signs(): + """Слияние с числами разных знаков""" + left = [-3, 0, 3] + right = [-2, 1, 4] + expected = [-5, -4, -3, -2, -1, 0] + assert merge(left, right) == expected + +def test_merge_mixed_signs(): + """Слияние с числами разных знаков""" + left = [-3, 0, 3] + right = [-2, 1, 4] + expected = [-3, -2, 0, 1, 3, 4] + assert merge(left, right) == expected + +def test_merge_float_numbers(): + """Слияние с числами с плавающей точкой""" + left = [1.1, 2.2, 3.3] + right = [1.5, 2.5, 3.5] + expected = [1.1, 1.5, 2.2, 2.5, 3.3, 3.5] + assert merge(left, right) == expected + + +"""Обычные тесты""" + + +@pytest.mark.parametrize( + ["n"], [(([randint(0, 300) for _ in range(10)]),) for _ in range(10)] +) +def test_heap_sort_positive(n): + """Тест с неотрицательными числами""" + assert merge_sort(n) == sorted(n) + + +@pytest.mark.parametrize( + ["n"], [(([randint(-300, -1) for _ in range(10)]),) for _ in range(10)] +) +def test_heap_sort_negative(n): + """Тест с отрицательными числами""" + assert merge_sort(n) == sorted(n) + + +@pytest.mark.parametrize( + ["n"], [(([uniform(-50, 50) for _ in range(10)]),) for _ in range(10)] +) +def test_float_numbers(n): + """Тест с числами с плавающей точкой""" + assert merge_sort(n) == sorted(n) + + +"""Тесты крайних случаев""" + + +def test_empty_list(): + """Тест пустого списка""" + assert merge_sort([]) == [] + + +def test_single_element(): + """Тест одного элемента""" + assert merge_sort([5]) == [5] + +def test_odd_len(): + """Тест массива с нечётным количеством элементов""" + assert merge_sort([5, 2, 3, 4, 1]) == [1, 2, 3, 4, 5] + +def test_large_random_list(): + """Тест большого случайного списка""" + test_list = [randint(-1000, 1000) for _ in range(1000)] + assert merge_sort(test_list) == sorted(test_list) + + +def test_very_large_numbers(): + """Тест с очень большими числами""" + assert merge_sort([2 ** 100, 0, -1, -2 ** 11]) == [-2 ** 11, -1, 0, 2 ** 100] + + +def test_already_sorted(): + """Тест уже отсортированного массива""" + assert merge_sort([1, 2, 3, 4, 5]) == [1, 2, 3, 4, 5] + + +def test_duplicates(): + """Тест с дубликатами""" + assert merge_sort([3, 1, 4, 1, 5, 9, 2, 6, 5]) == [1, 1, 2, 3, 4, 5, 5, 6, 9] From b3d969e48c369c148747efc5fd32bf98b6d7f454 Mon Sep 17 00:00:00 2001 From: ada1ra Date: Fri, 7 Nov 2025 23:29:49 +0300 Subject: [PATCH 09/14] Add tests for heap sort --- tests/test_heap_sort.py | 127 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 127 insertions(+) create mode 100644 tests/test_heap_sort.py diff --git a/tests/test_heap_sort.py b/tests/test_heap_sort.py new file mode 100644 index 0000000..99b36a8 --- /dev/null +++ b/tests/test_heap_sort.py @@ -0,0 +1,127 @@ +from heap_sort import heap_sort, heapify +from random import randint, uniform +import pytest + +"""Тесты для функции heapify""" + +def is_max_heap(arr, n): + """Дополнительная функция, проверяет что массив удовлетворяет свойству max-heap""" + for i in range(n // 2): + left = 2 * i + 1 + right = 2 * i + 2 + + if left < n and arr[i] < arr[left]: + return False + if right < n and arr[i] < arr[right]: + return False + return True + +def test_heapify_empty(): + """Тест пустого массива""" + arr = [] + heapify(arr, 0, 0) + assert arr == [] + +def test_heapify_single_element(): + """Тест массива из одного элемента""" + arr = [5] + heapify(arr, 1, 0) + assert arr == [5] + +def test_heapify_with_duplicates(): + """Тест с дубликатами""" + arr = [5, 5, 5, 3, 5, 2] + n = len(arr) + heapify(arr, n, 0) + assert is_max_heap(arr, n) + +def test_heapify_negative_numbers(): + """Тест с отрицательными числами""" + arr = [-1, -3, -2, -7, -5] + n = len(arr) + heapify(arr, n, 0) + assert is_max_heap(arr, n) + +def test_heapify_large_numbers(): + """Тест с большими числами""" + arr = [1000, 500, 1500, 200, 300] + n = len(arr) + heapify(arr, n, 0) + assert is_max_heap(arr, n) + +def test_heapify_only_left_child(): + """Тест, когда есть только левый потомок""" + arr = [1, 3, 2] # У узла 0 есть только левый потомок 3 + n = len(arr) + heapify(arr, n, 0) + assert arr == [3, 1, 2] # 3 становится корнем + +def test_heapify_already_max(): + """Тест, когда корень уже максимальный""" + arr = [10, 5, 8, 3, 4, 6, 7] + n = len(arr) + original = arr.copy() + heapify(arr, n, 0) + # Ничего не должно измениться + assert arr == original + + +"""Обычные тесты""" + + +@pytest.mark.parametrize( + ["n"], [(([randint(0, 300) for _ in range(10)]),) for _ in range(10)] +) +def test_heap_sort_positive(n): + """Тест с неотрицательными числами""" + assert heap_sort(n) == sorted(n) + + +@pytest.mark.parametrize( + ["n"], [(([randint(-300, -1) for _ in range(10)]),) for _ in range(10)] +) +def test_heap_sort_negative(n): + """Тест с отрицательными числами""" + assert heap_sort(n) == sorted(n) + + +@pytest.mark.parametrize( + ["n"], [(([uniform(-50, 50) for _ in range(10)]),) for _ in range(10)] +) +def test_float_numbers(n): + """Тест с числами с плавающей точкой""" + assert heap_sort(n) == sorted(n) + + +"""Тесты крайних случаев""" + + +def test_empty_list(): + """Тест пустого списка""" + assert heap_sort([]) == [] + + +def test_single_element(): + """Тест одного элемента""" + assert heap_sort([5]) == [5] + + +def test_large_random_list(): + """Тест большого случайного списка""" + test_list = [randint(-1000, 1000) for _ in range(1000)] + assert heap_sort(test_list) == sorted(test_list) + + +def test_very_large_numbers(): + """Тест с очень большими числами""" + assert heap_sort([2 ** 100, 0, -1, -2 ** 11]) == [-2 ** 11, -1, 0, 2 ** 100] + + +def test_already_sorted(): + """Тест уже отсортированного массива""" + assert heap_sort([1, 2, 3, 4, 5]) == [1, 2, 3, 4, 5] + + +def test_duplicates(): + """Тест с дубликатами""" + assert heap_sort([3, 1, 4, 1, 5, 9, 2, 6, 5]) == [1, 1, 2, 3, 4, 5, 5, 6, 9] From 33080b96479d7611516984a6aa6231a6acada526 Mon Sep 17 00:00:00 2001 From: ada1ra Date: Fri, 7 Nov 2025 23:30:03 +0300 Subject: [PATCH 10/14] Add tests for bubble sort --- tests/test_bubble_sort.py | 66 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 66 insertions(+) create mode 100644 tests/test_bubble_sort.py diff --git a/tests/test_bubble_sort.py b/tests/test_bubble_sort.py new file mode 100644 index 0000000..5497249 --- /dev/null +++ b/tests/test_bubble_sort.py @@ -0,0 +1,66 @@ +from bubble_sort import bubble_sort +from random import randint, uniform +import pytest + +"""Обычные тесты""" + + +@pytest.mark.parametrize( + ["n"], [(([randint(0, 300) for _ in range(10)]),) for _ in range(10)] +) +def test_heap_sort_positive(n): + """Тест с неотрицательными числами""" + assert bubble_sort(n) == sorted(n) + + +@pytest.mark.parametrize( + ["n"], [(([randint(-300, -1) for _ in range(10)]),) for _ in range(10)] +) +def test_heap_sort_negative(n): + """Тест с отрицательными числами""" + assert bubble_sort(n) == sorted(n) + + +@pytest.mark.parametrize( + ["n"], [(([uniform(-50, 50) for _ in range(10)]),) for _ in range(10)] +) +def test_float_numbers(n): + """Тест с числами с плавающей точкой""" + assert bubble_sort(n) == sorted(n) + + +"""Тесты крайних случаев""" + + +def test_empty_list(): + """Тест пустого списка""" + assert bubble_sort([]) == [] + + +def test_single_element(): + """Тест одного элемента""" + assert bubble_sort([5]) == [5] + + +def test_large_random_list(): + """Тест большого случайного списка""" + test_list = [randint(-1000, 1000) for _ in range(1000)] + assert bubble_sort(test_list) == sorted(test_list) + + +def test_very_large_numbers(): + """Тест с очень большими числами""" + assert bubble_sort([2 ** 100, 0, -1, -2 ** 11]) == [-2 ** 11, -1, 0, 2 ** 100] + + +def test_already_sorted(): + """Тест уже отсортированного массива""" + assert bubble_sort([1, 2, 3, 4, 5]) == [1, 2, 3, 4, 5] + +def test_reverse_sorted(): + """Тест обратно сортированного массива""" + assert bubble_sort([5, 4, 3, 2, 1]) == [1, 2, 3, 4, 5] + +def test_duplicates(): + """Тест с дубликатами""" + assert bubble_sort([3, 1, 4, 1, 5, 9, 2, 6, 5]) == [1, 1, 2, 3, 4, 5, 5, 6, 9] From 4ee2fcd91b74a9d92a2aeb67eef175314407d4dc Mon Sep 17 00:00:00 2001 From: ada1ra Date: Sun, 9 Nov 2025 20:23:19 +0300 Subject: [PATCH 11/14] Fix test repetition --- tests/test_merge_sort.py | 7 ------- 1 file changed, 7 deletions(-) diff --git a/tests/test_merge_sort.py b/tests/test_merge_sort.py index b407082..18bda2b 100644 --- a/tests/test_merge_sort.py +++ b/tests/test_merge_sort.py @@ -28,13 +28,6 @@ def test_merge_single_element_lists(): assert merge([1], [2]) == [1, 2] assert merge([2], [1]) == [1, 2] -def test_merge_mixed_signs(): - """Слияние с числами разных знаков""" - left = [-3, 0, 3] - right = [-2, 1, 4] - expected = [-5, -4, -3, -2, -1, 0] - assert merge(left, right) == expected - def test_merge_mixed_signs(): """Слияние с числами разных знаков""" left = [-3, 0, 3] From 73a0fac54c173a77fb471ed9d8ec92f8d8aa20e4 Mon Sep 17 00:00:00 2001 From: ada1ra Date: Sun, 9 Nov 2025 20:30:47 +0300 Subject: [PATCH 12/14] Fix python version --- .github/workflows/python-test.yml | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/.github/workflows/python-test.yml b/.github/workflows/python-test.yml index 5ed5528..e6b30da 100644 --- a/.github/workflows/python-test.yml +++ b/.github/workflows/python-test.yml @@ -15,7 +15,7 @@ jobs: runs-on: ubuntu-latest strategy: matrix: - python-version: [3.9, 3.10, 3.11, 3.12] + python-version: [3.9, 3.11, 3.12] steps: - name: Checkout repository @@ -28,11 +28,6 @@ jobs: with: python-version: ${{ matrix.python-version }} - - name: Install dependencies - run: | - pip install -e . - pip install -r requirements-dev.txt - - name: Run tests run: | pytest --cov=sorting_algorithms --cov-report=term -v From 69b9339f4a368a4e3650121e94040756954efb48 Mon Sep 17 00:00:00 2001 From: ada1ra Date: Sun, 9 Nov 2025 20:40:39 +0300 Subject: [PATCH 13/14] Fix pytest run --- .github/workflows/python-test.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/python-test.yml b/.github/workflows/python-test.yml index e6b30da..8de91d9 100644 --- a/.github/workflows/python-test.yml +++ b/.github/workflows/python-test.yml @@ -30,7 +30,7 @@ jobs: - name: Run tests run: | - pytest --cov=sorting_algorithms --cov-report=term -v + pytest ruff: name: Ruff Check From 34a63301fd7ea4078c239259001be891018d7551 Mon Sep 17 00:00:00 2001 From: ada1ra Date: Sun, 9 Nov 2025 20:44:52 +0300 Subject: [PATCH 14/14] Fix pytest run --- .github/workflows/python-test.yml | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/.github/workflows/python-test.yml b/.github/workflows/python-test.yml index 8de91d9..1fe690d 100644 --- a/.github/workflows/python-test.yml +++ b/.github/workflows/python-test.yml @@ -28,6 +28,12 @@ jobs: with: python-version: ${{ matrix.python-version }} + - name: Install dependencies + run: | + python -m pip install --upgrade pip + pip install pytest + pip install -e . + - name: Run tests run: | pytest