flor 0.9.5 → 0.10.0

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. 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 .