openai/openai-python

Public

mirrored from https://github.com/openai/openai-pythonAvailable

CodeCommitsIssuesPull requestsActionsInsightsSecurity
v1.42.0

Branches

Tags

  • No tags available.
0Branches0Tags
Go to file
Add file
Code

Clone

HTTPS

Download ZIP

tests/lib/chat/_utils.py

59lines · modeblame

bf1ca86cRobert Craigie1 years ago1from __future__ import annotations
2
3import io
4import inspect
5from typing import Any, Iterable
6from typing_extensions import TypeAlias
7
8import rich
9import pytest
10import pydantic
11
12ReprArgs: TypeAlias = "Iterable[tuple[str | None, Any]]"
13
14
15def print_obj(obj: object, monkeypatch: pytest.MonkeyPatch) -> str:
16"""Pretty print an object to a string"""
17
18# monkeypatch pydantic model printing so that model fields
19# are always printed in the same order so we can reliably
20# use this for snapshot tests
21original_repr = pydantic.BaseModel.__repr_args__
22
23def __repr_args__(self: pydantic.BaseModel) -> ReprArgs:
24return sorted(original_repr(self), key=lambda arg: arg[0] or arg)
25
26with monkeypatch.context() as m:
27m.setattr(pydantic.BaseModel, "__repr_args__", __repr_args__)
28
29buf = io.StringIO()
30
31console = rich.console.Console(file=buf, width=120)
32console.print(obj)
33
34string = buf.getvalue()
35
36# we remove all `fn_name.<locals>.` occurences
37# so that we can share the same snapshots between
38# pydantic v1 and pydantic v2 as their output for
39# generic models differs, e.g.
40#
41# v2: `ParsedChatCompletion[test_parse_pydantic_model.<locals>.Location]`
42# v1: `ParsedChatCompletion[Location]`
43return clear_locals(string, stacklevel=2)
44
45
46def get_caller_name(*, stacklevel: int = 1) -> str:
47frame = inspect.currentframe()
48assert frame is not None
49
50for i in range(stacklevel):
51frame = frame.f_back
52assert frame is not None, f"no {i}th frame"
53
54return frame.f_code.co_name
55
56
57def clear_locals(string: str, *, stacklevel: int) -> str:
58caller = get_caller_name(stacklevel=stacklevel + 1)
59return string.replace(f"{caller}.<locals>.", "")