flok 0.0.62 → 0.0.63

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 49ad16aaf0fca2dc27529ae8cb71c1d99e2282ed
4
- data.tar.gz: 95b619eb6df458626fe286555b6e5804768ba20e
3
+ metadata.gz: d369b592a35b8b2c078db3ac85240d1757cbe365
4
+ data.tar.gz: bf82891bcedf8b23edafcea1a06dc4876043535c
5
5
  SHA512:
6
- metadata.gz: 8131bb471d419d201ce16aa42c2114277443cbb02a9075ce555c3da2af2a18ef1b973d949c541aadd67c91cf63c7ba8d49eaeb3d46065787d7095c4ec7c78488
7
- data.tar.gz: 22b1c150cecfca9215bbabbf2e4038f9f390359070e6f268fca445300a29f7dbf6060709ed1cc31d03b098beca05f882cc68bfe8bb222b640d12f4e52f720364
6
+ metadata.gz: e58ba2e2620c41ee3e70960076766a63955219cd6fad8deebeaf5e067e10d38c053da078327b7b39a1e9d00a8b56af6e07858cacc60839bc7c9917f504a40eab
7
+ data.tar.gz: 4ad97f13b5ed4da7a63dd15366d0507ece1cf43aa3379183e8ee1b48c707f0a61a59fe04552ccd94aba645b650d122600cfabedc62e86966196c86cd72515bef
@@ -4,6 +4,7 @@ Client API covers controller action event handlers.
4
4
  ### Controller MACROS
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
+ * Push(action_name) - This works just like `Goto` except that `Pop` will restore the last action
7
8
  * Request(service_insatnce_name, ename, params) Initiate a service. See [Services](./services.md) for more info.
8
9
  * Send(event_name, info) - Send a custom event on the main queue.
9
10
  * 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
@@ -10,7 +10,7 @@ be looked up as `ctable[controller_name]`.
10
10
  ctable_entry {
11
11
  root_view, //A constant string of the name of the view this controller sets as it's root view.
12
12
  actions, //A dictionary [String:action_info] that corresponds to a dictionary of action_info object's based on the action's name.
13
- spots, //An array fo spot names for this controller
13
+ spots, //An array fo spot names for this controller, by default, the 'main' spot is counted as 1 spot.
14
14
  name, //The name of the controller, useful for certain lookup operations, this is also the ctable key
15
15
  __init__, //A function that is called when this controller is created. Signals service connection and the controller on_entry bits.
16
16
  Additionally, all interval timers are configured here based on their unique names. Actions that are not active will not receive these events (they
@@ -208,6 +208,50 @@ module Flok
208
208
  }]);
209
209
  }
210
210
  out.puts res
211
+ elsif l =~ /Push/
212
+ l.strip!
213
+ l.gsub!(/Push\(/, "")
214
+ l.gsub! /\)$/, ""
215
+ l.gsub! /\);$/, ""
216
+ o = l.split(",").map{|e| e.strip}
217
+
218
+ action_name = o.shift.gsub(/"/, "")
219
+
220
+ #Switch the actions, reset embeds, and call on_entry
221
+ res = %{
222
+ var old_action = __info__.action;
223
+ __info__.action = "#{action_name}";
224
+
225
+ //Prep embeds array, embeds[0] refers to the spot bp+2 (bp is vc, bp+1 is main)
226
+ __info__.embeds = [];
227
+ for (var i = 1; i < #{@controller.spots.count}; ++i) {
228
+ __info__.embeds.push([]);
229
+ }
230
+
231
+ //Call on_entry for the new action via the singleton on_entry
232
+ //located in ctable
233
+ __info__.cte.actions[__info__.action].on_entry(__base__)
234
+
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
+ //Send off event for action change
241
+ main_q.push([3, "if_event", __base__, "action", {
242
+ from: old_action,
243
+ to: "#{action_name}"
244
+ }]);
245
+ }
246
+ out.puts res
247
+ elsif l =~ /Pop/
248
+ l.strip!
249
+ l.gsub!(/Pop\(/, "")
250
+ l.gsub! /\)$/, ""
251
+ l.gsub! /\);$/, ""
252
+ o = l.split(",").map{|e| e.strip}
253
+
254
+ #out.puts res
211
255
  #Request(service_instance_name, ename, info)
212
256
  elsif l =~ /Request/
213
257
  l.strip!
@@ -1,3 +1,3 @@
1
1
  module Flok
2
- VERSION = "0.0.62"
2
+ VERSION = "0.0.63"
3
3
  end
@@ -192,6 +192,46 @@ shared_context "kern" do
192
192
  end
193
193
  end
194
194
 
195
+ #Expect the queue to not contain a message matching
196
+ def expect_not_to_contain msg_name, &block
197
+ original_q = JSON.parse(@q.to_json)
198
+
199
+ loop do
200
+ if @q.count == 0 and @cq.count == 0
201
+ #Good
202
+ @q = original_q
203
+ @cq = nil
204
+ return
205
+ end
206
+ #Dequeue from multi-priority queue if possible
207
+ if @cq.nil? or @cq.count == 0
208
+ @cq = @q.shift
209
+ @cp = @cq.shift #save priority
210
+ end
211
+
212
+ #Check to see if it's the correct item
213
+ arg_len = @cq.shift
214
+ name = @cq.shift
215
+ if arg_len.class == String
216
+ $stderr.puts "Arg len is: #{arg_len.inspect}"
217
+ $stderr.puts "Name is #{name.inspect}"
218
+ end
219
+ args = @cq.shift(arg_len)
220
+
221
+ #Matches message name
222
+ if name == msg_name
223
+ #Optional test block
224
+ if block
225
+ next unless block.call(args)
226
+ end
227
+
228
+ #Uh oh, we found one!
229
+ block_info = block ? " You gave a block to filter... check the code to see what it's checking for, it's more than just the message name" : ""
230
+ raise "Expected not to find a message matching #{msg_name.inspect} in the queue, but found one!#{block_info}"
231
+ end
232
+ end
233
+ end
234
+
195
235
  #Retrieve a message, we at least expect a name and priority
196
236
  def get msg_name, priority=0
197
237
  #Dequeue from multi-priority queue if possible
@@ -11,6 +11,7 @@ RSpec.describe "User compiler" do
11
11
  compiler = Flok::UserCompiler
12
12
  js_src(fn)
13
13
  js_res = compiler.compile(js_src(fn))
14
+ File.write "/Users/Seo/Desktop/js_src.js", js_res
14
15
  ctx = V8::Context.new
15
16
  ctx.eval js_res
16
17
  return ctx, js_res
@@ -0,0 +1,26 @@
1
+ controller :my_controller do
2
+ spots "hello", "world"
3
+
4
+ action :my_action do
5
+ on_entry %{
6
+ Embed("my_controller2", "hello", {});
7
+ }
8
+
9
+ on "test_event", %{
10
+ Push("my_other_action")
11
+ }
12
+ end
13
+
14
+ action :my_other_action do
15
+ on_entry %{
16
+ my_other_action_on_entry_called = true;
17
+ }
18
+ end
19
+ end
20
+
21
+ controller :my_controller2 do
22
+ action :my_action do
23
+ on_entry %{
24
+ }
25
+ end
26
+ end
@@ -0,0 +1,30 @@
1
+ controller :my_controller do
2
+ spots "hello", "world"
3
+
4
+ action :my_action do
5
+ on_entry %{
6
+ Embed("my_controller2", "hello", {});
7
+ }
8
+
9
+ on "test_event", %{
10
+ Push("my_other_action")
11
+ }
12
+ end
13
+
14
+ action :my_other_action do
15
+ on_entry %{
16
+ my_other_action_on_entry_called = true;
17
+ }
18
+
19
+ on "back", %{
20
+ Pop();
21
+ }
22
+ end
23
+ end
24
+
25
+ controller :my_controller2 do
26
+ action :my_action do
27
+ on_entry %{
28
+ }
29
+ end
30
+ end
@@ -75,7 +75,7 @@ RSpec.describe "kern:controller_spec" do
75
75
  end
76
76
 
77
77
  #Can initialize a controller via embed and the sub-controller has the correct info
78
- it "Can initiate a controller via _embed" do
78
+ it "Can initiate a controller with a sub-controller via _embed" do
79
79
  #Compile the controller
80
80
  ctx = flok_new_user File.read('./spec/kern/assets/embed_info.rb')
81
81
 
@@ -287,7 +287,7 @@ RSpec.describe "kern:controller_spec" do
287
287
  expect(embeds).to eq([[base+4], []])
288
288
  end
289
289
 
290
- it "Can receive 'test_event' and change actions" do
290
+ it "Can receive 'test_event' and change actions via Goto" do
291
291
  #Compile the controller
292
292
  ctx = flok_new_user File.read('./spec/kern/assets/goto.rb')
293
293
 
@@ -305,6 +305,66 @@ RSpec.describe "kern:controller_spec" do
305
305
  expect(ctx.eval("my_other_action_on_entry_called")).not_to eq(nil)
306
306
  end
307
307
 
308
+ it "Can receive 'test_event' and change actions via Push" do
309
+ #Compile the controller
310
+ ctx = flok_new_user File.read('./spec/kern/assets/push.rb')
311
+
312
+ #Run the embed function
313
+ dump = ctx.evald %{
314
+ //Call embed on main root view
315
+ base = _embed("my_controller", 0, {}, null);
316
+
317
+ //Drain queue with test event
318
+ int_dispatch([3, "int_event", base, "test_event", {}]);
319
+
320
+ //The second action was entered
321
+ dump["my_other_action_on_entry_called"] = my_other_action_on_entry_called;
322
+
323
+ //The controller's info
324
+ dump["controller_info"] = tel_deref(base);
325
+ dump["ctable_entry"] = dump["controller_info"]["cte"];
326
+ }
327
+
328
+ #The controller's instance info `action` field was changed to the new action
329
+ expect(dump["controller_info"]["action"]).to eq("my_other_action")
330
+
331
+ #The controller's instance embeds array is the correct blank version
332
+ #Each blank array in embeds refers to one spot (not including the main spot)
333
+ spot_count = dump["ctable_entry"]["spots"].count-1
334
+ expect(dump["controller_info"]["embeds"]).to eq((1..spot_count).map{|e| []})
335
+
336
+ #Does not dealloc the controller (and kill views)
337
+ @driver.expect_not_to_contain "if_free_view"
338
+
339
+ #Controller's action was called
340
+ expect(dump["my_other_action_on_entry_called"]).to eq(true)
341
+
342
+ #Got a notification for the view hierarchy about the change
343
+ @driver.ignore_up_to "if_event" do |e|
344
+ next e[2] == {"from" => "my_action", "to" => "my_other_action"}
345
+ end
346
+ @driver.mexpect("if_event", [Integer, "action", {"from" => "my_action", "to" => "my_other_action"}])
347
+ end
348
+
349
+ it "Can receive 'test_event' and change actions via Push and then back with Pop" do
350
+ #Compile the controller
351
+ ctx = flok_new_user File.read('./spec/kern/assets/push_pop.rb')
352
+
353
+ #Run the embed function
354
+ ctx.eval %{
355
+ //Call embed on main root view
356
+ base = _embed("my_controller", 0, {}, null);
357
+
358
+ //Drain queue with test event
359
+ int_dispatch([3, "int_event", base, "test_event", {}]);
360
+ }
361
+
362
+ #Now we expect the action for the controller to be 'my_other_action' and for it's on_entry
363
+ #to be called
364
+ expect(ctx.eval("my_other_action_on_entry_called")).not_to eq(nil)
365
+ end
366
+
367
+
308
368
  it "Does tear down the old embedded view from the embedded view controller when switching actions" do
309
369
  #Compile the controller
310
370
  ctx = flok_new_user File.read('./spec/kern/assets/goto.rb')
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: flok
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.62
4
+ version: 0.0.63
5
5
  platform: ruby
6
6
  authors:
7
7
  - seo
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-07-16 00:00:00.000000000 Z
11
+ date: 2015-07-17 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: execjs
@@ -1159,6 +1159,8 @@ files:
1159
1159
  - spec/kern/assets/interval3.rb
1160
1160
  - spec/kern/assets/lower_event.rb
1161
1161
  - spec/kern/assets/no_choose_action.rb
1162
+ - spec/kern/assets/push.rb
1163
+ - spec/kern/assets/push_pop.rb
1162
1164
  - spec/kern/assets/raise_event.rb
1163
1165
  - spec/kern/assets/rest_service/config0.rb
1164
1166
  - spec/kern/assets/rest_service/controller0.rb
@@ -2086,6 +2088,8 @@ test_files:
2086
2088
  - spec/kern/assets/interval3.rb
2087
2089
  - spec/kern/assets/lower_event.rb
2088
2090
  - spec/kern/assets/no_choose_action.rb
2091
+ - spec/kern/assets/push.rb
2092
+ - spec/kern/assets/push_pop.rb
2089
2093
  - spec/kern/assets/raise_event.rb
2090
2094
  - spec/kern/assets/rest_service/config0.rb
2091
2095
  - spec/kern/assets/rest_service/controller0.rb