FirebaseProvider

hnx.providers.firebase.FirebaseProvider

Source code in hnx/providers/firebase.py
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
class FirebaseProvider:
    def __init__(self, client: httpx.AsyncClient) -> None:
        self.client = client

    async def item(self, item_id: int):  # -> HNItem
        resp = await self.client.get(f"/item/{item_id}.json")
        resp.raise_for_status()
        return ITEM_ADAPTER.validate_python(resp.json())

    async def items(self, item_ids: list[int]):  # -> list[HNItem]
        sem = asyncio.Semaphore(50)

        async def worker(
            item_id: int,
        ) -> HNItem:
            async with sem:
                return await self.item(item_id)

        return await asyncio.gather(
            *(
                worker(
                    item_id,
                )
                for item_id in item_ids
            ),
        )

    async def user(self, username: str):  # -> User
        resp = await self.client.get(f"/user/{username}.json")
        resp.raise_for_status()
        return User.model_validate(resp.json())

    #######################################
    # Feeds
    #######################################

    async def feed(self, feed_type: FeedType):
        resp = await self.client.get(feed_type.endpoint)
        resp.raise_for_status()
        return resp.json()

    async def top(self):
        return await self.feed(FeedType.TOP)

    async def best(self):
        return await self.feed(FeedType.BEST)

    async def new(self):
        return await self.feed(FeedType.NEW)

    async def ask(self):
        return await self.feed(FeedType.ASK)

    async def show(self):
        return await self.feed(FeedType.SHOW)

    async def jobs(self):
        return await self.feed(FeedType.JOB)

AlgoliaProvider

hnx.providers.algolia.AlgoliaProvider

Source code in hnx/providers/algolia.py
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
class AlgoliaProvider:
    def __init__(
        self,
        client: httpx.AsyncClient,
    ) -> None:
        self.client = client

    async def item(
        self,
        item_id: int,
    ) -> AlgoliaNode:
        response = await self.client.get(f"/items/{item_id}")

        response.raise_for_status()

        return AlgoliaNode.model_validate(response.json())