dependz 0.0.1 → 0.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/dependz.rb +13 -20
- data/lib/dependz/add.rb +33 -0
- data/lib/dependz/base.rb +11 -0
- data/lib/dependz/list.rb +14 -0
- data/lib/dependz/sort_item.rb +9 -0
- data/lib/dependz/sort_level.rb +54 -0
- metadata +7 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: ba1ff616b07b924ecd59632333c81870cd3fce36f47298518680c3dd02c7813a
|
4
|
+
data.tar.gz: ab5a62a85de8b63999037543f34ffb19530d45e36294ac7a1c9630ffb7de4bf9
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 1373b544c115690a4d486fa36ec8f589721c972e27c4fc9a1a82e152be93b2a642b6409c753db05a38ba97f83b4c346c7ab6b75869196d715a8c29cc1b51a69f
|
7
|
+
data.tar.gz: 7a9595047c8a975b60acbfed1f780f6c889b6132cbd9b8dea466a5484b422e657f14e39e58fd9698be2f237cff6f84366f1d5034bdd6899cfdb7e44a63a4051f
|
data/lib/dependz.rb
CHANGED
@@ -3,25 +3,18 @@
|
|
3
3
|
require 'rgl/adjacency'
|
4
4
|
require 'rgl/topsort'
|
5
5
|
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
@dag = new_dag
|
20
|
-
|
21
|
-
self
|
22
|
-
end
|
23
|
-
|
24
|
-
def sort
|
25
|
-
@dag.topsort_iterator.to_a.reverse
|
6
|
+
require 'dependz/add'
|
7
|
+
require 'dependz/base'
|
8
|
+
require 'dependz/sort_item'
|
9
|
+
require 'dependz/list'
|
10
|
+
require 'dependz/sort_level'
|
11
|
+
|
12
|
+
module Dependz
|
13
|
+
class Client
|
14
|
+
include Base
|
15
|
+
include Add
|
16
|
+
include SortItem
|
17
|
+
include List
|
18
|
+
include SortLevel
|
26
19
|
end
|
27
20
|
end
|
data/lib/dependz/add.rb
ADDED
@@ -0,0 +1,33 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Dependz
|
4
|
+
class CircularDependenceError < StandardError; end
|
5
|
+
|
6
|
+
module Add
|
7
|
+
def add(depend_by:, depend_on:)
|
8
|
+
forms = depend_by.is_a?(Array) ? depend_by : [depend_by]
|
9
|
+
tos = depend_on.is_a?(Array) ? depend_on : [depend_on]
|
10
|
+
|
11
|
+
forms.each do |from|
|
12
|
+
tos.each do |to|
|
13
|
+
add_dependency(from, to)
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
self
|
18
|
+
end
|
19
|
+
|
20
|
+
private
|
21
|
+
|
22
|
+
def add_dependency(from, to)
|
23
|
+
new_dag = @dag.dup
|
24
|
+
new_dag.add_edge(from, to)
|
25
|
+
|
26
|
+
raise CircularDependenceError unless new_dag.cycles.empty?
|
27
|
+
|
28
|
+
@dag = new_dag
|
29
|
+
|
30
|
+
self
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
data/lib/dependz/base.rb
ADDED
data/lib/dependz/list.rb
ADDED
@@ -0,0 +1,54 @@
|
|
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
|
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.0
|
4
|
+
version: 0.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Rundong Gao
|
@@ -24,14 +24,18 @@ dependencies:
|
|
24
24
|
- - "~>"
|
25
25
|
- !ruby/object:Gem::Version
|
26
26
|
version: '0.5'
|
27
|
-
description:
|
28
|
-
No dpends_by will come be before it's depends_on.
|
27
|
+
description: Topoligical sorting for dependent relations
|
29
28
|
email: asphinx423@gmail.com
|
30
29
|
executables: []
|
31
30
|
extensions: []
|
32
31
|
extra_rdoc_files: []
|
33
32
|
files:
|
34
33
|
- lib/dependz.rb
|
34
|
+
- lib/dependz/add.rb
|
35
|
+
- lib/dependz/base.rb
|
36
|
+
- lib/dependz/list.rb
|
37
|
+
- lib/dependz/sort_item.rb
|
38
|
+
- lib/dependz/sort_level.rb
|
35
39
|
homepage: https://github.com/RundongGao/depends
|
36
40
|
licenses:
|
37
41
|
- MIT
|