flor 1.0.0 → 1.2.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +32 -1
- data/LICENSE.txt +1 -1
- data/README.md +1 -1
- data/lib/flor.rb +2 -1
- data/lib/flor/core/texecutor.rb +26 -1
- data/lib/flor/flor.rb +28 -11
- data/lib/flor/id.rb +4 -1
- data/lib/flor/log.rb +12 -7
- data/lib/flor/punit/c_iterator.rb +1 -1
- data/lib/flor/punit/concurrence.rb +6 -5
- data/lib/flor/punit/{m_ram.rb → m_receive_and_merge.rb} +4 -4
- data/lib/flor/tools/firb.rb +33 -0
- data/lib/flor/tools/shell.rb +12 -3
- data/lib/flor/unit.rb +1 -0
- data/lib/flor/unit/caller.rb +6 -4
- data/lib/flor/unit/caller_jruby.rb +8 -7
- data/lib/flor/unit/executor.rb +18 -13
- data/lib/flor/unit/ganger.rb +3 -0
- data/lib/flor/unit/gangers.rb +125 -0
- data/lib/flor/unit/loader.rb +42 -10
- data/lib/flor/unit/logger.rb +11 -2
- data/lib/flor/unit/models/message.rb +5 -0
- data/lib/flor/unit/models/pointer.rb +20 -1
- data/lib/flor/unit/scheduler.rb +16 -8
- data/lib/flor/unit/storage.rb +54 -46
- data/lib/flor/unit/taskers.rb +68 -0
- data/lib/flor/unit/waiter.rb +20 -16
- data/lib/flor/unit/wlist.rb +9 -0
- metadata +5 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: e89a3c4accc6ee1eca033031352f4c6d20c9b42ffbcb44aebe3cca04b59bc128
|
4
|
+
data.tar.gz: 30914f85dfb1f76de1877cdb60e977eff73cb1ee31d9dfa7b893160799b4c162
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 91cbcbbebccc7209554f49645a43876bf7f2743a77eac4a64ab3daf7f5fbfb8f2e7d566f6ffc03c932222aa2daf82e5674fd52a653bddd8b390b27cbb4714e1c
|
7
|
+
data.tar.gz: 174730b60ab5366c9cae335644ace73722ff52dc34477754020817c630dfabe1f6710846e437bbb936cb76fb4922f04d1dc2ffd2fde64f4c80924bd3dd7a629f
|
data/CHANGELOG.md
CHANGED
@@ -2,7 +2,38 @@
|
|
2
2
|
# CHANGELOG.md
|
3
3
|
|
4
4
|
|
5
|
-
## flor
|
5
|
+
## flor 1.2.1 released 2021-03-22
|
6
|
+
|
7
|
+
* If conf sto_db_logger is false, do not attach a logger to the db connection
|
8
|
+
|
9
|
+
|
10
|
+
## flor 1.2.0 released 2021-03-15
|
11
|
+
|
12
|
+
* Add #attd, #attl, #att_texts to Flor::Pointer
|
13
|
+
|
14
|
+
|
15
|
+
## flor 1.1.1 released 2021-03-03
|
16
|
+
|
17
|
+
* Use YAML to have more compact msg_to_detail_s
|
18
|
+
|
19
|
+
|
20
|
+
## flor 1.1.0 released 2021-01-06
|
21
|
+
|
22
|
+
* Introduce Tasker #set_payload and #set_vars
|
23
|
+
* Introduce the ModuleGanger
|
24
|
+
* Allow for domain/dot.json taskers
|
25
|
+
* Introduce Flor::StagedBasicTasker
|
26
|
+
* Fix service/executor issue in Caller
|
27
|
+
|
28
|
+
|
29
|
+
## flor 1.0.1 released 2020-11-23
|
30
|
+
|
31
|
+
* Accept sto_uri strings pointing to constant like 'DB'
|
32
|
+
|
33
|
+
|
34
|
+
## flor 1.0.0 released 2020-11-22
|
35
|
+
|
36
|
+
* Lots of incremental improvements
|
6
37
|
|
7
38
|
|
8
39
|
## flor 0.18.0 released 2019-05-05
|
data/LICENSE.txt
CHANGED
@@ -1,5 +1,5 @@
|
|
1
1
|
|
2
|
-
Copyright (c) 2015-
|
2
|
+
Copyright (c) 2015-2021, John Mettraux, jmettraux+flor@gmail.com
|
3
3
|
|
4
4
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
5
5
|
of this software and associated documentation files (the "Software"), to deal
|
data/README.md
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
|
2
2
|
# flor
|
3
3
|
|
4
|
-
[![
|
4
|
+
[![tests](https://github.com/floraison/flor/workflows/test/badge.svg)](https://github.com/floraison/flor/actions)
|
5
5
|
[![Gem Version](https://badge.fury.io/rb/flor.svg)](http://badge.fury.io/rb/flor)
|
6
6
|
|
7
7
|
Flor is a "Ruby workflow engine", if that makes any sense.
|
data/lib/flor.rb
CHANGED
data/lib/flor/core/texecutor.rb
CHANGED
@@ -254,7 +254,7 @@ module Flor
|
|
254
254
|
o.each { |ee| ee['_path'] = path if ee.is_a?(Hash) }
|
255
255
|
end
|
256
256
|
|
257
|
-
o
|
257
|
+
rework_conf(o)
|
258
258
|
end
|
259
259
|
|
260
260
|
def interpret_path(path, context=nil)
|
@@ -299,6 +299,31 @@ module Flor
|
|
299
299
|
|
300
300
|
ps.last == 'etc' ? File.absolute_path(File.join(dir, '..')) : dir
|
301
301
|
end
|
302
|
+
|
303
|
+
protected
|
304
|
+
|
305
|
+
# For now, only the return procedure has to be marshalled back
|
306
|
+
# to the "return" string, gh-36
|
307
|
+
#
|
308
|
+
def rework_conf(o)
|
309
|
+
|
310
|
+
case o
|
311
|
+
when Array
|
312
|
+
o.collect { |e|
|
313
|
+
rework_conf(e) }
|
314
|
+
when Hash
|
315
|
+
o.inject({}) { |h, (k, v)|
|
316
|
+
h[k] =
|
317
|
+
if Flor.is_proc_tree?(v) && v[1]['proc'] == 'return'
|
318
|
+
'return'
|
319
|
+
else
|
320
|
+
rework_conf(v)
|
321
|
+
end
|
322
|
+
h }
|
323
|
+
else
|
324
|
+
o
|
325
|
+
end
|
326
|
+
end
|
302
327
|
end
|
303
328
|
end
|
304
329
|
end
|
data/lib/flor/flor.rb
CHANGED
@@ -3,12 +3,11 @@
|
|
3
3
|
module Flor
|
4
4
|
|
5
5
|
NAME_REX = '[a-zA-Z0-9_]+'
|
6
|
-
UNIT_NAME_REX = /\A#{NAME_REX}\z
|
7
|
-
DOMAIN_NAME_REX = /\A#{NAME_REX}(\.#{NAME_REX})*\z
|
8
|
-
FLOW_NAME_REX = /\A(#{NAME_REX}(?:\.#{NAME_REX})*)\.([a-zA-Z0-9_-]+)\z
|
6
|
+
UNIT_NAME_REX = /\A#{NAME_REX}\z/.freeze
|
7
|
+
DOMAIN_NAME_REX = /\A#{NAME_REX}(\.#{NAME_REX})*\z/.freeze
|
8
|
+
FLOW_NAME_REX = /\A(#{NAME_REX}(?:\.#{NAME_REX})*)\.([a-zA-Z0-9_-]+)\z/.freeze
|
9
9
|
|
10
|
-
|
11
|
-
DOMAIN_UNIT_REX = /\A(#{NAME_REX}(?:\.#{NAME_REX})*)-(#{NAME_REX})[-$]/
|
10
|
+
DOMAIN_UNIT_REX = /\A(#{NAME_REX}(?:\.#{NAME_REX})*)-(#{NAME_REX})[-$]/.freeze
|
12
11
|
|
13
12
|
SPLAT_REGEX = /\A(.*)__(_|\d+)\z/.freeze
|
14
13
|
|
@@ -21,7 +20,7 @@ module Flor
|
|
21
20
|
signal cancel
|
22
21
|
terminated failed ceased
|
23
22
|
idle
|
24
|
-
|
23
|
+
].freeze
|
25
24
|
|
26
25
|
class << self
|
27
26
|
|
@@ -280,13 +279,19 @@ module Flor
|
|
280
279
|
#
|
281
280
|
# functions about time
|
282
281
|
|
282
|
+
# Used by the storage in its next_time endeavours
|
283
|
+
#
|
284
|
+
def tstam
|
285
|
+
Time.now.utc.strftime('%FT%T')
|
286
|
+
end
|
287
|
+
|
283
288
|
def isostamp(show_date, show_time, show_usec, time)
|
284
289
|
|
285
290
|
t = (time || Time.now).utc
|
286
291
|
s = StringIO.new
|
287
292
|
|
288
|
-
s << t.strftime('%
|
289
|
-
s << t.strftime('T%
|
293
|
+
s << t.strftime('%F') if show_date # YYYY-mm-dd
|
294
|
+
s << t.strftime('T%T') if show_time # THH:MM:SS
|
290
295
|
s << sprintf('.%06d', t.usec) if show_time && show_usec
|
291
296
|
s << 'Z' if show_time
|
292
297
|
|
@@ -324,6 +329,11 @@ module Flor
|
|
324
329
|
isostamp(false, true, true, t)
|
325
330
|
end
|
326
331
|
|
332
|
+
def monow
|
333
|
+
|
334
|
+
Process.clock_gettime(Process::CLOCK_MONOTONIC)
|
335
|
+
end
|
336
|
+
|
327
337
|
# def to_time(ts)
|
328
338
|
#
|
329
339
|
# m = ts.match(/\A(\d{4})(\d{2})(\d{2})\.(\d{2})(\d{2})(\d{2})(\d+)([uU]?)\z/)
|
@@ -368,11 +378,18 @@ module Flor
|
|
368
378
|
sub_domain?(dom, sub)
|
369
379
|
end
|
370
380
|
|
381
|
+
def dot_join(*elts)
|
382
|
+
|
383
|
+
elts.collect(&:to_s).select { |e| e.length > 0 }.join('.')
|
384
|
+
end
|
385
|
+
|
371
386
|
def sub_domain?(dom, sub)
|
372
387
|
|
373
|
-
dom
|
374
|
-
|
375
|
-
|
388
|
+
d = dom.is_a?(Array) ? dot_join(*dom) : dom.to_s
|
389
|
+
|
390
|
+
d == '' ||
|
391
|
+
sub == d ||
|
392
|
+
sub[0, d.length + 1] == d + '.'
|
376
393
|
end
|
377
394
|
alias subdomain? sub_domain?
|
378
395
|
|
data/lib/flor/id.rb
CHANGED
@@ -2,6 +2,9 @@
|
|
2
2
|
|
3
3
|
module Flor
|
4
4
|
|
5
|
+
NID_REX = /\A[0-9]+(?:_[0-9]+)*(?:-[0-9]+)?\z/.freeze
|
6
|
+
START_NID_REX = /\A[0-9]+(?:_[0-9]+)*(?:-[0-9]+)?/.freeze
|
7
|
+
|
5
8
|
class << self
|
6
9
|
|
7
10
|
#
|
@@ -99,7 +102,7 @@ module Flor
|
|
99
102
|
|
100
103
|
def is_nid?(s)
|
101
104
|
|
102
|
-
!! (s.is_a?(String) && s.match(
|
105
|
+
!! (s.is_a?(String) && s.match(NID_REX))
|
103
106
|
end
|
104
107
|
|
105
108
|
def split_exid(s)
|
data/lib/flor/log.rb
CHANGED
@@ -324,6 +324,7 @@ module Flor
|
|
324
324
|
def msg_to_detail_s(executor, m, opts={})
|
325
325
|
|
326
326
|
return if m['_detail_msg_flag']
|
327
|
+
#
|
327
328
|
m['_detail_msg_flag'] = true if opts[:flag]
|
328
329
|
|
329
330
|
o = StringIO.new
|
@@ -333,18 +334,22 @@ module Flor
|
|
333
334
|
n = executor.execution['nodes'][nid]
|
334
335
|
node = n ? Flor::Node.new(executor, n, m) : nil
|
335
336
|
|
336
|
-
o.puts "#{_c.
|
337
|
-
|
338
|
-
o.puts "#{_c.dg}
|
339
|
-
o.puts
|
340
|
-
|
337
|
+
o.puts "#{_c.rs}#{_c.dg}<Flor.msg_to_detail_s>"
|
338
|
+
|
339
|
+
o.puts "#{_c.dg}message:#{_c.yl}"
|
340
|
+
o.puts YAML.dump(m)
|
341
|
+
|
342
|
+
o.puts "#{_c.dg}tree:#{_c.yl}"
|
341
343
|
o.puts(tree_to_s(node.lookup_tree(nid), nid, out: o)) if node
|
344
|
+
|
342
345
|
o.puts "#{_c.dg}node:#{_c.yl}"
|
343
|
-
o.puts(
|
344
|
-
|
346
|
+
o.puts YAML.dump(n.merge('tree' => '(above)'))
|
347
|
+
|
348
|
+
o.puts "#{_c.dg}nodes:#{_c.yl}"
|
345
349
|
o.puts nods_to_s(executor, m, opts)
|
346
350
|
z = executor.execution['nodes'].size
|
347
351
|
o.puts "#{_c.yl}#{z} node#{z == 1 ? '' : 's'}."
|
352
|
+
|
348
353
|
o.puts "#{_c.dg}</Flor.msg_to_detail_s>#{_c.rs}"
|
349
354
|
|
350
355
|
o.string
|
@@ -1,6 +1,6 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require 'flor/punit/
|
3
|
+
require 'flor/punit/m_receive_and_merge'
|
4
4
|
|
5
5
|
|
6
6
|
class Flor::Pro::Concurrence < Flor::Procedure
|
@@ -387,10 +387,11 @@ class Flor::Pro::Concurrence < Flor::Procedure
|
|
387
387
|
|
388
388
|
REWRITE_AS_ATTS = %w[
|
389
389
|
on_receive on_merge
|
390
|
-
child_on_error children_on_error
|
391
|
-
|
392
|
-
|
393
|
-
|
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 ...
|
394
395
|
|
395
396
|
def pre_execute_rewrite
|
396
397
|
|
@@ -179,15 +179,15 @@ module Flor::Pro::ReceiveAndMerge
|
|
179
179
|
# * ignore
|
180
180
|
# * stack
|
181
181
|
|
182
|
-
STACK_REX = /\Astack(?::([-_a-zA-Z0-9]+))?\z
|
182
|
+
STACK_REX = /\Astack(?::([-_a-zA-Z0-9]+))?\z/.freeze
|
183
183
|
|
184
|
-
TRANSLATORS = { STACK_REX => 'k', /\Atail\z/ => 'a' }
|
184
|
+
TRANSLATORS = { STACK_REX => 'k', /\Atail\z/ => 'a' }.freeze
|
185
185
|
|
186
186
|
MORDERS = {
|
187
|
-
'f' => :first, 'l' => :last, /[tnh]/ => :north, /[bsa]/ => :south }
|
187
|
+
'f' => :first, 'l' => :last, /[tnh]/ => :north, /[bsa]/ => :south }.freeze
|
188
188
|
MMERGERS = {
|
189
189
|
'd' => :deep, /[mp]/ => :mix, 'o' => :override, 'i' => :ignore,
|
190
|
-
'k' => :stack }
|
190
|
+
'k' => :stack }.freeze
|
191
191
|
|
192
192
|
def default_merger
|
193
193
|
|
@@ -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
|
+
|
data/lib/flor/tools/shell.rb
CHANGED
@@ -15,11 +15,16 @@ module Flor::Tools
|
|
15
15
|
def initialize(argv=nil)
|
16
16
|
|
17
17
|
env = ENV['FLOR_ENV'] || 'shell'
|
18
|
-
|
18
|
+
|
19
|
+
@root = File.directory?(env) ? env : "envs/#{env}"
|
19
20
|
|
20
21
|
prepare_home
|
21
22
|
|
22
|
-
|
23
|
+
over_conf = {}
|
24
|
+
#
|
25
|
+
c = ENV['FLOR_STO_URI']; over_conf['sto_uri'] = c if c
|
26
|
+
|
27
|
+
@unit = Flor::Unit.new("#{@root}/etc/conf.json", over_conf)
|
23
28
|
|
24
29
|
@unit.conf['unit'] = 'cli'
|
25
30
|
#unit.hooker.add('journal', Flor::Journal)
|
@@ -31,7 +36,11 @@ module Flor::Tools
|
|
31
36
|
@mute = false
|
32
37
|
@paging = true
|
33
38
|
|
34
|
-
|
39
|
+
if ENV['FLOR_NO_START']
|
40
|
+
@unit.check_migration_version
|
41
|
+
else
|
42
|
+
@unit.start
|
43
|
+
end
|
35
44
|
|
36
45
|
@flow_path = File.join(@root, 'home/scratch.flo')
|
37
46
|
@ra_flow_path = File.join(@root, 'home/ra_scratch.flo')
|
data/lib/flor/unit.rb
CHANGED
data/lib/flor/unit/caller.rb
CHANGED
@@ -107,9 +107,11 @@ module Flor
|
|
107
107
|
#
|
108
108
|
# call
|
109
109
|
|
110
|
-
|
111
|
-
|
112
|
-
ms =
|
110
|
+
pt = message['point']
|
111
|
+
|
112
|
+
ms = [ "call_#{pt}", "on_#{pt}", :on_message, :on, pt ]
|
113
|
+
ms = ms + [ :on_cancel, :cancel ] if pt == 'detask'
|
114
|
+
|
113
115
|
m = ms.find { |mm| o.respond_to?(mm) }
|
114
116
|
|
115
117
|
fail(
|
@@ -121,7 +123,7 @@ module Flor
|
|
121
123
|
case o.method(m).arity
|
122
124
|
when 1 then o.send(m, message)
|
123
125
|
when 2 then o.send(m, conf, message)
|
124
|
-
when 3 then o.send(m,
|
126
|
+
when 3 then o.send(m, service, conf, message)
|
125
127
|
when -1 then o.send(m, {
|
126
128
|
service: service, configuration: conf, message: message })
|
127
129
|
else o.send(m)
|
@@ -23,7 +23,7 @@ module Flor
|
|
23
23
|
@exitstatus = exitstatus
|
24
24
|
end
|
25
25
|
|
26
|
-
def pid; @process.pid; end
|
26
|
+
def pid; @process.pid; rescue; nil; end
|
27
27
|
end
|
28
28
|
|
29
29
|
def spawn(conf, data)
|
@@ -41,7 +41,7 @@ module Flor
|
|
41
41
|
henv.each { |k, v| builder.environment.put(k, v) }
|
42
42
|
|
43
43
|
process = builder.start
|
44
|
-
pid = process.pid
|
44
|
+
pid = process.respond_to?(:pid) ? process.pid : nil
|
45
45
|
|
46
46
|
o = process.outputStream.to_io
|
47
47
|
i = process.inputStream.to_io
|
@@ -61,10 +61,12 @@ module Flor
|
|
61
61
|
|
62
62
|
rescue => err
|
63
63
|
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
64
|
+
if pid
|
65
|
+
Process.detach(pid)
|
66
|
+
(Process.kill(9, pid) rescue nil) unless Flor.no?(conf['on_error_kill'])
|
67
|
+
else
|
68
|
+
process.destroy rescue nil
|
69
|
+
end
|
68
70
|
|
69
71
|
raise err if err.is_a?(SpawnError)
|
70
72
|
raise WrappedSpawnError.new(conf, { to: to, t0: t0, pid: pid }, err)
|
@@ -72,7 +74,6 @@ module Flor
|
|
72
74
|
ensure
|
73
75
|
|
74
76
|
[ i, o, f ].each { |x| x.close rescue nil }
|
75
|
-
|
76
77
|
end
|
77
78
|
|
78
79
|
module CmdParser include Raabro
|