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
31 changes: 31 additions & 0 deletions .github/workflows/ci.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
name: Run Tests

on:
[ push, pull_request ]

jobs:
test:
runs-on: ubuntu-latest

steps:
- name: Check out code
uses: actions/checkout@v2

- name: Set up Python
uses: actions/setup-python@v2
with:
python-version: '3.8'

- name: Install dependencies
run: |
python -m pip install --upgrade pip
pip install -r requirements.txt
- name: Install mypy
run: |
python -m pip install mypy
- name: Run mypy
run: |
mypy .
- name: Run tests
run: |
python ./scripts/run_tests.py
2 changes: 2 additions & 0 deletions mypy.ini
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
[mypy]
exclude = venv/
52 changes: 52 additions & 0 deletions project/generators.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
from itertools import product
from typing import Generator, Callable, List


def get_rgba_element(index: int):
"""Генераторное выражение для четырехмерного набора векторов RGBA, где A - четное."""
rgba_space = (
(r, g, b, a)
for r, g, b, a in product(range(256), range(256), range(256), range(0, 101, 2))
)

for i, value in enumerate(rgba_space):
if i == index:
return value
raise IndexError("Index out of range")


def prime_generator() -> Generator[int, None, None]:
"""Генератор простых чисел."""
primes: List[int] = []
num = 2
while True:
if all(num % p != 0 for p in primes):
primes.append(num)
yield num
num += 1


def prime_decorator(
gen: Callable[[], Generator[int, None, None]]
) -> Callable[[int], int]:
"""Декоратор, превращающий генератор в функцию, возвращающую k-е простое число."""
cache: List[int] = []
generator = gen()

def wrapper(k: int) -> int:
if k < 1:
raise ValueError("Index must be greater than or equal to 1")
while len(cache) < k:
cache.append(next(generator))
return cache[k - 1]

return wrapper


def get_rgba(index: int):
return get_rgba_element(index)


@prime_decorator
def get_prime():
return prime_generator()
18 changes: 0 additions & 18 deletions tests/test_basic.py

This file was deleted.

33 changes: 33 additions & 0 deletions tests/test_generators.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
from itertools import product

import pytest

from project.generators import get_rgba, get_prime


@pytest.mark.parametrize(
"index, expected",
[
(0, (0, 0, 0, 0)),
(1, (0, 0, 0, 2)),
(10, (0, 0, 0, 20)),
(255, (0, 0, 5, 0)),
],
)
def test_rgba(index, expected):
assert get_rgba(index) == expected


@pytest.mark.parametrize("k, expected", [(1, 2), (2, 3), (3, 5), (10, 29), (20, 71)])
def test_prime(k, expected):
assert get_prime(k) == expected


def test_rgba_out_of_range():
with pytest.raises(IndexError):
get_rgba(10**9)


def test_prime_invalid_index():
with pytest.raises(ValueError):
get_prime(0)