Skip to content

Cache files in FileLoader#460

Merged
ahx merged 3 commits intoahx:mainfrom
moberegger:moberegger/cache-loaded-files
Apr 1, 2026
Merged

Cache files in FileLoader#460
ahx merged 3 commits intoahx:mainfrom
moberegger:moberegger/cache-loaded-files

Conversation

@moberegger
Copy link
Copy Markdown
Contributor

@moberegger moberegger commented Mar 31, 2026

I noticed that when loading an Openapi document with $refs to other yaml files, files were being loaded more than once.

For example, when loading the splitted-train-travel-api from the specs

OpenapiFirst.load('./spec/data/splitted-train-travel-api/openapi.yaml')

You'll see the same file loaded multiple times (note: I put a log message in OpenapiFirst::FileLoader#load to test this)

Loading definition...
Loading file "./spec/data/splitted-train-travel-api/openapi.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/paths/stations.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/paths/stations.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/paths/stations.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/paths/stations.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/headers/RateLimit.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/headers/RateLimit.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/headers/RateLimit.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/headers/RateLimit.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/headers/RateLimit.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/headers/RateLimit.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/responses/BadRequest.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/responses/BadRequest.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/headers/RateLimit.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/headers/RateLimit.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/headers/RateLimit.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/headers/RateLimit.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/responses/BadRequest.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/schemas/Problem.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/headers/RateLimit.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/schemas/Problem.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/headers/RateLimit.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/responses/Unauthorized.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/responses/Unauthorized.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/headers/RateLimit.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/headers/RateLimit.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/headers/RateLimit.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/headers/RateLimit.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/responses/Unauthorized.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/schemas/Problem.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/headers/RateLimit.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/schemas/Problem.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/headers/RateLimit.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/responses/Forbidden.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/responses/Forbidden.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/headers/RateLimit.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/headers/RateLimit.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/headers/RateLimit.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/headers/RateLimit.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/responses/Forbidden.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/schemas/Problem.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/headers/RateLimit.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/schemas/Problem.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/headers/RateLimit.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/responses/TooManyRequests.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/responses/TooManyRequests.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/headers/RateLimit.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/headers/RateLimit.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/headers/RateLimit.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/headers/RateLimit.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/headers/Retry-After.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/headers/Retry-After.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/headers/Retry-After.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/headers/Retry-After.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/responses/TooManyRequests.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/schemas/Problem.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/headers/RateLimit.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/headers/Retry-After.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/schemas/Problem.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/headers/RateLimit.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/headers/Retry-After.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/responses/InternalServerError.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/responses/InternalServerError.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/headers/RateLimit.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/headers/RateLimit.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/headers/RateLimit.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/headers/RateLimit.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/responses/InternalServerError.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/schemas/Problem.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/headers/RateLimit.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/schemas/Problem.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/headers/RateLimit.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/paths/trips.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/paths/trips.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/paths/trips.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/paths/trips.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/headers/RateLimit.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/headers/RateLimit.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/headers/RateLimit.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/headers/RateLimit.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/headers/RateLimit.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/headers/RateLimit.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/responses/BadRequest.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/responses/BadRequest.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/headers/RateLimit.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/headers/RateLimit.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/headers/RateLimit.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/headers/RateLimit.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/responses/BadRequest.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/schemas/Problem.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/headers/RateLimit.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/schemas/Problem.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/headers/RateLimit.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/responses/Unauthorized.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/responses/Unauthorized.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/headers/RateLimit.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/headers/RateLimit.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/headers/RateLimit.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/headers/RateLimit.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/responses/Unauthorized.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/schemas/Problem.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/headers/RateLimit.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/schemas/Problem.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/headers/RateLimit.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/responses/Forbidden.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/responses/Forbidden.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/headers/RateLimit.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/headers/RateLimit.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/headers/RateLimit.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/headers/RateLimit.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/responses/Forbidden.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/schemas/Problem.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/headers/RateLimit.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/schemas/Problem.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/headers/RateLimit.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/responses/TooManyRequests.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/responses/TooManyRequests.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/headers/RateLimit.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/headers/RateLimit.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/headers/RateLimit.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/headers/RateLimit.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/headers/Retry-After.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/headers/Retry-After.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/headers/Retry-After.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/headers/Retry-After.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/responses/TooManyRequests.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/schemas/Problem.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/headers/RateLimit.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/headers/Retry-After.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/schemas/Problem.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/headers/RateLimit.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/headers/Retry-After.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/responses/InternalServerError.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/responses/InternalServerError.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/headers/RateLimit.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/headers/RateLimit.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/headers/RateLimit.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/headers/RateLimit.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/responses/InternalServerError.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/schemas/Problem.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/headers/RateLimit.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/schemas/Problem.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/headers/RateLimit.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/paths/bookings.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/paths/bookings.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/paths/bookings.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/paths/bookings.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/headers/RateLimit.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/headers/RateLimit.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/headers/RateLimit.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/headers/RateLimit.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/headers/RateLimit.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/headers/RateLimit.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/responses/BadRequest.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/responses/BadRequest.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/headers/RateLimit.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/headers/RateLimit.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/headers/RateLimit.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/headers/RateLimit.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/responses/BadRequest.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/schemas/Problem.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/headers/RateLimit.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/schemas/Problem.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/headers/RateLimit.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/responses/Unauthorized.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/responses/Unauthorized.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/headers/RateLimit.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/headers/RateLimit.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/headers/RateLimit.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/headers/RateLimit.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/responses/Unauthorized.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/schemas/Problem.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/headers/RateLimit.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/schemas/Problem.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/headers/RateLimit.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/responses/Forbidden.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/responses/Forbidden.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/headers/RateLimit.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/headers/RateLimit.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/headers/RateLimit.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/headers/RateLimit.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/responses/Forbidden.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/schemas/Problem.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/headers/RateLimit.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/schemas/Problem.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/headers/RateLimit.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/responses/TooManyRequests.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/responses/TooManyRequests.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/headers/RateLimit.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/headers/RateLimit.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/headers/RateLimit.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/headers/RateLimit.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/headers/Retry-After.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/headers/Retry-After.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/headers/Retry-After.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/headers/Retry-After.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/responses/TooManyRequests.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/schemas/Problem.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/headers/RateLimit.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/headers/Retry-After.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/schemas/Problem.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/headers/RateLimit.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/headers/Retry-After.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/responses/InternalServerError.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/responses/InternalServerError.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/headers/RateLimit.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/headers/RateLimit.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/headers/RateLimit.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/headers/RateLimit.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/responses/InternalServerError.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/schemas/Problem.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/headers/RateLimit.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/schemas/Problem.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/headers/RateLimit.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/paths/bookings.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/schemas/Booking.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/schemas/Booking.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/responses/BadRequest.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/responses/BadRequest.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/headers/RateLimit.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/headers/RateLimit.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/headers/RateLimit.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/headers/RateLimit.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/responses/BadRequest.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/schemas/Problem.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/headers/RateLimit.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/schemas/Problem.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/headers/RateLimit.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/responses/Unauthorized.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/responses/Unauthorized.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/headers/RateLimit.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/headers/RateLimit.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/headers/RateLimit.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/headers/RateLimit.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/responses/Unauthorized.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/schemas/Problem.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/headers/RateLimit.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/schemas/Problem.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/headers/RateLimit.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/responses/NotFound.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/responses/NotFound.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/headers/RateLimit.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/headers/RateLimit.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/headers/RateLimit.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/headers/RateLimit.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/responses/NotFound.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/schemas/Problem.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/headers/RateLimit.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/schemas/Problem.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/headers/RateLimit.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/responses/Conflict.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/responses/Conflict.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/headers/RateLimit.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/headers/RateLimit.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/headers/RateLimit.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/headers/RateLimit.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/responses/Conflict.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/schemas/Problem.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/headers/RateLimit.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/schemas/Problem.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/headers/RateLimit.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/responses/TooManyRequests.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/responses/TooManyRequests.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/headers/RateLimit.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/headers/RateLimit.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/headers/RateLimit.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/headers/RateLimit.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/headers/Retry-After.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/headers/Retry-After.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/headers/Retry-After.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/headers/Retry-After.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/responses/TooManyRequests.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/schemas/Problem.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/headers/RateLimit.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/headers/Retry-After.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/schemas/Problem.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/headers/RateLimit.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/headers/Retry-After.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/responses/InternalServerError.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/responses/InternalServerError.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/headers/RateLimit.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/headers/RateLimit.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/headers/RateLimit.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/headers/RateLimit.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/responses/InternalServerError.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/schemas/Problem.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/headers/RateLimit.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/schemas/Problem.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/headers/RateLimit.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/responses/BadRequest.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/responses/BadRequest.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/headers/RateLimit.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/headers/RateLimit.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/headers/RateLimit.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/headers/RateLimit.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/responses/BadRequest.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/schemas/Problem.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/headers/RateLimit.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/schemas/Problem.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/headers/RateLimit.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/responses/Unauthorized.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/responses/Unauthorized.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/headers/RateLimit.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/headers/RateLimit.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/headers/RateLimit.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/headers/RateLimit.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/responses/Unauthorized.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/schemas/Problem.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/headers/RateLimit.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/schemas/Problem.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/headers/RateLimit.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/responses/NotFound.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/responses/NotFound.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/headers/RateLimit.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/headers/RateLimit.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/headers/RateLimit.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/headers/RateLimit.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/responses/NotFound.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/schemas/Problem.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/headers/RateLimit.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/schemas/Problem.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/headers/RateLimit.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/responses/Conflict.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/responses/Conflict.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/headers/RateLimit.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/headers/RateLimit.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/headers/RateLimit.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/headers/RateLimit.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/responses/Conflict.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/schemas/Problem.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/headers/RateLimit.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/schemas/Problem.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/headers/RateLimit.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/responses/TooManyRequests.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/responses/TooManyRequests.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/headers/RateLimit.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/headers/RateLimit.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/headers/RateLimit.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/headers/RateLimit.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/headers/Retry-After.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/headers/Retry-After.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/headers/Retry-After.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/headers/Retry-After.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/responses/TooManyRequests.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/schemas/Problem.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/headers/RateLimit.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/headers/Retry-After.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/schemas/Problem.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/headers/RateLimit.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/headers/Retry-After.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/responses/InternalServerError.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/responses/InternalServerError.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/headers/RateLimit.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/headers/RateLimit.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/headers/RateLimit.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/headers/RateLimit.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/responses/InternalServerError.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/schemas/Problem.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/headers/RateLimit.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/schemas/Problem.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/headers/RateLimit.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/paths/bookings_{bookingId}.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/paths/bookings_{bookingId}.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/paths/bookings_{bookingId}.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/paths/bookings_{bookingId}.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/headers/RateLimit.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/headers/RateLimit.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/headers/RateLimit.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/headers/RateLimit.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/headers/RateLimit.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/headers/RateLimit.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/responses/BadRequest.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/responses/BadRequest.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/headers/RateLimit.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/headers/RateLimit.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/headers/RateLimit.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/headers/RateLimit.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/responses/BadRequest.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/schemas/Problem.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/headers/RateLimit.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/schemas/Problem.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/headers/RateLimit.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/responses/Unauthorized.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/responses/Unauthorized.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/headers/RateLimit.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/headers/RateLimit.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/headers/RateLimit.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/headers/RateLimit.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/responses/Unauthorized.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/schemas/Problem.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/headers/RateLimit.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/schemas/Problem.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/headers/RateLimit.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/responses/Forbidden.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/responses/Forbidden.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/headers/RateLimit.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/headers/RateLimit.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/headers/RateLimit.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/headers/RateLimit.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/responses/Forbidden.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/schemas/Problem.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/headers/RateLimit.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/schemas/Problem.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/headers/RateLimit.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/responses/NotFound.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/responses/NotFound.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/headers/RateLimit.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/headers/RateLimit.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/headers/RateLimit.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/headers/RateLimit.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/responses/NotFound.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/schemas/Problem.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/headers/RateLimit.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/schemas/Problem.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/headers/RateLimit.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/responses/TooManyRequests.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/responses/TooManyRequests.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/headers/RateLimit.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/headers/RateLimit.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/headers/RateLimit.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/headers/RateLimit.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/headers/Retry-After.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/headers/Retry-After.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/headers/Retry-After.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/headers/Retry-After.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/responses/TooManyRequests.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/schemas/Problem.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/headers/RateLimit.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/headers/Retry-After.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/schemas/Problem.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/headers/RateLimit.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/headers/Retry-After.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/responses/InternalServerError.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/responses/InternalServerError.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/headers/RateLimit.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/headers/RateLimit.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/headers/RateLimit.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/headers/RateLimit.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/responses/InternalServerError.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/schemas/Problem.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/headers/RateLimit.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/schemas/Problem.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/headers/RateLimit.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/paths/bookings_{bookingId}.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/responses/BadRequest.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/responses/BadRequest.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/headers/RateLimit.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/headers/RateLimit.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/headers/RateLimit.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/headers/RateLimit.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/responses/BadRequest.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/schemas/Problem.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/headers/RateLimit.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/schemas/Problem.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/headers/RateLimit.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/responses/Unauthorized.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/responses/Unauthorized.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/headers/RateLimit.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/headers/RateLimit.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/headers/RateLimit.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/headers/RateLimit.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/responses/Unauthorized.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/schemas/Problem.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/headers/RateLimit.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/schemas/Problem.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/headers/RateLimit.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/responses/Forbidden.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/responses/Forbidden.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/headers/RateLimit.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/headers/RateLimit.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/headers/RateLimit.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/headers/RateLimit.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/responses/Forbidden.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/schemas/Problem.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/headers/RateLimit.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/schemas/Problem.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/headers/RateLimit.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/responses/NotFound.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/responses/NotFound.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/headers/RateLimit.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/headers/RateLimit.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/headers/RateLimit.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/headers/RateLimit.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/responses/NotFound.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/schemas/Problem.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/headers/RateLimit.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/schemas/Problem.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/headers/RateLimit.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/responses/TooManyRequests.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/responses/TooManyRequests.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/headers/RateLimit.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/headers/RateLimit.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/headers/RateLimit.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/headers/RateLimit.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/headers/Retry-After.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/headers/Retry-After.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/headers/Retry-After.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/headers/Retry-After.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/responses/TooManyRequests.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/schemas/Problem.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/headers/RateLimit.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/headers/Retry-After.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/schemas/Problem.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/headers/RateLimit.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/headers/Retry-After.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/responses/InternalServerError.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/responses/InternalServerError.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/headers/RateLimit.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/headers/RateLimit.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/headers/RateLimit.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/headers/RateLimit.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/responses/InternalServerError.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/schemas/Problem.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/headers/RateLimit.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/schemas/Problem.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/headers/RateLimit.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/paths/bookings_{bookingId}_payment.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/paths/bookings_{bookingId}_payment.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/paths/bookings_{bookingId}_payment.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/paths/bookings_{bookingId}_payment.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/schemas/BookingPayment.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/headers/RateLimit.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/headers/RateLimit.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/headers/RateLimit.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/headers/RateLimit.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/headers/RateLimit.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/responses/BadRequest.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/responses/BadRequest.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/headers/RateLimit.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/headers/RateLimit.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/headers/RateLimit.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/headers/RateLimit.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/responses/BadRequest.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/schemas/Problem.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/headers/RateLimit.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/schemas/Problem.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/headers/RateLimit.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/responses/Unauthorized.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/responses/Unauthorized.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/headers/RateLimit.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/headers/RateLimit.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/headers/RateLimit.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/headers/RateLimit.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/responses/Unauthorized.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/schemas/Problem.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/headers/RateLimit.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/schemas/Problem.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/headers/RateLimit.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/responses/Forbidden.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/responses/Forbidden.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/headers/RateLimit.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/headers/RateLimit.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/headers/RateLimit.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/headers/RateLimit.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/responses/Forbidden.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/schemas/Problem.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/headers/RateLimit.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/schemas/Problem.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/headers/RateLimit.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/responses/TooManyRequests.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/responses/TooManyRequests.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/headers/RateLimit.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/headers/RateLimit.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/headers/RateLimit.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/headers/RateLimit.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/headers/Retry-After.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/headers/Retry-After.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/headers/Retry-After.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/headers/Retry-After.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/responses/TooManyRequests.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/schemas/Problem.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/headers/RateLimit.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/headers/Retry-After.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/schemas/Problem.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/headers/RateLimit.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/headers/Retry-After.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/responses/InternalServerError.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/responses/InternalServerError.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/headers/RateLimit.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/headers/RateLimit.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/headers/RateLimit.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/headers/RateLimit.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/responses/InternalServerError.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/schemas/Problem.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/headers/RateLimit.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/schemas/Problem.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/headers/RateLimit.yaml"
... Loaded definition

I'm honestly not sure why this is happening. I thought that this may be because a yaml file could be referenced multiple times in the same document, but this appears to still be happening for files that are only referenced a single time. I would have expected the JSONSchemer::CachedResolver to handle most of this, but perhaps the caching is only taking place after all of the nested $refs have been loaded.

This PR adds a cache to the FileLoader. It is thread safe and follows the check-lock-check pattern to reduce overhead from the mutex. With this in place, loading the same document results in the files only being loaded a single time.

Loading definition...
Loading file "./spec/data/splitted-train-travel-api/openapi.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/paths/stations.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/headers/RateLimit.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/responses/BadRequest.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/schemas/Problem.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/responses/Unauthorized.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/responses/Forbidden.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/responses/TooManyRequests.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/headers/Retry-After.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/responses/InternalServerError.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/paths/trips.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/paths/bookings.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/schemas/Booking.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/responses/NotFound.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/responses/Conflict.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/paths/bookings_{bookingId}.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/paths/bookings_{bookingId}_payment.yaml"
Loading file "openapi_first/spec/data/splitted-train-travel-api/components/schemas/BookingPayment.yaml"
... Loaded definition

I saw #426, so perhaps this is a way to mitigate some of those memory issues.

A quick memory benchmark for

OpenapiFirst.load('./spec/data/splitted-train-travel-api/openapi.yaml')

Before

                        10.119M memsize (    66.438k retained)
                        76.989k objects (   485.000  retained)
                        50.000  strings (    50.000  retained)

After

                         2.701M memsize (   144.438k retained)
                        21.846k objects (     1.220k retained)
                        50.000  strings (    50.000  retained)

@moberegger moberegger requested a review from ahx as a code owner March 31, 2026 23:21
Copy link
Copy Markdown
Owner

@ahx ahx left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Hi. Thanks for the PR. I was hesitant to add caching outside of the "register" interface, but this makes total sense.

end

body
def clear_cache
Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Did you had a situation where you had to call this method? – If not, I'd like to remove this and maybe add an interface on a higher level.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I do (I should have called this out).

In the Rails app I am working on, it is set up to watch the yml files for reloading. So if a change is made to a schema, the entire server doesn't have to restart. Before reloading the OpenAPI definition, you would need to clear this cache.

I figured that this may be a general "need" so included this.

@ahx
Copy link
Copy Markdown
Owner

ahx commented Apr 1, 2026

Can you update the changelog (just under „unreleased“ please? I’ll merge after that.

Comment on lines +5 to +7
- `OpenapiFirst::FileLoader` will now cache the contents of files that have been loaded. This cache
is keyed on the file's path. If you need to reload your OpenAPI definition for tests or server hot
reloading, you can run `OpenapiFirst::FileLoader.clear_cache!`.
Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Is this something you'd like documented in the README as well? Until now, FileLoader was an implementation detail.

Maybe this should be OpenapiFirst.clear_cache! or something like that?

Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yes, the changelog should not mention internal APIs, but just what was behavior was changed / improved. I'll merge this PR and might rephrase this part in the next release (till friday).

@ahx ahx merged commit dbb0df8 into ahx:main Apr 1, 2026
22 checks passed
@ahx
Copy link
Copy Markdown
Owner

ahx commented Apr 1, 2026

Thanks for the work on this. I think this is a great improval.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants