Skip to content

Commit 2d2c8f7

Browse files
committed
Move random number generation to generators module
Signed-off-by: Bradley Reynolds <[email protected]>
1 parent e9d9f9b commit 2d2c8f7

File tree

7 files changed

+52
-37
lines changed

7 files changed

+52
-37
lines changed

docs/source/changelog.rst

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,11 @@
44
Changelog
55
=========
66

7+
- :release:`1.8.0 <11th March 2023>`
8+
- :feature:`26` Move random number generation to generators module
9+
710
- :release:`1.7.0 <11th March 2023>`
8-
- :feature:`24` Add random number generation
11+
- :feature:`24` Add bulk uuid generation
912

1013
- :release:`1.6.0 <09th March 2023>`
1114
- :feature:`21` Add random number generation

src/api/__init__.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,3 @@
11
"""Public API for our projects"""
22

3-
__version__ = "1.7.0"
3+
__version__ = "1.8.0"

src/api/modules/generators.py

Lines changed: 36 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,29 +1,29 @@
11
"""Generation of things"""
22

33
import uuid
4+
from random import randint
45
from typing import Literal
56

67
from fastapi import APIRouter
7-
88
# pylint: disable-next=no-name-in-module
9-
from pydantic import BaseModel, Field
9+
from pydantic import BaseModel, Field, validator
1010

1111
router_generators = APIRouter(prefix="/generators", tags=["generators"])
1212

1313

14-
class UUIDs(BaseModel):
15-
"""Model to hold a list of UUIDs"""
16-
17-
uuids: list[str]
18-
19-
2014
class UUIDConfig(BaseModel):
2115
"""Model to hold configuration for UUID generation"""
2216

2317
uuid_type: Literal[1, 4]
2418
quantity: int = Field(gt=0, default=1)
2519

2620

21+
class UUIDs(BaseModel):
22+
"""Model to hold a list of UUIDs"""
23+
24+
uuids: list[str]
25+
26+
2727
@router_generators.post("/uuids/")
2828
async def bulk_uuids(config: UUIDConfig) -> UUIDs:
2929
"""Generate bulk UUIDs"""
@@ -35,3 +35,31 @@ async def bulk_uuids(config: UUIDConfig) -> UUIDs:
3535
raise ValueError(f"unsupported UUID type: {config.uuid_type}")
3636
uuids = [str(function()) for _ in range(config.quantity)]
3737
return UUIDs(uuids=uuids)
38+
39+
40+
class NumbersConfig(BaseModel):
41+
"""Model to hold configuration for number generation"""
42+
43+
lower_bound: int | None = Field(default=1)
44+
upper_bound: int | None = Field(default=1)
45+
quantity: int | None = Field(gt=0, default=1)
46+
47+
@validator('upper_bound')
48+
def upper_bound_must_be_greater_than_lower_bound(cls, v, values, **kwargs):
49+
if 'lower_bound' in values and v < values['lower_bound']:
50+
raise ValueError('upper bound must be greater than lower bound')
51+
return v
52+
53+
54+
class Numbers(BaseModel):
55+
"""Model to hold a list of numbers"""
56+
57+
numbers: list[int]
58+
total: int
59+
60+
61+
@router_generators.post("/random-numbers/")
62+
async def random_numbers(config: NumbersConfig) -> Numbers:
63+
"""Generate bulk random numbers"""
64+
numbers = [randint(config.lower_bound, config.upper_bound) for _ in range(config.quantity)]
65+
return Numbers(numbers=numbers, total=sum(numbers))

src/api/server.py

Lines changed: 0 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,10 @@
11
"""API server definition"""
22

33
from os import getenv
4-
from random import randint
54

65
import sentry_sdk
76
from fastapi import APIRouter, FastAPI
87
from imsosorry import uwuify
9-
108
# pylint: disable-next=no-name-in-module
119
from pydantic import BaseModel
1210

@@ -33,13 +31,6 @@ class TextModel(BaseModel):
3331
text: str
3432

3533

36-
class Numbers(BaseModel):
37-
"""Model to hold a list of numbers"""
38-
39-
numbers: list[int]
40-
total: int
41-
42-
4334
app = FastAPI(
4435
title="Let's Build A API",
4536
description="An API to host Let's Build A's projects",
@@ -69,13 +60,5 @@ async def uwuify_route(text: TextModel):
6960
return {"text": uwuify(text.text)}
7061

7162

72-
@router_fun.get("/random-numbers/{quantity}/{range_high}")
73-
async def random_numbers(quantity: int, range_high: int) -> Numbers:
74-
"""Generate bulk random numbers"""
75-
numbers = [randint(1, range_high) for _ in range(quantity)]
76-
return Numbers(numbers=numbers, total=sum(numbers))
77-
78-
7963
app.include_router(router_fun)
80-
8164
app.include_router(router_generators)

tests/modules/__init__.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
"""Test the modules"""
Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,17 @@
99
client = TestClient(app)
1010

1111

12-
def test_read_random_numbers():
12+
def test_bulk_uuids():
1313
response = client.post("/generators/uuids/", json={"uuid_type": 1, "quantity": 1})
1414
assert response.status_code == 200
1515
first = response.json()["uuids"][0]
1616
assert isinstance(uuid.UUID(first), uuid.UUID)
17+
18+
19+
def test_random_numbers():
20+
response = client.post("/generators/random-numbers/", json={})
21+
assert response.status_code == 200
22+
assert response.json() == {
23+
"numbers": [1],
24+
"total": 1,
25+
}

tests/test_server.py

Lines changed: 0 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -15,12 +15,3 @@ def test_read_main():
1515
"message": "Welcome to the API",
1616
"version": __version__,
1717
}
18-
19-
20-
def test_read_random_numbers():
21-
response = client.get("/fun/random-numbers/1/1")
22-
assert response.status_code == 200
23-
assert response.json() == {
24-
"numbers": [1],
25-
"total": 1,
26-
}

0 commit comments

Comments
 (0)