lex-tasker 0.1.3 → 0.2.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.
- checksums.yaml +4 -4
- data/.circleci/config.yml +10 -32
- data/Gemfile.lock +69 -0
- data/README.md +1 -26
- data/bitbucket-pipelines.yml +69 -0
- data/lex-tasker.gemspec +8 -6
- data/lib/legion/extensions/tasker.rb +9 -2
- data/lib/legion/extensions/tasker/actors/fetch_delayed.rb +12 -0
- data/lib/legion/extensions/tasker/actors/log.rb +0 -4
- data/lib/legion/extensions/tasker/actors/task_manager.rb +21 -0
- data/lib/legion/extensions/tasker/helpers/base.rb +11 -0
- data/lib/legion/extensions/tasker/helpers/fetch_delayed.rb +66 -0
- data/lib/legion/extensions/tasker/helpers/find_subtask.rb +49 -0
- data/lib/legion/extensions/tasker/runners/check_subtask.rb +64 -85
- data/lib/legion/extensions/tasker/runners/fetch_delayed.rb +57 -36
- data/lib/legion/extensions/tasker/runners/task_manager.rb +28 -0
- data/lib/legion/extensions/tasker/runners/updater.rb +6 -0
- data/lib/legion/extensions/tasker/transport.rb +4 -0
- data/lib/legion/extensions/tasker/transport/queues/check_subtask.rb +4 -1
- data/lib/legion/extensions/tasker/transport/queues/fetch_delayed.rb +10 -0
- data/lib/legion/extensions/tasker/transport/queues/task_mananger.rb +15 -0
- data/lib/legion/extensions/tasker/version.rb +1 -1
- metadata +25 -12
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 8086ae496d1e741099cd0f91cd01cfaa91820518d3a93e00262ae04eeea471a5
|
|
4
|
+
data.tar.gz: 219a9d573a6e17923f01b2528fb91c1235dc1e62cf7b2dcdf9624dd99abc8d75
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: c7c51a2a36129f803d34b2b7aaecc43c06bdd619fabd8dd8ee37b0cf9a38a1ff68b8c0983efd3b742e22332bfc05afdb8507a04c7a62f0500ec22fb621e9ba6e
|
|
7
|
+
data.tar.gz: 7a98de6ea1d7b663992457e2c61df4a46c984ac41af4f30218404ea3798ecd0da3b8a880a86128637bb36105f971bc09a5c577934e1a7b2de633edefcb1ad14e
|
data/.circleci/config.yml
CHANGED
|
@@ -5,57 +5,35 @@ orbs:
|
|
|
5
5
|
jobs:
|
|
6
6
|
"rubocop":
|
|
7
7
|
docker:
|
|
8
|
-
- image: circleci/ruby:2.
|
|
8
|
+
- image: circleci/ruby:2.7
|
|
9
9
|
steps:
|
|
10
10
|
- checkout
|
|
11
11
|
- ruby/load-cache
|
|
12
12
|
- ruby/install-deps
|
|
13
|
+
- run:
|
|
14
|
+
name: Update bundler
|
|
15
|
+
command: gem update bundler
|
|
13
16
|
- run:
|
|
14
17
|
name: Run Rubocop
|
|
15
18
|
command: bundle exec rubocop
|
|
16
19
|
- ruby/save-cache
|
|
17
|
-
"
|
|
18
|
-
docker:
|
|
19
|
-
- image: circleci/ruby:2.5
|
|
20
|
-
- image: memcached:1.5-alpine
|
|
21
|
-
steps:
|
|
22
|
-
- checkout
|
|
23
|
-
- ruby/load-cache
|
|
24
|
-
- ruby/install-deps
|
|
25
|
-
- ruby/run-tests
|
|
26
|
-
- ruby/save-cache
|
|
27
|
-
"ruby-two-six":
|
|
28
|
-
docker:
|
|
29
|
-
- image: circleci/ruby:2.6
|
|
30
|
-
- image: memcached:1.5-alpine
|
|
31
|
-
steps:
|
|
32
|
-
- checkout
|
|
33
|
-
- ruby/load-cache
|
|
34
|
-
- ruby/install-deps
|
|
35
|
-
- ruby/run-tests
|
|
36
|
-
- ruby/save-cache
|
|
37
|
-
"ruby-two-seven":
|
|
20
|
+
"rspec":
|
|
38
21
|
docker:
|
|
39
22
|
- image: circleci/ruby:2.7
|
|
40
|
-
- image: memcached:1.5-alpine
|
|
41
23
|
steps:
|
|
42
24
|
- checkout
|
|
43
25
|
- ruby/load-cache
|
|
44
26
|
- ruby/install-deps
|
|
27
|
+
- run:
|
|
28
|
+
name: Update bundler
|
|
29
|
+
command: gem update bundler
|
|
45
30
|
- ruby/run-tests
|
|
46
31
|
- ruby/save-cache
|
|
47
|
-
|
|
48
32
|
workflows:
|
|
49
33
|
version: 2
|
|
50
34
|
rubocop-rspec:
|
|
51
35
|
jobs:
|
|
52
36
|
- rubocop
|
|
53
|
-
-
|
|
54
|
-
requires:
|
|
55
|
-
- rubocop
|
|
56
|
-
- ruby-two-six:
|
|
57
|
-
requires:
|
|
58
|
-
- ruby-two-five
|
|
59
|
-
- ruby-two-seven:
|
|
37
|
+
- rspec:
|
|
60
38
|
requires:
|
|
61
|
-
-
|
|
39
|
+
- rubocop
|
data/Gemfile.lock
ADDED
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
PATH
|
|
2
|
+
remote: .
|
|
3
|
+
specs:
|
|
4
|
+
lex-tasker (0.2.0)
|
|
5
|
+
|
|
6
|
+
GEM
|
|
7
|
+
remote: https://rubygems.org/
|
|
8
|
+
specs:
|
|
9
|
+
ast (2.4.1)
|
|
10
|
+
codecov (0.2.12)
|
|
11
|
+
json
|
|
12
|
+
simplecov
|
|
13
|
+
diff-lcs (1.4.4)
|
|
14
|
+
docile (1.3.2)
|
|
15
|
+
json (2.3.1)
|
|
16
|
+
parallel (1.19.2)
|
|
17
|
+
parser (2.7.2.0)
|
|
18
|
+
ast (~> 2.4.1)
|
|
19
|
+
rainbow (3.0.0)
|
|
20
|
+
rake (13.0.1)
|
|
21
|
+
regexp_parser (1.8.2)
|
|
22
|
+
rexml (3.2.4)
|
|
23
|
+
rspec (3.10.0)
|
|
24
|
+
rspec-core (~> 3.10.0)
|
|
25
|
+
rspec-expectations (~> 3.10.0)
|
|
26
|
+
rspec-mocks (~> 3.10.0)
|
|
27
|
+
rspec-core (3.10.0)
|
|
28
|
+
rspec-support (~> 3.10.0)
|
|
29
|
+
rspec-expectations (3.10.0)
|
|
30
|
+
diff-lcs (>= 1.2.0, < 2.0)
|
|
31
|
+
rspec-support (~> 3.10.0)
|
|
32
|
+
rspec-mocks (3.10.0)
|
|
33
|
+
diff-lcs (>= 1.2.0, < 2.0)
|
|
34
|
+
rspec-support (~> 3.10.0)
|
|
35
|
+
rspec-support (3.10.0)
|
|
36
|
+
rspec_junit_formatter (0.4.1)
|
|
37
|
+
rspec-core (>= 2, < 4, != 2.12.0)
|
|
38
|
+
rubocop (1.1.0)
|
|
39
|
+
parallel (~> 1.10)
|
|
40
|
+
parser (>= 2.7.1.5)
|
|
41
|
+
rainbow (>= 2.2.2, < 4.0)
|
|
42
|
+
regexp_parser (>= 1.8)
|
|
43
|
+
rexml
|
|
44
|
+
rubocop-ast (>= 1.0.1)
|
|
45
|
+
ruby-progressbar (~> 1.7)
|
|
46
|
+
unicode-display_width (>= 1.4.0, < 2.0)
|
|
47
|
+
rubocop-ast (1.1.0)
|
|
48
|
+
parser (>= 2.7.1.5)
|
|
49
|
+
ruby-progressbar (1.10.1)
|
|
50
|
+
simplecov (0.19.1)
|
|
51
|
+
docile (~> 1.1)
|
|
52
|
+
simplecov-html (~> 0.11)
|
|
53
|
+
simplecov-html (0.12.3)
|
|
54
|
+
unicode-display_width (1.7.0)
|
|
55
|
+
|
|
56
|
+
PLATFORMS
|
|
57
|
+
ruby
|
|
58
|
+
|
|
59
|
+
DEPENDENCIES
|
|
60
|
+
bundler (>= 2)
|
|
61
|
+
codecov
|
|
62
|
+
lex-tasker!
|
|
63
|
+
rake
|
|
64
|
+
rspec
|
|
65
|
+
rspec_junit_formatter
|
|
66
|
+
rubocop
|
|
67
|
+
|
|
68
|
+
BUNDLED WITH
|
|
69
|
+
2.1.4
|
data/README.md
CHANGED
|
@@ -1,28 +1,3 @@
|
|
|
1
1
|
# Legion::Extensions::Tasker
|
|
2
2
|
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
## Installation
|
|
7
|
-
|
|
8
|
-
Add this line to your application's Gemfile:
|
|
9
|
-
|
|
10
|
-
```ruby
|
|
11
|
-
gem 'lex-tasker'
|
|
12
|
-
```
|
|
13
|
-
|
|
14
|
-
And then execute:
|
|
15
|
-
|
|
16
|
-
$ bundle
|
|
17
|
-
|
|
18
|
-
Or install it yourself as:
|
|
19
|
-
|
|
20
|
-
$ gem install lex-tasker
|
|
21
|
-
|
|
22
|
-
## Usage
|
|
23
|
-
|
|
24
|
-
TODO: Write usage instructions here
|
|
25
|
-
|
|
26
|
-
## License
|
|
27
|
-
|
|
28
|
-
The gem is available as open source under the terms of the [MIT License](https://opensource.org/licenses/MIT).
|
|
3
|
+
A core LEX
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
image: ruby:2.7
|
|
2
|
+
|
|
3
|
+
pipelines:
|
|
4
|
+
tags:
|
|
5
|
+
"v*":
|
|
6
|
+
- step:
|
|
7
|
+
name: Rubocop
|
|
8
|
+
caches:
|
|
9
|
+
- bundler
|
|
10
|
+
script:
|
|
11
|
+
- gem install rubocop
|
|
12
|
+
- gem update rubocop
|
|
13
|
+
- rubocop
|
|
14
|
+
- step:
|
|
15
|
+
name: RSpec
|
|
16
|
+
caches:
|
|
17
|
+
- bundler
|
|
18
|
+
script:
|
|
19
|
+
- gem install bundler
|
|
20
|
+
- gem update bundler
|
|
21
|
+
- bundle update
|
|
22
|
+
- bundle exec rspec
|
|
23
|
+
- step:
|
|
24
|
+
name: Push to RubyGems
|
|
25
|
+
deployment: RubyGems
|
|
26
|
+
script:
|
|
27
|
+
- gem install bundler gem-release rspec
|
|
28
|
+
- bundle install
|
|
29
|
+
- (umask 077 ; echo $gem_creds | base64 --decode > ~/.gem/credentials)
|
|
30
|
+
- gem release
|
|
31
|
+
artifacts:
|
|
32
|
+
- pkg/**
|
|
33
|
+
branches:
|
|
34
|
+
master:
|
|
35
|
+
- step:
|
|
36
|
+
caches:
|
|
37
|
+
- bundler
|
|
38
|
+
script:
|
|
39
|
+
- gem install rubocop
|
|
40
|
+
- gem update rubocop
|
|
41
|
+
- rubocop
|
|
42
|
+
- step:
|
|
43
|
+
caches:
|
|
44
|
+
- bundler
|
|
45
|
+
script:
|
|
46
|
+
- gem install bundler
|
|
47
|
+
- gem update bundler
|
|
48
|
+
- bundle update
|
|
49
|
+
- bundle exec rspec
|
|
50
|
+
develop:
|
|
51
|
+
- step:
|
|
52
|
+
caches:
|
|
53
|
+
- bundler
|
|
54
|
+
script:
|
|
55
|
+
- gem install rubocop
|
|
56
|
+
- gem update rubocop
|
|
57
|
+
- rubocop
|
|
58
|
+
- step:
|
|
59
|
+
caches:
|
|
60
|
+
- bundler
|
|
61
|
+
script:
|
|
62
|
+
- gem install bundler
|
|
63
|
+
- gem update bundler
|
|
64
|
+
- bundle update
|
|
65
|
+
- bundle exec rspec
|
|
66
|
+
|
|
67
|
+
definitions:
|
|
68
|
+
caches:
|
|
69
|
+
bundler: /usr/local/bundle
|
data/lex-tasker.gemspec
CHANGED
|
@@ -5,7 +5,7 @@ require 'legion/extensions/tasker/version'
|
|
|
5
5
|
Gem::Specification.new do |spec|
|
|
6
6
|
spec.name = 'lex-tasker'
|
|
7
7
|
spec.version = Legion::Extensions::Tasker::VERSION
|
|
8
|
-
spec.authors = ['
|
|
8
|
+
spec.authors = ['Esity']
|
|
9
9
|
spec.email = ['matthewdiverson@gmail.com']
|
|
10
10
|
|
|
11
11
|
spec.summary = 'LEX::Tasker manages tasks status from Legion'
|
|
@@ -14,18 +14,20 @@ Gem::Specification.new do |spec|
|
|
|
14
14
|
spec.license = 'MIT'
|
|
15
15
|
spec.required_ruby_version = Gem::Requirement.new('>= 2.5.0')
|
|
16
16
|
|
|
17
|
-
# Specify which files should be added to the gem when it is released.
|
|
18
|
-
# The `git ls-files -z` loads the files in the RubyGem that have been added into git.
|
|
19
17
|
spec.files = Dir.chdir(File.expand_path(__dir__)) do
|
|
20
18
|
`git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
|
|
21
19
|
end
|
|
22
|
-
spec.
|
|
20
|
+
spec.metadata['homepage_uri'] = spec.homepage
|
|
21
|
+
spec.metadata['source_code_uri'] = 'https://bitbucket.org/legion-io/lex-tasker/src'
|
|
22
|
+
spec.metadata['documentation_uri'] = 'https://legionio.atlassian.net/wiki/spaces/LEX/pages/7733408'
|
|
23
|
+
spec.metadata['changelog_uri'] = 'https://legionio.atlassian.net/wiki/spaces/LEX/pages/12156936'
|
|
24
|
+
spec.metadata['bug_tracker_uri'] = 'https://bitbucket.org/legion-io/lex-tasker/issues'
|
|
23
25
|
spec.require_paths = ['lib']
|
|
24
26
|
|
|
25
|
-
spec.add_development_dependency 'bundler'
|
|
27
|
+
spec.add_development_dependency 'bundler', '>= 2'
|
|
26
28
|
spec.add_development_dependency 'codecov'
|
|
27
29
|
spec.add_development_dependency 'rake'
|
|
28
30
|
spec.add_development_dependency 'rspec'
|
|
31
|
+
spec.add_development_dependency 'rspec_junit_formatter'
|
|
29
32
|
spec.add_development_dependency 'rubocop'
|
|
30
|
-
spec.add_development_dependency 'rubocop-performance'
|
|
31
33
|
end
|
|
@@ -1,10 +1,17 @@
|
|
|
1
1
|
require 'legion/extensions/tasker/version'
|
|
2
|
-
require 'legion/extensions'
|
|
3
2
|
|
|
4
3
|
module Legion
|
|
5
4
|
module Extensions
|
|
6
5
|
module Tasker
|
|
7
|
-
extend Legion::Extensions::Core
|
|
6
|
+
extend Legion::Extensions::Core if Legion::Extensions.const_defined? :Core
|
|
7
|
+
|
|
8
|
+
def self.data_required?
|
|
9
|
+
true
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
def data_required?
|
|
13
|
+
true
|
|
14
|
+
end
|
|
8
15
|
end
|
|
9
16
|
end
|
|
10
17
|
end
|
|
@@ -5,9 +5,21 @@ module Legion::Extensions::Tasker
|
|
|
5
5
|
'fetch'
|
|
6
6
|
end
|
|
7
7
|
|
|
8
|
+
def runner_class
|
|
9
|
+
Legion::Extensions::Tasker::Runners::FetchDelayed
|
|
10
|
+
end
|
|
11
|
+
|
|
8
12
|
def use_runner?
|
|
9
13
|
false
|
|
10
14
|
end
|
|
15
|
+
|
|
16
|
+
def check_subtask?
|
|
17
|
+
false
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
def generate_task?
|
|
21
|
+
false
|
|
22
|
+
end
|
|
11
23
|
end
|
|
12
24
|
end
|
|
13
25
|
end
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
module Legion::Extensions::Tasker
|
|
2
|
+
module Actor
|
|
3
|
+
class TaskManager < Legion::Extensions::Actors::Subscription
|
|
4
|
+
def use_runner?
|
|
5
|
+
true
|
|
6
|
+
end
|
|
7
|
+
|
|
8
|
+
def check_subtask?
|
|
9
|
+
true
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
def generate_task?
|
|
13
|
+
true
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
def prefetch
|
|
17
|
+
1
|
|
18
|
+
end
|
|
19
|
+
end
|
|
20
|
+
end
|
|
21
|
+
end
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
module Legion
|
|
2
|
+
module Extensions
|
|
3
|
+
module Tasker
|
|
4
|
+
module Helpers
|
|
5
|
+
module FetchDelayed
|
|
6
|
+
def find_trigger(runner_class:, function:, **)
|
|
7
|
+
sql = "SELECT `functions`.`id` as `function_id`, `runner_id`, `runners`.`namespace`
|
|
8
|
+
FROM `legion`.`functions`
|
|
9
|
+
INNER JOIN `legion`.`runners` ON (`functions`.`runner_id` = `runners`.`id`)
|
|
10
|
+
WHERE `functions`.`name` = '#{function}'
|
|
11
|
+
AND `runners`.`namespace` = '#{runner_class}' LIMIT 1;"
|
|
12
|
+
|
|
13
|
+
cache = Legion::Cache.get(sql)
|
|
14
|
+
return cache unless cache.nil?
|
|
15
|
+
|
|
16
|
+
results = Legion::Data::Connection.sequel.fetch(sql).first
|
|
17
|
+
Legion::Cache.set(sql, results) if results.is_a?(Hash) && results.count.positive?
|
|
18
|
+
results
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
def find_delayed(**)
|
|
22
|
+
sql = '
|
|
23
|
+
SELECT tasks.id, tasks.relationship_id, tasks.function_id, tasks.created,
|
|
24
|
+
relationships.delay as relationship_delay, relationships.chain_id,
|
|
25
|
+
functions.name as function_name,
|
|
26
|
+
runners.namespace as class, runners.id as runner_id,
|
|
27
|
+
CONCAT( `exchange`, ".",`queue`,".",`functions`.`name`) AS runner_routing_key
|
|
28
|
+
FROM legion.tasks
|
|
29
|
+
INNER JOIN legion.functions ON (functions.id = tasks.function_id)
|
|
30
|
+
INNER JOIN legion.runners ON (runners.id = functions.runner_id)
|
|
31
|
+
INNER JOIN `legion`.`extensions` ON (`runners`.`extension_id` = `extensions`.`id`)
|
|
32
|
+
LEFT JOIN legion.relationships ON (relationships.id = tasks.relationship_id)
|
|
33
|
+
WHERE status = \'task.delayed\';'
|
|
34
|
+
|
|
35
|
+
Legion::Data::Connection.sequel.fetch(sql)
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
def find_subtasks(trigger_id:, **)
|
|
39
|
+
sql = "
|
|
40
|
+
SELECT
|
|
41
|
+
`relationships`.`id` as `relationship_id`, `debug`,
|
|
42
|
+
`chain_id`, `allow_new_chains`, `delay`, `trigger_id`, `action_id`, `conditions`, `transformation`,
|
|
43
|
+
`runners`.`namespace`, `runners`.`id` as `runner_id`, `runners`.`queue`,
|
|
44
|
+
`runners`.`namespace` as runner_class,
|
|
45
|
+
`functions`.`id` as `function_id`, `functions`.`name` as `function`,
|
|
46
|
+
`extensions`.`exchange`,
|
|
47
|
+
CONCAT( `exchange`, '.',`queue`,'.',`functions`.`name`) AS runner_routing_key
|
|
48
|
+
FROM `legion`.`relationships`
|
|
49
|
+
INNER JOIN `legion`.`functions` ON (`functions`.`id` = `relationships`.`action_id`)
|
|
50
|
+
INNER JOIN `legion`.`runners` ON (`functions`.`runner_id` = `runners`.`id`)
|
|
51
|
+
INNER JOIN `legion`.`extensions` ON (`runners`.`extension_id` = `extensions`.`id`)
|
|
52
|
+
WHERE `relationships`.`trigger_id` = #{trigger_id} AND `relationships`.`active` = 1;
|
|
53
|
+
"
|
|
54
|
+
|
|
55
|
+
cache = Legion::Cache.get(sql)
|
|
56
|
+
return cache unless cache.nil?
|
|
57
|
+
|
|
58
|
+
results = Legion::Data::Connection.sequel.fetch(sql)
|
|
59
|
+
Legion::Cache.set(sql, results, ttl: 5) if results.is_a?(Hash) && results.count.positive?
|
|
60
|
+
results
|
|
61
|
+
end
|
|
62
|
+
end
|
|
63
|
+
end
|
|
64
|
+
end
|
|
65
|
+
end
|
|
66
|
+
end
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
module Legion
|
|
2
|
+
module Extensions
|
|
3
|
+
module Tasker
|
|
4
|
+
module Helpers
|
|
5
|
+
module FindSubtask
|
|
6
|
+
def find_trigger(runner_class:, function:, **)
|
|
7
|
+
sql = "SELECT `functions`.`id` as `function_id`, `runner_id`, `runners`.`namespace`
|
|
8
|
+
FROM `legion`.`functions`
|
|
9
|
+
INNER JOIN `legion`.`runners` ON (`functions`.`runner_id` = `runners`.`id`)
|
|
10
|
+
WHERE `functions`.`name` = '#{function}'
|
|
11
|
+
AND `runners`.`namespace` = '#{runner_class}' LIMIT 1;"
|
|
12
|
+
|
|
13
|
+
cache = Legion::Cache.get(sql)
|
|
14
|
+
return cache unless cache.nil?
|
|
15
|
+
|
|
16
|
+
results = Legion::Data::Connection.sequel.fetch(sql).first
|
|
17
|
+
Legion::Cache.set(sql, results) if results.is_a?(Hash) && results.count.positive?
|
|
18
|
+
results
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
def find_subtasks(trigger_id:, **)
|
|
22
|
+
sql = "
|
|
23
|
+
SELECT
|
|
24
|
+
`relationships`.`id` as `relationship_id`, `debug`,
|
|
25
|
+
`chain_id`, `allow_new_chains`, `delay`, `trigger_id`, `action_id`, `conditions`, `transformation`,
|
|
26
|
+
`runners`.`namespace`, `runners`.`id` as `runner_id`, `runners`.`queue`,
|
|
27
|
+
`runners`.`namespace` as runner_class,
|
|
28
|
+
`functions`.`id` as `function_id`, `functions`.`name` as `function`,
|
|
29
|
+
`extensions`.`exchange`,
|
|
30
|
+
CONCAT( `exchange`, '.',`queue`,'.',`functions`.`name`) AS runner_routing_key
|
|
31
|
+
FROM `legion`.`relationships`
|
|
32
|
+
INNER JOIN `legion`.`functions` ON (`functions`.`id` = `relationships`.`action_id`)
|
|
33
|
+
INNER JOIN `legion`.`runners` ON (`functions`.`runner_id` = `runners`.`id`)
|
|
34
|
+
INNER JOIN `legion`.`extensions` ON (`runners`.`extension_id` = `extensions`.`id`)
|
|
35
|
+
WHERE `relationships`.`trigger_id` = #{trigger_id} AND `relationships`.`active` = 1;
|
|
36
|
+
"
|
|
37
|
+
|
|
38
|
+
cache = Legion::Cache.get(sql)
|
|
39
|
+
return cache unless cache.nil?
|
|
40
|
+
|
|
41
|
+
results = Legion::Data::Connection.sequel.fetch(sql)
|
|
42
|
+
Legion::Cache.set(sql, results, ttl: 5) if results.is_a?(Hash) && results.count.positive?
|
|
43
|
+
results
|
|
44
|
+
end
|
|
45
|
+
end
|
|
46
|
+
end
|
|
47
|
+
end
|
|
48
|
+
end
|
|
49
|
+
end
|
|
@@ -4,114 +4,93 @@ module Legion::Extensions::Tasker
|
|
|
4
4
|
module Runners
|
|
5
5
|
module CheckSubtask
|
|
6
6
|
include Legion::Extensions::Helpers::Lex
|
|
7
|
+
extend Legion::Extensions::Tasker::Helpers::FindSubtask
|
|
7
8
|
|
|
8
9
|
def check_subtasks(runner_class:, function:, **opts)
|
|
9
|
-
|
|
10
|
-
return if runner_record.nil?
|
|
10
|
+
trigger = find_trigger(runner_class: runner_class, function: function)
|
|
11
11
|
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
relationships = function_record.trigger_relationships_dataset.where(:active)
|
|
16
|
-
relationships.where(chain_id: opts[:chain_id] || :allow_new_chains) if opts.key? :chain_id
|
|
17
|
-
return { success: true, count: relationships.count } if relationships.count.zero?
|
|
18
|
-
|
|
19
|
-
relationships.each do |relationship|
|
|
20
|
-
unless relationship.values[:allow_new_chains]
|
|
21
|
-
next if relationship.chain.nil?
|
|
12
|
+
find_subtasks(trigger_id: trigger[:function_id]).each do |relationship|
|
|
13
|
+
unless relationship[:allow_new_chains]
|
|
14
|
+
next if relationship[:chain_id].nil?
|
|
22
15
|
next unless opts.key? :chain_id
|
|
23
|
-
next unless relationship
|
|
16
|
+
next unless relationship[:chain_id] == opts[:chain_id]
|
|
24
17
|
end
|
|
25
18
|
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
status = relationship.values[:delay].zero? ? 'conditioner.queued' : 'task.delayed'
|
|
30
|
-
|
|
31
|
-
task_id_hash = { runner_class: action_runner.values[:namespace],
|
|
32
|
-
function: action_function.values[:name],
|
|
33
|
-
status: status,
|
|
34
|
-
relationship_id: relationship.values[:id] }
|
|
35
|
-
task_id_hash[:payload] = opts
|
|
19
|
+
task_hash = relationship
|
|
20
|
+
task_hash[:status] = relationship[:delay].zero? ? 'conditioner.queued' : 'task.delayed'
|
|
21
|
+
task_hash[:payload] = opts
|
|
36
22
|
|
|
37
23
|
if opts.key? :master_id
|
|
38
|
-
|
|
24
|
+
task_hash[:master_id] = opts[:master_id]
|
|
39
25
|
elsif opts.key? :parent_id
|
|
40
|
-
|
|
26
|
+
task_hash[:master_id] = opts[:parent_id]
|
|
41
27
|
elsif opts.key? :task_id
|
|
42
|
-
|
|
28
|
+
task_hash[:master_id] = opts[:task_id]
|
|
43
29
|
end
|
|
44
30
|
|
|
45
|
-
|
|
31
|
+
task_hash[:parent_id] = opts[:task_id] if opts.key? :task_id
|
|
32
|
+
task_hash[:routing_key] = if relationship[:conditions].is_a?(String) && relationship[:conditions].length > 4
|
|
33
|
+
'task.subtask.conditioner'
|
|
34
|
+
elsif relationship[:transformation].is_a?(String) && relationship[:transformation].length > 4 # rubocop:disable Layout/LineLength
|
|
35
|
+
'task.subtask.transformation'
|
|
36
|
+
else
|
|
37
|
+
relationship[:runner_routing_key]
|
|
38
|
+
end
|
|
39
|
+
|
|
46
40
|
if opts[:result].is_a? Array
|
|
47
41
|
opts[:result].each do |result|
|
|
48
|
-
send_task(
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
action_function: action_function,
|
|
53
|
-
action_runner: action_runner,
|
|
54
|
-
result: result)
|
|
42
|
+
send_task(results: result,
|
|
43
|
+
trigger_runner_id: trigger[:runner_id],
|
|
44
|
+
trigger_function_id: trigger[:function_id],
|
|
45
|
+
**task_hash)
|
|
55
46
|
end
|
|
56
47
|
else
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
48
|
+
results = if opts[:results].is_a? Hash
|
|
49
|
+
opts[:results]
|
|
50
|
+
elsif opts[:result].is_a? Hash
|
|
51
|
+
opts[:result]
|
|
52
|
+
else
|
|
53
|
+
opts
|
|
54
|
+
end
|
|
55
|
+
send_task(
|
|
56
|
+
results: results,
|
|
57
|
+
trigger_runner_id: trigger[:runner_id],
|
|
58
|
+
trigger_function_id: trigger[:function_id],
|
|
59
|
+
**task_hash
|
|
60
|
+
)
|
|
64
61
|
end
|
|
65
62
|
end
|
|
66
|
-
rescue StandardError => e
|
|
67
|
-
Legion::Logging.fatal e.message
|
|
68
|
-
Legion::Logging.fatal e.backtrace
|
|
69
|
-
Legion::Logging.fatal runner_class
|
|
70
|
-
Legion::Logging.fatal function
|
|
71
|
-
Legion::Logging.fatal opts.keys
|
|
72
|
-
Legion::Logging.fatal opts[:entry]
|
|
73
63
|
end
|
|
74
64
|
|
|
75
|
-
def send_task(
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
65
|
+
def send_task(**opts)
|
|
66
|
+
opts[:results] = opts[:result] if opts.key?(:result) && !opts.key?(:results)
|
|
67
|
+
opts[:success] = if opts.key?(:result) && opts.key?(:success)
|
|
68
|
+
opts[:result][:success]
|
|
69
|
+
elsif opts.key?(:success)
|
|
70
|
+
opts[:success]
|
|
71
|
+
else
|
|
72
|
+
1
|
|
73
|
+
end
|
|
79
74
|
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
trigger_runner_id: runner_record.values[:id],
|
|
84
|
-
trigger_function_id: function_record.values[:id],
|
|
85
|
-
function_id: action_function.values[:id],
|
|
86
|
-
function: action_function.values[:name],
|
|
87
|
-
runner_id: action_runner.values[:id],
|
|
88
|
-
runner_class: action_runner.values[:namespace],
|
|
89
|
-
conditions: relationship.values[:conditions],
|
|
90
|
-
transformation: relationship.values[:transformation],
|
|
91
|
-
debug: relationship.values[:debug] && 1 || 0,
|
|
92
|
-
task_id: task_id,
|
|
93
|
-
results: opts[:result]
|
|
94
|
-
}
|
|
75
|
+
# opts[:task_id] = Legion::Runner::Status.generate_task_id(**opts)[:task_id]
|
|
76
|
+
opts[:task_id] = insert_task(**opts)
|
|
77
|
+
return { status: true } unless opts[:delay].zero?
|
|
95
78
|
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
elsif subtask_hash[:transformation].is_a?(String) && subtask_hash[:transformation].length > 4 # rubocop:disable Layout/LineLength
|
|
99
|
-
'task.subtask.transform'
|
|
100
|
-
else
|
|
101
|
-
"#{runner_record.extension.values[:exchange]}.#{runner_record.values[:queue]}.#{subtask_hash[:function]}" # rubocop:disable Layout/LineLength
|
|
102
|
-
end
|
|
79
|
+
Legion::Transport::Messages::SubTask.new(**opts).publish
|
|
80
|
+
end
|
|
103
81
|
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
82
|
+
def insert_task(relationship_id:, function_id:, status: 'task.queued', master_id: nil, parent_id: nil, **opts)
|
|
83
|
+
insert_hash = { relationship_id: relationship_id, function_id: function_id, status: status }
|
|
84
|
+
insert_hash[:master_id] = if master_id.is_a? Integer
|
|
85
|
+
master_id
|
|
86
|
+
elsif parent_id.is_a? Integer
|
|
87
|
+
parent_id
|
|
88
|
+
end
|
|
89
|
+
insert_hash[:parent_id] = parent_id if parent_id.is_a? Integer
|
|
90
|
+
insert_hash[:payload] = Legion::JSON.dump(opts)
|
|
91
|
+
# insert_hash[:function_args] = nil
|
|
92
|
+
# insert_hash[:results] = nil
|
|
93
|
+
Legion::Data::Model::Task.insert(insert_hash)
|
|
115
94
|
end
|
|
116
95
|
end
|
|
117
96
|
end
|
|
@@ -1,50 +1,71 @@
|
|
|
1
1
|
module Legion::Extensions::Tasker::Runners
|
|
2
2
|
module FetchDelayed
|
|
3
|
-
|
|
3
|
+
extend Legion::Extensions::Tasker::Helpers::FetchDelayed
|
|
4
|
+
include Legion::Extensions::Helpers::Task
|
|
4
5
|
|
|
5
6
|
def fetch(**_opts)
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
relationship_id:
|
|
17
|
-
chain_id:
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
7
|
+
find_delayed.each do |task|
|
|
8
|
+
if task[:relationship_delay].is_a?(Integer) && task[:relationship_delay].positive?
|
|
9
|
+
next if Time.now < task[:created] + task[:relationship_delay] # rubocop:disable Style/SoleNestedConditional
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
if task[:task_delay].is_a?(Integer) && task[:task_delay].positive?
|
|
13
|
+
next if Time.now < task[:created] + task[:task_delay] # rubocop:disable Style/SoleNestedConditional
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
subtask_hash = {
|
|
17
|
+
relationship_id: task[:relationship_id],
|
|
18
|
+
chain_id: task[:chain_id],
|
|
19
|
+
function_id: task[:function_id],
|
|
20
|
+
function: task[:function_name],
|
|
21
|
+
runner_id: task[:runner_id],
|
|
22
|
+
runner_class: task[:runner_class],
|
|
23
|
+
task_id: task[:id],
|
|
24
|
+
exchange: task[:exchange],
|
|
25
|
+
queue: task[:queue]
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
subtask_hash[:conditions] = task[:conditions] if task[:conditions].is_a?(String)
|
|
29
|
+
subtask_hash[:transformation] = task[:transformation] if task[:transformation].is_a?(String)
|
|
30
|
+
|
|
31
|
+
subtask_hash[:routing_key] = if task[:conditions].is_a?(String) && task[:conditions].length > 4
|
|
32
|
+
'task.subtask.conditioner'
|
|
33
|
+
elsif task[:transformation].is_a?(String) && task[:transformation].length > 4
|
|
34
|
+
'task.subtask.transformation'
|
|
35
|
+
else
|
|
36
|
+
task[:runner_routing_key]
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
send_task(**subtask_hash)
|
|
40
|
+
case subtask_hash[:routing_key]
|
|
41
|
+
when 'task.subtask.conditioner'
|
|
42
|
+
task_update(task[:id], 'conditioner.queued')
|
|
43
|
+
when 'task.subtask.transformation'
|
|
44
|
+
task_update(task[:id], 'transformer.queued')
|
|
45
|
+
else
|
|
46
|
+
task_update(task[:id], 'task.queued')
|
|
47
|
+
end
|
|
37
48
|
end
|
|
49
|
+
end
|
|
38
50
|
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
51
|
+
def send_task(**opts)
|
|
52
|
+
opts[:results] = opts[:result] if opts.key?(:result) && !opts.key?(:results)
|
|
53
|
+
opts[:success] = if opts.key?(:result) && opts.key?(:success)
|
|
54
|
+
opts[:result][:success]
|
|
55
|
+
elsif opts.key?(:success)
|
|
56
|
+
opts[:success]
|
|
57
|
+
else
|
|
58
|
+
1
|
|
59
|
+
end
|
|
60
|
+
log.debug 'pushing delayed task to worker'
|
|
61
|
+
Legion::Transport::Messages::Task.new(**opts).publish
|
|
43
62
|
end
|
|
44
63
|
|
|
45
64
|
def push(**_opts)
|
|
46
65
|
Legion::Extensions::Tasker::Transport::Messages::FetchDelayed.new.publish
|
|
47
66
|
{ success: true }
|
|
48
67
|
end
|
|
68
|
+
|
|
69
|
+
include Legion::Extensions::Helpers::Lex
|
|
49
70
|
end
|
|
50
71
|
end
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
module Legion
|
|
2
|
+
module Extensions
|
|
3
|
+
module Tasker
|
|
4
|
+
module Runners
|
|
5
|
+
module TaskManager
|
|
6
|
+
def purge_old(age: 31, limit: 100, status: 'task.completed', **_opts)
|
|
7
|
+
log.debug("purging old completed tasks with an age > #{age} days, limit: #{limit}")
|
|
8
|
+
dataset = Legion::Data::Model::Task
|
|
9
|
+
.where(Sequel.lit("created <= DATE_SUB(SYSDATE(), INTERVAL #{age} DAY)"))
|
|
10
|
+
.limit(limit)
|
|
11
|
+
dataset.where(status: status) unless ['*', nil, ''].include? status
|
|
12
|
+
log.debug "Deleting #{dataset.count} records" if dataset.count.positive?
|
|
13
|
+
dataset&.delete
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
def expire_queued(age: 1, limit: 10, **) # rubocop:disable Lint/UnusedMethodArgument
|
|
17
|
+
dataset = Legion::Data::Model::Task # rubocop:disable Lint/UselessAssignment
|
|
18
|
+
.where(status: ['conditioner.queued', 'transformer.queued', 'task.queued'])
|
|
19
|
+
.limit(limit)
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
include Legion::Extensions::Helpers::Task
|
|
23
|
+
include Legion::Extensions::Helpers::Lex
|
|
24
|
+
end
|
|
25
|
+
end
|
|
26
|
+
end
|
|
27
|
+
end
|
|
28
|
+
end
|
|
@@ -5,6 +5,12 @@ module Legion::Extensions::Tasker
|
|
|
5
5
|
|
|
6
6
|
def update_status(task_id:, **opts)
|
|
7
7
|
task = Legion::Data::Model::Task[task_id]
|
|
8
|
+
if task.nil? || task.values.nil?
|
|
9
|
+
return { success: false, changed: false, task_id: task_id, message: 'task nil' }
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
log.unknown task.class
|
|
13
|
+
|
|
8
14
|
update_hash = {}
|
|
9
15
|
%i[status function_args payload results].each do |column|
|
|
10
16
|
next unless opts.key? column
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
module Legion::Extensions::Tasker
|
|
2
|
+
module Transport
|
|
3
|
+
module Queues
|
|
4
|
+
class TaskManager < Legion::Transport::Queue
|
|
5
|
+
def queue_name
|
|
6
|
+
'tasker.task_manager'
|
|
7
|
+
end
|
|
8
|
+
|
|
9
|
+
def queue_options
|
|
10
|
+
{ arguments: { 'x-single-active-consumer': true } }
|
|
11
|
+
end
|
|
12
|
+
end
|
|
13
|
+
end
|
|
14
|
+
end
|
|
15
|
+
end
|
metadata
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: lex-tasker
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 0.
|
|
4
|
+
version: 0.2.0
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
|
-
-
|
|
8
|
-
autorequire:
|
|
7
|
+
- Esity
|
|
8
|
+
autorequire:
|
|
9
9
|
bindir: bin
|
|
10
10
|
cert_chain: []
|
|
11
|
-
date: 2020-
|
|
11
|
+
date: 2020-11-02 00:00:00.000000000 Z
|
|
12
12
|
dependencies:
|
|
13
13
|
- !ruby/object:Gem::Dependency
|
|
14
14
|
name: bundler
|
|
@@ -16,14 +16,14 @@ dependencies:
|
|
|
16
16
|
requirements:
|
|
17
17
|
- - ">="
|
|
18
18
|
- !ruby/object:Gem::Version
|
|
19
|
-
version: '
|
|
19
|
+
version: '2'
|
|
20
20
|
type: :development
|
|
21
21
|
prerelease: false
|
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
|
23
23
|
requirements:
|
|
24
24
|
- - ">="
|
|
25
25
|
- !ruby/object:Gem::Version
|
|
26
|
-
version: '
|
|
26
|
+
version: '2'
|
|
27
27
|
- !ruby/object:Gem::Dependency
|
|
28
28
|
name: codecov
|
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
|
@@ -67,7 +67,7 @@ dependencies:
|
|
|
67
67
|
- !ruby/object:Gem::Version
|
|
68
68
|
version: '0'
|
|
69
69
|
- !ruby/object:Gem::Dependency
|
|
70
|
-
name:
|
|
70
|
+
name: rspec_junit_formatter
|
|
71
71
|
requirement: !ruby/object:Gem::Requirement
|
|
72
72
|
requirements:
|
|
73
73
|
- - ">="
|
|
@@ -81,7 +81,7 @@ dependencies:
|
|
|
81
81
|
- !ruby/object:Gem::Version
|
|
82
82
|
version: '0'
|
|
83
83
|
- !ruby/object:Gem::Dependency
|
|
84
|
-
name: rubocop
|
|
84
|
+
name: rubocop
|
|
85
85
|
requirement: !ruby/object:Gem::Requirement
|
|
86
86
|
requirements:
|
|
87
87
|
- - ">="
|
|
@@ -106,21 +106,28 @@ files:
|
|
|
106
106
|
- ".rspec"
|
|
107
107
|
- ".rubocop.yml"
|
|
108
108
|
- Gemfile
|
|
109
|
+
- Gemfile.lock
|
|
109
110
|
- LICENSE.txt
|
|
110
111
|
- README.md
|
|
111
112
|
- Rakefile
|
|
112
113
|
- bin/console
|
|
113
114
|
- bin/setup
|
|
115
|
+
- bitbucket-pipelines.yml
|
|
114
116
|
- lex-tasker.gemspec
|
|
115
117
|
- lib/legion/extensions/tasker.rb
|
|
116
118
|
- lib/legion/extensions/tasker/actors/check_subtask.rb
|
|
117
119
|
- lib/legion/extensions/tasker/actors/fetch_delayed.rb
|
|
118
120
|
- lib/legion/extensions/tasker/actors/fetch_delayed_push.rb
|
|
119
121
|
- lib/legion/extensions/tasker/actors/log.rb
|
|
122
|
+
- lib/legion/extensions/tasker/actors/task_manager.rb
|
|
120
123
|
- lib/legion/extensions/tasker/actors/updater.rb
|
|
124
|
+
- lib/legion/extensions/tasker/helpers/base.rb
|
|
125
|
+
- lib/legion/extensions/tasker/helpers/fetch_delayed.rb
|
|
126
|
+
- lib/legion/extensions/tasker/helpers/find_subtask.rb
|
|
121
127
|
- lib/legion/extensions/tasker/runners/check_subtask.rb
|
|
122
128
|
- lib/legion/extensions/tasker/runners/fetch_delayed.rb
|
|
123
129
|
- lib/legion/extensions/tasker/runners/log.rb
|
|
130
|
+
- lib/legion/extensions/tasker/runners/task_manager.rb
|
|
124
131
|
- lib/legion/extensions/tasker/runners/updater.rb
|
|
125
132
|
- lib/legion/extensions/tasker/transport.rb
|
|
126
133
|
- lib/legion/extensions/tasker/transport/exchanges/task.rb
|
|
@@ -130,13 +137,19 @@ files:
|
|
|
130
137
|
- lib/legion/extensions/tasker/transport/queues/lex_register.rb
|
|
131
138
|
- lib/legion/extensions/tasker/transport/queues/subtask.rb
|
|
132
139
|
- lib/legion/extensions/tasker/transport/queues/task_log.rb
|
|
140
|
+
- lib/legion/extensions/tasker/transport/queues/task_mananger.rb
|
|
133
141
|
- lib/legion/extensions/tasker/transport/queues/updater.rb
|
|
134
142
|
- lib/legion/extensions/tasker/version.rb
|
|
135
143
|
homepage: https://bitbucket.org/legion-io/lex-tasker
|
|
136
144
|
licenses:
|
|
137
145
|
- MIT
|
|
138
|
-
metadata:
|
|
139
|
-
|
|
146
|
+
metadata:
|
|
147
|
+
homepage_uri: https://bitbucket.org/legion-io/lex-tasker
|
|
148
|
+
source_code_uri: https://bitbucket.org/legion-io/lex-tasker/src
|
|
149
|
+
documentation_uri: https://legionio.atlassian.net/wiki/spaces/LEX/pages/7733408
|
|
150
|
+
changelog_uri: https://legionio.atlassian.net/wiki/spaces/LEX/pages/12156936
|
|
151
|
+
bug_tracker_uri: https://bitbucket.org/legion-io/lex-tasker/issues
|
|
152
|
+
post_install_message:
|
|
140
153
|
rdoc_options: []
|
|
141
154
|
require_paths:
|
|
142
155
|
- lib
|
|
@@ -151,8 +164,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
|
151
164
|
- !ruby/object:Gem::Version
|
|
152
165
|
version: '0'
|
|
153
166
|
requirements: []
|
|
154
|
-
rubygems_version: 3.1.
|
|
155
|
-
signing_key:
|
|
167
|
+
rubygems_version: 3.1.4
|
|
168
|
+
signing_key:
|
|
156
169
|
specification_version: 4
|
|
157
170
|
summary: LEX::Tasker manages tasks status from Legion
|
|
158
171
|
test_files: []
|