dependz 0.0.1 → 0.1.0

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: 2d5f3e96944577b4d8351f07bcc7c211512882b86eed15fc6bf8a002fc51e101
4
- data.tar.gz: d5abc3939a18b2e432ff644060d6f99ef325c8b08e34675ebfb057e0b323beb5
3
+ metadata.gz: ba1ff616b07b924ecd59632333c81870cd3fce36f47298518680c3dd02c7813a
4
+ data.tar.gz: ab5a62a85de8b63999037543f34ffb19530d45e36294ac7a1c9630ffb7de4bf9
5
5
  SHA512:
6
- metadata.gz: 2ef84921a4dfe830971bf9c1808306bba3ef59d142a2f39e689ad0985fe0ae1f8a8ed8254b158f051fa7fc73a50da5a7d82002c2203e3679357a91d028af04ef
7
- data.tar.gz: 56a02358759536311fd169792fc5e1533d58a0bd97c6899508c24f17feb832a5447746d0b0a7b52a558996bc638066ae2f4089b0cc0f9d4b419661a878086402
6
+ metadata.gz: 1373b544c115690a4d486fa36ec8f589721c972e27c4fc9a1a82e152be93b2a642b6409c753db05a38ba97f83b4c346c7ab6b75869196d715a8c29cc1b51a69f
7
+ data.tar.gz: 7a9595047c8a975b60acbfed1f780f6c889b6132cbd9b8dea466a5484b422e657f14e39e58fd9698be2f237cff6f84366f1d5034bdd6899cfdb7e44a63a4051f
@@ -3,25 +3,18 @@
3
3
  require 'rgl/adjacency'
4
4
  require 'rgl/topsort'
5
5
 
6
- class Dependz
7
- class CircularDependenceError < StandardError; end
8
-
9
- def initialize
10
- @dag = RGL::DirectedAdjacencyGraph.new
11
- end
12
-
13
- def add(depends_by:, depends_on:)
14
- new_dag = @dag.dup
15
- new_dag.add_edge(depends_by, depends_on)
16
-
17
- raise CircularDependenceError unless new_dag.cycles.empty?
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
@@ -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
@@ -0,0 +1,11 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Dependz
4
+ module Base
5
+ attr_reader :dag
6
+
7
+ def initialize
8
+ @dag = RGL::DirectedAdjacencyGraph.new
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,14 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Dependz
4
+ module List
5
+ def list
6
+ dag.edges.map do |edge|
7
+ {
8
+ depend_by: edge.to_a[0],
9
+ depend_on: edge.to_a[1]
10
+ }
11
+ end
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,9 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Dependz
4
+ module SortItem
5
+ def sort_item
6
+ dag.topsort_iterator.to_a.reverse
7
+ end
8
+ end
9
+ end
@@ -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.1
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: Store dependencies in a graph struct, and sort them in topological order.
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