mementus 0.2.0 → 0.2.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.travis.yml +6 -7
- data/lib/mementus/breadth_first_search.rb +28 -0
- data/lib/mementus/depth_first_search.rb +25 -0
- data/lib/mementus/node_proxy.rb +26 -0
- data/lib/mementus/version.rb +1 -1
- data/lib/mementus.rb +3 -0
- data/spec/node_proxy_spec.rb +15 -0
- data/spec/traversal_spec.rb +39 -0
- metadata +8 -1
    
        checksums.yaml
    CHANGED
    
    | @@ -1,7 +1,7 @@ | |
| 1 1 | 
             
            ---
         | 
| 2 2 | 
             
            SHA1:
         | 
| 3 | 
            -
              metadata.gz:  | 
| 4 | 
            -
              data.tar.gz:  | 
| 3 | 
            +
              metadata.gz: a4a89d482eebdd901269f7a93501a22883a3b084
         | 
| 4 | 
            +
              data.tar.gz: 571323b9865fb729fc2a8b63e70d727a5108a90f
         | 
| 5 5 | 
             
            SHA512:
         | 
| 6 | 
            -
              metadata.gz:  | 
| 7 | 
            -
              data.tar.gz:  | 
| 6 | 
            +
              metadata.gz: 8182797b06e55efe935305ec6067007ae569adbf90ceac25aaf2b990a74495bf64597efd023f24be7d8f6e5ce8bfb59b77da8de666454a7f3f5fdb018c49c42d
         | 
| 7 | 
            +
              data.tar.gz: 9151ad44dbcc2570de6e58d60e5e967de8c4ce1ae9441795a63f37ae8bac8ca64cbf1596a15d5a277635fd15b135ae08f3596e4253c5297dcedc63e502bec6da
         | 
    
        data/.travis.yml
    CHANGED
    
    
| @@ -0,0 +1,28 @@ | |
| 1 | 
            +
            module Mementus
         | 
| 2 | 
            +
              class BreadthFirstSearch
         | 
| 3 | 
            +
                def initialize(graph, start)
         | 
| 4 | 
            +
                  @graph = graph
         | 
| 5 | 
            +
                  @start = start
         | 
| 6 | 
            +
                  @visited = { @start => true }
         | 
| 7 | 
            +
                  @queue = []
         | 
| 8 | 
            +
                end
         | 
| 9 | 
            +
             | 
| 10 | 
            +
                def each(&block)
         | 
| 11 | 
            +
                  visit(NodeProxy.new(@start, graph), &block)
         | 
| 12 | 
            +
                end
         | 
| 13 | 
            +
             | 
| 14 | 
            +
                private
         | 
| 15 | 
            +
             | 
| 16 | 
            +
                def visit(node, &block)
         | 
| 17 | 
            +
                  @queue << node.adjacent
         | 
| 18 | 
            +
             | 
| 19 | 
            +
                  while next_node = @queue.shift
         | 
| 20 | 
            +
                    next if @visited[next_node]
         | 
| 21 | 
            +
             | 
| 22 | 
            +
                    @visited[next_node] = true
         | 
| 23 | 
            +
                    block.call(next_node)
         | 
| 24 | 
            +
                    @queue << next_node.adjacent
         | 
| 25 | 
            +
                  end
         | 
| 26 | 
            +
                end
         | 
| 27 | 
            +
              end
         | 
| 28 | 
            +
            end
         | 
| @@ -0,0 +1,25 @@ | |
| 1 | 
            +
            module Mementus
         | 
| 2 | 
            +
              class DepthFirstSearch
         | 
| 3 | 
            +
                def initialize(graph, start)
         | 
| 4 | 
            +
                  @graph = graph
         | 
| 5 | 
            +
                  @start = start
         | 
| 6 | 
            +
                  @visited = { @start => true }
         | 
| 7 | 
            +
                end
         | 
| 8 | 
            +
             | 
| 9 | 
            +
                def each(&block)
         | 
| 10 | 
            +
                  visit(NodeProxy.new(@start, @graph), &block)
         | 
| 11 | 
            +
                end
         | 
| 12 | 
            +
             | 
| 13 | 
            +
                private
         | 
| 14 | 
            +
             | 
| 15 | 
            +
                def visit(node, &block)
         | 
| 16 | 
            +
                  node.each_adjacent do |adjacent|
         | 
| 17 | 
            +
                    next if @visited[adjacent]
         | 
| 18 | 
            +
             | 
| 19 | 
            +
                    @visited[adjacent] = true
         | 
| 20 | 
            +
                    block.call(adjacent)
         | 
| 21 | 
            +
                    visit(NodeProxy.new(adjacent, @graph), &block)
         | 
| 22 | 
            +
                  end
         | 
| 23 | 
            +
                end
         | 
| 24 | 
            +
              end
         | 
| 25 | 
            +
            end
         | 
| @@ -0,0 +1,26 @@ | |
| 1 | 
            +
            module Mementus
         | 
| 2 | 
            +
              class NodeProxy
         | 
| 3 | 
            +
                def initialize(node, graph)
         | 
| 4 | 
            +
                  @node = node
         | 
| 5 | 
            +
                  @graph = graph
         | 
| 6 | 
            +
                end
         | 
| 7 | 
            +
             | 
| 8 | 
            +
                def id
         | 
| 9 | 
            +
                  @node.id
         | 
| 10 | 
            +
                end
         | 
| 11 | 
            +
             | 
| 12 | 
            +
                def label
         | 
| 13 | 
            +
                  @node.label
         | 
| 14 | 
            +
                end
         | 
| 15 | 
            +
             | 
| 16 | 
            +
                def each_adjacent(&block)
         | 
| 17 | 
            +
                  @graph.each_adjacent(@node, &block)
         | 
| 18 | 
            +
                end
         | 
| 19 | 
            +
             | 
| 20 | 
            +
                def adjacent
         | 
| 21 | 
            +
                  each_adjacent.to_a.map do |node|
         | 
| 22 | 
            +
                    self.class.new(node, @graph)
         | 
| 23 | 
            +
                  end
         | 
| 24 | 
            +
                end
         | 
| 25 | 
            +
              end
         | 
| 26 | 
            +
            end
         | 
    
        data/lib/mementus/version.rb
    CHANGED
    
    
    
        data/lib/mementus.rb
    CHANGED
    
    
| @@ -0,0 +1,15 @@ | |
| 1 | 
            +
            require 'spec_helper'
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            describe Mementus::NodeProxy do
         | 
| 4 | 
            +
              specify '#new' do
         | 
| 5 | 
            +
                graph = Mementus::Graph.new
         | 
| 6 | 
            +
                node1 = Mementus::Node.new(1, :node)
         | 
| 7 | 
            +
                node2 = Mementus::Node.new(2, :node)
         | 
| 8 | 
            +
                node3 = Mementus::Node.new(3, :node)
         | 
| 9 | 
            +
                graph.add_edge(Mementus::Edge.new(node1, node2))
         | 
| 10 | 
            +
                graph.add_edge(Mementus::Edge.new(node1, node3))
         | 
| 11 | 
            +
             | 
| 12 | 
            +
                node_proxy = Mementus::NodeProxy.new(node1, graph)
         | 
| 13 | 
            +
                expect(node_proxy.adjacent.map { |node| node.id}).to eq([node2.id, node3.id])
         | 
| 14 | 
            +
              end
         | 
| 15 | 
            +
            end
         | 
| @@ -0,0 +1,39 @@ | |
| 1 | 
            +
            require 'spec_helper'
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            describe 'Basic graph traversals' do
         | 
| 4 | 
            +
              let(:start) do
         | 
| 5 | 
            +
                Mementus::Node.new(1, :node)
         | 
| 6 | 
            +
              end
         | 
| 7 | 
            +
             | 
| 8 | 
            +
              let(:graph) do
         | 
| 9 | 
            +
                graph = Mementus::Graph.new
         | 
| 10 | 
            +
                graph.add_edge(Mementus::Edge.new(start, Mementus::Node.new(2, :node)))
         | 
| 11 | 
            +
                graph.add_edge(Mementus::Edge.new(Mementus::Node.new(2, :node), Mementus::Node.new(3, :node)))
         | 
| 12 | 
            +
                graph.add_edge(Mementus::Edge.new(Mementus::Node.new(2, :node), Mementus::Node.new(5, :node)))
         | 
| 13 | 
            +
                graph.add_edge(Mementus::Edge.new(Mementus::Node.new(1, :node), Mementus::Node.new(6, :node)))
         | 
| 14 | 
            +
                graph.add_edge(Mementus::Edge.new(Mementus::Node.new(2, :node), Mementus::Node.new(7, :node)))
         | 
| 15 | 
            +
                graph.add_edge(Mementus::Edge.new(Mementus::Node.new(7, :node), Mementus::Node.new(8, :node)))
         | 
| 16 | 
            +
                graph.add_edge(Mementus::Edge.new(Mementus::Node.new(5, :node), Mementus::Node.new(9, :node)))
         | 
| 17 | 
            +
                graph
         | 
| 18 | 
            +
              end
         | 
| 19 | 
            +
             | 
| 20 | 
            +
              specify 'DepthFirstSearch#each' do
         | 
| 21 | 
            +
                traversal = Mementus::DepthFirstSearch.new(graph, start)
         | 
| 22 | 
            +
             | 
| 23 | 
            +
                expected = [1,2,3,5,9,7,8,6]
         | 
| 24 | 
            +
                index = 0
         | 
| 25 | 
            +
                traversal.each do |node|
         | 
| 26 | 
            +
                  expect(node.id).to eq(expected[index + 1])
         | 
| 27 | 
            +
                end
         | 
| 28 | 
            +
              end
         | 
| 29 | 
            +
             | 
| 30 | 
            +
              specify 'BreadthFirstSearch#each' do
         | 
| 31 | 
            +
                traversal = Mementus::DepthFirstSearch.new(graph, start)
         | 
| 32 | 
            +
             | 
| 33 | 
            +
                expected = [1,2,6,3,5,7,9,8]
         | 
| 34 | 
            +
                index = 0
         | 
| 35 | 
            +
                traversal.each do |node|
         | 
| 36 | 
            +
                  expect(node.id).to eq(expected[index + 1])
         | 
| 37 | 
            +
                end
         | 
| 38 | 
            +
              end
         | 
| 39 | 
            +
            end
         | 
    
        metadata
    CHANGED
    
    | @@ -1,7 +1,7 @@ | |
| 1 1 | 
             
            --- !ruby/object:Gem::Specification
         | 
| 2 2 | 
             
            name: mementus
         | 
| 3 3 | 
             
            version: !ruby/object:Gem::Version
         | 
| 4 | 
            -
              version: 0.2. | 
| 4 | 
            +
              version: 0.2.1
         | 
| 5 5 | 
             
            platform: ruby
         | 
| 6 6 | 
             
            authors:
         | 
| 7 7 | 
             
            - maetl
         | 
| @@ -67,15 +67,20 @@ files: | |
| 67 67 | 
             
            - Rakefile
         | 
| 68 68 | 
             
            - lib/mementus.rb
         | 
| 69 69 | 
             
            - lib/mementus/adapter.rb
         | 
| 70 | 
            +
            - lib/mementus/breadth_first_search.rb
         | 
| 71 | 
            +
            - lib/mementus/depth_first_search.rb
         | 
| 70 72 | 
             
            - lib/mementus/edge.rb
         | 
| 71 73 | 
             
            - lib/mementus/graph.rb
         | 
| 72 74 | 
             
            - lib/mementus/model.rb
         | 
| 73 75 | 
             
            - lib/mementus/node.rb
         | 
| 76 | 
            +
            - lib/mementus/node_proxy.rb
         | 
| 74 77 | 
             
            - lib/mementus/relation.rb
         | 
| 75 78 | 
             
            - lib/mementus/version.rb
         | 
| 76 79 | 
             
            - mementus.gemspec
         | 
| 77 80 | 
             
            - spec/graph_spec.rb
         | 
| 81 | 
            +
            - spec/node_proxy_spec.rb
         | 
| 78 82 | 
             
            - spec/spec_helper.rb
         | 
| 83 | 
            +
            - spec/traversal_spec.rb
         | 
| 79 84 | 
             
            homepage: https://github.com/maetl/mementus
         | 
| 80 85 | 
             
            licenses:
         | 
| 81 86 | 
             
            - MIT
         | 
| @@ -102,5 +107,7 @@ specification_version: 4 | |
| 102 107 | 
             
            summary: In-memory data model
         | 
| 103 108 | 
             
            test_files:
         | 
| 104 109 | 
             
            - spec/graph_spec.rb
         | 
| 110 | 
            +
            - spec/node_proxy_spec.rb
         | 
| 105 111 | 
             
            - spec/spec_helper.rb
         | 
| 112 | 
            +
            - spec/traversal_spec.rb
         | 
| 106 113 | 
             
            has_rdoc: 
         |