openai/openai-python

Public

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

CodeCommitsIssuesPull requestsActionsInsightsSecurity
v1.82.0

Branches

Tags

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

Clone

HTTPS

Download ZIP

tests/lib/chat/_utils.py

54lines · modeblame

bf1ca86cRobert Craigie1 years ago1from __future__ import annotations
2
3import inspect
4from typing import Any, Iterable
5from typing_extensions import TypeAlias
6
7import pytest
8import pydantic
9
e1aeeb0eRobert Craigie1 years ago10from ...utils import rich_print_str
11
bf1ca86cRobert Craigie1 years ago12ReprArgs: 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
e1aeeb0eRobert Craigie1 years ago29string = rich_print_str(obj)
bf1ca86cRobert Craigie1 years ago30
31# we remove all `fn_name.<locals>.` occurences
32# so that we can share the same snapshots between
33# pydantic v1 and pydantic v2 as their output for
34# generic models differs, e.g.
35#
36# v2: `ParsedChatCompletion[test_parse_pydantic_model.<locals>.Location]`
37# v1: `ParsedChatCompletion[Location]`
38return clear_locals(string, stacklevel=2)
39
40
41def get_caller_name(*, stacklevel: int = 1) -> str:
42frame = inspect.currentframe()
43assert frame is not None
44
45for i in range(stacklevel):
46frame = frame.f_back
47assert frame is not None, f"no {i}th frame"
48
49return frame.f_code.co_name
50
51
52def clear_locals(string: str, *, stacklevel: int) -> str:
53caller = get_caller_name(stacklevel=stacklevel + 1)
54return string.replace(f"{caller}.<locals>.", "")