flok 0.0.63 → 0.0.64
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.
- checksums.yaml +4 -4
- data/app/kern/controller.js +2 -1
- data/docs/client_api.md +1 -0
- data/docs/datatypes.md +2 -0
- data/lib/flok/user_compiler.rb +35 -6
- data/lib/flok/version.rb +1 -1
- data/spec/env/kern.rb +1 -0
- data/spec/kern/assets/push_pop.rb +15 -0
- data/spec/kern/controller_spec.rb +43 -8
- metadata +1 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 23c9159d75fdda332b781181b9f67d2ac27ce050
|
4
|
+
data.tar.gz: c8708185f49d5971598bc07223b3dd826a74357c
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 89a25a47703e48edb20ec062af27290f28cd4029fa15ebc48b2faaf4a01a8c5559f5db93d525191d77c1491954e9d1edfe813a14e654dd8447df77992b25ba18
|
7
|
+
data.tar.gz: 4af82d9ce8f48639b99e4b710b5771da4129c3bd792b6b7a67bf0966ac4bf994456ab4eefaed0b2e1c84ff17309fc55e101b7564fc4586d5fae74dcd2d4b67b9
|
data/app/kern/controller.js
CHANGED
data/docs/client_api.md
CHANGED
@@ -5,6 +5,7 @@ Client API covers controller action event handlers.
|
|
5
5
|
* Embed(view_controller_name, spot_name, context) - Embed a view controller with the name `view_controller_name` inside the current view controller at the spot with a context
|
6
6
|
* Goto(action_name) - Change actions
|
7
7
|
* Push(action_name) - This works just like `Goto` except that `Pop` will restore the last action
|
8
|
+
* Pop(action_name) - This is to be used after `Push` and will restore the state previous to the `Push`.
|
8
9
|
* Request(service_insatnce_name, ename, params) Initiate a service. See [Services](./services.md) for more info.
|
9
10
|
* Send(event_name, info) - Send a custom event on the main queue.
|
10
11
|
* Raise(event_name, info) - Will send an event to the parent view controller (and it will bubble up, following `event_gw` which is set in `Embed` as the parent controller
|
data/docs/datatypes.md
CHANGED
@@ -43,5 +43,7 @@ controller_info {
|
|
43
43
|
action: //The name of the current action that is active
|
44
44
|
cte: //The ctable entry pertaining to this controller
|
45
45
|
embeds: //An array of arrays, where position 0 is the spot after `main`, each element in the array is a view controller base pointer.
|
46
|
+
stack: [{action:, embeds:}] //When pushing, the stack contains a copy of the controller_info's action's and a reference to the embeds from the previous layer.
|
47
|
+
event_gw: //When an event cannot be serviced, it is given to the gateway to continue propogating
|
46
48
|
}
|
47
49
|
```
|
data/lib/flok/user_compiler.rb
CHANGED
@@ -219,7 +219,11 @@ module Flok
|
|
219
219
|
|
220
220
|
#Switch the actions, reset embeds, and call on_entry
|
221
221
|
res = %{
|
222
|
+
//Save state
|
222
223
|
var old_action = __info__.action;
|
224
|
+
var old_embeds = __info__.embeds;
|
225
|
+
__info__.stack.push({action: old_action, embeds: old_embeds});
|
226
|
+
|
223
227
|
__info__.action = "#{action_name}";
|
224
228
|
|
225
229
|
//Prep embeds array, embeds[0] refers to the spot bp+2 (bp is vc, bp+1 is main)
|
@@ -232,11 +236,6 @@ module Flok
|
|
232
236
|
//located in ctable
|
233
237
|
__info__.cte.actions[__info__.action].on_entry(__base__)
|
234
238
|
|
235
|
-
//'choose_action' pseudo-action will be sent as 'null' as it's the initial state
|
236
|
-
if (old_action === "choose_action") {
|
237
|
-
old_action = null;
|
238
|
-
}
|
239
|
-
|
240
239
|
//Send off event for action change
|
241
240
|
main_q.push([3, "if_event", __base__, "action", {
|
242
241
|
from: old_action,
|
@@ -250,8 +249,38 @@ module Flok
|
|
250
249
|
l.gsub! /\)$/, ""
|
251
250
|
l.gsub! /\);$/, ""
|
252
251
|
o = l.split(",").map{|e| e.strip}
|
252
|
+
#Switch the actions, reset embeds, and call on_entry
|
253
|
+
res = %{
|
254
|
+
var restore_info = __info__.stack.pop();
|
255
|
+
|
256
|
+
//Retrieve the original action info
|
257
|
+
var orig_action = restore_info.action;
|
258
|
+
var orig_embeds = restore_info.embeds;
|
259
|
+
|
260
|
+
//Save the old action
|
261
|
+
//var old_action = __info__.action;
|
262
|
+
|
263
|
+
//Restore the action we pushed from
|
264
|
+
__info__.action = orig_action;
|
253
265
|
|
254
|
-
|
266
|
+
//Remove all views, we don't have to recurse because removal of a view
|
267
|
+
//is supposed to remove *all* view controllers of that tree as well.
|
268
|
+
var embeds = __info__.embeds;
|
269
|
+
for (var i = 0; i < __info__.embeds.length; ++i) {
|
270
|
+
for (var j = 0; j < __info__.embeds[i].length; ++j) {
|
271
|
+
//Free +1 because that will be the 'main' view
|
272
|
+
main_q.push([1, "if_free_view", embeds[i][j]+1]);
|
273
|
+
|
274
|
+
//Call dealloc on the controller
|
275
|
+
tel_deref(embeds[i][j]).cte.__dealloc__(embeds[i][j]);
|
276
|
+
}
|
277
|
+
}
|
278
|
+
|
279
|
+
//Restore embeds
|
280
|
+
__info__.embeds = orig_embeds;
|
281
|
+
}
|
282
|
+
|
283
|
+
out.puts res
|
255
284
|
#Request(service_instance_name, ename, info)
|
256
285
|
elsif l =~ /Request/
|
257
286
|
l.strip!
|
data/lib/flok/version.rb
CHANGED
data/spec/env/kern.rb
CHANGED
@@ -1,9 +1,14 @@
|
|
1
1
|
controller :my_controller do
|
2
2
|
spots "hello", "world"
|
3
3
|
|
4
|
+
on_entry %{
|
5
|
+
my_action_entered_count = 0;
|
6
|
+
}
|
7
|
+
|
4
8
|
action :my_action do
|
5
9
|
on_entry %{
|
6
10
|
Embed("my_controller2", "hello", {});
|
11
|
+
my_action_entered_count += 1;
|
7
12
|
}
|
8
13
|
|
9
14
|
on "test_event", %{
|
@@ -13,6 +18,7 @@ controller :my_controller do
|
|
13
18
|
|
14
19
|
action :my_other_action do
|
15
20
|
on_entry %{
|
21
|
+
Embed("my_controller3", "hello", {});
|
16
22
|
my_other_action_on_entry_called = true;
|
17
23
|
}
|
18
24
|
|
@@ -28,3 +34,12 @@ controller :my_controller2 do
|
|
28
34
|
}
|
29
35
|
end
|
30
36
|
end
|
37
|
+
|
38
|
+
controller :my_controller3 do
|
39
|
+
action :my_action do
|
40
|
+
on_entry %{
|
41
|
+
my_controller3_main_view_bp = __base__+1;
|
42
|
+
}
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
@@ -127,12 +127,14 @@ RSpec.describe "kern:controller_spec" do
|
|
127
127
|
action = info.action
|
128
128
|
cte = info.cte
|
129
129
|
event_gw = info.event_gw
|
130
|
+
stack = info.stack
|
130
131
|
}
|
131
132
|
|
132
133
|
expect(ctx.eval('context')).not_to eq(nil)
|
133
134
|
expect(ctx.eval('action')).not_to eq(nil)
|
134
135
|
expect(ctx.eval('cte')).not_to eq(nil)
|
135
136
|
expect(ctx.eval('"event_gw" in info')).not_to eq(nil)
|
137
|
+
expect(ctx.eval('stack')).not_to eq(nil)
|
136
138
|
end
|
137
139
|
|
138
140
|
it "calls on_entry with the base pointer when a controller is embedded for the initial action" do
|
@@ -351,19 +353,52 @@ RSpec.describe "kern:controller_spec" do
|
|
351
353
|
ctx = flok_new_user File.read('./spec/kern/assets/push_pop.rb')
|
352
354
|
|
353
355
|
#Run the embed function
|
354
|
-
ctx.
|
356
|
+
dump = ctx.evald %{
|
355
357
|
//Call embed on main root view
|
356
|
-
base = _embed("my_controller", 0, {}, null);
|
358
|
+
dump["base"] = _embed("my_controller", 0, {}, null);
|
357
359
|
|
358
|
-
//
|
359
|
-
|
360
|
+
//The controller's info
|
361
|
+
dump["controller_info"] = tel_deref(dump["base"]);
|
362
|
+
dump["ctable_entry"] = dump["controller_info"]["cte"];
|
363
|
+
|
364
|
+
//Dump the embeds array before we switch anything around, this is the embeds for `my_action`
|
365
|
+
dump["my_action_embeds_original_array"] = JSON.parse(JSON.stringify(dump["controller_info"]["embeds"]));
|
366
|
+
|
367
|
+
//Push the controller to 'my_other_action'
|
368
|
+
int_dispatch([3, "int_event", dump["base"], "test_event", {}]);
|
369
|
+
|
370
|
+
//Pop the controller back to 'my_action'
|
371
|
+
int_dispatch([3, "int_event", dump["base"], "back", {}]);
|
372
|
+
|
373
|
+
//The second action was entered
|
374
|
+
dump["my_other_action_on_entry_called"] = my_other_action_on_entry_called;
|
375
|
+
|
376
|
+
//The first action was not entered twice
|
377
|
+
dump["my_action_entered_count"] = my_action_entered_count;
|
378
|
+
|
379
|
+
//The poped controller's base pointer for the main view
|
380
|
+
dump["my_controller3_main_view_bp"] = my_controller3_main_view_bp;
|
360
381
|
}
|
361
382
|
|
362
|
-
#
|
363
|
-
|
364
|
-
expect(ctx.eval("my_other_action_on_entry_called")).not_to eq(nil)
|
365
|
-
end
|
383
|
+
#The controller's instance info `action` field was changed back to the old action
|
384
|
+
expect(dump["controller_info"]["action"]).to eq("my_action")
|
366
385
|
|
386
|
+
#The controller's embeds is now restored back to the original embeds from 'my_action'
|
387
|
+
expect(dump["controller_info"]["embeds"]).to eq(dump["my_action_embeds_original_array"])
|
388
|
+
|
389
|
+
#Does dealloc the pushed controller, we can check to see if the view was destroyed
|
390
|
+
@driver.ignore_up_to "if_free_view"
|
391
|
+
@driver.mexpect("if_free_view", [dump["my_controller3_main_view_bp"]])
|
392
|
+
|
393
|
+
#Do not get a notification for any more removals, or creations
|
394
|
+
@driver.expect_not_to_contain "if_free_view"
|
395
|
+
@driver.expect_not_to_contain "if_init_view"
|
396
|
+
|
397
|
+
#Do not get a notification for the view hierarchy about the change
|
398
|
+
@driver.expect_not_to_contain "if_event" do |e|
|
399
|
+
next e[2] == {"from" => "my_other_action", "to" => "my_action"}
|
400
|
+
end
|
401
|
+
end
|
367
402
|
|
368
403
|
it "Does tear down the old embedded view from the embedded view controller when switching actions" do
|
369
404
|
#Compile the controller
|