dependz 0.1.0 → 0.1.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/dependz.rb +2 -2
- data/lib/dependz/sort_depth.rb +60 -0
- metadata +4 -3
- data/lib/dependz/sort_level.rb +0 -54
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: e21b5e4e8fdca0c6c7fa61925190624b2a1525cd91a98b51f24bc8fb01d21802
|
4
|
+
data.tar.gz: 56e0f76d74df8e7fea3fa77a8b581f5031efe9df235a32a28139f12246768566
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 9f13e19f30b940a67c2b55c338be23e687ea1bb12bc3cf1120ae8cc1eda38f74ed2daefc517c1295483599b45afe978c89fb6e412fdf4b41fdef0010d5f06a18
|
7
|
+
data.tar.gz: 1f7829d9f1c088e851e1ba25504265d6dec134ee61fade400d4173b14875292e80620489ae9202395901f5b9ebf6d6cec8a323add784fad0ed4d9c7769ffe3f2
|
data/lib/dependz.rb
CHANGED
@@ -7,7 +7,7 @@ require 'dependz/add'
|
|
7
7
|
require 'dependz/base'
|
8
8
|
require 'dependz/sort_item'
|
9
9
|
require 'dependz/list'
|
10
|
-
require 'dependz/
|
10
|
+
require 'dependz/sort_depth'
|
11
11
|
|
12
12
|
module Dependz
|
13
13
|
class Client
|
@@ -15,6 +15,6 @@ module Dependz
|
|
15
15
|
include Add
|
16
16
|
include SortItem
|
17
17
|
include List
|
18
|
-
include
|
18
|
+
include SortDepth
|
19
19
|
end
|
20
20
|
end
|
@@ -0,0 +1,60 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'rgl/traversal'
|
4
|
+
|
5
|
+
module Dependz
|
6
|
+
module SortDepth
|
7
|
+
def sort_depth
|
8
|
+
depth_of_all_item = roots
|
9
|
+
.map { |root| calculate_depth_from_root(dag, root) }
|
10
|
+
.reduce { |acc, depths| acc.merge(depths) { |_key, a, b| [a, b].max } }
|
11
|
+
|
12
|
+
format(depth_of_all_item)
|
13
|
+
end
|
14
|
+
|
15
|
+
private
|
16
|
+
|
17
|
+
def format(depth_mapping)
|
18
|
+
depth_mapping.each_with_object([]) do |item_depth, result|
|
19
|
+
item = item_depth[0]
|
20
|
+
depth = item_depth[1] - 1
|
21
|
+
|
22
|
+
if result[depth].nil?
|
23
|
+
result[depth] = [item]
|
24
|
+
else
|
25
|
+
result[depth].push(item)
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
def calculate_depth_from_root(dag, root)
|
31
|
+
@depth = 0
|
32
|
+
@depth_map = {}
|
33
|
+
|
34
|
+
visitor = dfs_visitor(dag)
|
35
|
+
dag.reverse.depth_first_visit(root, visitor) { |x| }
|
36
|
+
|
37
|
+
@depth_map
|
38
|
+
end
|
39
|
+
|
40
|
+
def dfs_visitor(dag)
|
41
|
+
RGL::DFSVisitor.new(dag.reverse).tap do |visitor|
|
42
|
+
visitor.set_examine_vertex_event_handler do |v|
|
43
|
+
@depth += 1
|
44
|
+
@depth_map[v] = @depth
|
45
|
+
end
|
46
|
+
|
47
|
+
visitor.set_finish_vertex_event_handler do |_v|
|
48
|
+
@depth -= 1
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
def roots
|
54
|
+
depend_ons = list.map { |d| d[:depend_on] }.uniq
|
55
|
+
depend_bys = list.map { |d| d[:depend_by] }.uniq
|
56
|
+
|
57
|
+
depend_ons.reject { |head| depend_bys.include?(head) }
|
58
|
+
end
|
59
|
+
end
|
60
|
+
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: dependz
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Rundong Gao
|
@@ -24,7 +24,8 @@ dependencies:
|
|
24
24
|
- - "~>"
|
25
25
|
- !ruby/object:Gem::Version
|
26
26
|
version: '0.5'
|
27
|
-
description:
|
27
|
+
description: A ruby gem for concurrent tasks scheduling and resolving dependencies
|
28
|
+
based on directed acyclic graphs and modified topological sorting algorithm.
|
28
29
|
email: asphinx423@gmail.com
|
29
30
|
executables: []
|
30
31
|
extensions: []
|
@@ -34,8 +35,8 @@ files:
|
|
34
35
|
- lib/dependz/add.rb
|
35
36
|
- lib/dependz/base.rb
|
36
37
|
- lib/dependz/list.rb
|
38
|
+
- lib/dependz/sort_depth.rb
|
37
39
|
- lib/dependz/sort_item.rb
|
38
|
-
- lib/dependz/sort_level.rb
|
39
40
|
homepage: https://github.com/RundongGao/depends
|
40
41
|
licenses:
|
41
42
|
- MIT
|
data/lib/dependz/sort_level.rb
DELETED
@@ -1,54 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
require 'rgl/traversal'
|
4
|
-
|
5
|
-
module Dependz
|
6
|
-
module SortLevel
|
7
|
-
def sort_level
|
8
|
-
@level_map = {}
|
9
|
-
|
10
|
-
roots(dag).each do |root|
|
11
|
-
@level = 0
|
12
|
-
visitor = dfs_visitor(dag)
|
13
|
-
dag.reverse.depth_first_visit(root, visitor) { |x| }
|
14
|
-
end
|
15
|
-
|
16
|
-
@level_map.each_with_object([]) do |item_with_level, result|
|
17
|
-
item = item_with_level[0]
|
18
|
-
level = item_with_level[1] - 1
|
19
|
-
|
20
|
-
if result[level].nil?
|
21
|
-
result[level] = [item]
|
22
|
-
else
|
23
|
-
result[level].push(item)
|
24
|
-
end
|
25
|
-
end
|
26
|
-
end
|
27
|
-
|
28
|
-
private
|
29
|
-
|
30
|
-
def dfs_visitor(dag)
|
31
|
-
RGL::DFSVisitor.new(dag.reverse).tap do |visitor|
|
32
|
-
visitor.set_examine_vertex_event_handler do |v|
|
33
|
-
@level += 1
|
34
|
-
if @level_map[v].nil?
|
35
|
-
@level_map[v] = @level
|
36
|
-
else
|
37
|
-
@level_map[v] = @level if @level_map[v] < @level
|
38
|
-
end
|
39
|
-
end
|
40
|
-
|
41
|
-
visitor.set_finish_vertex_event_handler do |_v|
|
42
|
-
@level -= 1
|
43
|
-
end
|
44
|
-
end
|
45
|
-
end
|
46
|
-
|
47
|
-
def roots(_dag)
|
48
|
-
depend_ons = list.map { |d| d[:depend_on] }.uniq
|
49
|
-
depend_bys = list.map { |d| d[:depend_by] }.uniq
|
50
|
-
|
51
|
-
depend_ons.reject { |head| depend_bys.include?(head) }
|
52
|
-
end
|
53
|
-
end
|
54
|
-
end
|