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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: ba1ff616b07b924ecd59632333c81870cd3fce36f47298518680c3dd02c7813a
4
- data.tar.gz: ab5a62a85de8b63999037543f34ffb19530d45e36294ac7a1c9630ffb7de4bf9
3
+ metadata.gz: e21b5e4e8fdca0c6c7fa61925190624b2a1525cd91a98b51f24bc8fb01d21802
4
+ data.tar.gz: 56e0f76d74df8e7fea3fa77a8b581f5031efe9df235a32a28139f12246768566
5
5
  SHA512:
6
- metadata.gz: 1373b544c115690a4d486fa36ec8f589721c972e27c4fc9a1a82e152be93b2a642b6409c753db05a38ba97f83b4c346c7ab6b75869196d715a8c29cc1b51a69f
7
- data.tar.gz: 7a9595047c8a975b60acbfed1f780f6c889b6132cbd9b8dea466a5484b422e657f14e39e58fd9698be2f237cff6f84366f1d5034bdd6899cfdb7e44a63a4051f
6
+ metadata.gz: 9f13e19f30b940a67c2b55c338be23e687ea1bb12bc3cf1120ae8cc1eda38f74ed2daefc517c1295483599b45afe978c89fb6e412fdf4b41fdef0010d5f06a18
7
+ data.tar.gz: 1f7829d9f1c088e851e1ba25504265d6dec134ee61fade400d4173b14875292e80620489ae9202395901f5b9ebf6d6cec8a323add784fad0ed4d9c7769ffe3f2
@@ -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/sort_level'
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 SortLevel
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.0
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: Topoligical sorting for dependent relations
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
@@ -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