Class: Rage::OpenAPI::Parsers::Ext::Alba

Inherits:
Object
  • Object
show all
Defined in:
lib/rage/openapi/parsers/ext/alba.rb

Defined Under Namespace

Classes: Visitor, VisitorContext

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(namespace: Object, root: Rage::OpenAPI::Nodes::Root.new) ⇒ Alba

Returns a new instance of Alba.



6
7
8
9
10
# File 'lib/rage/openapi/parsers/ext/alba.rb', line 6

def initialize(namespace: Object, root: Rage::OpenAPI::Nodes::Root.new, **)
  @namespace = namespace
  @root = root
  @parsing_stack = Set.new
end

Instance Attribute Details

#namespaceObject (readonly)

Returns the value of attribute namespace.



4
5
6
# File 'lib/rage/openapi/parsers/ext/alba.rb', line 4

def namespace
  @namespace
end

Instance Method Details

#__parse(klass_str) ⇒ Object



46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
# File 'lib/rage/openapi/parsers/ext/alba.rb', line 46

def __parse(klass_str)
  is_collection, klass_str = Rage::OpenAPI.__try_parse_collection(klass_str)

  # return an empty visitor if we're already parsing this class;
  # this serves as a recursion guard, specifically for the inheritance logic in `Visitor#visit_class_node`
  if @parsing_stack.include?(klass_str)
    return Visitor.new(self, is_collection)
  end
  @parsing_stack.add(klass_str)

  klass = @namespace.const_get(klass_str)
  source_path, _ = Object.const_source_location(klass.name)
  ast = Prism.parse_file(source_path)

  visitor = Visitor.new(self, is_collection)
  ast.value.accept(visitor)

  @parsing_stack.delete(klass_str)

  visitor
end

#__parse_nested(klass_str) ⇒ Object



32
33
34
35
36
37
38
39
40
41
42
43
44
# File 'lib/rage/openapi/parsers/ext/alba.rb', line 32

def __parse_nested(klass_str)
  is_collection, raw_klass_str = Rage::OpenAPI.__try_parse_collection(klass_str)

  if @parsing_stack.include?(raw_klass_str)
    @root.schema_registry[raw_klass_str] ||= nil
    ref = { "$ref" => "#/components/schemas/#{raw_klass_str}" }
    return is_collection ? { "type" => "array", "items" => ref } : ref
  end

  __parse(klass_str).tap { |visitor|
    visitor.root_key = visitor.root_key_for_collection = visitor.root_key_proc = visitor.key_transformer = nil
  }.build_schema
end

#known_definition?(str) ⇒ Boolean

Returns:

  • (Boolean)


12
13
14
15
16
17
# File 'lib/rage/openapi/parsers/ext/alba.rb', line 12

def known_definition?(str)
  _, str = Rage::OpenAPI.__try_parse_collection(str)
  defined?(Alba::Resource) && @namespace.const_get(str).ancestors.include?(Alba::Resource)
rescue NameError
  false
end

#parse(klass_str) ⇒ Object



19
20
21
22
23
24
25
26
27
28
29
30
# File 'lib/rage/openapi/parsers/ext/alba.rb', line 19

def parse(klass_str)
  _, raw_klass_str = Rage::OpenAPI.__try_parse_collection(klass_str)
  visitor = __parse(klass_str)

  if @root.schema_registry.key?(raw_klass_str)
    clean = { "type" => "object" }
    clean["properties"] = visitor.schema if visitor.schema.any?
    @root.schema_registry[raw_klass_str] = clean
  end

  visitor.build_schema
end