flor 0.9.5 → 0.10.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (91) hide show
  1. data/CHANGELOG.md +10 -0
  2. data/Makefile +13 -5
  3. data/README.md +0 -35
  4. data/flor.gemspec +1 -0
  5. data/lib/flor.rb +6 -24
  6. data/lib/flor/changes.rb +26 -0
  7. data/lib/flor/colours.rb +65 -31
  8. data/lib/flor/conf.rb +84 -54
  9. data/lib/flor/core.rb +0 -23
  10. data/lib/flor/core/executor.rb +12 -42
  11. data/lib/flor/core/node.rb +19 -24
  12. data/lib/flor/core/procedure.rb +13 -24
  13. data/lib/flor/core/texecutor.rb +10 -28
  14. data/lib/flor/deep.rb +152 -0
  15. data/lib/flor/djan.rb +200 -0
  16. data/lib/flor/dollar.rb +0 -24
  17. data/lib/flor/errors.rb +0 -24
  18. data/lib/flor/flor.rb +43 -296
  19. data/lib/flor/id.rb +90 -0
  20. data/lib/flor/log.rb +12 -35
  21. data/lib/flor/migrations/0002_cunit_and_munit.rb +86 -0
  22. data/lib/flor/parser.rb +40 -46
  23. data/lib/flor/pcore/_arr.rb +0 -24
  24. data/lib/flor/pcore/_atom.rb +0 -24
  25. data/lib/flor/pcore/_att.rb +3 -25
  26. data/lib/flor/pcore/_dump.rb +0 -24
  27. data/lib/flor/pcore/_err.rb +0 -24
  28. data/lib/flor/pcore/_happly.rb +0 -24
  29. data/lib/flor/pcore/_obj.rb +0 -24
  30. data/lib/flor/pcore/_skip.rb +0 -24
  31. data/lib/flor/pcore/arith.rb +0 -24
  32. data/lib/flor/pcore/break.rb +0 -24
  33. data/lib/flor/pcore/case.rb +127 -0
  34. data/lib/flor/pcore/cmp.rb +0 -24
  35. data/lib/flor/pcore/cond.rb +24 -24
  36. data/lib/flor/pcore/cursor.rb +0 -24
  37. data/lib/flor/pcore/define.rb +0 -24
  38. data/lib/flor/pcore/fail.rb +0 -24
  39. data/lib/flor/pcore/if.rb +39 -0
  40. data/lib/flor/pcore/loop.rb +0 -24
  41. data/lib/flor/pcore/map.rb +0 -24
  42. data/lib/flor/pcore/match.rb +0 -24
  43. data/lib/flor/pcore/move.rb +0 -24
  44. data/lib/flor/pcore/noeval.rb +0 -24
  45. data/lib/flor/pcore/noret.rb +0 -24
  46. data/lib/flor/pcore/push.rb +1 -25
  47. data/lib/flor/pcore/rand.rb +59 -0
  48. data/lib/flor/pcore/sequence.rb +0 -24
  49. data/lib/flor/pcore/set.rb +0 -24
  50. data/lib/flor/pcore/stall.rb +0 -24
  51. data/lib/flor/pcore/until.rb +0 -24
  52. data/lib/flor/pcore/val.rb +0 -24
  53. data/lib/flor/punit/cancel.rb +0 -24
  54. data/lib/flor/punit/cmap.rb +0 -24
  55. data/lib/flor/punit/concurrence.rb +54 -24
  56. data/lib/flor/punit/every.rb +0 -24
  57. data/lib/flor/punit/graft.rb +41 -0
  58. data/lib/flor/punit/on.rb +0 -24
  59. data/lib/flor/punit/schedule.rb +0 -24
  60. data/lib/flor/punit/signal.rb +0 -24
  61. data/lib/flor/punit/sleep.rb +0 -24
  62. data/lib/flor/punit/task.rb +0 -26
  63. data/lib/flor/punit/trace.rb +0 -24
  64. data/lib/flor/punit/trap.rb +0 -24
  65. data/lib/flor/to_string.rb +4 -25
  66. data/lib/flor/tools/env.rb +0 -23
  67. data/lib/flor/tools/shell.rb +810 -0
  68. data/lib/flor/unit.rb +0 -23
  69. data/lib/flor/unit/executor.rb +35 -31
  70. data/lib/flor/unit/ganger.rb +9 -34
  71. data/lib/flor/unit/hooker.rb +5 -25
  72. data/lib/flor/unit/journal.rb +0 -23
  73. data/lib/flor/unit/loader.rb +63 -94
  74. data/lib/flor/unit/logger.rb +8 -27
  75. data/lib/flor/unit/models.rb +0 -24
  76. data/lib/flor/unit/models/execution.rb +13 -24
  77. data/lib/flor/unit/models/pointer.rb +0 -24
  78. data/lib/flor/unit/models/timer.rb +0 -24
  79. data/lib/flor/unit/models/trace.rb +0 -24
  80. data/lib/flor/unit/models/trap.rb +0 -24
  81. data/lib/flor/unit/scheduler.rb +157 -128
  82. data/lib/flor/unit/storage.rb +224 -167
  83. data/lib/flor/unit/taskers.rb +38 -25
  84. data/lib/flor/unit/waiter.rb +7 -26
  85. data/lib/flor/unit/wlist.rb +8 -24
  86. metadata +28 -7
  87. data/fail.txt +0 -16
  88. data/intercepted.txt +0 -123
  89. data/lib/flor/pcore/ife.rb +0 -56
  90. data/lib/flor/tools/repl.rb +0 -231
  91. data/out.txt +0 -206
@@ -1,231 +0,0 @@
1
-
2
- require 'flor'
3
- require 'flor/unit'
4
-
5
-
6
- module Flor::Tools
7
-
8
- class Repl
9
-
10
- def initialize(env)
11
-
12
- @unit = Flor::Unit.new("envs/#{env}/etc/conf.json")
13
-
14
- #pp @unit.conf
15
- @unit.conf[:unit] = 'repl'
16
-
17
- #unit.hooker.add('journal', Flor::Journal)
18
- if @unit.conf['sto_uri'].match(/memory/)
19
- @unit.storage.delete_tables
20
- @unit.storage.migrate
21
- end
22
- @unit.start
23
-
24
- @lines = []
25
- @payload = {}
26
- @vars = {}
27
-
28
- @outcome = nil
29
-
30
- @unit.hook do |message|
31
-
32
- if ! message['consumed']
33
- # do nothing
34
- elsif %w[ terminated failed ].include?(message['point'])
35
- @outcome = message
36
- out = Flor.to_pretty_s(@outcome)
37
- col = message['point'] == 'failed' ? _rd : _gr
38
- out = out.gsub(/"point"=>"([^"]+)"/, "\"point\"=>\"#{col}\\1#{_yl}\"")
39
- out = "\n" + _yl + out + _rs
40
- out = out.split("\n").collect { |l| ' ' + l }.join("\n")
41
- print(out)
42
- end
43
- end
44
-
45
- @_c, @_dg, @_yl, @_bl, @_lg, @_gr, @_lr, @_rd = Flor.colours({})
46
-
47
- do_loop
48
- end
49
-
50
- # reset dark_grey light_yellow blue light_grey light_green light_red red
51
- attr_reader :_rs, :_dg, :_yl, :_bl, :_lg, :_gr, :_lr, :_rd
52
-
53
- protected
54
-
55
- def prompt
56
-
57
- "flor l#{@lines.size} > "
58
- end
59
-
60
- def do_loop
61
-
62
- loop do
63
-
64
- line = prompt_and_read
65
-
66
- break unless line
67
- next if line.strip == ''
68
-
69
- cmd = "cmd_#{line.split(/\s/).first}".to_sym
70
-
71
- if cmd.size > 4 && methods.include?(cmd)
72
- begin
73
- send(cmd, line)
74
- rescue StandardError, NotImplementedError => err
75
- p err
76
- err.backtrace[0, 7].each { |l| puts " #{l}" }
77
- end
78
- else
79
- @lines << line
80
- end
81
- end
82
-
83
- $stdout.puts
84
- end
85
-
86
- def hlp_launch
87
- %{ launches the current execution code }
88
- end
89
- def cmd_launch(line)
90
-
91
- exid = @unit.launch(@lines.join("\n"), vars: @vars, payload: @payload)
92
- puts " launched #{_yl}#{exid}#{_rs}"
93
- end
94
-
95
- alias hlp_run hlp_launch
96
- alias cmd_run cmd_launch
97
-
98
- def hlp_help
99
- %{ displays this help }
100
- end
101
- def cmd_help(line)
102
-
103
- puts
104
- puts "## available commands:"
105
- puts
106
- COMMANDS.each do |cmd|
107
- print "* #{cmd}"
108
- if hlp = (send("hlp_#{cmd}") rescue nil); print " - #{hlp.strip}"; end
109
- puts
110
- end
111
- puts
112
- end
113
-
114
- def hlp_exit
115
- %{ exits this repl, with the given int exit code or 0 }
116
- end
117
- def cmd_exit(line)
118
-
119
- exit(line.split(/\s+/)[1].to_i)
120
- end
121
-
122
- def hlp_list
123
- %{ lists the lines of the current execution code }
124
- end
125
- def do_list(lines)
126
-
127
- lw = [ 2, lines.size.to_s.length ].max
128
- sw = 5 - lw
129
-
130
- lines.each_with_index do |l, i|
131
- puts "#{_dg}% #{sw}s%0#{lw}i #{_yl}%s#{_rs}" % [ '', i + 1, l ]
132
- end
133
- end
134
- def cmd_list(line)
135
-
136
- do_list(@lines)
137
- end
138
-
139
- def hlp_parse
140
- %{ parses the current execution code and displays its tree }
141
- end
142
- def cmd_parse(line)
143
-
144
- Flor.print_tree(
145
- Flor::Lang.parse(@lines.join("\n"), nil, {}),
146
- '0',
147
- headers: false)
148
- end
149
-
150
- def hlp_new
151
- %w{ erases current execution code, vars and payload }
152
- end
153
- def cmd_new(line)
154
-
155
- @lines = []
156
- @vars = {}
157
- @payload = {}
158
- end
159
-
160
- def fname(line)
161
-
162
- line.split(/\s+/)[1]
163
- end
164
-
165
- def hlp_save
166
- %{ saves the current execution code to the given file }
167
- end
168
- def cmd_save(line)
169
-
170
- File.open(fname(line), 'wb') { |f| f.puts @lines }
171
- end
172
-
173
- def hlp_cat
174
- %{ outputs the content of the give file }
175
- end
176
- def cmd_cat(line)
177
-
178
- do_list(File.readlines(fname(line)).collect(&:chomp))
179
- end
180
-
181
- def hlp_load
182
- %{ loads a file as execution code }
183
- end
184
- def cmd_load(line)
185
-
186
- @lines = File.readlines(fname(line)).collect(&:chomp)
187
- end
188
-
189
- def cmd_cont(line)
190
-
191
- fail NotImplementedError
192
- end
193
-
194
- def hlp_edit
195
- %{ saves the current execution code to .tmp.flo and opens it for edition }
196
- end
197
- def cmd_edit(line)
198
-
199
- cmd_save('save .tmp.flo')
200
- system('$EDITOR .tmp.flo')
201
- cmd_load('load .tmp.flo')
202
- FileUtils.rm('.tmp.flo')
203
- end
204
-
205
- #
206
- # use Readline if possible
207
-
208
- COMMANDS = self.allocate.methods \
209
- .select { |m| m.to_s.match(/^cmd_/) }.collect { |m| m[4..-1] }.sort
210
-
211
- begin
212
- require 'readline'
213
- def prompt_and_read
214
- Readline.readline(prompt, true)
215
- end
216
- Readline.completion_proc =
217
- proc { |s|
218
- r = /^#{Regexp.escape(s)}/
219
- COMMANDS.grep(r) + Dir["#{s}*"].grep(r)
220
- }
221
- #Readline.completion_append_character =
222
- # " "
223
- rescue LoadError => le
224
- def prompt_and_read
225
- print(prompt)
226
- ($stdin.readline rescue false)
227
- end
228
- end
229
- end
230
- end
231
-
data/out.txt DELETED
@@ -1,206 +0,0 @@
1
-
2
- 054400 satsuma 我 ~/w/sg (master) マ FLOR_DEBUG=dbg bxs spec/functional/cases/awm_activation_spec.rb:198
3
-
4
- java 1.9.3
5
- Run options: include {:locations=>{"./spec/functional/cases/awm_activation_spec.rb"=>[198]}}
6
-
7
- Sg::Cases::AwmActivation
8
- .reply
9
- as OPS
10
- +---
11
- | {:vars=>{:launcher=>2002}, :payload=>{"client"=>{"rm"=>"2002", "codename"=>"brilliant-fire-4", "nationality"=>"Singapore", "domicile"=>"Singapore", "amount"=>1000000, "currency"=>"USD", "orientation"=>"Standard", "amountUsd"=>1000000, "amountString"=>"1,000,000", "amountUsdString"=>"1,000,000", "mandateId"=>"2002-201702050001"}, "objective"=>{"o"=>"b", "objective"=>"Build"}, "risk"=>{"profile"=>"Aggressive Growth", "level"=>4, "self"=>{"profile"=>"Aggressive Growth", "level"=>4}, "a"=>{"profile"=>"Aggressive Growth", "level"=>4}, "b"=>{"profile"=>"Aggressive Growth", "level"=>4}, "answers"=>["#raAggressiveGrowth", "#raPioGrowth", "#raWpLow", "#raCfNo", "#raPfz", "#raHl8", "#raReIncrease"], "mode"=>"normal"}, "strategy"=>{"name"=>"Conservative", "c"=>"c3", "i"=>3}, "agreement"=>{"allin"=>"1.10%", "discounted"=>"1.00%", "rate"=>"0%"}}, :fname=>"flor/lib/flows/iwm.asia.pfs/awm/awm_activation.flo", :colour=>true}
12
- | # awm_activation.flo
13
- | sequence
14
- | create_mandate _
15
- | ops 'assign container number'
16
- | update_mandate status: 'numbered'
17
- | pfs 'activate mandate'
18
- | update_mandate status: 'active'
19
- | email 'rm' 'awm mandate activated'
20
- .
21
- +---
22
- | 0 sequence L4
23
- | 0_0 create_mandate L6
24
- | 0_0_0 _att L6
25
- | 0_0_0_0 _ L6
26
- | 0_1 ops L8
27
- | 0_1_0 _att L8
28
- | 0_1_0_0 _sqs assign container number L8
29
- | 0_2 update_mandate L9
30
- | 0_2_0 _att L9
31
- | 0_2_0_0 status L9
32
- | 0_2_0_1 _sqs numbered L9
33
- | 0_3 pfs L11
34
- | 0_3_0 _att L11
35
- | 0_3_0_0 _sqs activate mandate L11
36
- | 0_4 update_mandate L12
37
- | 0_4_0 _att L12
38
- | 0_4_0_0 status L12
39
- | 0_4_0_1 _sqs active L12
40
- | 0_5 email L14
41
- | 0_5_0 _att L14
42
- | 0_5_0_0 _sqs rm L14
43
- | 0_5_1 _att L14
44
- | 0_5_1_0 _sqs awm mandate activated L14
45
- .
46
- /--- run starts Flor::UnitExecutor 7816 iwm.asia.pfs.awm-u0-20170204.2056.kilodababi
47
- | {:thread=>7818}
48
- | {:counters=>{}, :nodes=>0, :size=>132}
49
- 20:56:36.753 bi 0 exe [sequence L4] [[create_mandate,[[_att,[[_,[],6]],6]],6],[... m1s_ f.ret null vars:launcher
50
- 20:56:36.784 bi 0_0 exe [task L6] [[_att,[[_sqs,create_mandate,6]],6],[_att,[... m2s1r1>1 from 0 f.ret null
51
- 20:56:36.786 bi 0_0_0 exe [_att L6] [[_sqs,create_mandate,6]] m3s2r1>1 from 0_0 f.ret null
52
- 20:56:36.791 bi 0_0_0_0 exe ended: [_sqs L6] create_mandate m4s3r1>1 from 0_0_0 f.ret create_mandate
53
- 20:56:36.792 bi 0_0_0 rec ended: [_att L6] hp:_att m5s4r1>1 from 0_0_0_0 f.ret create_mandate
54
- 20:56:36.793 bi 0_0 rec [task L6] hp:task m6s5r1>1 from 0_0_0 f.ret create_mandate
55
- 20:56:36.794 bi 0_0_1 exe ended: [_att L6] [[_,[],6]] m7s6r1>1 from 0_0 f.ret create_mandate
56
- 20:56:36.796 bi 0_0 rec [task L6] hp:task m8s7r1>1 from 0_0_1 f.ret create_mandate
57
- 20:56:37.019 bi 0_0 tas [task L6] hp:task m9s8r1>1 from 0_0 f.ret create_mandate
58
- | run ends Flor::UnitExecutor 7816 iwm.asia.pfs.awm-u0-20170204.2056.kilodababi
59
- | {:took=>1.282}
60
- | {:thread=>7818, :consumed=>9, :traps=>0}
61
- | {:counters=>{"runs"=>1, "msgs"=>9, "omsgs"=>0}, :nodes=>2, :size=>861}
62
- \--- .
63
- /--- run starts Flor::UnitExecutor 7824 iwm.asia.pfs.awm-u0-20170204.2056.kilodababi
64
- | {:thread=>7826}
65
- | {:counters=>{}, :nodes=>0, :size=>132}
66
- 20:56:38.037 bi 0_0 ret m1s_ f.ret create_mandate
67
- 20:56:38.038 bi 0_0 rec m2s_r1>1 f.ret create_mandate
68
- /=e092 =exe=exe=exe=exe=exe=exe=exe=exe=exe=exe=exe=exe=exe=exe=exe=exe=exe
69
- |=e092 + in Flor::UnitExecutor#do_run
70
- |=e092 error: #<NoMethodError: undefined method `[]' for nil:NilClass>
71
- |=e092 db: Sequel::JDBC::Database 321524886
72
- |=e092 thread: t7826 #<Thread:0x3b42dc22 run>
73
- |=e092 exe:
74
- |=e092 exid: "iwm.asia.pfs.awm-u0-20170204.2056.kilodababi"
75
- |=e092 counters: {"runs"=>1, "msgs"=>2, "omsgs"=>0}
76
- |=e092 messages:
77
- |=e092 []
78
- |=e092 storage errored items/models:
79
- |=e092 * {"exid"=>"iwm.asia.pfs.awm-u0-20170204.2056.kilodababi", "nodes"=>{}, "errors"=>[], "tasks"=>{}, "counters"=>{"runs"=>1, "msgs"=>2, "omsgs"=>0}, "start"=>"2017-02-04T20:56:36.736000Z", "size"=>132, "id"=>58}
80
- |=e092 error: #<NoMethodError: undefined method `[]' for nil:NilClass>
81
- |=e092 backtrace:
82
- |=e092 /Users/jmettraux/w/sg/subrepos/flor/lib/flor/unit/storage.rb:156:in `put_execution'
83
- |=e092 /Users/jmettraux/w/sg/subrepos/flor/lib/flor/unit/executor.rb:112:in `do_run'
84
- |=e092 /Users/jmettraux/w/sg/subrepos/flor/lib/flor/unit/executor.rb:53:in `run'
85
- \=e092 =exe=exe=exe=exe=exe=exe=exe=exe=exe=exe=exe=exe=exe=exe=exe=exe=exe .
86
-
87
-
88
-
89
-
90
- dump:
91
-
92
- {:execution=>
93
- {"exid"=>"iwm.asia.pfs.awm-u0-20170204.2056.kilodababi",
94
- "nodes"=>{},
95
- "errors"=>[],
96
- "tasks"=>{},
97
- "counters"=>{"runs"=>1, "msgs"=>2, "omsgs"=>0},
98
- "start"=>"2017-02-04T20:56:36.736000Z",
99
- "size"=>132,
100
- "id"=>58},
101
- :messages=>[],
102
- :consumed=>
103
- [{"point"=>"return",
104
- "exid"=>"iwm.asia.pfs.awm-u0-20170204.2056.kilodababi",
105
- "nid"=>"0_0",
106
- "payload"=>
107
- {"client"=>
108
- {"rm"=>"2002",
109
- "codename"=>"brilliant-fire-4",
110
- "nationality"=>"Singapore",
111
- "domicile"=>"Singapore",
112
- "amount"=>1000000,
113
- "currency"=>"USD",
114
- "orientation"=>"Standard",
115
- "amountUsd"=>1000000,
116
- "amountString"=>"1,000,000",
117
- "amountUsdString"=>"1,000,000",
118
- "mandateId"=>"2002-201702050001"},
119
- "objective"=>{"o"=>"b", "objective"=>"Build"},
120
- "risk"=>
121
- {"profile"=>"Aggressive Growth",
122
- "level"=>4,
123
- "self"=>{"profile"=>"Aggressive Growth", "level"=>4},
124
- "a"=>{"profile"=>"Aggressive Growth", "level"=>4},
125
- "b"=>{"profile"=>"Aggressive Growth", "level"=>4},
126
- "answers"=>
127
- ["#raAggressiveGrowth",
128
- "#raPioGrowth",
129
- "#raWpLow",
130
- "#raCfNo",
131
- "#raPfz",
132
- "#raHl8",
133
- "#raReIncrease"],
134
- "mode"=>"normal"},
135
- "strategy"=>{"name"=>"Conservative", "c"=>"c3", "i"=>3},
136
- "agreement"=>{"allin"=>"1.10%", "discounted"=>"1.00%", "rate"=>"0%"},
137
- "ret"=>"create_mandate"},
138
- "tasker"=>"create_mandate",
139
- "mid"=>144,
140
- "m"=>1,
141
- "pr"=>1,
142
- "consumed"=>"2017-02-04T20:56:38.037000Z"},
143
- {"point"=>"receive",
144
- "exid"=>"iwm.asia.pfs.awm-u0-20170204.2056.kilodababi",
145
- "nid"=>"0_0",
146
- "payload"=>
147
- {"client"=>
148
- {"rm"=>"2002",
149
- "codename"=>"brilliant-fire-4",
150
- "nationality"=>"Singapore",
151
- "domicile"=>"Singapore",
152
- "amount"=>1000000,
153
- "currency"=>"USD",
154
- "orientation"=>"Standard",
155
- "amountUsd"=>1000000,
156
- "amountString"=>"1,000,000",
157
- "amountUsdString"=>"1,000,000",
158
- "mandateId"=>"2002-201702050001"},
159
- "objective"=>{"o"=>"b", "objective"=>"Build"},
160
- "risk"=>
161
- {"profile"=>"Aggressive Growth",
162
- "level"=>4,
163
- "self"=>{"profile"=>"Aggressive Growth", "level"=>4},
164
- "a"=>{"profile"=>"Aggressive Growth", "level"=>4},
165
- "b"=>{"profile"=>"Aggressive Growth", "level"=>4},
166
- "answers"=>
167
- ["#raAggressiveGrowth",
168
- "#raPioGrowth",
169
- "#raWpLow",
170
- "#raCfNo",
171
- "#raPfz",
172
- "#raHl8",
173
- "#raReIncrease"],
174
- "mode"=>"normal"},
175
- "strategy"=>{"name"=>"Conservative", "c"=>"c3", "i"=>3},
176
- "agreement"=>{"allin"=>"1.10%", "discounted"=>"1.00%", "rate"=>"0%"},
177
- "ret"=>"create_mandate"},
178
- "tasker"=>"create_mandate",
179
- "er"=>1,
180
- "m"=>2,
181
- "pr"=>1,
182
- "consumed"=>"2017-02-04T20:56:38.038000Z"}],
183
- :traps=>[],
184
- :exid=>"iwm.asia.pfs.awm-u0-20170204.2056.kilodababi",
185
- :alive=>false,
186
- :shutdown=>false,
187
- :thread=>[7826, "#<Thread:0x3b42dc22>"]}
188
- --------------------------------------------------------------------------------
189
- /=e091 =exe=exe=exe=exe=exe=exe=exe=exe=exe=exe=exe=exe=exe=exe=exe=exe=exe
190
- |=e091 + in Flor::UnitExecutor#do_run
191
- |=e091 error: #<NoMethodError: undefined method `[]' for nil:NilClass>
192
- |=e091 db: Sequel::JDBC::Database 321524886
193
- |=e091 thread: t7826 #<Thread:0x3b42dc22 run>
194
- |=e091 exe:
195
- |=e091 exid: "iwm.asia.pfs.awm-u0-20170204.2056.kilodababi"
196
- |=e091 counters: {"runs"=>1, "msgs"=>2, "omsgs"=>0}
197
- |=e091 messages:
198
- |=e091 []
199
- |=e091 storage errored items/models:
200
- |=e091 * {"exid"=>"iwm.asia.pfs.awm-u0-20170204.2056.kilodababi", "nodes"=>{}, "errors"=>[], "tasks"=>{}, "counters"=>{"runs"=>1, "msgs"=>2, "omsgs"=>0}, "start"=>"2017-02-04T20:56:36.736000Z", "size"=>132, "id"=>58}
201
- |=e091 error: #<NoMethodError: undefined method `[]' for nil:NilClass>
202
- |=e091 backtrace:
203
- |=e091 /Users/jmettraux/w/sg/subrepos/flor/lib/flor/unit/storage.rb:156:in `put_execution'
204
- |=e091 /Users/jmettraux/w/sg/subrepos/flor/lib/flor/unit/executor.rb:112:in `do_run'
205
- |=e091 /Users/jmettraux/w/sg/subrepos/flor/lib/flor/unit/executor.rb:53:in `run'
206
- \=e091 =exe=exe=exe=exe=exe=exe=exe=exe=exe=exe=exe=exe=exe=exe=exe=exe=exe .