rachinations 0.0.1

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 (91) hide show
  1. checksums.yaml +7 -0
  2. data/.coveralls.yml +1 -0
  3. data/.gitignore +6 -0
  4. data/.travis.yml +8 -0
  5. data/.yardopts +1 -0
  6. data/Gemfile +19 -0
  7. data/Gemfile.lock +93 -0
  8. data/LICENSE.txt +21 -0
  9. data/README.md +18 -0
  10. data/Rakefile +16 -0
  11. data/lib/rachinations.rb +49 -0
  12. data/lib/rachinations/domain/diagrams/diagram.rb +167 -0
  13. data/lib/rachinations/domain/diagrams/non_deterministic_diagram.rb +16 -0
  14. data/lib/rachinations/domain/diagrams/verbose_diagram.rb +9 -0
  15. data/lib/rachinations/domain/edge_collection.rb +12 -0
  16. data/lib/rachinations/domain/edges/edge.rb +159 -0
  17. data/lib/rachinations/domain/edges/random_edge.rb +4 -0
  18. data/lib/rachinations/domain/exceptions/bad_options.rb +3 -0
  19. data/lib/rachinations/domain/exceptions/no_elements_found.rb +2 -0
  20. data/lib/rachinations/domain/exceptions/no_elements_matching_condition_error.rb +2 -0
  21. data/lib/rachinations/domain/exceptions/no_elements_of_given_type.rb +3 -0
  22. data/lib/rachinations/domain/exceptions/unsupported_type_error.rb +2 -0
  23. data/lib/rachinations/domain/modules/common/hash_init.rb +88 -0
  24. data/lib/rachinations/domain/modules/common/invariant.rb +17 -0
  25. data/lib/rachinations/domain/modules/diagrams/verbose.rb +30 -0
  26. data/lib/rachinations/domain/node_collection.rb +30 -0
  27. data/lib/rachinations/domain/nodes/converter.rb +276 -0
  28. data/lib/rachinations/domain/nodes/gate.rb +6 -0
  29. data/lib/rachinations/domain/nodes/node.rb +166 -0
  30. data/lib/rachinations/domain/nodes/pool.rb +267 -0
  31. data/lib/rachinations/domain/nodes/resourceful_node.rb +96 -0
  32. data/lib/rachinations/domain/nodes/resourceless_node.rb +11 -0
  33. data/lib/rachinations/domain/nodes/sink.rb +17 -0
  34. data/lib/rachinations/domain/nodes/source.rb +161 -0
  35. data/lib/rachinations/domain/nodes/trader.rb +6 -0
  36. data/lib/rachinations/domain/resource_bag.rb +131 -0
  37. data/lib/rachinations/domain/resources/token.rb +51 -0
  38. data/lib/rachinations/domain/strategies/strategy.rb +5 -0
  39. data/lib/rachinations/domain/strategies/valid_types.rb +69 -0
  40. data/lib/rachinations/dsl/dsl.rb +63 -0
  41. data/lib/rachinations/extras/fifo.rb +27 -0
  42. data/lib/rachinations/version.rb +3 -0
  43. data/machinations_diagrams/apenas_bonito.xml +22 -0
  44. data/machinations_diagrams/behavior_converter.xml +53 -0
  45. data/machinations_diagrams/behavior_converter_fim.xml +10 -0
  46. data/machinations_diagrams/canon/README.md +8 -0
  47. data/machinations_diagrams/canon/converters_differences.xml +27 -0
  48. data/machinations_diagrams/canon/converters_differences2.xml +34 -0
  49. data/machinations_diagrams/canon/converters_similarities.xml +63 -0
  50. data/machinations_diagrams/canon/converters_similarities2.xml +21 -0
  51. data/machinations_diagrams/canon/nodes_and_edges_differences.xml +15 -0
  52. data/machinations_diagrams/canon/nodes_and_edges_similarities.xml +20 -0
  53. data/machinations_diagrams/deterministic_example.xml +46 -0
  54. data/machinations_diagrams/economies_of_scale.xml +32 -0
  55. data/machinations_diagrams/feature_ou_bug.xml +5 -0
  56. data/machinations_diagrams/loop_in_trigger.xml +21 -0
  57. data/machinations_diagrams/naficadevendo.xml +12 -0
  58. data/machinations_diagrams/noreporting_equivalent.xml +22 -0
  59. data/machinations_diagrams/pull_all_example.xml +7 -0
  60. data/machinations_diagrams/sketch_of_memory.xml +41 -0
  61. data/machinations_diagrams/software_engineering_process 2.xml +130 -0
  62. data/machinations_diagrams/software_engineering_process v3.xml +168 -0
  63. data/machinations_diagrams/software_engineering_process v4.xml +192 -0
  64. data/machinations_diagrams/software_engineering_process.xml +65 -0
  65. data/machinations_diagrams/software_engineering_process_with_rework_after_test.xml +195 -0
  66. data/machinations_diagrams/startup_marketing.xml +35 -0
  67. data/machinations_diagrams/triggers_allow_multiple_stages_at_same_round.xml +19 -0
  68. data/machinations_diagrams/um_de_cada_vez_vs_todos_de_uma_vez.xml +20 -0
  69. data/rachinations.gemspec +35 -0
  70. data/testing/features/step_definitions/step_definitions.rb +11 -0
  71. data/testing/simulations/modelo1.rb +20 -0
  72. data/testing/simulations/modelo2.rb +49 -0
  73. data/testing/simulations/noreporting.rb +51 -0
  74. data/testing/simulations/sequencial.rb +19 -0
  75. data/testing/simulations/sobonito.rb +28 -0
  76. data/testing/simulations/sobonitowhile.rb +28 -0
  77. data/testing/simulations/whatIwish1.rb +20 -0
  78. data/testing/spec/canon/converter_spec.rb +33 -0
  79. data/testing/spec/canon/pool_spec.rb +68 -0
  80. data/testing/spec/conditions_spec.rb +10 -0
  81. data/testing/spec/converter_spec.rb +223 -0
  82. data/testing/spec/diagram_spec.rb +671 -0
  83. data/testing/spec/edge_spec.rb +256 -0
  84. data/testing/spec/hash_init_spec.rb +59 -0
  85. data/testing/spec/node_spec.rb +31 -0
  86. data/testing/spec/non_deterministic_diagram_spec.rb +112 -0
  87. data/testing/spec/pool_spec.rb +233 -0
  88. data/testing/spec/source_spec.rb +132 -0
  89. data/testing/spec/spec_helper.rb +34 -0
  90. data/testing/spec/xexeo_spec.rb +193 -0
  91. metadata +283 -0
@@ -0,0 +1,51 @@
1
+ require_relative '../../domain/diagrams/diagram'
2
+ require_relative '../../domain/nodes/pool'
3
+ require_relative '../../domain/edges/edge'
4
+
5
+ generator = Diagram.new('1to2')
6
+
7
+ generator.add_node! Pool, {
8
+ name: 'g1',
9
+ activation: :automatic,
10
+ initial_value: 5,
11
+ mode: :push
12
+ }
13
+
14
+ generator.add_node! Pool, {
15
+ name: 'g2',
16
+ activation: :automatic,
17
+ mode: :push
18
+ }
19
+
20
+ generator.add_node! Pool, {
21
+ name: 'g3'
22
+ }
23
+
24
+ generator.add_edge! Edge, {
25
+ name: 'c1',
26
+ from: 'g1',
27
+ to: 'g2'
28
+ }
29
+
30
+ generator.add_edge! Edge, {
31
+ name: 'c2',
32
+ from: 'g1',
33
+ to: 'g3',
34
+ }
35
+
36
+
37
+ generator.add_edge! Edge, {
38
+ name: 'c3',
39
+ from: 'g2',
40
+ to: 'g1',
41
+ }
42
+
43
+ # I want to check the initial state
44
+ puts "#### Estado inicial ####"
45
+ puts generator
46
+
47
+ # run and get the end
48
+ generator.run!(10)
49
+
50
+ puts "#### Estado final ####"
51
+ puts generator
@@ -0,0 +1,19 @@
1
+ require_relative '../../domain/diagrams/diagram'
2
+ require_relative '../../dsl/dsl'
3
+ require_relative '../../domain/nodes/pool'
4
+ require_relative '../../domain/edges/edge'
5
+ include DSL
6
+
7
+ n=diagram 'test_diagram', :verbose do
8
+ node 'p1', Pool, mode: :push, activation: :automatic, initial_value: 8
9
+ node 'p2', Pool, mode: :push, activation: :automatic
10
+ node 'p3', Pool, mode: :push, activation: :automatic
11
+ node 'p4', Pool, mode: :push, activation: :automatic
12
+ edge 'e1', Edge, 'p1', 'p2'
13
+ edge 'e2', Edge, 'p2', 'p3'
14
+ edge 'e3', Edge, 'p3', 'p4'
15
+ end
16
+
17
+ n.run!(5)
18
+
19
+ puts n
@@ -0,0 +1,28 @@
1
+ require_relative '../../domain/diagrams/diagram'
2
+ require_relative '../../dsl/dsl'
3
+ require_relative '../../domain/nodes/pool'
4
+ require_relative '../../domain/edges/edge'
5
+
6
+ include DSL
7
+
8
+ n=diagram 'test_diagram',:verbose do
9
+ node 'p1', Pool, mode: :push, activation: :automatic, initial_value: 8
10
+ node 'p2', Pool, mode: :push, activation: :automatic
11
+ node 'p3', Pool, mode: :push, activation: :automatic
12
+ node 'p4', Pool, mode: :push, activation: :automatic
13
+ edge 'e1', Edge, 'p1', 'p2'
14
+ edge 'e2', Edge, 'p2', 'p1'
15
+ edge 'e3', Edge, 'p1', 'p3'
16
+ edge 'e4', Edge, 'p3', 'p1'
17
+ edge 'e5', Edge, 'p4', 'p2'
18
+ edge 'e6', Edge, 'p2', 'p4'
19
+ edge 'e7', Edge, 'p4', 'p3'
20
+ edge 'e8', Edge, 'p3', 'p4'
21
+ end
22
+
23
+ d = Diagram.new('bonitinho')
24
+
25
+ n.run!(20)
26
+
27
+
28
+
@@ -0,0 +1,28 @@
1
+ require_relative '../../domain/diagrams/diagram'
2
+ require_relative '../../dsl/dsl'
3
+ require_relative '../../domain/nodes/pool'
4
+ require_relative '../../domain/edges/edge'
5
+ include DSL
6
+
7
+ n=diagram 'test_diagram', :verbose do
8
+ node 'p1', Pool, mode: :push, activation: :automatic, initial_value: 8
9
+ node 'p2', Pool, mode: :push, activation: :automatic
10
+ node 'p3', Pool, mode: :push, activation: :automatic
11
+ node 'p4', Pool, mode: :push, activation: :automatic
12
+ edge 'e1', Edge, 'p1', 'p2'
13
+ edge 'e2', Edge, 'p2', 'p1'
14
+ edge 'e3', Edge, 'p1', 'p3'
15
+ edge 'e4', Edge, 'p3', 'p1'
16
+ edge 'e5', Edge, 'p4', 'p2'
17
+ edge 'e6', Edge, 'p2', 'p4'
18
+ edge 'e7', Edge, 'p4', 'p3'
19
+ edge 'e8', Edge, 'p3', 'p4'
20
+ end
21
+
22
+ d = Diagram.new('bonitinho')
23
+
24
+ n.run_while! do
25
+ not (n.get_node("p1").resource_count == 2 and n.get_node("p4").resource_count == 2)
26
+ end
27
+
28
+
@@ -0,0 +1,20 @@
1
+ require_relative '../domain/diagram'
2
+ require_relative '../dsl/dsl.rb'
3
+ include DSL
4
+
5
+ n=diagram 'test_diagram' do
6
+ node 'source', Source
7
+ node 'pool1', Pool
8
+ edge 'edge1', Edge, 'source', 'pool1'
9
+ node 'pool2', Pool,
10
+ converter 'c1' , Converter
11
+ node 'e3' , Edge , 'pool2' , 'c1'
12
+ trigger 't1' , Trigger , 'pool1' , 'pool2' , { |ExtendedNode p| p.resouces>0 }
13
+ end
14
+
15
+ n.run!(5,report=true)
16
+
17
+
18
+
19
+
20
+
@@ -0,0 +1,33 @@
1
+ require_relative '../spec_helper'
2
+
3
+ describe 'Converter canonical behavior' do
4
+
5
+ context "there's just one pool on each side" do
6
+
7
+ before(:each) {
8
+ @d = Diagram.new 'foo'
9
+ @d.add_node! Pool, name: 'p9', initial_value: 9
10
+ @d.add_node! Pool, name: 'p0'
11
+ @d.add_node! Converter, name: 'c', mode: :pull_any
12
+ @d.add_edge! Edge, name:'e1', from: 'p9', to: 'c'
13
+ @d.add_edge! Edge, name:'e2',from: 'c', to: 'p0'
14
+ }
15
+ it 'is triggered by itself' do
16
+ c = @d.get_node 'c'
17
+ p0 = @d.get_node('p0')
18
+ p9 = @d.get_node('p9')
19
+
20
+ 5.times{ c.trigger! }
21
+
22
+ # to unlock the resources
23
+ @d.get_node('p0').commit!
24
+ @d.get_node('p9').commit!
25
+
26
+ expect(@d.get_node('p0').resource_count).to eq 5
27
+ expect(@d.get_node('p9').resource_count).to eq 4
28
+
29
+
30
+ end
31
+
32
+ end
33
+ end
@@ -0,0 +1,68 @@
1
+ require_relative '../spec_helper'
2
+
3
+ describe 'Pool canonical behaviour' do
4
+
5
+ context 'untyped pools' do
6
+
7
+ context 'push_any' do
8
+
9
+ before(:each) do
10
+
11
+ @p1 = Pool.new name: 'p1', initial_value: 2, mode: :push_any
12
+ @p2 = Pool.new name: 'p2'
13
+
14
+ @e = Edge.new name: 'e', from: @p1, to: @p2
15
+ @p1.attach_edge!(@e)
16
+ @p2.attach_edge!(@e)
17
+
18
+ end
19
+
20
+ it 'pushes one' do
21
+
22
+ @p1.trigger!
23
+
24
+ expect(@p1.resource_count).to eq 1
25
+
26
+ # because it's just received the resource, it'll be blocked
27
+ expect(@p2.instant_resource_count).to eq 1
28
+
29
+ end
30
+
31
+ end
32
+
33
+ context 'pull_any' do
34
+
35
+ before(:each) do
36
+ @p1 = Pool.new name: 'p1', mode: :pull_any
37
+ @p2 = Pool.new name: 'p2', initial_value: 2
38
+
39
+ @e = Edge.new name: 'e', from: @p2, to: @p1
40
+ @p1.attach_edge!(@e)
41
+ @p2.attach_edge!(@e)
42
+
43
+
44
+ end
45
+
46
+ it 'pulls one' do
47
+ @p1.trigger!
48
+
49
+ expect(@p2.resource_count).to eq 1
50
+
51
+ # # because it's just received the resource, it'll be blocked
52
+ expect(@p1.instant_resource_count).to eq 1
53
+
54
+ end
55
+
56
+ end
57
+
58
+ context 'push_all' do
59
+
60
+ end
61
+
62
+ context 'pull_all' do
63
+
64
+ end
65
+
66
+ end
67
+
68
+ end
@@ -0,0 +1,10 @@
1
+ require_relative 'spec_helper'
2
+
3
+ describe 'Nodes that can be given conditions' do
4
+
5
+ it 'does something' do
6
+
7
+ skip "will test conditions later"
8
+
9
+ end
10
+ end
@@ -0,0 +1,223 @@
1
+ require_relative 'spec_helper'
2
+
3
+ describe Converter do
4
+
5
+
6
+ it 'is created with name as single argument' do
7
+
8
+ expect { Converter.new name: 'foo' }.not_to raise_error
9
+
10
+ end
11
+
12
+ it 'is added into a diagram' do
13
+
14
+ d = Diagram.new 'd'
15
+
16
+ d.add_node! Converter, name: 'conv'
17
+
18
+ expect(d.get_node('conv')).to be_a Converter
19
+
20
+ end
21
+
22
+ it 'is connected to one edge in and one edge out' do
23
+
24
+ c = Converter.new name: 'c'
25
+
26
+ c.attach_edge(double(:from => c, :to => double()))
27
+
28
+ c.attach_edge(double(:from => double(), :to => c))
29
+
30
+ end
31
+
32
+
33
+ describe '#trigger!' do
34
+
35
+ context 'simple' do
36
+
37
+ before(:each) do
38
+
39
+ @c = Converter.new name: 'c'
40
+ @edge_in = instance_double(Edge, from: double(), to: @c, label: 1, pull_expression: proc{true==true})
41
+ @edge_out = instance_double(Edge, from: @c, to: double(), label: 1,push_expression: proc{true==true})
42
+ @c.attach_edge!(@edge_in).attach_edge!(@edge_out)
43
+
44
+ end
45
+
46
+ it 'asks incoming edges for their pull_expressions' do
47
+
48
+ expect(@edge_in).to receive(:pull_expression)
49
+ expect(@edge_in).to receive(:pull!)
50
+ @edge_out.as_null_object
51
+ @c.trigger!
52
+
53
+ end
54
+
55
+ it "doesn't ping outgoing edges if incoming edge cannot pull" do
56
+
57
+ expect(@edge_in).to receive(:pull_expression).and_raise(RuntimeError)
58
+ expect(@edge_out).not_to receive(:push!)
59
+
60
+ @c.trigger!
61
+
62
+ end
63
+
64
+ end
65
+
66
+ context 'when pull_any' do
67
+
68
+ before(:each) do
69
+
70
+ @c = Converter.new name: 'c', mode: :pull_any
71
+ @edge_in = instance_double(Edge, from: double(), to: @c,label:1)
72
+ @edge_out = instance_double(Edge, from: @c, to: double(),label:1)
73
+ @c.attach_edge!(@edge_in).attach_edge!(@edge_out)
74
+
75
+ end
76
+
77
+ it 'does not push when resource contributions are not met' do
78
+
79
+ expect(@edge_in).to receive(:pull_expression).and_return(proc{true})
80
+
81
+ expect(@edge_in).to receive(:pull!)
82
+
83
+ expect(@edge_out).not_to receive(:push_expression)
84
+
85
+ expect(@c).to receive(:in_conditions_met?).and_return(false)
86
+
87
+ @c.trigger!
88
+
89
+
90
+ end
91
+
92
+ it 'does cause a push when resource contribution is met, even if across turns' do
93
+ expect(@edge_in).to receive(:pull_expression).and_raise(RuntimeError)
94
+
95
+ expect(@edge_in).not_to receive(:pull!)
96
+
97
+ expect(@c).to receive(:in_conditions_met?).and_return(true)
98
+
99
+
100
+ expect(@edge_out).to receive(:test_push?).and_return(true)
101
+ expect(@edge_out).to receive(:push_expression).and_return(proc{true})
102
+ expect(@edge_out).to receive(:push!)
103
+
104
+ @c.trigger!
105
+ end
106
+
107
+ end
108
+
109
+ context 'when pull_all' do
110
+
111
+ before(:each) do
112
+ @c = Converter.new name: 'c', mode: :pull_all
113
+ @edge_in = instance_double(Edge, from: double(), to: @c, label:1,pull_expression: proc{true})
114
+ @edge_in2 = instance_double(Edge, from: double(), to: @c, label: 1,pull_expression: proc{true})
115
+ @edge_out = instance_double(Edge, from: @c, to: double(), label: 1,push_expression: proc{true})
116
+ @c.attach_edge!(@edge_in).attach_edge!(@edge_in2).attach_edge!(@edge_out)
117
+ end
118
+
119
+
120
+ it 'pushes and pulls if all edges (incoming and outgoing) can push and pull, respectively' do
121
+
122
+ expect(@edge_in).to receive(:test_pull?).with(true).and_return(true)
123
+ expect(@edge_in).to receive(:pull!)
124
+
125
+ expect(@edge_in2).to receive(:test_pull?).with(true).and_return(true)
126
+ expect(@edge_in2).to receive(:pull!)
127
+
128
+ expect(@edge_out).to receive(:test_push?).with(true).and_return(true)
129
+ expect(@edge_out).to receive(:push!)
130
+
131
+
132
+ @c.trigger!
133
+
134
+ end
135
+
136
+
137
+ it 'does not pull or push if at least one incoming edge cannot pull ' do
138
+
139
+ # they are shuffled and we stop sending test_ping? to edges
140
+ # once one has returned false. Therefore we do not know which
141
+ # edges will receive the message so we have to allow all to.
142
+
143
+ allow(@edge_in).to receive_messages(:test_pull? => false)
144
+ allow(@edge_in2).to receive_messages(:test_pull? => false)
145
+ allow(@edge_out).to receive_messages(:test_push? => false)
146
+
147
+ # but none outgoing will get pinged
148
+ expect(@edge_in).not_to receive(:pull!)
149
+ expect(@edge_in2).not_to receive(:pull!)
150
+ expect(@edge_out).not_to receive(:push!)
151
+
152
+
153
+ @c.trigger!
154
+
155
+ end
156
+
157
+ it 'also does not pull or push if at least one outgoing edge cannot push' do
158
+
159
+ end
160
+
161
+ end
162
+
163
+ end
164
+
165
+ describe '#put_resource!' do
166
+
167
+ before(:each) do
168
+ @c = Converter.new name: 'c'
169
+ @edge_in = instance_double(Edge, from: double(), to: @c, label: 1)
170
+ @edge_out = instance_double(Edge, from: @c, to: double(), label: 1)
171
+ @c.attach_edge!(@edge_out)
172
+ @c.attach_edge!(@edge_in)
173
+ end
174
+
175
+ it 'does not ping incoming edges' do
176
+
177
+ expect(@edge_in).not_to receive(:test_pull?)
178
+ expect(@edge_out).to receive(:push_expression).and_return(proc{true})
179
+ @edge_out.as_null_object
180
+ @c.put_resource!(double(), @edge_in)
181
+ end
182
+
183
+
184
+ end
185
+
186
+ describe '#take_resource!' do
187
+
188
+ before(:each) do
189
+
190
+ # TODO
191
+ end
192
+
193
+ it 'something' do
194
+
195
+ end
196
+
197
+
198
+ end
199
+
200
+ describe '#attach_edge' do
201
+
202
+ before(:each) do
203
+ @c = Converter.new name: 'c'
204
+ @e = Edge.new name: 'e', from: double(), to: @c
205
+
206
+ end
207
+
208
+ it 'adds attached edge to resources_contributed hash' do
209
+
210
+ hsh = Hash.new
211
+
212
+ expect(@c).to receive(:resources_contributed).and_return(hsh)
213
+
214
+ expect(hsh).to receive(:store)
215
+
216
+ @c.attach_edge!(@e)
217
+
218
+
219
+ end
220
+
221
+ end
222
+
223
+ end