usecasing 0.1.2 → 0.1.3
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.
- data/README.md +1 -4
- data/lib/usecasing/execution_order.rb +45 -1
- data/lib/usecasing/version.rb +1 -1
- data/lib/usecasing.rb +0 -1
- metadata +4 -5
- data/lib/usecasing/cyclic_finder.rb +0 -44
data/README.md
CHANGED
@@ -7,10 +7,7 @@
|
|
7
7
|
|
8
8
|
Add this line to your application's Gemfile:
|
9
9
|
|
10
|
-
|
11
|
-
To early adopters use the :git path
|
12
|
-
|
13
|
-
gem 'usecasing', :git => 'https://github.com/tdantas/usecasing.git'
|
10
|
+
gem 'usecasing'
|
14
11
|
|
15
12
|
And then execute:
|
16
13
|
|
@@ -1,9 +1,12 @@
|
|
1
|
+
require 'set'
|
2
|
+
require 'tsort'
|
3
|
+
|
1
4
|
module UseCase
|
2
5
|
|
3
6
|
class ExecutionOrder
|
4
7
|
|
5
8
|
def self.run(start_node)
|
6
|
-
any_ciclic, ciclic = CyclicFinder.
|
9
|
+
any_ciclic, ciclic = CyclicFinder.cyclic?(start_node)
|
7
10
|
raise StandardError.new("cyclic detected: #{ciclic}") if any_ciclic
|
8
11
|
post_order(start_node, [])
|
9
12
|
end
|
@@ -18,6 +21,47 @@ module UseCase
|
|
18
21
|
|
19
22
|
result.push(node)
|
20
23
|
end
|
24
|
+
end
|
25
|
+
|
26
|
+
class CyclicFinder
|
27
|
+
include TSort
|
28
|
+
|
29
|
+
def self.cyclic?(start_point)
|
30
|
+
new(start_point).cyclic?
|
31
|
+
end
|
32
|
+
|
33
|
+
def initialize(start_point)
|
34
|
+
@start_point = start_point
|
35
|
+
@nodes = discover_nodes
|
36
|
+
end
|
37
|
+
|
38
|
+
def tsort_each_node(&block)
|
39
|
+
@nodes.each &block
|
40
|
+
end
|
41
|
+
|
42
|
+
def tsort_each_child(node, &block)
|
43
|
+
node.dependencies.each &block
|
44
|
+
end
|
45
|
+
|
46
|
+
def cyclic?
|
47
|
+
components = strongly_connected_components
|
48
|
+
result = components.any?{ |component| component.size != 1 }
|
49
|
+
[ result, components.select{|component| component.size != 1 } ]
|
50
|
+
end
|
51
|
+
|
52
|
+
private
|
53
|
+
def discover_nodes
|
54
|
+
visited = {}
|
55
|
+
stack = [@start_point]
|
56
|
+
result = Set.new
|
57
|
+
until stack.empty?
|
58
|
+
node = stack.pop
|
59
|
+
result.add node
|
60
|
+
stack.push(*(node.dependencies)) if not visited[node]
|
61
|
+
visited[node] = true
|
62
|
+
end
|
63
|
+
return result
|
64
|
+
end
|
21
65
|
|
22
66
|
end
|
23
67
|
end
|
data/lib/usecasing/version.rb
CHANGED
data/lib/usecasing.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: usecasing
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.3
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2013-12-
|
12
|
+
date: 2013-12-24 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: rspec
|
@@ -76,7 +76,6 @@ files:
|
|
76
76
|
- lib/usecasing.rb
|
77
77
|
- lib/usecasing/base.rb
|
78
78
|
- lib/usecasing/context.rb
|
79
|
-
- lib/usecasing/cyclic_finder.rb
|
80
79
|
- lib/usecasing/execution_order.rb
|
81
80
|
- lib/usecasing/version.rb
|
82
81
|
- spec/context_spec.rb
|
@@ -98,7 +97,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
98
97
|
version: '0'
|
99
98
|
segments:
|
100
99
|
- 0
|
101
|
-
hash:
|
100
|
+
hash: 3012714953632075920
|
102
101
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
103
102
|
none: false
|
104
103
|
requirements:
|
@@ -107,7 +106,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
107
106
|
version: '0'
|
108
107
|
segments:
|
109
108
|
- 0
|
110
|
-
hash:
|
109
|
+
hash: 3012714953632075920
|
111
110
|
requirements: []
|
112
111
|
rubyforge_project:
|
113
112
|
rubygems_version: 1.8.24
|
@@ -1,44 +0,0 @@
|
|
1
|
-
require 'set'
|
2
|
-
require 'tsort'
|
3
|
-
|
4
|
-
module UseCase
|
5
|
-
|
6
|
-
class CyclicFinder
|
7
|
-
include TSort
|
8
|
-
|
9
|
-
def initialize(start_point)
|
10
|
-
@start_point = start_point
|
11
|
-
@nodes = discover_nodes
|
12
|
-
end
|
13
|
-
|
14
|
-
def tsort_each_node(&block)
|
15
|
-
@nodes.each &block
|
16
|
-
end
|
17
|
-
|
18
|
-
def tsort_each_child(node, &block)
|
19
|
-
node.dependencies.each &block
|
20
|
-
end
|
21
|
-
|
22
|
-
def cyclic?
|
23
|
-
components = strongly_connected_components
|
24
|
-
result = components.any?{ |component| component.size != 1 }
|
25
|
-
[ result, components.select{|component| component.size != 1 } ]
|
26
|
-
end
|
27
|
-
|
28
|
-
private
|
29
|
-
def discover_nodes
|
30
|
-
visited = {}
|
31
|
-
stack = [@start_point]
|
32
|
-
result = Set.new
|
33
|
-
until stack.empty?
|
34
|
-
node = stack.pop
|
35
|
-
result.add node
|
36
|
-
stack.push(*(node.dependencies)) if not visited[node]
|
37
|
-
visited[node] = true
|
38
|
-
end
|
39
|
-
|
40
|
-
return result
|
41
|
-
end
|
42
|
-
|
43
|
-
end
|
44
|
-
end
|