lex-swarm 0.2.1 → 0.2.2
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/lex-swarm.gemspec +7 -0
- data/lib/legion/extensions/swarm/actors/workspace_sync.rb +5 -2
- data/lib/legion/extensions/swarm/runners/swarm.rb +11 -11
- data/lib/legion/extensions/swarm/runners/workspace.rb +3 -3
- data/lib/legion/extensions/swarm/version.rb +1 -1
- data/spec/legion/extensions/swarm/actors/workspace_sync_spec.rb +3 -2
- data/spec/spec_helper.rb +29 -5
- metadata +99 -1
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 44c1897aa216153d964378805ac63718afc2782bfeee0b9e69fb3c6b84e7c750
|
|
4
|
+
data.tar.gz: 225dacb3e327dd976379dc39760d77e72f28350b4c3881547be8cfd735716736
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 3e0331bfb72bc0f67669fd6a3b84a752387adc733e14c7eab07913d8a7438f51c3d727515246c2552faaef2c68b1faa8a035b4c99d50ae283548eba404e1bd27
|
|
7
|
+
data.tar.gz: '089cd79bcc1b9a1642fe55723373d012220619eea2455e808dd5b19983e5c291218c2367bac81f92c1e3a4a74514d07948932c751eb4e1164c68a7cd1f872ac9'
|
data/lex-swarm.gemspec
CHANGED
|
@@ -25,5 +25,12 @@ Gem::Specification.new do |spec|
|
|
|
25
25
|
Dir.glob('{lib,spec}/**/*') + %w[lex-swarm.gemspec Gemfile]
|
|
26
26
|
end
|
|
27
27
|
spec.require_paths = ['lib']
|
|
28
|
+
spec.add_dependency 'legion-cache', '>= 1.3.11'
|
|
29
|
+
spec.add_dependency 'legion-crypt', '>= 1.4.9'
|
|
30
|
+
spec.add_dependency 'legion-data', '>= 1.4.17'
|
|
31
|
+
spec.add_dependency 'legion-json', '>= 1.2.1'
|
|
32
|
+
spec.add_dependency 'legion-logging', '>= 1.3.2'
|
|
33
|
+
spec.add_dependency 'legion-settings', '>= 1.3.14'
|
|
34
|
+
spec.add_dependency 'legion-transport', '>= 1.3.9'
|
|
28
35
|
spec.add_development_dependency 'legion-gaia', '>= 0.9.9'
|
|
29
36
|
end
|
|
@@ -8,6 +8,9 @@ module Legion
|
|
|
8
8
|
module Swarm
|
|
9
9
|
module Actors
|
|
10
10
|
class WorkspaceSync
|
|
11
|
+
include Legion::Extensions::Helpers::Lex if Legion::Extensions.const_defined?(:Helpers) &&
|
|
12
|
+
Legion::Extensions::Helpers.const_defined?(:Lex)
|
|
13
|
+
|
|
11
14
|
ROUTING_PREFIX = 'swarm.workspace'
|
|
12
15
|
|
|
13
16
|
def publish_change(charter_id:, key:, operation:, value: nil, author: nil, version: nil, **) # rubocop:disable Metrics/ParameterLists
|
|
@@ -19,10 +22,10 @@ module Legion
|
|
|
19
22
|
timestamp: Time.now.utc.to_s }
|
|
20
23
|
|
|
21
24
|
Legion::Transport.publish(routing_key: routing_key, payload: payload)
|
|
22
|
-
|
|
25
|
+
log.debug "[swarm-workspace-sync] published #{operation} #{key} to #{routing_key}"
|
|
23
26
|
{ success: true, routing_key: routing_key }
|
|
24
27
|
rescue StandardError => e
|
|
25
|
-
|
|
28
|
+
log.warn "[swarm-workspace-sync] publish failed: #{e.message}"
|
|
26
29
|
{ success: true, skipped: :publish_error, message: e.message }
|
|
27
30
|
end
|
|
28
31
|
|
|
@@ -12,7 +12,7 @@ module Legion
|
|
|
12
12
|
charter = Helpers::Charter.new_charter(name: name, objective: objective,
|
|
13
13
|
roles: roles, max_agents: max_agents, timeout: timeout)
|
|
14
14
|
id = swarm_store.create(charter)
|
|
15
|
-
|
|
15
|
+
log.info "[swarm] created: id=#{id[0..7]} name=#{name} max=#{max_agents} roles=#{roles.join(',')}"
|
|
16
16
|
{ charter_id: id, name: name, status: :forming }
|
|
17
17
|
end
|
|
18
18
|
|
|
@@ -20,8 +20,8 @@ module Legion
|
|
|
20
20
|
return { error: :invalid_role, valid: Helpers::Charter::ROLES } unless Helpers::Charter.valid_role?(role)
|
|
21
21
|
|
|
22
22
|
result = swarm_store.join(charter_id, agent_id: agent_id, role: role)
|
|
23
|
-
|
|
24
|
-
|
|
23
|
+
log.debug "[swarm] join: charter=#{charter_id[0..7]} agent=#{agent_id} role=#{role} result=#{result}"
|
|
24
|
+
log.info "[swarm] agent joined: charter=#{charter_id[0..7]} agent=#{agent_id} role=#{role}" if result == :joined
|
|
25
25
|
{
|
|
26
26
|
joined: { joined: true, charter_id: charter_id },
|
|
27
27
|
full: { error: :swarm_full },
|
|
@@ -32,8 +32,8 @@ module Legion
|
|
|
32
32
|
|
|
33
33
|
def leave_swarm(charter_id:, agent_id:, **)
|
|
34
34
|
result = swarm_store.leave(charter_id, agent_id: agent_id)
|
|
35
|
-
|
|
36
|
-
|
|
35
|
+
log.debug "[swarm] leave: charter=#{charter_id[0..7]} agent=#{agent_id} result=#{result}"
|
|
36
|
+
log.info "[swarm] agent left: charter=#{charter_id[0..7]} agent=#{agent_id}" if result == :left
|
|
37
37
|
{
|
|
38
38
|
left: { left: true },
|
|
39
39
|
not_found: { error: :not_found },
|
|
@@ -44,28 +44,28 @@ module Legion
|
|
|
44
44
|
def complete_swarm(charter_id:, outcome:, **)
|
|
45
45
|
result = swarm_store.complete(charter_id, outcome: outcome)
|
|
46
46
|
if result
|
|
47
|
-
|
|
47
|
+
log.info "[swarm] completed: charter=#{charter_id[0..7]} outcome=#{outcome}"
|
|
48
48
|
else
|
|
49
|
-
|
|
49
|
+
log.debug "[swarm] complete failed: charter=#{charter_id[0..7]} not found"
|
|
50
50
|
end
|
|
51
51
|
result ? { completed: true, outcome: outcome } : { error: :not_found }
|
|
52
52
|
end
|
|
53
53
|
|
|
54
54
|
def get_swarm(charter_id:, **)
|
|
55
55
|
charter = swarm_store.get(charter_id)
|
|
56
|
-
|
|
56
|
+
log.debug "[swarm] get: charter=#{charter_id[0..7]} found=#{!charter.nil?}"
|
|
57
57
|
charter ? { found: true, charter: charter } : { found: false }
|
|
58
58
|
end
|
|
59
59
|
|
|
60
60
|
def active_swarms(**)
|
|
61
61
|
charters = swarm_store.active_charters
|
|
62
|
-
|
|
62
|
+
log.debug "[swarm] active: count=#{charters.size}"
|
|
63
63
|
{ charters: charters, count: charters.size }
|
|
64
64
|
end
|
|
65
65
|
|
|
66
66
|
def swarm_status(**)
|
|
67
67
|
total = swarm_store.count
|
|
68
|
-
|
|
68
|
+
log.debug "[swarm] status: total=#{total}"
|
|
69
69
|
{ total: total }
|
|
70
70
|
end
|
|
71
71
|
|
|
@@ -80,7 +80,7 @@ module Legion
|
|
|
80
80
|
charter[:status] = :disbanded
|
|
81
81
|
disbanded << charter[:charter_id]
|
|
82
82
|
end
|
|
83
|
-
|
|
83
|
+
log.debug "[swarm] stale check: checked=#{swarm_store.charters.size} disbanded=#{disbanded.size}"
|
|
84
84
|
{ checked: swarm_store.charters.size, disbanded: disbanded.size, disbanded_ids: disbanded }
|
|
85
85
|
end
|
|
86
86
|
|
|
@@ -12,7 +12,7 @@ module Legion
|
|
|
12
12
|
|
|
13
13
|
def workspace_put(charter_id:, key:, value:, author:, **)
|
|
14
14
|
entry = workspace.put(charter_id, key: key, value: value, author: author)
|
|
15
|
-
|
|
15
|
+
log.debug "[swarm-workspace] put: charter=#{charter_id[0..7]} key=#{key} v=#{entry[:version]}"
|
|
16
16
|
{ success: true, key: key, version: entry[:version], charter_id: charter_id }
|
|
17
17
|
end
|
|
18
18
|
|
|
@@ -33,7 +33,7 @@ module Legion
|
|
|
33
33
|
def workspace_delete(charter_id:, key:, **)
|
|
34
34
|
removed = workspace.delete(charter_id, key: key)
|
|
35
35
|
if removed
|
|
36
|
-
|
|
36
|
+
log.debug "[swarm-workspace] delete: charter=#{charter_id[0..7]} key=#{key}"
|
|
37
37
|
{ success: true, key: key, charter_id: charter_id }
|
|
38
38
|
else
|
|
39
39
|
{ success: false, reason: :not_found, key: key, charter_id: charter_id }
|
|
@@ -42,7 +42,7 @@ module Legion
|
|
|
42
42
|
|
|
43
43
|
def workspace_clear(charter_id:, **)
|
|
44
44
|
workspace.clear_charter(charter_id)
|
|
45
|
-
|
|
45
|
+
log.debug "[swarm-workspace] clear: charter=#{charter_id[0..7]}"
|
|
46
46
|
{ success: true, charter_id: charter_id }
|
|
47
47
|
end
|
|
48
48
|
|
|
@@ -7,11 +7,12 @@ RSpec.describe Legion::Extensions::Swarm::Actors::WorkspaceSync do
|
|
|
7
7
|
subject(:actor) { described_class.allocate }
|
|
8
8
|
|
|
9
9
|
describe '#publish_change' do
|
|
10
|
-
it 'returns skipped when transport
|
|
10
|
+
it 'returns skipped when transport publish fails' do
|
|
11
|
+
allow(Legion::Transport).to receive(:publish).and_raise(StandardError, 'not connected')
|
|
11
12
|
result = actor.publish_change(charter_id: 'c1', key: 'k', value: 'v',
|
|
12
13
|
author: 'a', version: 1, operation: :put)
|
|
13
14
|
expect(result[:success]).to be true
|
|
14
|
-
expect(result[:skipped]).to eq(:
|
|
15
|
+
expect(result[:skipped]).to eq(:publish_error)
|
|
15
16
|
end
|
|
16
17
|
end
|
|
17
18
|
|
data/spec/spec_helper.rb
CHANGED
|
@@ -1,13 +1,37 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
2
|
|
|
3
3
|
require 'bundler/setup'
|
|
4
|
+
require 'legion/logging'
|
|
5
|
+
require 'legion/settings'
|
|
6
|
+
require 'legion/cache/helper'
|
|
7
|
+
require 'legion/crypt/helper'
|
|
8
|
+
require 'legion/data/helper'
|
|
9
|
+
require 'legion/json/helper'
|
|
10
|
+
require 'legion/transport/helper'
|
|
4
11
|
|
|
5
12
|
module Legion
|
|
6
|
-
module
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
13
|
+
module Extensions
|
|
14
|
+
module Helpers
|
|
15
|
+
module Lex
|
|
16
|
+
include Legion::Logging::Helper
|
|
17
|
+
include Legion::Settings::Helper
|
|
18
|
+
include Legion::Cache::Helper
|
|
19
|
+
include Legion::Crypt::Helper
|
|
20
|
+
include Legion::Data::Helper
|
|
21
|
+
include Legion::JSON::Helper
|
|
22
|
+
include Legion::Transport::Helper
|
|
23
|
+
end
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
module Actors
|
|
27
|
+
class Every
|
|
28
|
+
include Helpers::Lex
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
class Once
|
|
32
|
+
include Helpers::Lex
|
|
33
|
+
end
|
|
34
|
+
end
|
|
11
35
|
end
|
|
12
36
|
end
|
|
13
37
|
|
metadata
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: lex-swarm
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 0.2.
|
|
4
|
+
version: 0.2.2
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Esity
|
|
@@ -9,6 +9,104 @@ bindir: bin
|
|
|
9
9
|
cert_chain: []
|
|
10
10
|
date: 1980-01-02 00:00:00.000000000 Z
|
|
11
11
|
dependencies:
|
|
12
|
+
- !ruby/object:Gem::Dependency
|
|
13
|
+
name: legion-cache
|
|
14
|
+
requirement: !ruby/object:Gem::Requirement
|
|
15
|
+
requirements:
|
|
16
|
+
- - ">="
|
|
17
|
+
- !ruby/object:Gem::Version
|
|
18
|
+
version: 1.3.11
|
|
19
|
+
type: :runtime
|
|
20
|
+
prerelease: false
|
|
21
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
22
|
+
requirements:
|
|
23
|
+
- - ">="
|
|
24
|
+
- !ruby/object:Gem::Version
|
|
25
|
+
version: 1.3.11
|
|
26
|
+
- !ruby/object:Gem::Dependency
|
|
27
|
+
name: legion-crypt
|
|
28
|
+
requirement: !ruby/object:Gem::Requirement
|
|
29
|
+
requirements:
|
|
30
|
+
- - ">="
|
|
31
|
+
- !ruby/object:Gem::Version
|
|
32
|
+
version: 1.4.9
|
|
33
|
+
type: :runtime
|
|
34
|
+
prerelease: false
|
|
35
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
36
|
+
requirements:
|
|
37
|
+
- - ">="
|
|
38
|
+
- !ruby/object:Gem::Version
|
|
39
|
+
version: 1.4.9
|
|
40
|
+
- !ruby/object:Gem::Dependency
|
|
41
|
+
name: legion-data
|
|
42
|
+
requirement: !ruby/object:Gem::Requirement
|
|
43
|
+
requirements:
|
|
44
|
+
- - ">="
|
|
45
|
+
- !ruby/object:Gem::Version
|
|
46
|
+
version: 1.4.17
|
|
47
|
+
type: :runtime
|
|
48
|
+
prerelease: false
|
|
49
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
50
|
+
requirements:
|
|
51
|
+
- - ">="
|
|
52
|
+
- !ruby/object:Gem::Version
|
|
53
|
+
version: 1.4.17
|
|
54
|
+
- !ruby/object:Gem::Dependency
|
|
55
|
+
name: legion-json
|
|
56
|
+
requirement: !ruby/object:Gem::Requirement
|
|
57
|
+
requirements:
|
|
58
|
+
- - ">="
|
|
59
|
+
- !ruby/object:Gem::Version
|
|
60
|
+
version: 1.2.1
|
|
61
|
+
type: :runtime
|
|
62
|
+
prerelease: false
|
|
63
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
64
|
+
requirements:
|
|
65
|
+
- - ">="
|
|
66
|
+
- !ruby/object:Gem::Version
|
|
67
|
+
version: 1.2.1
|
|
68
|
+
- !ruby/object:Gem::Dependency
|
|
69
|
+
name: legion-logging
|
|
70
|
+
requirement: !ruby/object:Gem::Requirement
|
|
71
|
+
requirements:
|
|
72
|
+
- - ">="
|
|
73
|
+
- !ruby/object:Gem::Version
|
|
74
|
+
version: 1.3.2
|
|
75
|
+
type: :runtime
|
|
76
|
+
prerelease: false
|
|
77
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
78
|
+
requirements:
|
|
79
|
+
- - ">="
|
|
80
|
+
- !ruby/object:Gem::Version
|
|
81
|
+
version: 1.3.2
|
|
82
|
+
- !ruby/object:Gem::Dependency
|
|
83
|
+
name: legion-settings
|
|
84
|
+
requirement: !ruby/object:Gem::Requirement
|
|
85
|
+
requirements:
|
|
86
|
+
- - ">="
|
|
87
|
+
- !ruby/object:Gem::Version
|
|
88
|
+
version: 1.3.14
|
|
89
|
+
type: :runtime
|
|
90
|
+
prerelease: false
|
|
91
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
92
|
+
requirements:
|
|
93
|
+
- - ">="
|
|
94
|
+
- !ruby/object:Gem::Version
|
|
95
|
+
version: 1.3.14
|
|
96
|
+
- !ruby/object:Gem::Dependency
|
|
97
|
+
name: legion-transport
|
|
98
|
+
requirement: !ruby/object:Gem::Requirement
|
|
99
|
+
requirements:
|
|
100
|
+
- - ">="
|
|
101
|
+
- !ruby/object:Gem::Version
|
|
102
|
+
version: 1.3.9
|
|
103
|
+
type: :runtime
|
|
104
|
+
prerelease: false
|
|
105
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
106
|
+
requirements:
|
|
107
|
+
- - ">="
|
|
108
|
+
- !ruby/object:Gem::Version
|
|
109
|
+
version: 1.3.9
|
|
12
110
|
- !ruby/object:Gem::Dependency
|
|
13
111
|
name: legion-gaia
|
|
14
112
|
requirement: !ruby/object:Gem::Requirement
|