flor 1.0.0 → 1.2.1
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 +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
|
-
[](https://github.com/floraison/flor/actions)
|
5
5
|
[](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
|