Class: Apress::Documentation::Storage::DependencyGraph
- Inherits:
-
Object
- Object
- Apress::Documentation::Storage::DependencyGraph
- Includes:
- Singleton
- Defined in:
- lib/apress/documentation/storage/dependency_graph.rb
Overview
Private: Основное хранилище всех зависимостей между документами Инкапсулирует орентированный граф, вершины которого документы (Document или SwaggerDocument)
Instance Method Summary collapse
-
#add_dependency(document_from, document_to) ⇒ Object
Public: добавление связи между документами, создает ребро в графе, если оно не было создано.
-
#add_document(document) ⇒ Object
Public: добавление документа.
-
#dependencies(contract, reverse:) ⇒ Object
Public: находит все зависимости для заданного документа.
-
#reset! ⇒ Object
Public: очищает все текущие зависисмости.
-
#validate! ⇒ Object
Public: валидирует зависимости.
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 |