Class: Rbdantic::JsonSchema::DefsRegistry

Inherits:
Object
  • Object
show all
Defined in:
lib/rbdantic/json_schema/defs_registry.rb

Overview

Registry for tracking model schemas during generation Used to implement $defs/$ref pattern for circular references

Instance Method Summary collapse

Constructor Details

#initializeDefsRegistry

Returns a new instance of DefsRegistry.



10
11
12
13
14
# File 'lib/rbdantic/json_schema/defs_registry.rb', line 10

def initialize
  @defs = {}
  @being_processed = Set.new  # Currently being processed (for cycle detection)
  @referenced = Set.new
end

Instance Method Details

#being_processed?(model_class) ⇒ Boolean

Check if a model is currently being processed (for cycle detection)

Parameters:

  • model_class (Class)

    the model class

Returns:



23
24
25
# File 'lib/rbdantic/json_schema/defs_registry.rb', line 23

def being_processed?(model_class)
  @being_processed.include?(model_class)
end

#clearObject

Clear the registry (for fresh generation)



72
73
74
75
76
# File 'lib/rbdantic/json_schema/defs_registry.rb', line 72

def clear
  @defs.clear
  @being_processed.clear
  @referenced.clear
end

#defs_hash(except: nil) ⇒ Hash?

Get the $defs hash for inclusion in top-level schema

Returns:

  • (Hash, nil)

    the defs hash or nil if empty



66
67
68
69
# File 'lib/rbdantic/json_schema/defs_registry.rb', line 66

def defs_hash(except: nil)
  defs = except ? @defs.reject { |key, _| key == key_for(except) } : @defs
  defs.empty? ? nil : defs
end

#key_for(model_class) ⇒ Object



16
17
18
# File 'lib/rbdantic/json_schema/defs_registry.rb', line 16

def key_for(model_class)
  model_class.name || "AnonymousModel_#{model_class.object_id}"
end

#mark_processing(model_class) ⇒ Object

Mark a model as being processed

Parameters:

  • model_class (Class)

    the model class



29
30
31
# File 'lib/rbdantic/json_schema/defs_registry.rb', line 29

def mark_processing(model_class)
  @being_processed.add(model_class)
end

#ref_for(model_class) ⇒ Hash

Generate a $ref for a registered model

Parameters:

  • model_class (Class)

    the model class

Returns:

  • (Hash)

    the $ref object



58
59
60
61
62
# File 'lib/rbdantic/json_schema/defs_registry.rb', line 58

def ref_for(model_class)
  key = key_for(model_class)
  @referenced.add(key)
  { "$ref" => "#/$defs/#{key}" }
end

#referenced?(model_class) ⇒ Boolean

Returns:



51
52
53
# File 'lib/rbdantic/json_schema/defs_registry.rb', line 51

def referenced?(model_class)
  @referenced.include?(key_for(model_class))
end

#register(model_class, schema) ⇒ String

Register a model's completed schema and return its key

Parameters:

  • model_class (Class)

    the model class

  • schema (Hash)

    the generated schema

Returns:

  • (String)

    the key used in $defs



37
38
39
40
41
42
# File 'lib/rbdantic/json_schema/defs_registry.rb', line 37

def register(model_class, schema)
  key = key_for(model_class)
  @defs[key] = schema
  @being_processed.delete(model_class)  # No longer being processed
  key
end

#registered?(model_class) ⇒ Boolean

Check if a model's schema is registered (completed)

Parameters:

  • model_class (Class)

    the model class

Returns:



47
48
49
# File 'lib/rbdantic/json_schema/defs_registry.rb', line 47

def registered?(model_class)
  @defs.key?(key_for(model_class))
end