Class: Apress::Documentation::Storage::DependencyGraph

Inherits:
Object
  • Object
show all
Includes:
Singleton
Defined in:
lib/apress/documentation/storage/dependency_graph.rb

Overview

Private: Основное хранилище всех зависимостей между документами Инкапсулирует орентированный граф, вершины которого документы (Document или SwaggerDocument)

Instance Method Summary collapse

Instance Method Details

#add_dependency(document_from, document_to) ⇒ Object

Public: добавление связи между документами, создает ребро в графе, если оно не было создано

Arguments:

document_from - (Document) - документ от который зависит
document_to - (String or Document) - документ или его слаг(если документ еще не был создан)

Returns nothing



35
36
37
# File 'lib/apress/documentation/storage/dependency_graph.rb', line 35

def add_dependency(document_from, document_to)
  graph.add_edge(document_from, document_to) unless graph.has_edge?(document_from, document_to)
end

#add_document(document) ⇒ Object

Public: добавление документа

Arguments:

document - (String or Document) - документ или его слаг(если документ еще не был создан)

Note:

Данный метод позволяет ""лениво"" создавать документы в графе,
подменяя слаг документа, вставленного в граф до создания самого документа, на сам документ

Returns nothing



20
21
22
23
24
25
26
# File 'lib/apress/documentation/storage/dependency_graph.rb', line 20

def add_document(document)
  if graph.has_vertex?(document)
    graph.replace_vertex(document, document)
  else
    graph.add_vertex(document)
  end
end

#dependencies(contract, reverse:) ⇒ Object

Public: находит все зависимости для заданного документа

Arguments:

contract - (Document) - документ для которого определяем зависимости
reverse - (boolean) - флаг, различает тип определяемых зависимостей
  возможные значения
    - false (default) - документы, от которых зависит текущий документ (AKA зависимости contract)
    - true - документы, которые зависят от текущего (AKA потребители contract)

Returns Array of Pairs - [[doc_from, doc_to], [doc_from_other, doc_to_other]]



49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
# File 'lib/apress/documentation/storage/dependency_graph.rb', line 49

def dependencies(contract, reverse:)
  dep = []

  condition =
    if reverse
      lambda { |doc, _, to| doc == to }
    else
      lambda { |doc, from, _| doc == from }
    end

  graph.each_edge do |from, to|
    next unless condition.call(contract, from, to)

    dep << (reverse ? [to, from] : [from, to])
  end

  dep
end

#reset!Object

Public: очищает все текущие зависисмости

Returns nothing



84
85
86
# File 'lib/apress/documentation/storage/dependency_graph.rb', line 84

def reset!
  @graph = RGL::DirectedAdjacencyGraph.new
end

#validate!Object

Public: валидирует зависимости

Throws RuntimeError если найдена вершина неверного типа

Returns nothing



73
74
75
76
77
78
79
# File 'lib/apress/documentation/storage/dependency_graph.rb', line 73

def validate!
  graph.each_vertex do |v|
    unless v.is_a?(Apress::Documentation::Storage::BaseStorage)
      raise "Несуществующий документ - #{v}, объявлен в - #{dependencies(v, reverse: true).map(&:last)}"
    end
  end
end