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 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