SYMBOL INDEX (439 symbols across 37 files) FILE: examples/httpbin_post.py class GracefulHttpbin (line 10) | class GracefulHttpbin(Gracy[str]): class Config (line 11) | class Config: method post_json_example (line 14) | async def post_json_example(self): method post_data_example (line 20) | async def post_data_example(self): function main (line 25) | async def main(): FILE: examples/memory.py class PokemonNotFound (line 15) | class PokemonNotFound(GracyUserDefinedException): method _format_message (line 18) | def _format_message( class PokeApiEndpoint (line 26) | class PokeApiEndpoint(BaseEndpoint): class GracefulPokeAPI (line 31) | class GracefulPokeAPI(Gracy[PokeApiEndpoint]): class Config (line 32) | class Config: class Test (line 39) | class Test: function main (line 43) | def main(): FILE: examples/pokeapi.py class PokemonNotFound (line 31) | class PokemonNotFound(GracyUserDefinedException): method _format_message (line 34) | def _format_message( class ServerIsOutError (line 42) | class ServerIsOutError(Exception): class PokeApiEndpoint (line 46) | class PokeApiEndpoint(BaseEndpoint): class GracefulPokeAPI (line 51) | class GracefulPokeAPI(Gracy[PokeApiEndpoint]): class Config (line 52) | class Config: method get_pokemon (line 72) | async def get_pokemon(self, name: str): method get_generation (line 79) | async def get_generation(self, gen: int): function main (line 87) | async def main(): FILE: examples/pokeapi_limit_concurrency.py class PokeApiEndpoint (line 52) | class PokeApiEndpoint(BaseEndpoint): class GracefulPokeAPI (line 57) | class GracefulPokeAPI(Gracy[PokeApiEndpoint]): class Config (line 58) | class Config: method get_pokemon (line 73) | async def get_pokemon(self, name: str): method get_generation (line 76) | async def get_generation(self, gen: int): method slow_req (line 80) | async def slow_req(self, s: int): function main (line 87) | async def main(): FILE: examples/pokeapi_namespaces.py class PokeApiEndpoint (line 20) | class PokeApiEndpoint(BaseEndpoint): class PokeApiBerryNamespace (line 30) | class PokeApiBerryNamespace(GracyNamespace[PokeApiEndpoint]): method get_this (line 31) | async def get_this(self, name_or_id: t.Union[str, int]): method get_flavor (line 36) | async def get_flavor(self, name_or_id: t.Union[str, int]): method get_firmness (line 41) | async def get_firmness(self, name_or_id: t.Union[str, int]): class PokeApiPokemonNamespace (line 47) | class PokeApiPokemonNamespace(GracyNamespace[PokeApiEndpoint]): method get_this (line 48) | async def get_this(self, name_or_id: t.Union[str, int]): method get_color (line 53) | async def get_color(self, name_or_id: t.Union[str, int]): method get_form (line 58) | async def get_form(self, name_or_id: t.Union[str, int]): class PokeApi (line 64) | class PokeApi(Gracy[PokeApiEndpoint]): class Config (line 65) | class Config: function main (line 81) | async def main(): FILE: examples/pokeapi_replay.py class PokemonNotFound (line 43) | class PokemonNotFound(GracyUserDefinedException): method _format_message (line 46) | def _format_message( class PokeApiEndpoint (line 54) | class PokeApiEndpoint(BaseEndpoint): class GracefulPokeAPI (line 59) | class GracefulPokeAPI(Gracy[PokeApiEndpoint]): class Config (line 60) | class Config: method get_pokemon (line 80) | async def get_pokemon(self, name: str): method get_generation (line 83) | async def get_generation(self, gen: int): function main (line 87) | async def main(replay_mode: GracyReplay): FILE: examples/pokeapi_replay_mongo.py class PokemonNotFound (line 38) | class PokemonNotFound(GracyUserDefinedException): method _format_message (line 41) | def _format_message( class PokeApiEndpoint (line 49) | class PokeApiEndpoint(BaseEndpoint): class GracefulPokeAPI (line 54) | class GracefulPokeAPI(Gracy[PokeApiEndpoint]): class Config (line 55) | class Config: method get_pokemon (line 74) | async def get_pokemon(self, name: str): method get_generation (line 77) | async def get_generation(self, gen: int): function main (line 81) | async def main(replay_mode: GracyReplay): FILE: examples/pokeapi_retry.py class ServerIsOutError (line 29) | class ServerIsOutError(Exception): class PokeApiEndpoint (line 33) | class PokeApiEndpoint(BaseEndpoint): class GracefulPokeAPI (line 37) | class GracefulPokeAPI(Gracy[PokeApiEndpoint]): class Config (line 38) | class Config: method get_pokemon (line 51) | async def get_pokemon(self, name: str): function main (line 59) | async def main(): FILE: examples/pokeapi_throttle.py class PokeApiEndpoint (line 34) | class PokeApiEndpoint(BaseEndpoint): class GracefulPokeAPI (line 39) | class GracefulPokeAPI(Gracy[PokeApiEndpoint]): class Config (line 40) | class Config: method get_pokemon (line 59) | async def get_pokemon(self, name: str): method get_generation (line 69) | async def get_generation(self, gen: int): function main (line 76) | async def main(): FILE: examples/pokestarwarsapi.py class PokeApiEndpoint (line 9) | class PokeApiEndpoint(BaseEndpoint): class GracefulPokeAPI (line 13) | class GracefulPokeAPI(Gracy[PokeApiEndpoint]): class Config (line 14) | class Config: method get_pokemon (line 25) | async def get_pokemon(self, name: str): class StarWarsAPI (line 29) | class StarWarsAPI(Gracy[str]): class Config (line 30) | class Config: method get_person (line 38) | async def get_person(self, person_id: int): function main (line 46) | async def main(): FILE: src/gracy/_configs.py function custom_gracy_config (line 15) | def custom_gracy_config(config: GracyConfig): function within_hook (line 28) | def within_hook(): FILE: src/gracy/_core.py function _gracefully_throttle (line 85) | async def _gracefully_throttle( function _gracefully_retry (line 137) | async def _gracefully_retry( function _maybe_parse_result (line 234) | def _maybe_parse_result( function _gracify (line 259) | async def _gracify( class OngoingRequestsTracker (line 380) | class OngoingRequestsTracker: method __init__ (line 381) | def __init__(self) -> None: method count (line 386) | def count(self) -> int: method request (line 390) | async def request( class Gracy (line 446) | class Gracy(t.Generic[Endpoint]): class Config (line 454) | class Config: method __init__ (line 459) | def __init__( method _init_typed_http_methods (line 476) | def _init_typed_http_methods(self): method _post_init (line 542) | def _post_init(self): method _instantiate_namespaces (line 550) | def _instantiate_namespaces(self): method ongoing_requests_count (line 565) | def ongoing_requests_count(self) -> int: method _create_client (line 568) | def _create_client(self, **kwargs: t.Any) -> httpx.AsyncClient: method _request (line 573) | async def _request( method before (line 633) | async def before(self, context: GracyRequestContext): method _before (line 636) | async def _before(self, context: GracyRequestContext): method after (line 646) | async def after( method _after (line 654) | async def _after( method get_report (line 669) | def get_report(self): method report_status (line 672) | def report_status(self, printer: PRINTERS): method dangerously_reset_report (line 677) | def dangerously_reset_report(cls): class GracyNamespace (line 686) | class GracyNamespace(t.Generic[Endpoint], Gracy[Endpoint]): method __init__ (line 690) | def __init__(self, parent: Gracy[Endpoint], **kwargs: t.Any) -> None: method _get_namespace_client (line 700) | def _get_namespace_client( method _setup_namespace_config (line 705) | def _setup_namespace_config(self, parent: Gracy[Endpoint]): function graceful (line 742) | def graceful( function graceful_generator (line 790) | def graceful_generator( FILE: src/gracy/_general.py function extract_request_kwargs (line 22) | def extract_request_kwargs(kwargs: dict[str, t.Any]) -> dict[str, t.Any]: FILE: src/gracy/_loggers.py function is_replay (line 13) | def is_replay(resp: httpx.Response) -> bool: class SafeDict (line 17) | class SafeDict(t.Dict[str, str]): method __missing__ (line 18) | def __missing__(self, key: str): class DefaultLogMessage (line 22) | class DefaultLogMessage(str, Enum): function do_log (line 48) | def do_log( function extract_base_format_args (line 68) | def extract_base_format_args(request_context: GracyRequestContext) -> di... function extract_response_format_args (line 78) | def extract_response_format_args(response: httpx.Response | None) -> dic... function process_log_before_request (line 97) | def process_log_before_request( function process_log_throttle (line 104) | def process_log_throttle( function process_log_retry (line 121) | def process_log_retry( function process_log_after_request (line 144) | def process_log_after_request( function process_log_concurrency_limit (line 158) | def process_log_concurrency_limit( function process_log_concurrency_freed (line 169) | def process_log_concurrency_freed( FILE: src/gracy/_models.py class LogLevel (line 22) | class LogLevel(IntEnum): class LogEvent (line 32) | class LogEvent: class GracefulRetryState (line 50) | class GracefulRetryState: method __init__ (line 57) | def __init__(self, retry_config: GracefulRetry) -> None: method delay (line 63) | def delay(self) -> float: method failed (line 70) | def failed(self) -> bool: method max_attempts (line 74) | def max_attempts(self): method can_retry (line 78) | def can_retry(self): method cant_retry (line 82) | def cant_retry(self): method cause (line 86) | def cause(self) -> str: method increment (line 119) | def increment(self, response: httpx.Response | None): class OverrideRetryOn (line 140) | class OverrideRetryOn: class GracefulRetry (line 145) | class GracefulRetry: method needs_retry (line 157) | def needs_retry(self, response_result: int) -> bool: method create_state (line 167) | def create_state( class ThrottleRule (line 176) | class ThrottleRule: method __init__ (line 199) | def __init__( method readable_time_range (line 213) | def readable_time_range(self) -> str: method __str__ (line 238) | def __str__(self) -> str: method calculate_await_time (line 241) | def calculate_await_time(self, controller: ThrottleController) -> float: class ThrottleLocker (line 259) | class ThrottleLocker: method __init__ (line 260) | def __init__(self) -> None: method lock_rule (line 265) | def lock_rule(self, rule: ThrottleRule): method lock_check (line 270) | def lock_check(self): method is_rule_throttled (line 274) | def is_rule_throttled(self, rule: ThrottleRule) -> bool: class GracefulThrottle (line 281) | class GracefulThrottle: method __init__ (line 286) | def __init__( class ThrottleController (line 297) | class ThrottleController: method __init__ (line 298) | def __init__(self) -> None: method init_request (line 301) | def init_request(self, request_context: GracyRequestContext): method calculate_requests_per_rule (line 307) | def calculate_requests_per_rule( method calculate_requests_per_sec (line 340) | def calculate_requests_per_sec(self, url_pattern: t.Pattern[str]) -> f... method debug_print (line 368) | def debug_print(self): class GracefulValidator (line 386) | class GracefulValidator(ABC): method check (line 392) | def check(self, response: httpx.Response) -> None: class RequestTimeline (line 398) | class RequestTimeline: method build (line 404) | def build(cls, start: float, resp: httpx.Response): class ConcurrentRequestLimit (line 415) | class ConcurrentRequestLimit: method __post_init__ (line 458) | def __post_init__(self): method _get_blocking_key (line 463) | def _get_blocking_key( method get_semaphore (line 476) | def get_semaphore( class GracyConfig (line 493) | class GracyConfig: method should_retry (line 539) | def should_retry( method has_retry (line 602) | def has_retry(self) -> bool: method merge_config (line 606) | def merge_config(cls, base: GracyConfig, modifier: GracyConfig): method get_concurrent_limit (line 617) | def get_concurrent_limit( class BaseEndpoint (line 649) | class BaseEndpoint(str, Enum): method __str__ (line 650) | def __str__(self) -> str: class GracefulRequest (line 657) | class GracefulRequest: method __init__ (line 664) | def __init__( method __call__ (line 676) | def __call__(self) -> t.Awaitable[httpx.Response]: class GracyRequestContext (line 680) | class GracyRequestContext: method __init__ (line 681) | def __init__( method active_config (line 705) | def active_config(self) -> GracyConfig: FILE: src/gracy/_paginator.py class GracyPaginator (line 9) | class GracyPaginator(t.Generic[RESP_T, TOKEN_T]): method __init__ (line 10) | def __init__( method _prepare_params (line 35) | def _prepare_params( method _fetch_page (line 46) | async def _fetch_page(self) -> RESP_T: method has_prev (line 51) | def has_prev(self, token: TOKEN_T) -> bool: method _calculate_next_token (line 57) | def _calculate_next_token(self, resp: RESP_T, token: TOKEN_T) -> TOKEN_T: method _calculate_prev_token (line 63) | def _calculate_prev_token(self, token: TOKEN_T) -> TOKEN_T: method set_page (line 69) | def set_page(self, token: TOKEN_T) -> None: method next_page (line 72) | async def next_page(self) -> RESP_T | None: method prev_page (line 82) | async def prev_page(self): method __aiter__ (line 92) | def __aiter__(self): method __anext__ (line 95) | async def __anext__(self): class GracyOffsetPaginator (line 102) | class GracyOffsetPaginator(t.Generic[RESP_T], GracyPaginator[RESP_T, int]): method __init__ (line 103) | def __init__( method _prepare_params (line 120) | def _prepare_params( method has_prev (line 131) | def has_prev(self, token: int) -> bool: method _calculate_next_token (line 137) | def _calculate_next_token(self, resp: RESP_T, token: int) -> int: method _calculate_prev_token (line 140) | def _calculate_prev_token(self, token: int) -> int: FILE: src/gracy/_reports/_builders.py class ReportBuilder (line 25) | class ReportBuilder: method __init__ (line 26) | def __init__(self) -> None: method track (line 31) | def track( method retried (line 47) | def retried(self, request_context: GracyRequestContext): method throttled (line 50) | def throttled(self, request_context: GracyRequestContext): method _replayed (line 53) | def _replayed(self, request_context: GracyRequestContext): method _calculate_req_rate_for_url (line 56) | def _calculate_req_rate_for_url( method build (line 63) | def build( FILE: src/gracy/_reports/_models.py class GracyRequestResult (line 13) | class GracyRequestResult: class GracyRequestCounters (line 21) | class GracyRequestCounters: class ReportGenericAggregatedRequest (line 28) | class ReportGenericAggregatedRequest: method success_rate (line 47) | def success_rate(self) -> float: method failed_rate (line 54) | def failed_rate(self) -> float: class GracyAggregatedRequest (line 62) | class GracyAggregatedRequest(ReportGenericAggregatedRequest): class GracyAggregatedTotal (line 68) | class GracyAggregatedTotal(ReportGenericAggregatedRequest): method avg_latency (line 73) | def avg_latency(self) -> float: method req_rate_per_sec (line 78) | def req_rate_per_sec(self) -> float: method increment_result (line 82) | def increment_result(self, row: GracyAggregatedRequest) -> None: class GracyReport (line 98) | class GracyReport: method __init__ (line 99) | def __init__( method add_request (line 121) | def add_request(self, request: GracyAggregatedRequest) -> None: FILE: src/gracy/_reports/_printers.py class Titles (line 16) | class Titles: function _getreplays_warn (line 34) | def _getreplays_warn(replay_settings: GracyReplay | None) -> str: function _format_value (line 52) | def _format_value( function _format_int (line 75) | def _format_int( function _print_header (line 97) | def _print_header(report: GracyReport): class BasePrinter (line 108) | class BasePrinter(ABC): method print_report (line 110) | def print_report(self, report: GracyReport) -> t.Any: class RichPrinter (line 114) | class RichPrinter(BasePrinter): method print_report (line 115) | def print_report(self, report: GracyReport) -> None: class PlotlyPrinter (line 195) | class PlotlyPrinter(BasePrinter): method print_report (line 196) | def print_report(self, report: GracyReport): class ListPrinter (line 229) | class ListPrinter(BasePrinter): method print_report (line 230) | def print_report(self, report: GracyReport) -> None: class LoggerPrinter (line 342) | class LoggerPrinter(BasePrinter): method print_report (line 343) | def print_report(self, report: GracyReport) -> None: function print_report (line 375) | def print_report(report: GracyReport, method: PRINTERS) -> t.Any: FILE: src/gracy/_types.py class Unset (line 16) | class Unset: method __bool__ (line 23) | def __bool__(self): function parsed_response (line 39) | def parsed_response(return_type: t.Type[T]): # type: ignore function generated_parsed_response (line 52) | def generated_parsed_response(return_type: t.Type[T]): # type: ignore FILE: src/gracy/_validators.py class DefaultValidator (line 11) | class DefaultValidator(GracefulValidator): method check (line 12) | def check(self, response: httpx.Response) -> None: class StrictStatusValidator (line 19) | class StrictStatusValidator(GracefulValidator): method __init__ (line 20) | def __init__(self, status_code: t.Union[int, t.Iterable[int]]) -> None: method check (line 26) | def check(self, response: httpx.Response) -> None: class AllowedStatusValidator (line 33) | class AllowedStatusValidator(GracefulValidator): method __init__ (line 34) | def __init__(self, status_code: t.Union[int, t.Iterable[int]]) -> None: method check (line 40) | def check(self, response: httpx.Response) -> None: FILE: src/gracy/common_hooks.py class HookResult (line 22) | class HookResult: class HttpHeaderRetryAfterBackOffHook (line 28) | class HttpHeaderRetryAfterBackOffHook: method __init__ (line 59) | def __init__( method _process_log (line 75) | def _process_log( method _parse_retry_after_as_seconds (line 92) | def _parse_retry_after_as_seconds(self, response: httpx.Response) -> f... method before (line 115) | async def before(self, context: GracyRequestContext) -> HookResult: method after (line 118) | async def after( class RateLimitBackOffHook (line 156) | class RateLimitBackOffHook: method __init__ (line 182) | def __init__( method _process_log (line 198) | def _process_log( method before (line 210) | async def before(self, context: GracyRequestContext) -> HookResult: method after (line 213) | async def after( FILE: src/gracy/exceptions.py class GracyException (line 12) | class GracyException(Exception, ABC): method __reduce__ (line 14) | def __reduce__(self) -> REDUCE_PICKABLE_RETURN: class GracyRequestFailed (line 24) | class GracyRequestFailed(GracyException): method __init__ (line 34) | def __init__(self, context: GracyRequestContext, original_exc: Excepti... method _get_exc_name (line 50) | def _get_exc_name(exc: Exception) -> str: method __reduce__ (line 64) | def __reduce__(self) -> REDUCE_PICKABLE_RETURN: class GracyParseFailed (line 68) | class GracyParseFailed(GracyException): method __init__ (line 69) | def __init__(self, response: httpx.Response) -> None: method __reduce__ (line 80) | def __reduce__(self) -> REDUCE_PICKABLE_RETURN: class BadResponse (line 84) | class BadResponse(GracyException): method __init__ (line 85) | def __init__( method __reduce__ (line 116) | def __reduce__(self) -> REDUCE_PICKABLE_RETURN: class UnexpectedResponse (line 120) | class UnexpectedResponse(BadResponse): method __init__ (line 121) | def __init__( method __reduce__ (line 130) | def __reduce__(self) -> REDUCE_PICKABLE_RETURN: class NonOkResponse (line 134) | class NonOkResponse(BadResponse): method __init__ (line 135) | def __init__(self, url: str, response: httpx.Response) -> None: method __reduce__ (line 141) | def __reduce__(self) -> REDUCE_PICKABLE_RETURN: class GracyUserDefinedException (line 145) | class GracyUserDefinedException(GracyException): method __init__ (line 148) | def __init__( method _build_default_args (line 155) | def _build_default_args(self) -> dict[str, t.Any]: method _format_message (line 170) | def _format_message( method url (line 177) | def url(self): method endpoint (line 181) | def endpoint(self): method response (line 185) | def response(self): method __reduce__ (line 188) | def __reduce__(self) -> REDUCE_PICKABLE_RETURN: class GracyReplayRequestNotFound (line 192) | class GracyReplayRequestNotFound(GracyException): method __init__ (line 193) | def __init__(self, request: httpx.Request) -> None: method __reduce__ (line 199) | def __reduce__(self) -> REDUCE_PICKABLE_RETURN: FILE: src/gracy/replays/_wrappers.py function record_mode (line 16) | def record_mode(replay: GracyReplay, httpx_request_func: httpx_func_type): function replay_mode (line 28) | def replay_mode( function smart_replay_mode (line 48) | def smart_replay_mode( FILE: src/gracy/replays/storages/_base.py function is_replay (line 22) | def is_replay(resp: httpx.Response) -> bool: class GracyReplayStorage (line 26) | class GracyReplayStorage(ABC): method prepare (line 27) | def prepare(self) -> None: method record (line 32) | async def record(self, response: httpx.Response) -> None: method find_replay (line 37) | async def find_replay( method _load (line 43) | async def _load( method load (line 49) | async def load( method flush (line 64) | def flush(self) -> None: class ReplayLogEvent (line 70) | class ReplayLogEvent(LogEvent): class GracyReplay (line 76) | class GracyReplay: method has_replay (line 108) | async def has_replay(self, request: httpx.Request) -> bool: method inc_record (line 114) | def inc_record(self): method inc_replay (line 122) | def inc_replay(self): FILE: src/gracy/replays/storages/pymongo.py class MongoCredentials (line 22) | class MongoCredentials: class MongoReplayDocument (line 30) | class MongoReplayDocument(t.TypedDict): function get_unique_keys_from_doc (line 40) | def get_unique_keys_from_doc( function get_unique_keys_from_request (line 50) | def get_unique_keys_from_request( class MongoReplayStorage (line 63) | class MongoReplayStorage(GracyReplayStorage): method __init__ (line 64) | def __init__( method _flush_batch (line 79) | def _flush_batch(self) -> None: method _create_or_batch (line 85) | def _create_or_batch(self, doc: MongoReplayDocument) -> None: method prepare (line 97) | def prepare(self) -> None: method record (line 104) | async def record(self, response: httpx.Response) -> None: method find_replay (line 130) | async def find_replay( method _load (line 144) | async def _load( method flush (line 157) | def flush(self) -> None: FILE: src/gracy/replays/storages/sqlite.py class GracyRecording (line 21) | class GracyRecording: class SQLiteReplayStorage (line 31) | class SQLiteReplayStorage(GracyReplayStorage): method __init__ (line 32) | def __init__( method _create_db (line 39) | def _create_db(self) -> None: method _insert_into_db (line 48) | def _insert_into_db(self, recording: GracyRecording) -> None: method prepare (line 61) | def prepare(self) -> None: method record (line 68) | async def record(self, response: httpx.Response) -> None: method _find_record (line 81) | def _find_record(self, request: httpx.Request): method find_replay (line 95) | async def find_replay( method _load (line 108) | async def _load( FILE: src/tests/conftest.py class FakeReplayStorage (line 22) | class FakeReplayStorage(SQLiteReplayStorage): method __init__ (line 25) | def __init__(self, force_urls: t.List[str]) -> None: method _find_record (line 30) | def _find_record(self, request: httpx.Request): class PokeApiEndpoint (line 46) | class PokeApiEndpoint(BaseEndpoint): function assert_one_request_made (line 51) | def assert_one_request_made(gracy_api: Gracy[PokeApiEndpoint]): function assert_requests_made (line 56) | def assert_requests_made( function assert_muiti_endpoints_requests_made (line 65) | def assert_muiti_endpoints_requests_made( FILE: src/tests/generate_test_db.py class PokeApiEndpoint (line 10) | class PokeApiEndpoint(BaseEndpoint): class GracefulPokeAPIRecorder (line 16) | class GracefulPokeAPIRecorder(Gracy[PokeApiEndpoint]): class Config (line 17) | class Config: method __init__ (line 20) | def __init__(self) -> None: method get_pokemon (line 28) | async def get_pokemon(self, name: str): method get_berry (line 31) | async def get_berry(self, name: str): method get_generation (line 34) | async def get_generation(self, gen: int): function main (line 38) | async def main(): FILE: src/tests/test_generators.py class GracefulPokeAPI (line 10) | class GracefulPokeAPI(Gracy[PokeApiEndpoint]): class Config (line 11) | class Config: method get_2_yield_graceful (line 15) | async def get_2_yield_graceful(self): function make_pokeapi (line 24) | def make_pokeapi(): function test_pokemon_ok_json (line 32) | async def test_pokemon_ok_json(make_pokeapi: t.Callable[[], GracefulPoke... FILE: src/tests/test_gracy_httpx.py function make_pokeapi (line 19) | def make_pokeapi(): class GracefulPokeAPI (line 27) | class GracefulPokeAPI(Gracy[PokeApiEndpoint]): class Config (line 28) | class Config: function test_pass_kwargs (line 40) | async def test_pass_kwargs(make_pokeapi: MAKE_POKEAPI_TYPE): FILE: src/tests/test_hooks.py function make_pokeapi (line 34) | def make_pokeapi(): class GracefulPokeAPI (line 42) | class GracefulPokeAPI(Gracy[PokeApiEndpoint]): class Config (line 43) | class Config: method __init__ (line 51) | def __init__(self, *args: t.Any, **kwargs: t.Any) -> None: method before (line 60) | async def before(self, context: GracyRequestContext): method after (line 63) | async def after( method get_pokemon (line 77) | async def get_pokemon(self, name: str): class GracefulPokeAPIWithRequestHooks (line 81) | class GracefulPokeAPIWithRequestHooks(GracefulPokeAPI): method before (line 82) | async def before(self, context: GracyRequestContext): method after (line 87) | async def after( function test_before_hook_counts (line 101) | async def test_before_hook_counts(make_pokeapi: MAKE_POKEAPI_TYPE): function test_after_hook_counts_statuses (line 111) | async def test_after_hook_counts_statuses(make_pokeapi: MAKE_POKEAPI_TYPE): function test_after_hook_counts_aborts (line 135) | async def test_after_hook_counts_aborts(): function test_hook_has_no_recursion (line 155) | async def test_hook_has_no_recursion(): function test_hook_with_retries_has_no_recursion (line 165) | async def test_hook_with_retries_has_no_recursion(): FILE: src/tests/test_loggers.py class CustomValidator (line 13) | class CustomValidator(GracefulValidator): method check (line 14) | def check(self, response: httpx.Response) -> None: function assert_log (line 19) | def assert_log(record: logging.LogRecord, expected_event: LogEvent): class GracefulPokeAPI (line 30) | class GracefulPokeAPI(Gracy[PokeApiEndpoint]): class Config (line 31) | class Config: method get_pokemon (line 39) | async def get_pokemon(self, name: str): function pokeapi (line 44) | def pokeapi(): function test_pokemon_log_request_response (line 49) | async def test_pokemon_log_request_response( function test_pokemon_log_request_response_error (line 59) | async def test_pokemon_log_request_response_error( FILE: src/tests/test_namespaces.py class PokemonNamespace (line 24) | class PokemonNamespace(GracyNamespace[PokeApiEndpoint]): method get_one (line 25) | async def get_one(self, name: str): class BerryNamespace (line 29) | class BerryNamespace(GracyNamespace[PokeApiEndpoint]): method get_one (line 30) | async def get_one(self, name: str): class GracefulPokeAPI (line 34) | class GracefulPokeAPI(Gracy[PokeApiEndpoint]): class Config (line 35) | class Config: function make_pokeapi (line 48) | def make_pokeapi(): function test_get_from_namespaces (line 59) | async def test_get_from_namespaces(make_pokeapi: MAKE_POKEAPI_TYPE): FILE: src/tests/test_parsers.py class GracefulPokeAPI (line 19) | class GracefulPokeAPI(Gracy[PokeApiEndpoint]): class Config (line 20) | class Config: method get_pokemon (line 25) | async def get_pokemon(self, name: str): method get_pokemon_not_found_as_none (line 31) | async def get_pokemon_not_found_as_none(self, name: str): function make_pokeapi (line 38) | def make_pokeapi(): function test_pokemon_ok_json (line 46) | async def test_pokemon_ok_json(make_pokeapi: t.Callable[[], GracefulPoke... function test_pokemon_bad_json (line 57) | async def test_pokemon_bad_json(make_pokeapi: t.Callable[[], GracefulPok... function test_pokemon_not_found_as_none (line 66) | async def test_pokemon_not_found_as_none(make_pokeapi: t.Callable[[], Gr... FILE: src/tests/test_retry.py function assert_log (line 66) | def assert_log(record: logging.LogRecord, expected_event: LogEvent): class CustomValidator (line 71) | class CustomValidator(GracefulValidator): method check (line 72) | def check(self, response: httpx.Response) -> None: class GracefulPokeAPI (line 77) | class GracefulPokeAPI(Gracy[PokeApiEndpoint]): class Config (line 78) | class Config: method get_pokemon (line 86) | async def get_pokemon(self, name: str): method get_pokemon_without_retry (line 90) | async def get_pokemon_without_retry(self, name: str): method get_pokemon_without_retry_or_parser (line 94) | async def get_pokemon_without_retry_or_parser(self, name: str): method get_pokemon_with_strict_status (line 98) | async def get_pokemon_with_strict_status(self, name: str): method get_pokemon_without_allowed_status (line 102) | async def get_pokemon_without_allowed_status(self, name: str): method get_pokemon_with_custom_validator (line 106) | async def get_pokemon_with_custom_validator(self, name: str): method get_pokemon_with_retry_on_none (line 110) | async def get_pokemon_with_retry_on_none(self, name: str): method get_pokemon_with_retry_on_none_and_validator (line 114) | async def get_pokemon_with_retry_on_none_and_validator(self, name: str): method get_pokemon_with_log_retry_3_times (line 118) | async def get_pokemon_with_log_retry_3_times(self, name: str): method get_pokemon_with_retry_overriden_log_placeholder (line 122) | async def get_pokemon_with_retry_overriden_log_placeholder(self, name:... function make_pokeapi (line 127) | def make_pokeapi(): function make_flaky_pokeapi (line 143) | def make_flaky_pokeapi(): class PokeApiFactory (line 167) | class PokeApiFactory(t.Protocol): method __call__ (line 168) | def __call__( class FlakyPokeApiFactory (line 177) | class FlakyPokeApiFactory(t.Protocol): method __call__ (line 178) | def __call__( function test_ensure_replay_is_enabled (line 187) | async def test_ensure_replay_is_enabled(make_pokeapi: PokeApiFactory): function test_pokemon_not_found (line 200) | async def test_pokemon_not_found(max_retries: int, make_pokeapi: PokeApi... function test_pokemon_not_found_without_allowed (line 211) | async def test_pokemon_not_found_without_allowed( function test_pokemon_not_found_with_strict_status (line 225) | async def test_pokemon_not_found_with_strict_status( function test_pokemon_with_bad_parser_break_wont_run (line 237) | async def test_pokemon_with_bad_parser_break_wont_run(make_pokeapi: Poke... function test_retry_with_failing_custom_validation (line 249) | async def test_retry_with_failing_custom_validation(make_pokeapi: PokeAp... function test_failing_without_retry (line 261) | async def test_failing_without_retry(make_pokeapi: PokeApiFactory): function test_failing_without_retry_or_parser (line 272) | async def test_failing_without_retry_or_parser(make_pokeapi: PokeApiFact... function test_retry_none_for_successful_request (line 283) | async def test_retry_none_for_successful_request(make_pokeapi: PokeApiFa... function test_retry_none_for_failing_request (line 294) | async def test_retry_none_for_failing_request(make_pokeapi: PokeApiFacto... function test_retry_none_for_failing_validator (line 305) | async def test_retry_none_for_failing_validator(make_pokeapi: PokeApiFac... function test_retry_eventually_recovers (line 318) | async def test_retry_eventually_recovers(make_flaky_pokeapi: FlakyPokeAp... function test_retry_eventually_recovers_with_strict (line 332) | async def test_retry_eventually_recovers_with_strict( function test_retry_logs (line 348) | async def test_retry_logs( function test_retry_logs_fail_reason (line 371) | async def test_retry_logs_fail_reason( function test_retry_logs_exhausts (line 394) | async def test_retry_logs_exhausts( function test_retry_without_replay_request_without_response_generic (line 417) | async def test_retry_without_replay_request_without_response_generic( FILE: src/tests/test_validators.py class CustomValidator (line 19) | class CustomValidator(GracefulValidator): method check (line 20) | def check(self, response: httpx.Response) -> None: class GracefulPokeAPI (line 25) | class GracefulPokeAPI(Gracy[PokeApiEndpoint]): class Config (line 26) | class Config: method get_pokemon (line 29) | async def get_pokemon(self, name: str): method get_pokemon_with_wrong_strict_status (line 33) | async def get_pokemon_with_wrong_strict_status(self, name: str): method get_pokemon_with_correct_strict_status (line 37) | async def get_pokemon_with_correct_strict_status(self, name: str): method get_pokemon_allow_404 (line 43) | async def get_pokemon_allow_404(self, name: str): function make_pokeapi (line 50) | def make_pokeapi(): function test_pokemon_ok_default (line 58) | async def test_pokemon_ok_default(make_pokeapi: t.Callable[[], GracefulP... function test_pokemon_not_found_default (line 68) | async def test_pokemon_not_found_default(make_pokeapi: t.Callable[[], Gr... function test_pokemon_strict_status_fail (line 83) | async def test_pokemon_strict_status_fail( function test_pokemon_strict_status_success (line 100) | async def test_pokemon_strict_status_success( function test_pokemon_allow_404 (line 111) | async def test_pokemon_allow_404(make_pokeapi: t.Callable[[], GracefulPo...