55module OpenapiFirst
66 # This is here to give traverse an OAD while keeping $refs intact
77 # @visibility private
8- module RefResolver
9- def self . load ( filepath )
10- contents = OpenapiFirst ::FileLoader . load ( filepath )
8+ class RefResolver
9+ def initialize ( file_loader :)
10+ @file_loader = file_loader
11+ end
12+
13+ private attr_reader :file_loader
14+
15+ def load ( filepath )
16+ contents = file_loader . load ( filepath )
1117 self . for ( contents , filepath :)
1218 end
1319
14- def self . for ( value , filepath : nil , context : value )
20+ def for ( value , filepath : nil , context : value )
1521 case value
1622 when ::Hash
17- resolver = Hash . new ( value , context :, filepath :)
23+ resolver = Hash . new ( value , context :, filepath :, ref_resolver : self )
1824 if value . key? ( '$ref' )
1925 probe = resolver . resolve_ref ( value [ '$ref' ] )
2026 return probe if probe . is_a? ( Array )
2127 end
2228 resolver
2329 when ::Array
24- Array . new ( value , context :, filepath :)
30+ Array . new ( value , context :, filepath :, ref_resolver : self )
2531 when ::NilClass
2632 nil
2733 else
28- Simple . new ( value )
34+ Simple . new ( value , ref_resolver : self )
2935 end
3036 end
3137
38+ def file_at ( filepath , file_pointer )
39+ file_contents = file_loader . load ( filepath )
40+ value = Hana ::Pointer . new ( file_pointer ) . eval ( file_contents )
41+ self . for ( value , filepath : filepath , context : file_contents )
42+ end
43+
3244 # @visibility private
3345 module Diggable
3446 def dig ( *keys )
@@ -42,10 +54,11 @@ def dig(*keys)
4254
4355 # @visibility private
4456 module Resolvable
45- def initialize ( value , context : value , filepath : nil )
57+ def initialize ( value , ref_resolver : , context : value , filepath : nil )
4658 @value = value
4759 @context = context
4860 @filepath = filepath
61+ @ref_resolver = ref_resolver
4962 @dir = if filepath
5063 File . dirname ( File . absolute_path ( filepath ) )
5164 else
@@ -62,6 +75,8 @@ def initialize(value, context: value, filepath: nil)
6275
6376 attr_reader :filepath
6477
78+ private attr_reader :ref_resolver
79+
6580 def ==( _other )
6681 raise "Don't call == on an unresolved value. Use .value == other instead."
6782 end
@@ -71,16 +86,14 @@ def resolve_ref(pointer)
7186 value = Hana ::Pointer . new ( pointer [ 1 ..] ) . eval ( context )
7287 raise "Unknown reference #{ pointer } in #{ context } " unless value
7388
74- return RefResolver . for ( value , filepath :, context :)
89+ return ref_resolver . for ( value , filepath :, context :)
7590 end
7691
7792 relative_path , file_pointer = pointer . split ( '#' )
7893 full_path = File . expand_path ( relative_path , dir )
79- return RefResolver . load ( full_path ) unless file_pointer
94+ return ref_resolver . load ( full_path ) unless file_pointer
8095
81- file_contents = FileLoader . load ( full_path )
82- value = Hana ::Pointer . new ( file_pointer ) . eval ( file_contents )
83- RefResolver . for ( value , filepath : full_path , context : file_contents )
96+ ref_resolver . file_at ( full_path , file_pointer )
8497 rescue OpenapiFirst ::FileNotFoundError => e
8598 message = "Problem with reference resolving #{ pointer . inspect } in " \
8699 "file #{ File . absolute_path ( filepath ) . inspect } : #{ e . message } "
@@ -114,13 +127,13 @@ def resolved
114127 def []( key )
115128 return resolve_ref ( @value [ '$ref' ] ) [ key ] if !@value . key? ( key ) && @value . key? ( '$ref' )
116129
117- RefResolver . for ( @value [ key ] , filepath :, context :)
130+ ref_resolver . for ( @value [ key ] , filepath :, context :)
118131 end
119132
120133 def fetch ( key )
121134 return resolve_ref ( @value [ '$ref' ] ) . fetch ( key ) if !@value . key? ( key ) && @value . key? ( '$ref' )
122135
123- RefResolver . for ( @value . fetch ( key ) , filepath :, context :)
136+ ref_resolver . for ( @value . fetch ( key ) , filepath :, context :)
124137 end
125138
126139 def each
@@ -170,7 +183,7 @@ def [](index)
170183 item = @value [ index ]
171184 return resolve_ref ( item [ '$ref' ] ) if item . is_a? ( ::Hash ) && item . key? ( '$ref' )
172185
173- RefResolver . for ( item , filepath :, context :)
186+ ref_resolver . for ( item , filepath :, context :)
174187 end
175188
176189 def each
0 commit comments