petri 0.0.0 → 0.0.1

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: 499cdfa50c7df671582543bc17bbd5db4a7cab6f
4
- data.tar.gz: a96adde8d148ed7cee62f2013c54ae54eda2dfaa
3
+ metadata.gz: d2e16e5fcbb59acc715a976e7aa7d4413fc82cca
4
+ data.tar.gz: 2079de4b12c5e40cf2acd911d11d2f5333671fa9
5
5
  SHA512:
6
- metadata.gz: 21305eb0658d4b29b8696d287d69a83eff4fb150e4fd842f8cfc47622953c393f30ea93cc3f56ac6398470c60cdc367c9b6e0f54053417e7d805c891a54f5112
7
- data.tar.gz: 07e2b532eb5edd038761de2300270073e4658c1172d92024b0288e2ede9ed66cd37ba7738ae4036b1210200bd62f06394f4ab6857e03ea22657a303fba50cf02
6
+ metadata.gz: 23a78414f842e70b17926cbaaa9e78f421cc29897a09392b3da99711c183e14aba1033c88a1fbb02b26e08a3da227a84dcc6d37264b7b8494f14776262de356f
7
+ data.tar.gz: 547dd41631abe1893d187dc7de37a0c36bb0212cbe0e95587b61e6a15b3b058ac3ea9b8d54f5a30bcbc723f5fc2239304ab2d51205e64dc1d32fb19bf8e733f4
@@ -0,0 +1 @@
1
+ # IT ROCKS
@@ -2,11 +2,40 @@ module Petri
2
2
  class Arc < Element
3
3
  attr_reader :from_node, :to_node, :type
4
4
 
5
- def initialize(net, from: nil, to: nil, type: nil, guid: nil)
6
- super(net, {guid: guid})
5
+ def initialize(net, from: nil, to: nil, type: nil, guid: nil, production_rule: nil, guard: nil)
6
+ super(net, {guid: guid, production_rule: production_rule, guard: guard})
7
7
  @from_node = from
8
8
  @to_node = to
9
- @type = type || :regular
9
+ @type = type.try(:to_sym) || :regular
10
+ end
11
+
12
+ def reset?
13
+ @type == :reset
14
+ end
15
+
16
+ def regular?
17
+ @type == :regular
18
+ end
19
+
20
+ def inhibitor?
21
+ @type == :inhibitor
22
+ end
23
+
24
+ def production_rule
25
+ data[:production_rule]
26
+ end
27
+
28
+ def guard
29
+ data[:guard]
30
+ end
31
+
32
+ def normalized_guard
33
+ self.class.normalize_guard(guard)
34
+ end
35
+
36
+ def self.normalize_guard(guard)
37
+ return unless guard
38
+ guard.to_s.gsub(/\s+/, ' ').strip
10
39
  end
11
40
  end
12
41
  end
@@ -1,3 +1,5 @@
1
+ require 'securerandom'
2
+
1
3
  module Petri
2
4
  class Element
3
5
  attr_reader :net, :data, :guid
@@ -7,7 +9,21 @@ module Petri
7
9
  def initialize(net, data = {})
8
10
  @net = net
9
11
  @data = data.symbolize_keys || {}
10
- @guid ||= data[:guid] if data[:guid]
12
+ @guid ||= (data[:guid] ||= generate_guid)
13
+ end
14
+
15
+ def [](key)
16
+ @data[key]
17
+ end
18
+
19
+ def []=(k, v)
20
+ @data[k] = v
21
+ end
22
+
23
+ private
24
+
25
+ def generate_guid
26
+ SecureRandom.uuid
11
27
  end
12
28
  end
13
29
  end
@@ -0,0 +1,31 @@
1
+ module Petri
2
+ class Message < Transition
3
+
4
+ # @return [String, nil]
5
+ def action
6
+ nil
7
+ end
8
+
9
+ def automated?
10
+ true
11
+ end
12
+
13
+ def input_places
14
+ input_nodes
15
+ end
16
+
17
+ def output_places
18
+ output_nodes
19
+ end
20
+
21
+ # @return [Array<Place>]
22
+ def places_to_reset
23
+ reset_arcs.map(&:to_node)
24
+ end
25
+
26
+ # @return [Array<Arc>]
27
+ def reset_arcs
28
+ net.arcs.select { |arc| arc.from_node == self && arc.reset? }
29
+ end
30
+ end
31
+ end
@@ -2,49 +2,114 @@ module Petri
2
2
  class Net
3
3
  include NetLoader
4
4
 
5
- attr_reader :places, :transitions, :arcs, :tokens
5
+ attr_reader :places, :transitions, :arcs
6
6
 
7
7
  def initialize
8
8
  @transitions = []
9
9
  @places = []
10
10
  @arcs = []
11
- @tokens = []
11
+ @data = {}
12
12
  end
13
13
 
14
- # Lets the process be started
15
- # Populates tokens in start places
16
- def init
17
- places.each do |place|
18
- put_token(place) if place.start?
19
- end
14
+ # @return [Array<Transition>]
15
+ def automated_transitions
16
+ transitions.select(&:automated?)
17
+ end
18
+
19
+ # @return [Array<Message>]
20
+ def messages
21
+ transitions.select { |transition| transition.is_a?(Petri::Message) }
20
22
  end
21
23
 
22
- # @param place [Place]
23
- # @return [Token]
24
- def put_token(place)
25
- Token.new(place).tap do |token|
26
- @tokens << token
24
+ # @return [Place]
25
+ def start_place
26
+ start_places = @places.select(&:start?).select do |place|
27
+ place.identifier.blank? ||
28
+ places_by_identifier(place.identifier).select(&:finish?).empty?
27
29
  end
30
+
31
+ raise ArgumentError, 'There are more than one start places' if start_places.many?
32
+ raise ArgumentError, 'There is no start place' if start_places.empty?
33
+
34
+ start_places.first
28
35
  end
29
36
 
30
- # @param place [Place]
31
- # @return [Token, nil]
32
- def remove_token(place)
33
- @tokens.each do |token|
34
- if token.place == place
35
- @tokens.delete(token)
36
- return token
37
+ # @param identifier [String]
38
+ # @return [Place, nil]
39
+ def place_by_identifier(identifier)
40
+ identifier = identifier.to_s
41
+ @places.each { |node| return node if node.identifier == identifier }
42
+ nil
43
+ end
44
+
45
+ # @param identifier [String]
46
+ # @return [Transition, nil]
47
+ def transition_by_identifier(identifier, automated: nil)
48
+ identifier = identifier.to_s
49
+ transitions = @transitions.select do |transition|
50
+ if automated
51
+ transition.automated?
52
+ elsif automated == false
53
+ !transition.automated?
54
+ else
55
+ true
37
56
  end
38
57
  end
58
+
59
+ transitions.each { |node| return node if node.identifier == identifier }
60
+
61
+ nil
62
+ end
63
+
64
+ # @param identifier [String]
65
+ # @return [Array<Transition>]
66
+ def transitions_by_identifier(identifier)
67
+ @transitions.select { |node| node.identifier == identifier }
68
+ end
69
+
70
+ # @param guard [String]
71
+ # @return [Arc, nil]
72
+ def arc_by_guard(guard)
73
+ return if guard.blank?
74
+
75
+ guard = Arc.normalize_guard(guard)
76
+ @arcs.each { |arc| return arc if arc.normalized_guard == guard }
39
77
  nil
40
78
  end
41
79
 
80
+ # @param identifier [String]
81
+ # @return [Node, nil]
82
+ def node_by_identifier(identifier)
83
+ place_by_identifier(identifier) || transition_by_identifier(identifier)
84
+ end
85
+
86
+ def [](key)
87
+ @data[key]
88
+ end
89
+
90
+ def []=(k, v)
91
+ @data[k] = v
92
+ end
93
+
94
+ def inspect
95
+ "Petri::Net#{hash}"
96
+ end
97
+
42
98
  protected
43
99
 
100
+ # @param guid [String]
101
+ # @return [Node, nil]
44
102
  def node_by_guid(guid)
45
103
  @places.each { |node| return node if node.guid == guid }
46
104
  @transitions.each { |node| return node if node.guid == guid }
47
105
  nil
48
106
  end
107
+
108
+ # @param identifier [String]
109
+ # @return [Array<Place>]
110
+ def places_by_identifier(identifier)
111
+ identifier = identifier.to_s
112
+ @places.select { |node| node.identifier == identifier }
113
+ end
49
114
  end
50
115
  end
@@ -1,33 +1,110 @@
1
1
  module Petri
2
2
  module NetLoader
3
- extend ActiveSupport::Concern
3
+ # @param val [String, Class]
4
+ def tasks_process_class=(val)
5
+ @tasks_process_class = val
6
+ end
7
+
8
+ # @return [String, Class]
9
+ def tasks_process_class
10
+ @tasks_process_class || 'TasksProcess'
11
+ end
4
12
 
5
13
  # @param guid [String]
6
- # @param title [String]
14
+ # @param identifier [String]
7
15
  # @param start [true, false]
8
- def add_place(guid: , title: , start: )
9
- @places << Place.new(self, {guid: guid, title: title, start: start})
16
+ def add_place(guid: nil, identifier: , start: false, finish: false)
17
+ Place.new(self, {guid: guid, identifier: identifier, start: start, finish: finish}).tap do |place|
18
+ @places << place
19
+ end
20
+ end
21
+
22
+ # @param guid [String]
23
+ # @param identifier [String]
24
+ # @param action [String]
25
+ def add_transition(guid: nil, identifier: , action: nil, automated: )
26
+ Transition.new(self, {guid: guid, identifier: identifier, action: action, automated: automated}).tap do |transition|
27
+ @transitions << transition
28
+ end
10
29
  end
11
30
 
12
31
  # @param guid [String]
13
- # @param title [String]
32
+ # @param identifier [String]
14
33
  # @param action [String]
15
- def add_transition(guid: , title: , action: )
16
- @transitions << Transition.new(self, {guid: guid, title: title, action: action})
34
+ def add_message(guid: nil, identifier:)
35
+ Message.new(self, {guid: guid, identifier: identifier}).tap do |message|
36
+ @transitions << message
37
+ end
38
+ end
39
+
40
+ # @param task_identifier [String]
41
+ # @param pin [String]
42
+ # @param automated [true, false]
43
+ def add_task_transition(task_identifier:, pin:, automated:)
44
+ TaskTransition.new(self, {task_identifier: task_identifier, pin: pin, automated: automated, process_class: tasks_process_class}).tap do |transition|
45
+ @transitions << transition
46
+ end
17
47
  end
18
48
 
19
49
  # @param guid [String]
20
- # @param title [String]
50
+ # @param identifier [String]
21
51
  # @param from_guid [String]
22
52
  # @param to_guid [String]
23
53
  # @param type [String]
24
- def add_arc(guid: , from_guid: , to_guid: , type: )
54
+ # @param production_rule [String, nil]
55
+ def add_arc(guid: nil, from_guid: , to_guid: , type: , production_rule: nil, guard: nil)
25
56
  from_node = node_by_guid(from_guid)
26
57
  to_node = node_by_guid(to_guid)
27
- @arcs << Arc.new(self, from: from_node, to: to_node, type: type.try(:to_sym), guid: guid)
58
+
59
+ if type == 'test'
60
+ @arcs << Arc.new(self, from: from_node, to: to_node, type: :regular, guid: guid, guard: guard)
61
+ @arcs << Arc.new(self, from: to_node, to: from_node, type: :regular, guid: guid)
62
+ else
63
+ @arcs << Arc.new(self, from: from_node, to: to_node, type: type.try(:to_sym), guid: guid, production_rule: production_rule, guard: guard)
64
+ end
65
+ end
66
+
67
+ # @param task_data [Hash]
68
+ # @param net_data [Hash] full bpf
69
+ def add_task(task_data, net_data)
70
+ identifier = task_data['identifier']
71
+
72
+ add_task_transition(task_identifier: identifier, pin: 'Finish', automated: false) if task_data['manual_finish_enabled']
73
+ add_task_transition(task_identifier: identifier, pin: 'Cancel', automated: false) # Manual cancel is always enabled?
74
+
75
+ task_arcs = net_data['arcs'].select { |arc| arc['to_guid'] == task_data['guid'] }.group_by { |arc| arc['pin'] }
76
+ task_arcs.each { |pin, arcs| connect_task_arcs(identifier, pin, arcs) }
77
+ end
78
+
79
+ # @param task_identifier [String]
80
+ # @param pin [String] Create, Pause, Finish, Cancel
81
+ # @param arcs [Array<Petri::Arc>]
82
+ def connect_task_arcs(task_identifier, pin, arcs)
83
+ return if arcs.empty?
84
+
85
+ transition = add_task_transition(task_identifier: task_identifier, pin: pin, automated: true)
86
+
87
+ # (p*) <?-> [(T) task pin]
88
+ arcs.each_with_index do |arc, index|
89
+ front_arc_type = arc['type'] == 'test' ? 'regular' : arc['type']
90
+
91
+ add_arc(from_guid: arc['from_guid'],
92
+ to_guid: transition.guid,
93
+ type: front_arc_type,
94
+ guard: arc['guard'])
95
+
96
+ add_arc(from_guid: transition.guid,
97
+ to_guid: arc['from_guid'],
98
+ type: 'regular') if arc['type'] == 'test'
99
+ end
100
+ end
101
+
102
+ def self.included(base_class)
103
+ base_class.extend(ClassMethods)
28
104
  end
29
105
 
30
106
  module ClassMethods
107
+
31
108
  # @param path [String]
32
109
  # @return [Net]
33
110
  def from_file(path)
@@ -52,21 +129,34 @@ module Petri
52
129
  self.new.tap do |net|
53
130
  hash['places'].each do |data|
54
131
  net.add_place(guid: data['guid'],
55
- title: data['title'],
56
- start: data['start'])
132
+ identifier: data['identifier'],
133
+ start: data['start'],
134
+ finish: data['finish'])
57
135
  end
58
136
 
59
137
  hash['transitions'].each do |data|
60
138
  net.add_transition(guid: data['guid'],
61
- title: data['title'],
139
+ identifier: data['identifier'],
140
+ automated: data['automated'],
62
141
  action: data['action'])
63
142
  end
64
143
 
144
+ hash['messages'].each do |data|
145
+ net.add_message(guid: data['guid'],
146
+ identifier: data['identifier'])
147
+ end if hash['messages']
148
+
149
+ hash['tasks'].each do |data|
150
+ net.add_task(data, hash)
151
+ end if hash['tasks']
152
+
65
153
  hash['arcs'].each do |data|
66
154
  net.add_arc(guid: data['guid'],
67
155
  from_guid: data['from_guid'],
68
156
  to_guid: data['to_guid'],
69
- type: data['type'])
157
+ type: data['type'],
158
+ production_rule: data['production_rule'],
159
+ guard: data['guard'])
70
160
  end
71
161
  end
72
162
  end
@@ -2,8 +2,38 @@ module Petri
2
2
  class Node < Element
3
3
 
4
4
  # @return [String, nil]
5
- def title
6
- @data[:title]
5
+ def identifier
6
+ @data[:identifier]
7
+ end
8
+
9
+ # @return [Array<Arc>]
10
+ def input_arcs
11
+ net.arcs.select { |arc| arc.to_node == self && arc.regular? }
12
+ end
13
+
14
+ # @return [Array<Node>]
15
+ def input_nodes
16
+ input_arcs.map(&:from_node)
17
+ end
18
+
19
+ # @return [Array<Arc>]
20
+ def output_arcs
21
+ net.arcs.select { |arc| arc.from_node == self && arc.regular? }
22
+ end
23
+
24
+ # @return [Array<Node>]
25
+ def output_nodes
26
+ output_arcs.map(&:to_node)
27
+ end
28
+
29
+ # @return [Array<Arc>]
30
+ def outgoing_arcs
31
+ net.arcs.select { |arc| arc.from_node == self }
32
+ end
33
+
34
+ # @return [Array<Arc>]
35
+ def ingoing_arcs
36
+ net.arcs.select { |arc| arc.to_node == self }
7
37
  end
8
38
  end
9
39
  end
@@ -1,12 +1,38 @@
1
1
  module Petri
2
2
  class Place < Node
3
3
 
4
- def has_token?
5
- net.tokens.any? { |token| token.place == self }
6
- end
7
-
8
4
  def start?
9
5
  !!@data[:start]
10
6
  end
7
+
8
+ def finish?
9
+ !!@data[:finish]
10
+ end
11
+
12
+ # @return [Array<Arc>]
13
+ def reset_arcs
14
+ net.arcs.select { |arc| arc.to_node == self && arc.reset? }
15
+ end
16
+
17
+ # @return [Array<Transition>]
18
+ def reset_transitions
19
+ reset_arcs.map(&:from_node)
20
+ end
21
+
22
+ # For a finish place returns start places with the same identifier.
23
+ # For nets where a finish place may be connected with start places
24
+ # in order to initialize one flow as a result of another.
25
+ # @return [Array<Place>]
26
+ def links
27
+ if finish?
28
+ @net.places.select { |place| place.start? && place.identifier == identifier }
29
+ else
30
+ []
31
+ end
32
+ end
33
+
34
+ def inspect
35
+ "Petri::Place<#{identifier}>"
36
+ end
11
37
  end
12
38
  end
@@ -0,0 +1,25 @@
1
+ module Petri
2
+ module Subprocess
3
+
4
+ # Used as a key for caching
5
+ # @return [String]
6
+ def subprocess_identifier
7
+ fail NotImplementedError
8
+ end
9
+
10
+ # @return [Class]
11
+ def process_class
12
+ @process_class ||= begin
13
+ klass = @data[:process_class]
14
+ case klass
15
+ when String
16
+ klass.constantize
17
+ when Class
18
+ klass
19
+ else
20
+ fail ArgumentError, "Expected Class, String, got #{klass.class.name}"
21
+ end
22
+ end
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,60 @@
1
+ module Petri
2
+ class TaskTransition < Transition
3
+ include Petri::Subprocess
4
+
5
+ attr_reader :task_identifier
6
+
7
+ # @param net [Net]
8
+ # @param data [Hash<Symbol>]
9
+ def initialize(net, data = {})
10
+ super
11
+ @task_identifier = @data[:task_identifier]
12
+ @data[:identifier] = generate_identifier
13
+ end
14
+
15
+ def create?
16
+ pin == 'Create'
17
+ end
18
+
19
+ def finish?
20
+ pin == 'Finish'
21
+ end
22
+
23
+ def pause?
24
+ pin == 'Pause'
25
+ end
26
+
27
+ def resume?
28
+ pin == 'Resume'
29
+ end
30
+
31
+ def cancel?
32
+ pin == 'Cancel'
33
+ end
34
+
35
+ def pin
36
+ @data[:pin]
37
+ end
38
+
39
+ # [Petri::Subprocess]
40
+ def subprocess_identifier
41
+ task_identifier
42
+ end
43
+
44
+ private
45
+
46
+ def generate_identifier
47
+ if create?
48
+ "Create \"#{@task_identifier}\" task"
49
+ elsif finish?
50
+ "Finish \"#{@task_identifier}\" task"
51
+ elsif pause?
52
+ "Pause \"#{@task_identifier}\" task"
53
+ elsif resume?
54
+ "Resume \"#{@task_identifier}\" task"
55
+ elsif cancel?
56
+ "Cancel \"#{@task_identifier}\" task"
57
+ end
58
+ end
59
+ end
60
+ end
@@ -1,10 +1,33 @@
1
1
  module Petri
2
2
  class Token
3
- attr_reader :place
3
+ attr_reader :place, :source_transition, :data
4
4
 
5
5
  # @param place [Place]
6
- def initialize(place)
6
+ # @param source_transition [Transition, nil]
7
+ def initialize(place, source_transition = nil)
7
8
  @place = place
9
+ @source_transition = source_transition
10
+ @data = {}
11
+ end
12
+
13
+ # @return [String, nil]
14
+ def production_rule
15
+ source_arc && source_arc.production_rule
16
+ end
17
+
18
+ # @return [Arc, nil]
19
+ def source_arc
20
+ if source_transition
21
+ place.input_arcs.find { |arc| arc.from_node == source_transition }
22
+ end
23
+ end
24
+
25
+ def []=(k, v)
26
+ @data[k] = v
27
+ end
28
+
29
+ def [](k)
30
+ @data[k]
8
31
  end
9
32
  end
10
33
  end
@@ -6,59 +6,39 @@ module Petri
6
6
  @data[:action].presence
7
7
  end
8
8
 
9
- def enabled?
10
- input_places.all?(&:has_token?)
9
+ def automated?
10
+ @data[:automated].present?
11
11
  end
12
12
 
13
- def fire!
14
- raise ArgumentError, 'Transition is not enabled' unless enabled?
15
- consume_tokens
16
- callback.try(:call)
17
- produce_tokens
13
+ def inhibitor_places
14
+ ingoing_arcs.select(&:inhibitor?).map(&:from_node)
18
15
  end
19
16
 
20
- # @param block [Proc]
21
- def set_callback(&block)
22
- @callback = block
23
- end
24
-
25
- # @return [Proc, nil]
26
- def callback
27
- @callback
17
+ def input_places
18
+ input_nodes
28
19
  end
29
20
 
30
- private
31
-
32
- def consume_tokens
33
- input_places.each do |place|
34
- net.remove_token(place)
35
- end
21
+ def output_places
22
+ output_nodes
36
23
  end
37
24
 
38
- def produce_tokens
39
- output_places.each do |place|
40
- net.put_token(place)
41
- end
25
+ # @return [Array<Place>]
26
+ def places_to_reset
27
+ reset_arcs.map(&:to_node)
42
28
  end
43
29
 
44
30
  # @return [Array<Arc>]
45
- def input_arcs
46
- net.arcs.select { |arc| arc.to_node == self }
47
- end
48
-
49
- # @return [Array<Place>]
50
- def input_places
51
- input_arcs.map(&:from_node)
31
+ def reset_arcs
32
+ net.arcs.select { |arc| arc.from_node == self && arc.reset? }
52
33
  end
53
34
 
54
35
  # @return [Array<Arc>]
55
- def output_arcs
56
- net.arcs.select { |arc| arc.from_node == self }
36
+ def guard_arcs
37
+ ingoing_arcs.select { |arc| arc.guard.present? }
57
38
  end
58
39
 
59
- # @return [Array<Place>]
60
- def output_places
61
- output_arcs.map(&:to_node)
40
+ def inspect
41
+ "Petri::Transition<#{identifier}>"
62
42
  end
63
43
  end
64
44
  end
@@ -0,0 +1,3 @@
1
+ module Petri
2
+ VERSION = '0.0.1'
3
+ end
@@ -0,0 +1,22 @@
1
+ # -*- encoding: utf-8 -*-
2
+ require File.expand_path('../lib/version', __FILE__)
3
+
4
+ Gem::Specification.new do |s|
5
+ s.name = %q{petri}
6
+ s.version = Petri::VERSION
7
+
8
+ s.date = %q{2016-03-01}
9
+ s.authors = ["Sergei Zinin (einzige)"]
10
+ s.email = %q{szinin@gmail.com}
11
+ s.homepage = %q{http://github.com/einzige/petri}
12
+
13
+ s.licenses = ["MIT"]
14
+
15
+ s.files = `git ls-files`.split("\n")
16
+ s.require_paths = ["lib"]
17
+ s.extra_rdoc_files = ["README.md"]
18
+
19
+ s.description = %q{A petri nets framework}
20
+ s.summary = %q{Moves tokens around}
21
+ end
22
+
metadata CHANGED
@@ -1,50 +1,36 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: petri
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.0
4
+ version: 0.0.1
5
5
  platform: ruby
6
6
  authors:
7
- - Sergei Zinin
7
+ - Sergei Zinin (einzige)
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-02-22 00:00:00.000000000 Z
12
- dependencies:
13
- - !ruby/object:Gem::Dependency
14
- name: activesupport
15
- requirement: !ruby/object:Gem::Requirement
16
- requirements:
17
- - - "~>"
18
- - !ruby/object:Gem::Version
19
- version: '3.2'
20
- - - ">="
21
- - !ruby/object:Gem::Version
22
- version: 3.2.16
23
- type: :runtime
24
- prerelease: false
25
- version_requirements: !ruby/object:Gem::Requirement
26
- requirements:
27
- - - "~>"
28
- - !ruby/object:Gem::Version
29
- version: '3.2'
30
- - - ">="
31
- - !ruby/object:Gem::Version
32
- version: 3.2.16
33
- description: A simple petri nets structure
11
+ date: 2016-03-01 00:00:00.000000000 Z
12
+ dependencies: []
13
+ description: A petri nets framework
34
14
  email: szinin@gmail.com
35
15
  executables: []
36
16
  extensions: []
37
- extra_rdoc_files: []
17
+ extra_rdoc_files:
18
+ - README.md
38
19
  files:
39
- - lib/petri.rb
20
+ - README.md
40
21
  - lib/petri/arc.rb
41
22
  - lib/petri/element.rb
23
+ - lib/petri/message.rb
42
24
  - lib/petri/net.rb
43
25
  - lib/petri/net_loader.rb
44
26
  - lib/petri/node.rb
45
27
  - lib/petri/place.rb
28
+ - lib/petri/subprocess.rb
29
+ - lib/petri/task_transition.rb
46
30
  - lib/petri/token.rb
47
31
  - lib/petri/transition.rb
32
+ - lib/version.rb
33
+ - petri.gemspec
48
34
  homepage: http://github.com/einzige/petri
49
35
  licenses:
50
36
  - MIT
@@ -65,8 +51,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
65
51
  version: '0'
66
52
  requirements: []
67
53
  rubyforge_project:
68
- rubygems_version: 2.2.2
54
+ rubygems_version: 2.5.1
69
55
  signing_key:
70
56
  specification_version: 4
71
- summary: Petri nets
57
+ summary: Moves tokens around
72
58
  test_files: []
@@ -1,8 +0,0 @@
1
- require 'petri/element'
2
- require 'petri/node'
3
- require 'petri/place'
4
- require 'petri/transition'
5
- require 'petri/arc'
6
- require 'petri/token'
7
- require 'petri/net_loader'
8
- require 'petri/net'