y_petri 2.1.3 → 2.1.6

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.
Files changed (72) hide show
  1. checksums.yaml +4 -4
  2. data/lib/y_petri/agent/petri_net_related.rb +25 -5
  3. data/lib/y_petri/agent/selection.rb +12 -10
  4. data/lib/y_petri/agent/simulation_related.rb +14 -58
  5. data/lib/y_petri/agent.rb +15 -17
  6. data/lib/y_petri/core/timed/euler.rb +13 -15
  7. data/lib/y_petri/core/timed/pseudo_euler.rb +22 -24
  8. data/lib/y_petri/core/timed/quasi_euler.rb +15 -17
  9. data/lib/y_petri/core/timed.rb +42 -44
  10. data/lib/y_petri/core/timeless/pseudo_euler.rb +12 -14
  11. data/lib/y_petri/core/timeless.rb +10 -7
  12. data/lib/y_petri/core.rb +3 -3
  13. data/lib/y_petri/dsl.rb +46 -46
  14. data/lib/y_petri/fixed_assets.rb +8 -0
  15. data/lib/y_petri/net/data_set.rb +238 -0
  16. data/lib/y_petri/net/own_state.rb +63 -0
  17. data/lib/y_petri/net/state/feature/delta.rb +98 -71
  18. data/lib/y_petri/net/state/feature/firing.rb +51 -54
  19. data/lib/y_petri/net/state/feature/flux.rb +51 -55
  20. data/lib/y_petri/net/state/feature/gradient.rb +55 -59
  21. data/lib/y_petri/net/state/feature/marking.rb +55 -59
  22. data/lib/y_petri/net/state/feature.rb +65 -67
  23. data/lib/y_petri/net/state/features/record.rb +150 -43
  24. data/lib/y_petri/net/state/features.rb +252 -96
  25. data/lib/y_petri/net/state.rb +114 -106
  26. data/lib/y_petri/net/visualization.rb +3 -2
  27. data/lib/y_petri/net.rb +29 -24
  28. data/lib/y_petri/place/arcs.rb +3 -3
  29. data/lib/y_petri/place/guard.rb +35 -117
  30. data/lib/y_petri/place/guarded.rb +86 -0
  31. data/lib/y_petri/place.rb +6 -3
  32. data/lib/y_petri/simulation/element_representation.rb +2 -2
  33. data/lib/y_petri/simulation/elements.rb +3 -1
  34. data/lib/y_petri/simulation/feature_set.rb +3 -1
  35. data/lib/y_petri/simulation/marking_vector.rb +3 -1
  36. data/lib/y_petri/simulation/place_mapping.rb +3 -1
  37. data/lib/y_petri/simulation/places.rb +1 -1
  38. data/lib/y_petri/simulation/recorder.rb +60 -54
  39. data/lib/y_petri/simulation/timed/recorder.rb +12 -1
  40. data/lib/y_petri/simulation/timed.rb +173 -172
  41. data/lib/y_petri/simulation/transitions/access.rb +97 -29
  42. data/lib/y_petri/simulation.rb +11 -9
  43. data/lib/y_petri/transition/{assignment.rb → A.rb} +2 -2
  44. data/lib/y_petri/transition/{timed.rb → T.rb} +2 -2
  45. data/lib/y_petri/transition/arcs.rb +3 -3
  46. data/lib/y_petri/transition/cocking.rb +3 -3
  47. data/lib/y_petri/transition/{init.rb → construction_convenience.rb} +6 -53
  48. data/lib/y_petri/transition/{ordinary_timeless.rb → t.rb} +2 -2
  49. data/lib/y_petri/transition/type.rb +103 -0
  50. data/lib/y_petri/transition/type_information.rb +103 -0
  51. data/lib/y_petri/transition/types.rb +107 -0
  52. data/lib/y_petri/transition/usable_without_world.rb +14 -0
  53. data/lib/y_petri/transition.rb +87 -101
  54. data/lib/y_petri/version.rb +1 -1
  55. data/lib/y_petri/world/dependency.rb +30 -28
  56. data/lib/y_petri/world.rb +10 -8
  57. data/test/acceptance/basic_usage_test.rb +3 -3
  58. data/test/acceptance/simulation_test.rb +3 -3
  59. data/test/acceptance/simulation_with_physical_units_test.rb +2 -2
  60. data/test/acceptance/token_game_test.rb +2 -2
  61. data/test/acceptance/visualization_test.rb +3 -3
  62. data/test/acceptance_tests.rb +2 -2
  63. data/test/agent_test.rb +1 -1
  64. data/test/net_test.rb +41 -17
  65. data/test/place_test.rb +1 -1
  66. data/test/simulation_test.rb +39 -39
  67. data/test/transition_test.rb +1 -1
  68. data/test/world_test.rb +1 -1
  69. data/test/y_petri_test.rb +1 -1
  70. metadata +13 -8
  71. data/lib/y_petri/net/state/features/dataset.rb +0 -135
  72. data/lib/y_petri/transition/construction.rb +0 -311
@@ -0,0 +1,107 @@
1
+ # encoding: utf-8
2
+
3
+ require_relative 'T'
4
+ require_relative 't'
5
+ require_relative 'A'
6
+
7
+ module YPetri::Transition::Types
8
+ # Is this a timed stoichiometric transition?
9
+ #
10
+ def TS?
11
+ type == :TS
12
+ end
13
+
14
+ # Is this a timed non-stoichiometric transition?
15
+ #
16
+ def Ts?
17
+ type == :Ts
18
+ end
19
+
20
+ # Is this a timeless stoichiometric transition?
21
+ #
22
+ def tS?
23
+ type == :tS
24
+ end
25
+
26
+ # Is this a timeless non-stoichiometric transition?
27
+ #
28
+ def ts?
29
+ type == :ts
30
+ end
31
+
32
+ # Is this a stoichiometric transition?
33
+ #
34
+ def stoichiometric?; @stoichiometric end
35
+ alias S? stoichiometric?
36
+
37
+ # Is this a non-stoichiometric transition?
38
+ #
39
+ def nonstoichiometric?
40
+ ! stoichiometric?
41
+ end
42
+ alias s? nonstoichiometric?
43
+
44
+ # Does the transition's action depend on delta time?
45
+ #
46
+ def timed?
47
+ @timed
48
+ end
49
+ alias T? timed?
50
+
51
+ # Is the transition timeless? (Opposite of #timed?)
52
+ #
53
+ def timeless?
54
+ not timed?
55
+ end
56
+ alias t? timeless?
57
+
58
+ # Is the transition functional?
59
+ #
60
+ # Explanation: If rate or action closure is supplied, a transition is always
61
+ # considered 'functional'. Otherwise, it is considered not 'functional'.
62
+ # Note that even transitions that are not functional still have standard
63
+ # action acc. to Petri's definition. Also note that a timed transition is
64
+ # necessarily functional.
65
+ #
66
+ def functional?
67
+ @functional
68
+ end
69
+
70
+ # Opposite of #functional?
71
+ #
72
+ def functionless?
73
+ not functional?
74
+ end
75
+
76
+ # Reports the transition's membership in one of the 4 basic types:
77
+ #
78
+ # 1. TS .... timed stoichiometric
79
+ # 2. tS .... timeless stoichiometric
80
+ # 3. Ts .... timed nonstoichiometric
81
+ # 4. ts .... timeless nonstoichiometric
82
+ #
83
+ # plus the fifth type
84
+ #
85
+ # 5. A .... assignment transitions
86
+ #
87
+ def type
88
+ return :A if assignment_action?
89
+ timed? ? ( stoichiometric? ? :TS : :Ts ) : ( stoichiometric? ? :tS : :ts )
90
+ end
91
+
92
+ # Is this a transition with assignment action? (Transitions with assignment
93
+ # action, or "assignment transitions", completely replace the marking of their
94
+ # codomain with their action closure result, like in spreadsheets.)
95
+ #
96
+ def assignment_action?
97
+ @assignment_action
98
+ end
99
+ alias assignment? assignment_action?
100
+ alias A? assignment_action?
101
+
102
+ # Is this a non-assignment transition? (Opposite of +#A?+)
103
+ #
104
+ def a?
105
+ ! assignment_action?
106
+ end
107
+ end # class YPetri::Transition::Types
@@ -0,0 +1,14 @@
1
+ # encoding: utf-8
2
+
3
+ # Overrride of World::Dependency to enable Transition instances not belonging
4
+ # to any World instance.
5
+ #
6
+ module YPetri::Transition::UsableWithoutWorld
7
+ def place id
8
+ super rescue Place().instance( id )
9
+ end
10
+
11
+ def transition id
12
+ super rescue Transition().instance( id )
13
+ end
14
+ end # class YPetri::Transition::UsableWithoutWorld
@@ -2,10 +2,9 @@
2
2
 
3
3
  require_relative 'transition/arcs'
4
4
  require_relative 'transition/cocking'
5
- require_relative 'transition/init'
6
- require_relative 'transition/timed'
7
- require_relative 'transition/ordinary_timeless'
8
- require_relative 'transition/assignment'
5
+ require_relative 'transition/construction_convenience'
6
+ require_relative 'transition/types'
7
+ require_relative 'transition/usable_without_world'
9
8
 
10
9
  # Transitions -- little boxes in Petri net drawings -- represent atomic
11
10
  # operations on the Petri net's marking.
@@ -92,59 +91,104 @@ require_relative 'transition/assignment'
92
91
  # closure as per C. A. Petri is automatically constructed for these.
93
92
  #
94
93
  class YPetri::Transition
95
- include NameMagic
96
- include YPetri::World::Dependency
94
+ NameMagic # ★ means include
95
+ YPetri::World::Dependency
96
+ ★ UsableWithoutWorld
97
+ ★ Arcs
98
+ ★ Cocking
99
+ ★ ConstructionConvenience
100
+ ★ Types
97
101
 
98
102
  class << self
99
- include YPetri::World::Dependency
103
+ YPetri::World::Dependency
100
104
  end
101
105
 
102
- delegate :world, to: "self.class"
103
-
104
- BASIC_TRANSITION_TYPES = {
106
+ TYPES = {
107
+ T: "timed",
108
+ t: "timeless",
109
+ S: "stoichiometric",
110
+ s: "non-stoichiometric",
111
+ A: "assignment",
112
+ a: "non-assignment",
105
113
  TS: "timed stoichiometric",
106
114
  tS: "timeless stoichiometric",
107
115
  Ts: "timed nonstoichiometric",
108
116
  ts: "timeless nonstoichiometric"
109
117
  }
110
118
 
111
- def TS?; type == :TS end
112
- def Ts?; type == :Ts end
113
- def tS?; type == :tS end
114
- def ts?; type == :ts end
119
+ delegate :world, to: "self.class"
120
+
121
+ # Transition class represents many different kinds of Petri net transitions.
122
+ # It makes the constructor syntax a bit more polymorphic. The type of the
123
+ # transition to construct is mostly inferred from the constructor arguments.
124
+ #
125
+ # Mandatorily, the constructor will always need a way to determine the domain
126
+ # (upstream arcs) and codomain (downstream arcs) of the transition. Also, the
127
+ # constructor must have a way to determine the transition's action. This is
128
+ # best explained by examples -- let us have 3 places A, B, C, for whe we will
129
+ # create different kinds of transitions:
130
+ #
131
+ #
132
+ # ==== TS (timed stoichiometric)
133
+ #
134
+ # Rate closure and stoichiometry has to be supplied. Rate closure arity should
135
+ # correspond to the domain size. Return arity should be 1 (to be multiplied by
136
+ # the stoichiometry vector, as in all other stoichiometric transitions).
137
+ #
138
+ # Transition.new stoichiometry: { A: -1, B: 1 },
139
+ # rate: -> a { a * 0.5 }
140
+ #
141
+ #
142
+ # ==== Ts (timed nonstoichiometric)
143
+ #
144
+ # Rate closure has to be supplied, whose arity should match the domain, and
145
+ # output arity codomain.
146
+ #
147
+ # ==== tS (timeless stoichiometric)
148
+ #
149
+ # Stoichiometry has to be supplied, action closure is optional. If supplied,
150
+ # its return arity should be 1 (to be multiplied by the stoichiometry vector).
151
+ #
152
+ # ==== ts transitions (timeless nonstoichiometric)
153
+ #
154
+ # Action closure is expected with return arity equal to the codomain size:
155
+ #
156
+ # Transition.new upstream_arcs: [A, C], downstream_arcs: [A, B],
157
+ # action_closure: proc { |m, x|
158
+ # if x > 0 then [-(m / 2), (m / 2)]
159
+ # else [1, 0] end
160
+ # }
161
+ #
162
+ def initialize *args, &block
163
+ check_in_arguments *args, &block # the big job
164
+ extend( if timed? then Type_T
165
+ elsif assignment_action? then Type_A
166
+ else Type_t end )
167
+ inform_upstream_places # that they have been connected
168
+ inform_downstream_places # that they have been connected
169
+ uncock # initialize in the uncocked state
170
+ end
115
171
 
116
172
  # Domain, or 'upstream arcs', is a collection of places, whose marking
117
173
  # directly affects the transition's action.
118
174
  #
119
175
  attr_reader :domain
120
- alias :domain_arcs :domain
121
- alias :domain_places :domain
122
- alias :upstream :domain
123
- alias :upstream_arcs :domain
124
- alias :upstream_places :domain
176
+ alias domain_arcs domain
177
+ alias domain_places domain
178
+ alias upstream domain
179
+ alias upstream_arcs domain
180
+ alias upstream_places domain
125
181
 
126
182
  # Codomain, 'downstream arcs', or 'action arcs', is a collection of places,
127
183
  # whose marking is directly changed by this transition's firing.
128
184
  #
129
185
  attr_reader :codomain
130
- alias :codomain_arcs :codomain
131
- alias :codomain_places :codomain
132
- alias :downstream :codomain
133
- alias :downstream_arcs :codomain
134
- alias :downstream_places :codomain
135
- alias :action_arcs :codomain
136
-
137
- # Is the transition stoichiometric?
138
- #
139
- def stoichiometric?; @stoichiometric end
140
- alias :S? :stoichiometric?
141
-
142
- # Is the transition nonstoichiometric? (Opposite of #stoichiometric?)
143
- #
144
- def nonstoichiometric?
145
- not stoichiometric?
146
- end
147
- alias :s? :nonstoichiometric?
186
+ alias codomain_arcs codomain
187
+ alias codomain_places codomain
188
+ alias downstream codomain
189
+ alias downstream_arcs codomain
190
+ alias downstream_places codomain
191
+ alias action_arcs codomain
148
192
 
149
193
  # Stoichiometry (implies that the transition is stoichiometric).
150
194
  #
@@ -170,76 +214,18 @@ class YPetri::Transition
170
214
  # Rate closure arity should correspond to the transition's domain.
171
215
  #
172
216
  attr_reader :rate_closure
173
- alias :rate :rate_closure
174
- alias :flux_closure :rate_closure
175
- alias :flux :rate_closure
176
- alias :propensity_closure :rate_closure
177
- alias :propensity :rate_closure
217
+ alias rate rate_closure
218
+ alias flux_closure rate_closure
219
+ alias flux rate_closure
220
+ alias propensity_closure rate_closure
221
+ alias propensity rate_closure
178
222
 
179
223
  # For rateless transition, action closure must be present. Action closure
180
224
  # input arguments must correspond to the domain places, and for timed
181
225
  # transitions, the first argument of the action closure must be Δtime.
182
226
  #
183
227
  attr_reader :action_closure
184
- alias :action :action_closure
185
-
186
- # Does the transition's action depend on delta time?
187
- #
188
- def timed?
189
- @timed
190
- end
191
- alias T? timed?
192
-
193
- # Is the transition timeless? (Opposite of #timed?)
194
- #
195
- def timeless?
196
- not timed?
197
- end
198
- alias t? timeless?
199
-
200
- # Is the transition functional?
201
- # Explanation: If rate or action closure is supplied, a transition is always
202
- # considered 'functional'. Otherwise, it is considered not 'functional'.
203
- # Note that even transitions that are not functional still have standard
204
- # action acc. to Petri's definition. Also note that a timed transition is
205
- # necessarily functional.
206
- #
207
- def functional?
208
- @functional
209
- end
210
-
211
- # Opposite of #functional?
212
- #
213
- def functionless?
214
- not functional?
215
- end
216
-
217
- # Reports the transition's membership in one of the 4 basic types:
218
- #
219
- # 1. TS .... timed stoichiometric
220
- # 2. tS .... timeless stoichiometric
221
- # 3. Ts .... timed nonstoichiometric
222
- # 4. ts .... timeless nonstoichiometric
223
- #
224
- # plus the fifth type
225
- #
226
- # 5. A .... assignment transitions
227
- #
228
- def type
229
- return :A if assignment_action?
230
- timed? ? ( stoichiometric? ? :TS : :Ts ) : ( stoichiometric? ? :tS : :ts )
231
- end
232
-
233
- # Is it an assignment transition? (Transitions with 'assignment action'
234
- # completely replace their codomain's marking.)
235
- #
236
- def assignment_action?; @assignment_action end
237
- alias :assignment? :assignment_action?
238
- alias :A? :assignment_action?
239
-
240
- # Is it a non-assignment transition? (Opposite of +#A?+)
241
- #
242
- def a?; ! assignment_action? end
228
+ alias action action_closure
243
229
 
244
230
  # Zero action.
245
231
  #
@@ -1,4 +1,4 @@
1
1
  module YPetri
2
- VERSION = "2.1.3"
2
+ VERSION = "2.1.6"
3
3
  DEBUG = false
4
4
  end
@@ -3,38 +3,40 @@
3
3
  # Provides basic skeleton for dependency injection for the triples of the
4
4
  # parametrized subclasses of Place, Transition and Net in different workspaces.
5
5
  #
6
- module YPetri::World::Dependency
7
- delegate :Place, :Transition, :Net, to: :world
6
+ class YPetri::World
7
+ module Dependency
8
+ delegate :Place, :Transition, :Net, to: :world
8
9
 
9
- # Place instance identification.
10
- #
11
- def place id
12
- world.place( id )
13
- end
10
+ # Place instance identification.
11
+ #
12
+ def place id
13
+ world.place( id )
14
+ end
14
15
 
15
- # Transition instance identification.
16
- #
17
- def transition id
18
- world.transition( id )
19
- end
16
+ # Transition instance identification.
17
+ #
18
+ def transition id
19
+ world.transition( id )
20
+ end
20
21
 
21
- # Element instance identification.
22
- #
23
- def element id
24
- begin
25
- place( id )
26
- rescue NameError, TypeError
22
+ # Element instance identification.
23
+ #
24
+ def element id
27
25
  begin
28
- transition( id )
29
- rescue NameError, TypeError => err
30
- raise TypeError, "Unrecognized place or transition: #{element} (#{err})"
26
+ place( id )
27
+ rescue NameError, TypeError
28
+ begin
29
+ transition( id )
30
+ rescue NameError, TypeError => err
31
+ raise TypeError, "Unrecognized place or transition: #{element} (#{err})"
32
+ end
31
33
  end
32
34
  end
33
- end
34
35
 
35
- # Net instance identification.
36
- #
37
- def net id
38
- Net().instance( id )
39
- end
40
- end # module YPetri::DependencyInjection
36
+ # Net instance identification.
37
+ #
38
+ def net id
39
+ Net().instance( id )
40
+ end
41
+ end # module Dependency
42
+ end # module YPetri::World
data/lib/y_petri/world.rb CHANGED
@@ -1,17 +1,19 @@
1
+ # encoding: utf-8
2
+
3
+ require_relative 'world/dependency'
4
+ require_relative 'world/petri_net_related'
5
+ require_relative 'world/simulation_related'
6
+
7
+
1
8
  # As the name suggests, represents the world. Holds places, transitions, nets
2
9
  # and other assets needed to set up and simulate Petri nets (settings, clamps,
3
10
  # initial markings etc.). Provides basic methods to do what is necessary.
4
11
  # More ergonomic and DSL-like methods are up to the YPetri::Agent.
5
12
  #
6
13
  class YPetri::World
7
- include NameMagic
8
-
9
- require_relative 'world/dependency'
10
- require_relative 'world/petri_net_related'
11
- require_relative 'world/simulation_related'
12
-
13
- include self::PetriNetRelated
14
- include self::SimulationRelated
14
+ NameMagic # ★ means include
15
+ ★ PetriNetRelated
16
+ SimulationRelated
15
17
 
16
18
  def initialize
17
19
  # Parametrize the Place / Transition / Net classes.
@@ -1,7 +1,7 @@
1
1
  #! /usr/bin/ruby
2
- # -*- coding: utf-8 -*-
2
+ # encoding: utf-8
3
3
 
4
- require 'minitest/spec'
4
+ gem 'minitest', '=4.7.4'
5
5
  require 'minitest/autorun'
6
6
  require_relative '../../lib/y_petri' # tested component itself
7
7
  # require 'y_petri'
@@ -9,7 +9,7 @@ require_relative '../../lib/y_petri' # tested component itself
9
9
 
10
10
  describe "Basic use of TimedSimulation" do
11
11
  before do
12
- @m = YPetri::Manipulator.new
12
+ @m = YPetri::Agent.new
13
13
  @m.Place( name: "A", default_marking: 0.5 )
14
14
  @m.Place( name: "B", default_marking: 0.5 )
15
15
  @m.Transition( name: "A_pump",
@@ -1,7 +1,7 @@
1
1
  #! /usr/bin/ruby
2
- # -*- coding: utf-8 -*-
2
+ # encoding: utf-8
3
3
 
4
- require 'minitest/spec'
4
+ gem 'minitest', '=4.7.4'
5
5
  require 'minitest/autorun'
6
6
  require_relative '../../lib/y_petri' # tested component itself
7
7
  # require 'y_petri'
@@ -9,7 +9,7 @@ require_relative '../../lib/y_petri' # tested component itself
9
9
 
10
10
  describe "Simplified dTTP pathway used for demo with Dr. Chang" do
11
11
  before do
12
- @m = YPetri::Manipulator.new
12
+ @m = YPetri::Agent.new
13
13
  Cytoplasm_volume_in_litres = 5.0e-11
14
14
  NA = 6.022e23
15
15
  Pieces_per_micromolar = NA / 1_000_000 * Cytoplasm_volume_in_litres
@@ -1,7 +1,7 @@
1
1
  #! /usr/bin/ruby
2
2
  # -*- coding: utf-8 -*-
3
3
 
4
- require 'minitest/spec'
4
+ gem 'minitest', '=4.7.4'
5
5
  require 'minitest/autorun'
6
6
  require_relative '../../lib/y_petri' # tested component itself
7
7
  # require 'y_petri'
@@ -11,7 +11,7 @@ describe "Use of TimedSimulation with units" do
11
11
  before do
12
12
  require 'sy'
13
13
 
14
- @m = YPetri::Manipulator.new
14
+ @m = YPetri::Agent.new
15
15
 
16
16
  # === General assumptions
17
17
  Cytoplasm_volume = 5.0e-11.l
@@ -1,7 +1,7 @@
1
1
  #! /usr/bin/ruby
2
2
  # -*- coding: utf-8 -*-
3
3
 
4
- require 'minitest/spec'
4
+ gem 'minitest', '=4.7.4'
5
5
  require 'minitest/autorun'
6
6
  require_relative '../../lib/y_petri' # tested component itself
7
7
  # require 'y_petri'
@@ -9,7 +9,7 @@ require_relative '../../lib/y_petri' # tested component itself
9
9
 
10
10
  describe "Token game" do
11
11
  before do
12
- @m = YPetri::Manipulator.new
12
+ @m = YPetri::Agent.new
13
13
  @m.Place name: "A"
14
14
  @m.Place name: "B"
15
15
  @m.Place name: "C", marking: 7.77
@@ -1,7 +1,7 @@
1
1
  #! /usr/bin/ruby
2
- # -*- coding: utf-8 -*-
2
+ # encoding: utf-8
3
3
 
4
- require 'minitest/spec'
4
+ gem 'minitest', '=4.7.4'
5
5
  require 'minitest/autorun'
6
6
  require_relative '../../lib/y_petri' # tested component itself
7
7
  # require 'y_petri'
@@ -9,7 +9,7 @@ require_relative '../../lib/y_petri' # tested component itself
9
9
 
10
10
  describe "Graphviz visualization" do
11
11
  before do
12
- @m = YPetri::Manipulator.new
12
+ @m = YPetri::Agent.new
13
13
  @m.Place name: :A, m!: 1
14
14
  @m.Place name: :B, m!: 1.5
15
15
  @m.Place name: :C, m!: 2
@@ -1,7 +1,7 @@
1
1
  #! /usr/bin/ruby
2
- # -*- coding: utf-8 -*-
2
+ # encoding: utf-8
3
3
 
4
- require 'minitest/spec'
4
+ gem 'minitest', '=4.7.4'
5
5
  require 'minitest/autorun'
6
6
  require_relative '../lib/y_petri' # tested component itself
7
7
  # require 'y_petri'
data/test/agent_test.rb CHANGED
@@ -1,7 +1,7 @@
1
1
  #! /usr/bin/ruby
2
2
  # -*- coding: utf-8 -*-
3
3
 
4
- require 'minitest/spec'
4
+ gem 'minitest', '=4.7.4'
5
5
  require 'minitest/autorun'
6
6
  require_relative '../lib/y_petri' # tested component itself
7
7
  # require 'y_petri'