flor 0.17.0 → 1.1.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (165) hide show
  1. checksums.yaml +5 -5
  2. data/CHANGELOG.md +48 -0
  3. data/CREDITS.md +1 -0
  4. data/LICENSE.txt +1 -1
  5. data/Makefile +1 -1
  6. data/README.md +34 -2
  7. data/flor.gemspec +8 -9
  8. data/lib/flor.rb +3 -2
  9. data/lib/flor/colours.rb +5 -3
  10. data/lib/flor/conf.rb +1 -0
  11. data/lib/flor/core.rb +9 -8
  12. data/lib/flor/core/executor.rb +25 -22
  13. data/lib/flor/core/node.rb +1 -13
  14. data/lib/flor/core/procedure.rb +57 -12
  15. data/lib/flor/core/texecutor.rb +35 -3
  16. data/lib/flor/djan.rb +1 -0
  17. data/lib/flor/errors.rb +1 -0
  18. data/lib/flor/flor.rb +173 -29
  19. data/lib/flor/id.rb +5 -1
  20. data/lib/flor/log.rb +20 -8
  21. data/lib/flor/migrations/0001_tables.rb +1 -0
  22. data/lib/flor/migrations/0002_cunit_and_munit.rb +1 -0
  23. data/lib/flor/migrations/0003_timer_onid_bnid.rb +1 -0
  24. data/lib/flor/migrations/0004_trap_bnid.rb +1 -0
  25. data/lib/flor/migrations/0005_pointer_content.rb +1 -0
  26. data/lib/flor/parser.rb +19 -11
  27. data/lib/flor/pcore/_apply.rb +1 -0
  28. data/lib/flor/pcore/_arr.rb +1 -0
  29. data/lib/flor/pcore/_atom.rb +1 -0
  30. data/lib/flor/pcore/_att.rb +1 -0
  31. data/lib/flor/pcore/_coll.rb +1 -0
  32. data/lib/flor/pcore/_dmute.rb +5 -1
  33. data/lib/flor/pcore/_dol.rb +1 -0
  34. data/lib/flor/pcore/_dqs.rb +1 -0
  35. data/lib/flor/pcore/_dump.rb +1 -0
  36. data/lib/flor/pcore/_err.rb +1 -0
  37. data/lib/flor/pcore/_head.rb +1 -0
  38. data/lib/flor/pcore/_obj.rb +1 -0
  39. data/lib/flor/pcore/_pat_.rb +1 -0
  40. data/lib/flor/pcore/_pat_arr.rb +1 -0
  41. data/lib/flor/pcore/_pat_guard.rb +1 -0
  42. data/lib/flor/pcore/_pat_obj.rb +1 -0
  43. data/lib/flor/pcore/_pat_or.rb +1 -0
  44. data/lib/flor/pcore/_pat_regex.rb +1 -0
  45. data/lib/flor/pcore/_ref.rb +1 -0
  46. data/lib/flor/pcore/_rxs.rb +1 -0
  47. data/lib/flor/pcore/_skip.rb +1 -0
  48. data/lib/flor/pcore/_val.rb +1 -0
  49. data/lib/flor/pcore/all.rb +1 -0
  50. data/lib/flor/pcore/andor.rb +1 -0
  51. data/lib/flor/pcore/any.rb +1 -0
  52. data/lib/flor/pcore/apply.rb +1 -0
  53. data/lib/flor/pcore/arith.rb +1 -0
  54. data/lib/flor/pcore/array_qmark.rb +1 -0
  55. data/lib/flor/pcore/break.rb +13 -1
  56. data/lib/flor/pcore/case.rb +1 -0
  57. data/lib/flor/pcore/cmp.rb +1 -0
  58. data/lib/flor/pcore/collect.rb +2 -1
  59. data/lib/flor/pcore/cond.rb +1 -0
  60. data/lib/flor/pcore/cursor.rb +45 -3
  61. data/lib/flor/pcore/define.rb +1 -0
  62. data/lib/flor/pcore/detect.rb +1 -0
  63. data/lib/flor/pcore/do_return.rb +1 -0
  64. data/lib/flor/pcore/each.rb +1 -0
  65. data/lib/flor/pcore/echo.rb +1 -0
  66. data/lib/flor/pcore/empty.rb +1 -0
  67. data/lib/flor/pcore/fail.rb +1 -0
  68. data/lib/flor/pcore/filter.rb +1 -0
  69. data/lib/flor/pcore/find.rb +1 -0
  70. data/lib/flor/pcore/flatten.rb +1 -0
  71. data/lib/flor/pcore/for_each.rb +1 -0
  72. data/lib/flor/pcore/if.rb +1 -0
  73. data/lib/flor/pcore/includes.rb +1 -0
  74. data/lib/flor/pcore/inject.rb +1 -0
  75. data/lib/flor/pcore/iterator.rb +1 -0
  76. data/lib/flor/pcore/keys.rb +1 -0
  77. data/lib/flor/pcore/length.rb +1 -0
  78. data/lib/flor/pcore/loop.rb +1 -0
  79. data/lib/flor/pcore/map.rb +1 -0
  80. data/lib/flor/pcore/match.rb +1 -0
  81. data/lib/flor/pcore/matchr.rb +1 -0
  82. data/lib/flor/pcore/max.rb +1 -0
  83. data/lib/flor/pcore/merge.rb +1 -0
  84. data/lib/flor/pcore/move.rb +1 -0
  85. data/lib/flor/pcore/noeval.rb +1 -0
  86. data/lib/flor/pcore/noret.rb +1 -0
  87. data/lib/flor/pcore/not.rb +1 -0
  88. data/lib/flor/pcore/on.rb +34 -9
  89. data/lib/flor/pcore/on_cancel.rb +1 -0
  90. data/lib/flor/pcore/on_error.rb +1 -0
  91. data/lib/flor/pcore/push.rb +1 -0
  92. data/lib/flor/pcore/rand.rb +1 -0
  93. data/lib/flor/pcore/range.rb +1 -0
  94. data/lib/flor/pcore/reduce.rb +1 -0
  95. data/lib/flor/pcore/return.rb +1 -0
  96. data/lib/flor/pcore/reverse.rb +1 -0
  97. data/lib/flor/pcore/select.rb +1 -0
  98. data/lib/flor/pcore/sequence.rb +49 -0
  99. data/lib/flor/pcore/set.rb +1 -0
  100. data/lib/flor/pcore/shuffle.rb +1 -0
  101. data/lib/flor/pcore/slice.rb +1 -0
  102. data/lib/flor/pcore/sort.rb +1 -0
  103. data/lib/flor/pcore/sort_by.rb +1 -0
  104. data/lib/flor/pcore/split.rb +1 -0
  105. data/lib/flor/pcore/stall.rb +1 -0
  106. data/lib/flor/pcore/strings.rb +1 -0
  107. data/lib/flor/pcore/timestamp.rb +1 -0
  108. data/lib/flor/pcore/to_array.rb +1 -0
  109. data/lib/flor/pcore/twig.rb +1 -0
  110. data/lib/flor/pcore/type_of.rb +1 -0
  111. data/lib/flor/pcore/until.rb +1 -0
  112. data/lib/flor/punit/abort.rb +50 -0
  113. data/lib/flor/punit/c_collect.rb +1 -0
  114. data/lib/flor/punit/c_each.rb +19 -0
  115. data/lib/flor/punit/c_for_each.rb +2 -1
  116. data/lib/flor/punit/c_iterator.rb +2 -1
  117. data/lib/flor/punit/c_map.rb +1 -0
  118. data/lib/flor/punit/cancel.rb +10 -1
  119. data/lib/flor/punit/concurrence.rb +7 -5
  120. data/lib/flor/punit/cron.rb +1 -0
  121. data/lib/flor/punit/do_trap.rb +1 -0
  122. data/lib/flor/punit/every.rb +1 -0
  123. data/lib/flor/punit/graft.rb +1 -0
  124. data/lib/flor/punit/{m_ram.rb → m_receive_and_merge.rb} +5 -4
  125. data/lib/flor/punit/on_timeout.rb +1 -0
  126. data/lib/flor/punit/part.rb +1 -0
  127. data/lib/flor/punit/schedule.rb +1 -0
  128. data/lib/flor/punit/signal.rb +30 -5
  129. data/lib/flor/punit/sleep.rb +1 -0
  130. data/lib/flor/punit/task.rb +9 -2
  131. data/lib/flor/punit/trace.rb +1 -0
  132. data/lib/flor/punit/trap.rb +41 -1
  133. data/lib/flor/to_string.rb +1 -0
  134. data/lib/flor/tools/env.rb +1 -0
  135. data/lib/flor/tools/firb.rb +33 -0
  136. data/lib/flor/tools/shell.rb +13 -3
  137. data/lib/flor/tools/shell_out.rb +1 -0
  138. data/lib/flor/tt.rb +98 -0
  139. data/lib/flor/unit.rb +3 -0
  140. data/lib/flor/unit/caller.rb +158 -23
  141. data/lib/flor/unit/caller_jruby.rb +133 -0
  142. data/lib/flor/unit/dump.rb +36 -0
  143. data/lib/flor/unit/executor.rb +28 -18
  144. data/lib/flor/unit/ganger.rb +30 -18
  145. data/lib/flor/unit/gangers.rb +125 -0
  146. data/lib/flor/unit/hloader.rb +34 -7
  147. data/lib/flor/unit/hook.rb +3 -0
  148. data/lib/flor/unit/hooker.rb +32 -15
  149. data/lib/flor/unit/journal.rb +23 -0
  150. data/lib/flor/unit/loader.rb +142 -15
  151. data/lib/flor/unit/logger.rb +35 -7
  152. data/lib/flor/unit/models.rb +48 -10
  153. data/lib/flor/unit/models/execution.rb +51 -0
  154. data/lib/flor/unit/models/message.rb +6 -0
  155. data/lib/flor/unit/models/pointer.rb +1 -0
  156. data/lib/flor/unit/models/timer.rb +1 -0
  157. data/lib/flor/unit/models/trace.rb +1 -0
  158. data/lib/flor/unit/models/trap.rb +15 -6
  159. data/lib/flor/unit/scheduler.rb +211 -61
  160. data/lib/flor/unit/spooler.rb +1 -0
  161. data/lib/flor/unit/storage.rb +117 -73
  162. data/lib/flor/unit/taskers.rb +115 -1
  163. data/lib/flor/unit/waiter.rb +22 -17
  164. data/lib/flor/unit/wlist.rb +19 -8
  165. metadata +26 -45
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
 
2
3
  class Flor::Pro::TypeOf < Flor::Procedure
3
4
  #
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
 
2
3
  class Flor::Pro::Until < Flor::Procedure
3
4
  #
@@ -0,0 +1,50 @@
1
+ # frozen_string_literal: true
2
+
3
+ class Flor::Pro::Abort < Flor::Procedure
4
+ #
5
+ # Cancels the current execution.
6
+ #
7
+ # Cancels all the root nodes at once. Is usually the equivalent of
8
+ # `cancel '0'` but sometimes the root nodes are gone...
9
+ #
10
+ # "kabort" is like "abort" but the cancel flavour is 'kill', so that
11
+ # cancel handlers are ignored.
12
+ #
13
+ # ```
14
+ # # ...
15
+ # cursor
16
+ # task 'prepare mandate'
17
+ # abort _ if f.outcome == 'reject'
18
+ # task 'sign mandate'
19
+ # # ...
20
+ # ```
21
+ #
22
+ # ## see also
23
+ #
24
+ # Cancel, kill
25
+
26
+ name 'abort', 'kabort'
27
+
28
+ def receive_last
29
+
30
+ fla = heap == 'kabort' ? 'kill' : 'cancel'
31
+
32
+ nodes = @execution['nodes']
33
+ nids = nodes.keys.dup
34
+
35
+ @execution['nodes'].values.each do |n|
36
+
37
+ #p n.select { |k, v| %w[ nid can parent cnodes ].include?(k) }
38
+ nid = n['nid']
39
+ pa = nodes[n['parent']]
40
+
41
+ nids.delete(nid) if pa && pa['cnodes'].include?(nid)
42
+ end
43
+ #p nids
44
+
45
+ wrap_cancel_nodes(nids, { 'flavour' => fla })
46
+ .each { |m| m['from'] = '9' }
47
+ # since '9' isn't the parent of any node
48
+ end
49
+ end
50
+
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
 
2
3
  class Flor::Pro::Ccollect < Flor::Macro::Iterator
3
4
  #
@@ -1,5 +1,24 @@
1
+ # frozen_string_literal: true
1
2
 
2
3
  class Flor::Pro::Ceach < Flor::Macro::Iterator
4
+ #
5
+ # Concurrent "each".
6
+ #
7
+ # ```
8
+ # ceach [ alice bob charly ]
9
+ # task elt "prepare monthly report"
10
+ # ```
11
+ # which is equivalent to
12
+ # ```
13
+ # concurrence
14
+ # task 'alice' "prepare monthly report"
15
+ # task 'bob' "prepare monthly report"
16
+ # task 'charly' "prepare monthly report"
17
+ # ```
18
+ #
19
+ # ## see also
20
+ #
21
+ # For-each, c-map, and c-for-each.
3
22
 
4
23
  names %w[ ceach c-each ]
5
24
 
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
 
2
3
  require 'flor/punit/c_iterator'
3
4
 
@@ -27,7 +28,7 @@ class Flor::Pro::CforEach < Flor::Pro::ConcurrentIterator
27
28
  #
28
29
  # ## see also
29
30
  #
30
- # For-each, cmap, and ceach.
31
+ # For-each, c-map, and c-each.
31
32
 
32
33
  name 'c-for-each'
33
34
 
@@ -1,5 +1,6 @@
1
+ # frozen_string_literal: true
1
2
 
2
- require 'flor/punit/m_ram'
3
+ require 'flor/punit/m_receive_and_merge'
3
4
 
4
5
 
5
6
  # Parent class for "c-for-each" and "c-map"
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
 
2
3
  require 'flor/punit/c_iterator'
3
4
 
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
 
2
3
  class Flor::Pro::Cancel < Flor::Procedure
3
4
  #
@@ -29,7 +30,15 @@ class Flor::Pro::Cancel < Flor::Procedure
29
30
  # ```
30
31
  # But it's kind of brittle compared to using tags.
31
32
  #
32
- # # TODO document "kill"
33
+ # ## kill
34
+ #
35
+ # "kill" is equivalent to "cancel", but once called, cancel handlers are
36
+ # ignored, it cancels through.
37
+ #
38
+ #
39
+ # ## see also
40
+ #
41
+ # On_cancel, on
33
42
 
34
43
  name 'cancel', 'kill'
35
44
  # ruote had "undo" as well...
@@ -1,5 +1,6 @@
1
+ # frozen_string_literal: true
1
2
 
2
- require 'flor/punit/m_ram'
3
+ require 'flor/punit/m_receive_and_merge'
3
4
 
4
5
 
5
6
  class Flor::Pro::Concurrence < Flor::Procedure
@@ -386,10 +387,11 @@ class Flor::Pro::Concurrence < Flor::Procedure
386
387
 
387
388
  REWRITE_AS_ATTS = %w[
388
389
  on_receive on_merge
389
- child_on_error children_on_error ]
390
- #
391
- # heads of the child nodes that should get rewritten as attributes
392
- # of the concurrence ...
390
+ child_on_error children_on_error
391
+ ].freeze
392
+ #
393
+ # heads of the child nodes that should get rewritten as attributes
394
+ # of the concurrence ...
393
395
 
394
396
  def pre_execute_rewrite
395
397
 
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
 
2
3
  require 'flor/punit/schedule'
3
4
 
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
 
2
3
  class Flor::Pro::DoTrap < Flor::Macro
3
4
  #
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
 
2
3
  require 'flor/punit/schedule'
3
4
 
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
 
2
3
  class Flor::Pro::Graft < Flor::Procedure
3
4
  #
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
 
2
3
  # Module extracted out of "concurrence", deals with receivers and mergers.
3
4
  #
@@ -178,15 +179,15 @@ module Flor::Pro::ReceiveAndMerge
178
179
  # * ignore
179
180
  # * stack
180
181
 
181
- STACK_REX = /\Astack(?::([-_a-zA-Z0-9]+))?\z/
182
+ STACK_REX = /\Astack(?::([-_a-zA-Z0-9]+))?\z/.freeze
182
183
 
183
- TRANSLATORS = { STACK_REX => 'k', /\Atail\z/ => 'a' }
184
+ TRANSLATORS = { STACK_REX => 'k', /\Atail\z/ => 'a' }.freeze
184
185
 
185
186
  MORDERS = {
186
- 'f' => :first, 'l' => :last, /[tnh]/ => :north, /[bsa]/ => :south }
187
+ 'f' => :first, 'l' => :last, /[tnh]/ => :north, /[bsa]/ => :south }.freeze
187
188
  MMERGERS = {
188
189
  'd' => :deep, /[mp]/ => :mix, 'o' => :override, 'i' => :ignore,
189
- 'k' => :stack }
190
+ 'k' => :stack }.freeze
190
191
 
191
192
  def default_merger
192
193
 
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
 
2
3
  class Flor::Pro::OnTimeout < Flor::Procedure
3
4
  #
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
 
2
3
  class Flor::Pro::Part < Flor::Procedure
3
4
 
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
 
2
3
  class Flor::Pro::Schedule < Flor::Procedure
3
4
  #
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
 
2
3
  class Flor::Pro::Signal < Flor::Procedure
3
4
  #
@@ -51,6 +52,26 @@ class Flor::Pro::Signal < Flor::Procedure
51
52
  # flor_unit.signal('close', exid: execution_id, payload: { 'f0' => 'zero' })
52
53
  # ```
53
54
  #
55
+ # ## signalling another execution
56
+ #
57
+ # If the exid of execution A is known in execution B, execution B can
58
+ # send a signal to A.
59
+ #
60
+ # ```ruby
61
+ # exid0 = @unit.launch(
62
+ # %q{
63
+ # trap signal: 'green' # block until receiving the 'green' signal
64
+ # set f.done true
65
+ # })
66
+ # @unit.launch(
67
+ # %q{
68
+ # set f.a 'a'
69
+ # signal exid: f.exid0 'green' # send 'green' signal to exid0
70
+ # set f.b 'b'
71
+ # },
72
+ # payload: { 'exid0' => exid0 })
73
+ # ```
74
+ #
54
75
  # ## see also
55
76
  #
56
77
  # On and trap.
@@ -64,14 +85,18 @@ class Flor::Pro::Signal < Flor::Procedure
64
85
 
65
86
  def receive_last
66
87
 
67
- name = att('name', nil)
88
+ na = att('name', nil)
89
+ ei = att('exid') || exid
90
+ pl = att('payload') || payload.copy_current
68
91
 
69
- return super unless name
92
+ return super unless na
70
93
 
71
94
  wrap(
72
- 'point' => 'signal', 'nid' => nid, 'name' => name,
73
- 'payload' => payload.copy_current
74
- ) + super
95
+ 'point' => 'signal',
96
+ 'exid' => ei, 'nid' => nid,
97
+ 'name' => na, 'payload' => pl
98
+ ) +
99
+ super
75
100
  end
76
101
  end
77
102
 
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
 
2
3
  class Flor::Pro::Sleep < Flor::Procedure
3
4
  #
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
 
2
3
  class Flor::Pro::Task < Flor::Procedure
3
4
  #
@@ -68,6 +69,9 @@ class Flor::Pro::Task < Flor::Procedure
68
69
  # clean_up assign: 'alan'
69
70
  # "clean up" assign: 'alan'
70
71
 
72
+ @node['message'] = message
73
+ # keep copy for Executor#return integrity enforcement
74
+
71
75
  nis = atts(nil)
72
76
  ta = att('by', 'for', 'assign')
73
77
  tn = att('with', 'task')
@@ -79,8 +83,7 @@ class Flor::Pro::Task < Flor::Procedure
79
83
 
80
84
  attl, attd = determine_atts
81
85
 
82
- @node['task'] =
83
- { 'tasker' => tasker, 'name' => taskname }
86
+ @node['task'] = { 'tasker' => tasker, 'name' => taskname }
84
87
 
85
88
  wrap(
86
89
  'point' => 'task',
@@ -96,6 +99,9 @@ class Flor::Pro::Task < Flor::Procedure
96
99
 
97
100
  close_node
98
101
 
102
+ @node['message'] = message
103
+ # keep copy for Executor#return integrity enforcement
104
+
99
105
  attl, attd = determine_atts
100
106
 
101
107
  wrap(
@@ -103,6 +109,7 @@ class Flor::Pro::Task < Flor::Procedure
103
109
  'exid' => exid, 'nid' => nid,
104
110
  'tags' => list_tags,
105
111
  'tasker' => att(nil),
112
+ 'taskname' => @node['task']['name'],
106
113
  'attl' => attl, 'attd' => attd,
107
114
  'payload' => determine_payload)
108
115
  end
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
 
2
3
  class Flor::Pro::Trace < Flor::Procedure
3
4
 
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
 
2
3
  # Would it be worth the pain implementing bind:?
3
4
 
@@ -168,6 +169,12 @@ class Flor::Pro::Trap < Flor::Procedure
168
169
  # (org.acme.accounting, org.acme.engineering, org.acme.whatever.x.y.z, ...)
169
170
  #
170
171
  #
172
+ # ## the bnid: directive
173
+ #
174
+ # "bound nid" by default is the nid of the parent expression to the "trap".
175
+ # With `bnid:`, one can bind a trap to another expression.
176
+ #
177
+ #
171
178
  # ## the count: limit
172
179
  #
173
180
  # ```
@@ -178,6 +185,37 @@ class Flor::Pro::Trap < Flor::Procedure
178
185
  # twice.
179
186
  #
180
187
  #
188
+ # ## the payload: directive
189
+ #
190
+ # The `payload:` attribute tells the trap what payload to hand to the
191
+ # trap handler.
192
+ #
193
+ # When `payload: 'event'`, the handler is given a copy of the fields as
194
+ # seen in the event that triggered the trap.
195
+ #
196
+ # When `payload: 'trap'`, the handler is given a copy of the fields as
197
+ # they were when and where the trap was set.
198
+ #
199
+ # When `payload: { a: 'A' }`, the given payload is used (here
200
+ # `{ 'a' => 'A' }`).
201
+ #
202
+ #
203
+ # ## blocking trap
204
+ #
205
+ # One can use a trap without a function. It will block the execution branch
206
+ # until the expect event, signal, etc occurs
207
+ # ```
208
+ # sequence
209
+ # technical_writer 'prepare documentation'
210
+ # team_manager 'submit documentation to review team'
211
+ # trap signal: 'green' # go on after the 'green' signal...
212
+ # team_manager 'deploy documentation'
213
+ # ```
214
+ # Here the execution will block after the team manager submits the doc
215
+ # for review. When the 'green' signal comes, the flow resumes to 'deploy
216
+ # documentation'.
217
+ #
218
+ #
181
219
  # ## see also
182
220
  #
183
221
  # On and signal.
@@ -213,6 +251,8 @@ class Flor::Pro::Trap < Flor::Procedure
213
251
  points = points.uniq if points
214
252
  names = names.uniq if names
215
253
 
254
+ bnid = att('bnid', 'bind') || parent || '0'
255
+
216
256
  msg =
217
257
  if fun
218
258
  apply(fun, [], tree[2], anid: false).first
@@ -222,7 +262,7 @@ class Flor::Pro::Trap < Flor::Procedure
222
262
 
223
263
  tra = {}
224
264
  tra['nid'] = nid
225
- tra['bnid'] = parent || '0'
265
+ tra['bnid'] = bnid
226
266
  tra['points'] = points
227
267
  tra['tags'] = tags
228
268
  tra['heaps'] = heaps
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
 
2
3
  module Flor
3
4
 
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
 
2
3
  require 'fileutils'
3
4
 
@@ -0,0 +1,33 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'irb'
4
+
5
+ #require 'sequel'
6
+ require 'flor'
7
+ require 'flor/unit'
8
+
9
+
10
+ p [ RUBY_VERSION, RUBY_PLATFORM ]
11
+
12
+ puts
13
+
14
+ ENV.each do |k, v|
15
+ next unless k.match?(/RUBY|GEM/)
16
+ puts "* #{k}: #{v}"
17
+ end
18
+
19
+ ARGV.each do |arg|
20
+ if arg.match(/:/)
21
+ DB = Sequel.connect(arg)
22
+ p DB
23
+ end
24
+ end
25
+
26
+ #MODELS = [ :executions, :timers, :traces, :traps, :pointers, :messages ]
27
+ if defined?(DB)
28
+ Flor::Message.dataset = DB[:flor_messages]
29
+ end
30
+
31
+ ARGV.clear
32
+ IRB.start
33
+