trailblazer-activity 0.1.1 → 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
  SHA1:
3
- metadata.gz: 88fdbd19ae2eb00bf9f2ad4d700cacfbb26cde7b
4
- data.tar.gz: 8171eb89bc8c6d9350aeb5d1e2c8609d28987c43
3
+ metadata.gz: ee1dccefcc5ecdb9c4a24901de3e68ae14542b29
4
+ data.tar.gz: cb17a9035ef5193301f01f58659a156616c1d42e
5
5
  SHA512:
6
- metadata.gz: d04ecbd89f38f8ffe7dca35a18c122e4139530640014b52a16150c560e2d4cd1bd012a93d97b9ec0a748be90f4e3f5fa2ab5b464b4a4014d28ad834ce021c151
7
- data.tar.gz: 5344aef9ca3900e5482a5cd20d9e01932a2865123d2de37a9a9854b414c1634e8df931119ee0929b0fe1ce8bb3c7073324111532b073a5fb575d47c228634666
6
+ metadata.gz: 92fc5d5969bf80a125d284d7615152655fbeb5af46dd1cac3e9927962a88eb751504976806336cbdcab55b577504e07494a27348a60bb25b565b36e60e42f9c2
7
+ data.tar.gz: d58607ae4df287ed931770f30a2c6017ebf693a28d252326605940f0f6c6c03da8441c5fe66af6abf56c21c6123719b2aafbae43a820aaf27390631314817990
data/CHANGES.md CHANGED
@@ -1,3 +1,10 @@
1
+ # 0.1.2
2
+
3
+ * Consistent return values for all graph operations: `node, edge`.
4
+ * `Edge` now always gets an id.
5
+ * `#connect_for!` always throws away the old edge, fixing a bug where graph and circuit would look different.
6
+ * Internal simplifications for `Graph` alteration methods.
7
+
1
8
  # 0.1.1
2
9
 
3
10
  * Fix loading order.
data/Gemfile CHANGED
@@ -5,3 +5,5 @@ gemspec
5
5
 
6
6
  gem "minitest-line"
7
7
  gem "benchmark-ips"
8
+
9
+ gem "trailblazer-test", git: "https://github.com/trailblazer/trailblazer-test"
@@ -18,7 +18,7 @@ module Trailblazer
18
18
  # Only way to build an Activity.
19
19
  def self.from_wirings(wirings, &block)
20
20
  start_evt = Circuit::Start.new(:default)
21
- start_args = [ start_evt, { type: :event, id: [:Start, :default] } ]
21
+ start_args = [ start_evt, { type: :event, id: "Start.default" } ]
22
22
 
23
23
  start = block ? Graph::Start( *start_args, &block ) : Graph::Start(*start_args)
24
24
 
@@ -42,7 +42,7 @@ module Trailblazer
42
42
  # end
43
43
  def self.from_hash(end_evt=Circuit::End.new(:default), start_evt=Circuit::Start.new(:default), &block)
44
44
  hash = yield(start_evt, end_evt)
45
- graph = Graph::Start( start_evt, id: [:Start, :default] )
45
+ graph = Graph::Start( start_evt, id: "Start.default" )
46
46
 
47
47
  hash.each do |source_task, connections|
48
48
  source = graph.find_all { |node| node[:_wrapped] == source_task }.first or raise "#{source_task} unknown"
@@ -9,12 +9,16 @@ module Trailblazer
9
9
  # TODO: make Edge, Node, Start Hash::Immutable ?
10
10
  class Edge
11
11
  def initialize(data)
12
- @data = data
12
+ @data = data.freeze
13
13
  end
14
14
 
15
15
  def [](key)
16
16
  @data[key]
17
17
  end
18
+
19
+ def to_h
20
+ @data.to_h
21
+ end
18
22
  end
19
23
 
20
24
  class Node < Edge
@@ -27,53 +31,61 @@ module Trailblazer
27
31
  end
28
32
 
29
33
  # Single entry point for adding nodes and edges to the graph.
30
- def connect_for!(source, edge, target)
31
- # raise if find_all( source[:id] ).any?
32
- self[:graph][source] ||= {}
33
- self[:graph][target] ||= {} # keep references to all nodes, even when detached.
34
+ # @return target Node
35
+ # @return edge Edge the edge created connecting source and target.
36
+ def connect_for!(source, edge_args, target, old_edge:nil)
37
+ edge = Edge(source, edge_args, target)
38
+
34
39
  self[:graph][source][edge] = target
40
+
41
+ self[:graph][source].delete(old_edge) # FIXME: shouldn't be here
42
+
43
+ return target, edge
35
44
  end
36
- private :connect_for!
37
45
 
38
- # Builds a node from the provided `:node` argument array.
46
+ def add!(node_args)
47
+ new_node = Node(*node_args)
48
+
49
+ raise IllegalNodeError.new("The ID `#{new_node[:id]}` has been added before.") if find_all( new_node[:id] ).any?
50
+
51
+ self[:graph][new_node] = {}
52
+ new_node
53
+ end
54
+
55
+ private :connect_for!, :add!
56
+
57
+ # Builds a node from the provided `:target` arguments.
58
+ # @param target: Array wrapped, options
39
59
  def attach!(target:raise, edge:raise, source:self)
40
- target = target.kind_of?(Node) ? target : Node(*target)
60
+ target = add!(target)
41
61
 
42
62
  connect!(target: target, edge: edge, source: source)
43
63
  end
44
64
 
45
65
  def connect!(target:raise, edge:raise, source:self)
46
- target = target.kind_of?(Node) ? target : (find_all { |_target| _target[:id] == target }[0] || raise( "#{target} not found"))
66
+ target = target.kind_of?(Node) ? target : (find_all { |_target| _target[:id] == target }[0] || raise( "#{target} not found")) # FIXME: only needed for recompile_activity.
47
67
  source = source.kind_of?(Node) ? source : (find_all { |_source| _source[:id] == source }[0] || raise( "#{source} not found"))
48
68
 
49
- edge = Edge(*edge)
50
-
51
69
  connect_for!(source, edge, target)
52
-
53
- target
54
70
  end
55
71
 
56
72
  def insert_before!(old_node, node:raise, outgoing:nil, incoming:raise)
57
- old_node = find_all(old_node)[0] || raise( "#{old_node} not found") unless old_node.kind_of?(Node)
58
- new_node = Node(*node)
73
+ old_node = find_all(old_node)[0] || raise( "#{old_node} not found") unless old_node.kind_of?(Node) # FIXME: do we really need this?
74
+ new_node = add!(node)
59
75
 
60
- raise IllegalNodeError.new("The ID `#{new_node[:id]}` has been added before.") if find_all( new_node[:id] ).any?
61
-
62
- incoming_tuples = predecessors(old_node)
63
- rewired_connections = incoming_tuples.find_all { |(node, edge)| incoming.(edge) }
76
+ incoming_tuples = predecessors(old_node)
77
+ rewired_incoming_connections = incoming_tuples.find_all { |(node, edge)| incoming.(edge) }
64
78
 
65
79
  # rewire old_task's predecessors to new_task.
66
- if rewired_connections.size == 0 # this happens when we're inserting "before" an orphaned node.
67
- self[:graph][new_node] = {} # FIXME: redundant in #connect_for!
68
- else
69
- rewired_connections.each { |(node, edge)| connect_for!(node, edge, new_node) }
80
+ if rewired_incoming_connections.any? # the opposite happens when we're inserting "before" an orphaned node.
81
+ rewired_incoming_connections.each { |node, edge|
82
+ node, edge = connect_for!(node, [edge[:_wrapped], edge.to_h], new_node, old_edge: edge)
83
+ }
70
84
  end
71
85
 
72
86
  # connect new_task --> old_task.
73
87
  if outgoing
74
- edge = Edge(*outgoing)
75
-
76
- connect_for!(new_node, edge, old_node)
88
+ node, edge = connect_for!(new_node, outgoing, old_node)
77
89
  end
78
90
 
79
91
  return new_node
@@ -83,20 +95,19 @@ module Trailblazer
83
95
  nodes = self[:graph].keys + self[:graph].values.collect(&:values).flatten
84
96
  nodes = nodes.uniq
85
97
 
86
- block ||= ->(node) { node[:id] == id }
87
-
88
- nodes.find_all(&block)
98
+ nodes.find_all(& block || ->(node) { node[:id] == id })
89
99
  end
90
100
 
91
- def Edge(wrapped, options)
92
- edge = Edge.new(options.merge( _wrapped: wrapped ))
101
+ def Edge(source, (wrapped, options), target) # FIXME: test required id. test source and target
102
+ id = "#{source[:id]}-#{wrapped}-#{target[:id]}"
103
+ edge = Edge.new(options.merge( _wrapped: wrapped, id: id, source: source, target: target ))
93
104
  end
94
105
 
95
- def Node(wrapped, options)
96
- Node.new( options.merge( _wrapped: wrapped ) )
106
+ # @private
107
+ def Node(wrapped, id:raise("No ID was provided for #{wrapped}"), **options)
108
+ Node.new( options.merge( id: id, _wrapped: wrapped ) )
97
109
  end
98
110
 
99
- # private
100
111
  def predecessors(target_node)
101
112
  self[:graph].each_with_object([]) do |(node, connections), ary|
102
113
  connections.each { |edge, target| target == target_node && ary << [node, edge] }
@@ -104,7 +115,7 @@ module Trailblazer
104
115
  end
105
116
 
106
117
  def successors(node)
107
- ( self[:graph][node] || {} ).values
118
+ ( self[:graph][node] || [] ).collect { |edge, target| [target, edge] }
108
119
  end
109
120
 
110
121
  def to_h(include_leafs:true)
@@ -1,5 +1,5 @@
1
1
  module Trailblazer
2
2
  class Activity
3
- VERSION = "0.1.1"
3
+ VERSION = "0.1.2"
4
4
  end
5
5
  end
@@ -32,7 +32,7 @@ module Trailblazer
32
32
  def self.wirings
33
33
  [
34
34
  [ :insert_before!, "task_wrap.call_task", node: [ Trace.method(:capture_args), id: "task_wrap.capture_args" ], outgoing: [ Right, {} ], incoming: ->(*) { true } ],
35
- [ :insert_before!, [:End, :default], node: [ Trace.method(:capture_return), id: "task_wrap.capture_return" ], outgoing: [ Right, {} ], incoming: ->(*) { true } ],
35
+ [ :insert_before!, "End.default", node: [ Trace.method(:capture_return), id: "task_wrap.capture_return" ], outgoing: [ Right, {} ], incoming: ->(*) { true } ],
36
36
  ]
37
37
  end
38
38
 
@@ -79,8 +79,8 @@ class Trailblazer::Circuit
79
79
  def self.initial_activity
80
80
  Trailblazer::Activity.from_wirings(
81
81
  [
82
- [ :attach!, target: [ End.new(:default), type: :event, id: [:End, :default] ], edge: [ Right, {} ] ],
83
- [ :insert_before!, [:End, :default], node: [ Call, id: "task_wrap.call_task" ], outgoing: [ Right, {} ], incoming: ->(*) { true } ]
82
+ [ :attach!, target: [ End.new(:default), type: :event, id: "End.default" ], edge: [ Right, {} ] ],
83
+ [ :insert_before!, "End.default", node: [ Call, id: "task_wrap.call_task" ], outgoing: [ Right, {} ], incoming: ->(*) { true } ]
84
84
  ]
85
85
  )
86
86
  end
@@ -20,11 +20,12 @@ Gem::Specification.new do |spec|
20
20
  spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
21
21
  spec.require_paths = ["lib"]
22
22
 
23
+ spec.add_dependency "hirb"
24
+
23
25
  spec.add_development_dependency "bundler", "~> 1.14"
24
26
  spec.add_development_dependency "rake", "~> 10.0"
25
27
  spec.add_development_dependency "minitest", "~> 5.0"
26
-
27
- spec.add_dependency "hirb"
28
+ spec.add_development_dependency "trailblazer-test"
28
29
 
29
30
  spec.required_ruby_version = '>= 2.0.0'
30
31
  end
metadata CHANGED
@@ -1,15 +1,29 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: trailblazer-activity
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.1
4
+ version: 0.1.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Nick Sutterer
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2017-08-21 00:00:00.000000000 Z
11
+ date: 2017-08-23 00:00:00.000000000 Z
12
12
  dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: hirb
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: '0'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: '0'
13
27
  - !ruby/object:Gem::Dependency
14
28
  name: bundler
15
29
  requirement: !ruby/object:Gem::Requirement
@@ -53,13 +67,13 @@ dependencies:
53
67
  - !ruby/object:Gem::Version
54
68
  version: '5.0'
55
69
  - !ruby/object:Gem::Dependency
56
- name: hirb
70
+ name: trailblazer-test
57
71
  requirement: !ruby/object:Gem::Requirement
58
72
  requirements:
59
73
  - - ">="
60
74
  - !ruby/object:Gem::Version
61
75
  version: '0'
62
- type: :runtime
76
+ type: :development
63
77
  prerelease: false
64
78
  version_requirements: !ruby/object:Gem::Requirement
65
79
  requirements: