33require_relative 'hash_helper'
44
55class << RSpec ::OpenAPI ::ComponentsUpdater = Object . new
6+ SCHEMA_REF_PREFIX = '#/components/schemas/'
7+
68 # @param [Hash] base
79 # @param [Hash] fresh
810 def update! ( base , fresh )
@@ -30,7 +32,7 @@ def update!(base, fresh)
3032 # Skip if the property using $ref is not found in the parent schema. The property may be removed.
3133 next if nested_schema . nil?
3234
33- schema_name = base . dig ( *paths ) &. gsub ( '#/components/schemas/' , '' ) &.to_sym
35+ schema_name = extract_schema_name ( base . dig ( *paths ) ) &.to_sym
3436 fresh_schemas [ schema_name ] ||= { }
3537 RSpec ::OpenAPI ::SchemaMerger . merge! ( fresh_schemas [ schema_name ] , nested_schema )
3638 end
@@ -44,7 +46,7 @@ def update!(base, fresh)
4446 def build_fresh_schemas ( references , base , fresh )
4547 references . inject ( { } ) do |acc , paths |
4648 ref_link = dig_schema ( base , paths ) [ :$ref ]
47- schema_name = ref_link . to_s . gsub ( '#/components/schemas/' , '' )
49+ schema_name = extract_schema_name ( ref_link )
4850 schema_body = dig_schema ( fresh , paths . grep_v ( Integer ) )
4951
5052 RSpec ::OpenAPI ::SchemaMerger . merge! ( acc , { schema_name => schema_body } )
@@ -81,7 +83,7 @@ def find_non_top_level_nested_refs(base, generated_names)
8183 # Reject already-generated schemas to reduce unnecessary loop
8284 nested_refs . reject do |paths |
8385 ref_link = base . dig ( *paths )
84- schema_name = ref_link . gsub ( '#/components/schemas/' , '' )
86+ schema_name = extract_schema_name ( ref_link )
8587 generated_names . include? ( schema_name )
8688 end
8789 end
@@ -91,11 +93,19 @@ def find_one_of_refs(base, paths)
9193 return unless one_of
9294
9395 one_of . each_with_index . filter_map do |schema , index |
94- paths + [ index ] if schema &.dig ( :$ref ) &. start_with? ( '#/components/schemas/' )
96+ paths + [ index ] if schema_ref? ( schema &.dig ( :$ref ) )
9597 end
9698 end
9799
98100 def find_object_refs ( base , paths )
99- [ paths ] if dig_schema ( base , paths ) &.dig ( :$ref ) &.start_with? ( '#/components/schemas/' )
101+ [ paths ] if schema_ref? ( dig_schema ( base , paths ) &.dig ( :$ref ) )
102+ end
103+
104+ def extract_schema_name ( ref_link )
105+ ref_link &.delete_prefix ( SCHEMA_REF_PREFIX )
106+ end
107+
108+ def schema_ref? ( ref_link )
109+ ref_link &.start_with? ( SCHEMA_REF_PREFIX )
100110 end
101111end
0 commit comments