Skip to content

Commit 27f669a

Browse files
committed
docs: add missing docstrings
1 parent 4ccc1b0 commit 27f669a

46 files changed

Lines changed: 390 additions & 19 deletions

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

src/cbrkit/adapt/strings.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,7 @@ def __init__(
8383
@property
8484
@override
8585
def metadata(self) -> JsonDict:
86+
"""Return metadata describing the regex configuration."""
8687
return self._metadata
8788

8889
@override

src/cbrkit/api.py

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,8 @@
1515

1616

1717
class Settings(BaseSettings):
18+
"""Environment-based configuration for the CBRKit API."""
19+
1820
model_config = SettingsConfigDict(env_prefix="cbrkit_")
1921
retriever: str = ""
2022
reuser: str = ""
@@ -28,6 +30,7 @@ class Settings(BaseSettings):
2830

2931

3032
def load_callables(value: str) -> dict[str, Any]:
33+
"""Load callable objects from a comma-separated string of module paths."""
3134
if value == "":
3235
return {}
3336

@@ -56,6 +59,7 @@ def load_callables(value: str) -> dict[str, Any]:
5659

5760

5861
def parse_dataset(obj: CasebaseSpec) -> Mapping[str, Any]:
62+
"""Parse a casebase specification into a string-keyed mapping."""
5963
if isinstance(obj, dict):
6064
return cast(dict[str, Any], obj)
6165

@@ -78,6 +82,7 @@ def parse_callables[T](
7882
keys: list[str] | str | None,
7983
loaded: dict[str, T],
8084
) -> list[T]:
85+
"""Select loaded callables by name, defaulting to all available."""
8186
if not keys:
8287
keys = list(loaded.keys())
8388
elif isinstance(keys, str):
@@ -87,6 +92,8 @@ def parse_callables[T](
8792

8893

8994
class RetrieveRequest(BaseModel):
95+
"""Request payload for the retrieval endpoint."""
96+
9097
casebase: CasebaseSpec
9198
queries: CasebaseSpec
9299
retrievers: Annotated[list[str] | str, Field(default_factory=list)]
@@ -96,6 +103,7 @@ class RetrieveRequest(BaseModel):
96103
def retrieve(
97104
request: RetrieveRequest,
98105
) -> cbrkit.retrieval.Result[str, str, Any, cbrkit.typing.Float]:
106+
"""Handle a retrieval request and return ranked results."""
99107
return cbrkit.retrieval.apply_queries(
100108
parse_dataset(request.casebase),
101109
parse_dataset(request.queries),
@@ -104,6 +112,8 @@ def retrieve(
104112

105113

106114
class ReuseRequest(BaseModel):
115+
"""Request payload for the reuse endpoint."""
116+
107117
casebase: CasebaseSpec
108118
queries: CasebaseSpec
109119
reusers: Annotated[list[str] | str, Field(default_factory=list)]
@@ -113,6 +123,7 @@ class ReuseRequest(BaseModel):
113123
def reuse(
114124
request: ReuseRequest,
115125
) -> cbrkit.reuse.Result[str, str, Any, cbrkit.typing.Float]:
126+
"""Handle a reuse request and return adapted results."""
116127
return cbrkit.reuse.apply_queries(
117128
parse_dataset(request.casebase),
118129
parse_dataset(request.queries),
@@ -121,6 +132,8 @@ def reuse(
121132

122133

123134
class CycleRequest(BaseModel):
135+
"""Request payload for the full CBR cycle endpoint."""
136+
124137
casebase: CasebaseSpec
125138
queries: CasebaseSpec
126139
retrievers: Annotated[list[str] | str, Field(default_factory=list)]
@@ -133,6 +146,7 @@ class CycleRequest(BaseModel):
133146
def cycle(
134147
request: CycleRequest,
135148
) -> cbrkit.cycle.Result[str, str, Any, cbrkit.typing.Float]:
149+
"""Handle a full CBR cycle request and return the combined result."""
136150
return cbrkit.cycle.apply_queries(
137151
parse_dataset(request.casebase),
138152
parse_dataset(request.queries),
@@ -144,6 +158,8 @@ def cycle(
144158

145159

146160
class SynthesizeRequest(BaseModel):
161+
"""Request payload for the synthesis endpoint."""
162+
147163
casebase: CasebaseSpec
148164
queries: CasebaseSpec
149165
synthesizer: str
@@ -157,6 +173,7 @@ class SynthesizeRequest(BaseModel):
157173
def synthesize(
158174
request: SynthesizeRequest,
159175
) -> cbrkit.synthesis.Result[str, Any]:
176+
"""Handle a synthesis request by running a CBR cycle and synthesizing the result."""
160177
cycle_result = cbrkit.cycle.apply_queries(
161178
parse_dataset(request.casebase),
162179
parse_dataset(request.queries),
@@ -173,6 +190,7 @@ def synthesize(
173190

174191

175192
def openapi_generator():
193+
"""Generate and cache the OpenAPI schema for the CBRKit API."""
176194
if not app.openapi_schema:
177195
app.openapi_schema = get_openapi(
178196
title="CBRKit",

src/cbrkit/cli.py

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323

2424
@app.callback()
2525
def app_callback():
26+
"""Initialize the CBRKit CLI application."""
2627
pass
2728

2829

@@ -36,6 +37,7 @@ def retrieve(
3637
print_similarities: bool = False,
3738
output_path: Path | None = None,
3839
) -> None:
40+
"""Retrieve similar cases from a casebase for the given queries."""
3941
sys.path.extend(str(x) for x in search_path)
4042
casebase = cbrkit.loaders.path(casebase_path)
4143
queries = cbrkit.loaders.path(queries_path)
@@ -71,6 +73,7 @@ def reuse(
7173
search_path: Annotated[list[Path], typer.Option(default_factory=list)],
7274
output_path: Path | None = None,
7375
) -> None:
76+
"""Reuse retrieved cases by adapting them for the given queries."""
7477
sys.path.extend(str(x) for x in search_path)
7578
casebase = cbrkit.loaders.path(casebase_path)
7679
queries = cbrkit.loaders.path(queries_path)
@@ -95,6 +98,7 @@ def cycle(
9598
retainer: str | None = None,
9699
output_path: Path | None = None,
97100
) -> None:
101+
"""Run a full CBR cycle with retrieval, reuse, revision, and retention."""
98102
sys.path.extend(str(x) for x in search_path)
99103
casebase = cbrkit.loaders.path(casebase_path)
100104
queries = cbrkit.loaders.path(queries_path)
@@ -131,6 +135,7 @@ def synthesis(
131135
retainer: str | None = None,
132136
output_path: Path | None = None,
133137
) -> None:
138+
"""Run a CBR cycle followed by synthesis to produce a generated response."""
134139
sys.path.extend(str(x) for x in search_path)
135140
casebase = cbrkit.loaders.path(casebase_path)
136141
queries = cbrkit.loaders.path(queries_path)
@@ -174,6 +179,7 @@ def serve(
174179
reload: bool = False,
175180
root_path: str = "",
176181
) -> None:
182+
"""Start the CBRKit API server with the specified components."""
177183
import uvicorn
178184

179185
from cbrkit.api import app
@@ -204,6 +210,7 @@ def uvicorn(
204210
reload: bool = False,
205211
root_path: str = "",
206212
) -> None:
213+
"""Start a custom ASGI application using the uvicorn server."""
207214
import uvicorn
208215

209216
sys.path.extend(str(x) for x in search_path)
@@ -219,6 +226,7 @@ def uvicorn(
219226

220227
@app.command()
221228
def openapi(file: Path | None = None):
229+
"""Generate the OpenAPI schema and print or write it to a file."""
222230
from cbrkit.api import app
223231

224232
schema = orjson.dumps(

src/cbrkit/dumpers.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525

2626

2727
def default_conversion_func(obj: Any) -> Any:
28+
"""Convert an object to a serializable form using Pydantic or duck typing."""
2829
if isinstance(obj, BaseModel):
2930
return obj.model_dump(
3031
exclude_unset=True,

src/cbrkit/eval/common.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ def compute_score_metric[C, S: Float, T](
2222
run_scores: Mapping[C, S],
2323
metric_func: Callable[[list[float], list[float]], T],
2424
) -> T:
25+
"""Compute a score metric over shared keys between qrel and run scores."""
2526
keys = set(qrel_scores.keys()).intersection(set(run_scores.keys()))
2627

2728
return metric_func(
@@ -36,6 +37,7 @@ def compute_score_metrics[Q, C, S: Float, T](
3637
metric_funcs: dict[str, Callable[[list[float], list[float]], T]],
3738
aggregation_func: ConversionFunc[list[T], T] | None = None,
3839
) -> dict[str, T | float]:
40+
"""Compute multiple score metrics across all shared queries."""
3941
metric_values: dict[str, T | float] = {}
4042
keys = set(qrel_scores.keys()).intersection(set(run_scores.keys()))
4143

@@ -356,6 +358,7 @@ def compute[Q, C, S: Float](
356358
metrics: Sequence[str] = DEFAULT_METRICS,
357359
metric_funcs: Mapping[str, EvalMetricFunc] | None = None,
358360
) -> dict[str, float]:
361+
"""Evaluate retrieval results against relevance judgments using the given metrics."""
359362
import ranx
360363

361364
if metric_funcs is None:
@@ -503,6 +506,7 @@ def similarities_to_qrels[Q, C](
503506
round_mode: Literal["floor", "ceil", "nearest"] = "nearest",
504507
auto_scale: bool = True,
505508
) -> QueryCaseMatrix[Q, C, int]:
509+
"""Convert float similarity scores to integer relevance judgments."""
506510
if max_qrel is None:
507511
return {
508512
query: {

src/cbrkit/eval/retrieval.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ def retrieval_step[Q, C, S: Float](
1313
metrics: Sequence[str] = DEFAULT_METRICS,
1414
metric_funcs: dict[str, EvalMetricFunc] | None = None,
1515
) -> dict[str, float]:
16+
"""Evaluate a single retrieval step against relevance judgments."""
1617
return compute(
1718
qrels,
1819
{query: entry.similarities for query, entry in step.queries.items()},
@@ -27,6 +28,7 @@ def retrieval[Q, C, S: Float](
2728
metrics: Sequence[str] = DEFAULT_METRICS,
2829
metric_funcs: dict[str, EvalMetricFunc] | None = None,
2930
) -> list[dict[str, float]]:
31+
"""Evaluate all retrieval steps against relevance judgments."""
3032
return [
3133
retrieval_step(
3234
qrels,
@@ -45,6 +47,7 @@ def retrieval_step_to_qrels[Q, C, S: Float](
4547
round_mode: Literal["floor", "ceil", "nearest"] = "nearest",
4648
auto_scale: bool = True,
4749
) -> QueryCaseMatrix[Q, C, int]:
50+
"""Convert a retrieval step's similarities to integer relevance judgments."""
4851
unpacked_sims = {
4952
query: {case: unpack_float(value) for case, value in entry.similarities.items()}
5053
for query, entry in result.queries.items()
@@ -65,6 +68,7 @@ def retrieval_to_qrels[Q, C, S: Float](
6568
round_mode: Literal["floor", "ceil", "nearest"] = "nearest",
6669
auto_scale: bool = True,
6770
) -> list[QueryCaseMatrix[Q, C, int]]:
71+
"""Convert all retrieval steps' similarities to integer relevance judgments."""
6872
return [
6973
retrieval_step_to_qrels(
7074
step,

0 commit comments

Comments
 (0)