hierarchical_graph 1.0.2 → 1.1.0
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/lib/hierarchical_graph.rb +20 -0
- data/lib/hierarchical_graph/node.rb +6 -2
- data/lib/hierarchical_graph/version.rb +1 -1
- data/spec/hierarchical_graph_spec.rb +72 -0
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: b06e425f1dbfef479fc43a6c77574d7f39eea429e6b7c2f772cab22fa9a6c0b8
|
4
|
+
data.tar.gz: 7c7a7b5c3ac89569b47f6c2acf4a40a95da52ea0d397c668fb369c15be0f0c60
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 2d4dafcb3372f016ce1e6b79ec3b6a5346d410d54fa156d2c66bae8f7c33963c51d64ced1591e7e1755ad699da7e62c36556b907c5cdf831b2b3d60df965932d
|
7
|
+
data.tar.gz: 6a5d195ef7d30f9885734a5d156ef742a457e911d7d5a7e8edf7584d01cee192b44533af5043ad4e153255316975bf2b028a241716c8a682bc2a7397f319cae5
|
data/lib/hierarchical_graph.rb
CHANGED
@@ -102,6 +102,26 @@ class HierarchicalGraph
|
|
102
102
|
end.uniq(&:id)
|
103
103
|
end
|
104
104
|
|
105
|
+
def subgraph_of(ids)
|
106
|
+
ids.each { |id| validate_present! id }
|
107
|
+
|
108
|
+
HierarchicalGraph.new.tap do |subgraph|
|
109
|
+
ids.each do |id|
|
110
|
+
subgraph.add_node id, nodes[id].data
|
111
|
+
end
|
112
|
+
|
113
|
+
subgraph.each do |node|
|
114
|
+
children_of(node.id).each do |child|
|
115
|
+
subgraph.add_relation parent_id: node.id, child_id: child.id unless subgraph[child.id].nil?
|
116
|
+
end
|
117
|
+
end
|
118
|
+
end
|
119
|
+
end
|
120
|
+
|
121
|
+
def descendants_subgraph_from(id)
|
122
|
+
subgraph_of [id] + descendants_of(id).map(&:id)
|
123
|
+
end
|
124
|
+
|
105
125
|
def to_s
|
106
126
|
"<#{self.class.name} nodes:[#{map(&:to_s).join(', ')}]>"
|
107
127
|
end
|
@@ -17,6 +17,10 @@ class HierarchicalGraph
|
|
17
17
|
data[key] = value
|
18
18
|
end
|
19
19
|
|
20
|
+
def root?
|
21
|
+
parents.empty?
|
22
|
+
end
|
23
|
+
|
20
24
|
def parents
|
21
25
|
graph.parents_of id
|
22
26
|
end
|
@@ -33,8 +37,8 @@ class HierarchicalGraph
|
|
33
37
|
graph.descendants_of id
|
34
38
|
end
|
35
39
|
|
36
|
-
def
|
37
|
-
|
40
|
+
def descendants_subgraph
|
41
|
+
graph.descendants_subgraph_from id
|
38
42
|
end
|
39
43
|
|
40
44
|
def to_s
|
@@ -253,6 +253,68 @@ describe HierarchicalGraph do
|
|
253
253
|
graph.to_s.must_equal '<HierarchicalGraph nodes:[<HierarchicalGraph::Node 1 parents:[] children:[2]>, <HierarchicalGraph::Node 2 parents:[1] children:[]>]>'
|
254
254
|
end
|
255
255
|
|
256
|
+
it 'Subgraph' do
|
257
|
+
graph = HierarchicalGraph.new
|
258
|
+
graph.add_node 1
|
259
|
+
graph.add_node 2
|
260
|
+
graph.add_node 3
|
261
|
+
graph.add_node 4
|
262
|
+
graph.add_node 5
|
263
|
+
graph.add_node 6
|
264
|
+
graph.add_relation parent_id: 1, child_id: 2
|
265
|
+
graph.add_relation parent_id: 1, child_id: 3
|
266
|
+
graph.add_relation parent_id: 2, child_id: 4
|
267
|
+
graph.add_relation parent_id: 3, child_id: 4
|
268
|
+
graph.add_relation parent_id: 3, child_id: 5
|
269
|
+
graph.add_relation parent_id: 4, child_id: 5
|
270
|
+
graph.add_relation parent_id: 5, child_id: 6
|
271
|
+
|
272
|
+
subgraph = graph.subgraph_of [3, 4, 5]
|
273
|
+
|
274
|
+
subgraph.map(&:id).must_equal [3, 4, 5]
|
275
|
+
|
276
|
+
subgraph[3].parents.must_be_empty
|
277
|
+
subgraph[3].children.map(&:id).must_equal [4, 5]
|
278
|
+
|
279
|
+
subgraph[4].parents.map(&:id).must_equal [3]
|
280
|
+
subgraph[4].children.map(&:id).must_equal [5]
|
281
|
+
|
282
|
+
subgraph[5].parents.map(&:id).must_equal [3, 4]
|
283
|
+
subgraph[5].children.must_be_empty
|
284
|
+
end
|
285
|
+
|
286
|
+
it 'Descendants Subgraph' do
|
287
|
+
graph = HierarchicalGraph.new
|
288
|
+
graph.add_node 1
|
289
|
+
graph.add_node 2
|
290
|
+
graph.add_node 3
|
291
|
+
graph.add_node 4
|
292
|
+
graph.add_node 5
|
293
|
+
graph.add_node 6
|
294
|
+
graph.add_relation parent_id: 1, child_id: 2
|
295
|
+
graph.add_relation parent_id: 1, child_id: 3
|
296
|
+
graph.add_relation parent_id: 3, child_id: 4
|
297
|
+
graph.add_relation parent_id: 3, child_id: 5
|
298
|
+
graph.add_relation parent_id: 4, child_id: 5
|
299
|
+
graph.add_relation parent_id: 5, child_id: 6
|
300
|
+
|
301
|
+
subgraph = graph.descendants_subgraph_from 3
|
302
|
+
|
303
|
+
subgraph.map(&:id).must_equal [3, 4, 5, 6]
|
304
|
+
|
305
|
+
subgraph[3].parents.must_be_empty
|
306
|
+
subgraph[3].children.map(&:id).must_equal [4, 5]
|
307
|
+
|
308
|
+
subgraph[4].parents.map(&:id).must_equal [3]
|
309
|
+
subgraph[4].children.map(&:id).must_equal [5]
|
310
|
+
|
311
|
+
subgraph[5].parents.map(&:id).must_equal [3, 4]
|
312
|
+
subgraph[5].children.map(&:id).must_equal [6]
|
313
|
+
|
314
|
+
subgraph[6].parents.map(&:id).must_equal [5]
|
315
|
+
subgraph[6].children.must_be_empty
|
316
|
+
end
|
317
|
+
|
256
318
|
describe 'Node' do
|
257
319
|
|
258
320
|
let :graph do
|
@@ -312,6 +374,16 @@ describe HierarchicalGraph do
|
|
312
374
|
graph[2][:code].must_equal 'node_2'
|
313
375
|
end
|
314
376
|
|
377
|
+
it 'Descendants Subgraph' do
|
378
|
+
node = graph[3]
|
379
|
+
subgraph = node.descendants_subgraph
|
380
|
+
|
381
|
+
subgraph.roots.map(&:id).must_equal [3]
|
382
|
+
subgraph[3].children.map(&:id).must_equal [4]
|
383
|
+
subgraph[4].children.map(&:id).must_equal [5]
|
384
|
+
subgraph[5].children.must_be_empty
|
385
|
+
end
|
386
|
+
|
315
387
|
end
|
316
388
|
|
317
389
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: hierarchical_graph
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.0
|
4
|
+
version: 1.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Gabriel Naiman
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2021-02-26 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rake
|