33Data providers implement the logic for searching and retrieving publications.
44"""
55
6+
67from abc import ABC , abstractmethod
8+ from collections .abc import Mapping
79from dataclasses import dataclass
810import functools
911from typing import List , Optional
@@ -44,6 +46,28 @@ def to_publication(self) -> Publication:
4446 )
4547
4648
49+ class Search (BaseModel , Mapping ):
50+ query : str
51+ limit : int = 50
52+ offset : int = 0
53+ sort : Optional [str ] = None
54+
55+ def __iter__ (self ):
56+ """Allows **Search(...) to unpack into a dict for DataProvider.search(**s)"""
57+ return iter (self .model_dump ())
58+
59+ def __getitem__ (self , item ):
60+ return getattr (self , item )
61+
62+ def __len__ (self ):
63+ return len (self .model_fields )
64+
65+ @property
66+ def params (self ) -> dict [str , str ]:
67+ d = self .model_dump (exclude_none = True )
68+ return {k : str (v ) for k , v in d .items ()}
69+
70+
4771class DataProvider (ABC ):
4872 """Abstract base class for OPDS 2.0 data providers.
4973
@@ -112,9 +136,9 @@ def has_more(self) -> bool:
112136 """Determine if there are more results beyond the current page."""
113137 return (self .offset + self .limit ) < self .total
114138
115- @staticmethod
116- @abstractmethod
139+ @classmethod
117140 def search (
141+ cls ,
118142 query : str ,
119143 limit : int = 50 ,
120144 offset : int = 0 ,
@@ -133,8 +157,8 @@ def search(
133157 Returns:
134158 SearchResponse object containing search results
135159 """
136- return DataProvider .SearchResponse (
137- DataProvider ,
160+ return cls .SearchResponse (
161+ cls ,
138162 records = [],
139163 total = 0 ,
140164 query = query ,
0 commit comments