lex-lex 0.3.4 → 0.3.6

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 60afc682e1c0a5fbf9ebd85ae1c9c2f16d91e7fe5bcdcf623984a9baae27a325
4
- data.tar.gz: f1be1282c8be0613b8c77706975168440c546ccf5ac00fd4d6fd1d9fd055597e
3
+ metadata.gz: 3243ab6be48b9602778598ee63810fa357789ec4419f9899587e70977c1635c4
4
+ data.tar.gz: c8adbc3c6efc21cc6e307aab07403de34a582bfa275d94777b252ffe117375d5
5
5
  SHA512:
6
- metadata.gz: 7d8050005b9b6eff43ee6c8d1f8be3f6a89e6dc0c4c3fdee0152abe48cf18b934be475de41e43b2f8a3b72b771e5d3c0a394566df50c3e0244acee25a3aa406e
7
- data.tar.gz: 6c903ce0206c679a25edb8912704862e992cd4cdb23c7b4a626fcacafa5f95184e0d72a38cfed5673560fce1050ee2eafe7d0cebfddca5c67e3b95c1401aa5ff
6
+ metadata.gz: 938dae527776a91aee1ef16193f9da5517c827a199c5c1babdd7623d5f0365d9860b3c0b864659ee40694f893db80b0c7e44b111ef0acee105094d2d71f4f959
7
+ data.tar.gz: cc4ea57cabf435f6e3bc97eb999310534503f4b1b36d974e187d71b22c22002d6becd140d079cc8fc7c889e9b0907496ba433fe622de700f6fea99e94d8ad9c7
@@ -10,8 +10,8 @@ jobs:
10
10
  ci:
11
11
  uses: LegionIO/.github/.github/workflows/ci.yml@main
12
12
 
13
- lint:
14
- uses: LegionIO/.github/.github/workflows/lint-patterns.yml@main
13
+ excluded-files:
14
+ uses: LegionIO/.github/.github/workflows/excluded-files.yml@main
15
15
 
16
16
  security:
17
17
  uses: LegionIO/.github/.github/workflows/security-scan.yml@main
@@ -27,7 +27,7 @@ jobs:
27
27
  uses: LegionIO/.github/.github/workflows/stale.yml@main
28
28
 
29
29
  release:
30
- needs: [ci, lint]
30
+ needs: [ci, excluded-files]
31
31
  if: github.event_name == 'push' && github.ref == 'refs/heads/main'
32
32
  uses: LegionIO/.github/.github/workflows/release.yml@main
33
33
  secrets:
data/.rubocop.yml CHANGED
@@ -1,65 +1,5 @@
1
- AllCops:
2
- TargetRubyVersion: 3.4
3
- NewCops: enable
4
- SuggestExtensions: false
5
-
6
- Layout/LineLength:
7
- Max: 160
8
-
9
- Layout/SpaceAroundEqualsInParameterDefault:
10
- EnforcedStyle: space
11
-
12
- Layout/HashAlignment:
13
- EnforcedHashRocketStyle: table
14
- EnforcedColonStyle: table
15
-
16
- Metrics/MethodLength:
17
- Max: 50
18
-
19
- Metrics/ClassLength:
20
- Max: 1500
21
-
22
- Metrics/ModuleLength:
23
- Max: 1500
24
-
25
- Metrics/AbcSize:
26
- Max: 60
27
-
28
- Metrics/CyclomaticComplexity:
29
- Max: 15
30
-
31
- Metrics/PerceivedComplexity:
32
- Max: 17
33
-
34
- Style/Documentation:
35
- Enabled: false
36
-
37
- Style/SymbolArray:
38
- Enabled: true
39
-
40
- Style/FrozenStringLiteralComment:
41
- Enabled: true
42
- EnforcedStyle: always
43
-
44
- Naming/FileName:
45
- Enabled: false
46
-
47
- Naming/PredicateMethod:
48
- Enabled: false
49
-
50
- Naming/PredicatePrefix:
51
- Enabled: false
52
-
53
- Gemspec/DevelopmentDependencies:
54
- Enabled: false
55
-
56
- Metrics/ParameterLists:
57
- Enabled: false
58
-
59
- Metrics/BlockLength:
60
- Max: 40
61
- Exclude:
62
- - 'spec/**/*'
1
+ inherit_gem:
2
+ rubocop-legion: config/lex.yml
63
3
 
64
4
  Style/OneClassPerFile:
65
5
  Exclude:
data/CHANGELOG.md CHANGED
@@ -1,5 +1,17 @@
1
1
  # Changelog
2
2
 
3
+ ## [0.3.6] - 2026-05-27
4
+
5
+ ### Changed
6
+ - Use Sequel static_cache for Extension/Runner/Function lookups in Register#save, eliminating per-message PG round-trips for existing records
7
+ - Fall back to `.where` queries when static_cache plugin is not loaded (test environments)
8
+ - Reload static caches after inserts/updates to keep in-memory state fresh
9
+
10
+ ## [0.3.5] - 2026-03-30
11
+
12
+ ### Changed
13
+ - update to rubocop-legion 0.1.7, resolve all offenses
14
+
3
15
  ## [0.3.4] - 2026-03-29
4
16
 
5
17
  ### Fixed
data/Gemfile CHANGED
@@ -3,3 +3,5 @@
3
3
  source 'https://rubygems.org'
4
4
 
5
5
  gemspec
6
+
7
+ gem 'rubocop-legion'
data/lex-lex.gemspec CHANGED
@@ -34,10 +34,10 @@ Gem::Specification.new do |spec|
34
34
  spec.add_dependency 'legion-settings', '>= 1.3.14'
35
35
  spec.add_dependency 'legion-transport', '>= 1.3.9'
36
36
 
37
- spec.add_development_dependency 'rake'
38
37
  spec.add_development_dependency 'rspec', '~> 3.13'
39
38
  spec.add_development_dependency 'rspec_junit_formatter'
40
- spec.add_development_dependency 'rubocop', '~> 1.75'
39
+ spec.add_development_dependency 'rubocop'
40
+ spec.add_development_dependency 'rubocop-legion'
41
41
  spec.add_development_dependency 'rubocop-rspec'
42
42
  spec.add_development_dependency 'simplecov'
43
43
  end
@@ -4,7 +4,7 @@ module Legion
4
4
  module Extensions
5
5
  module Lex
6
6
  module Actor
7
- class AgentWatcher < Legion::Extensions::Actors::Every
7
+ class AgentWatcher < Legion::Extensions::Actors::Every # rubocop:disable Legion/Extension/EveryActorRequiresTime
8
8
  def runner_class
9
9
  self.class
10
10
  end
@@ -27,11 +27,11 @@ module Legion
27
27
  false
28
28
  end
29
29
 
30
- def enabled?
30
+ def enabled? # rubocop:disable Legion/Extension/ActorEnabledSideEffects
31
31
  return false unless defined?(Legion::Settings)
32
32
 
33
33
  Legion::Settings[:data][:connected] == true
34
- rescue StandardError
34
+ rescue StandardError => _e
35
35
  false
36
36
  end
37
37
 
@@ -8,13 +8,14 @@ module Legion
8
8
  include Legion::Extensions::Helpers::Lex if defined?(Legion::Extensions::Helpers::Lex)
9
9
 
10
10
  def create(name:, namespace:, active: true, **opts)
11
- existing = Legion::Data::Model::Extension.where(name: name).first
12
- return update(extension_id: existing.values[:id], namespace: namespace, active: active, **opts) if existing
11
+ existing = find_cached_extension(name)
12
+ return update(extension_id: existing.values[:id], namespace: namespace, active: active, **opts) if existing # rubocop:disable Legion/Extension/RunnerReturnHash
13
13
 
14
14
  insert = { name: name, namespace: namespace, active: active }
15
15
  insert[:exchange] = opts.fetch(:exchange, name)
16
16
  insert[:uri] = opts.fetch(:uri, name)
17
17
  id = Legion::Data::Model::Extension.insert(insert)
18
+ reload_static_caches
18
19
  { success: true, extension_id: id }
19
20
  end
20
21
 
@@ -33,6 +34,7 @@ module Legion
33
34
  return { success: true, changed: false, extension_id: extension_id } if changes.empty?
34
35
 
35
36
  extension.update(changes)
37
+ reload_static_caches
36
38
  { success: true, changed: true, updates: changes, extension_id: extension_id }
37
39
  end
38
40
 
@@ -52,8 +54,26 @@ module Legion
52
54
  return { success: false, reason: 'not found' } if record.nil?
53
55
 
54
56
  record.delete
57
+ reload_static_caches
55
58
  { success: true, extension_id: extension_id }
56
59
  end
60
+
61
+ private
62
+
63
+ def find_cached_extension(name)
64
+ model = Legion::Data::Model::Extension
65
+ if model.respond_to?(:cache) && model.respond_to?(:all)
66
+ model.all.find { |e| e.values[:name] == name }
67
+ else
68
+ model.where(name: name).first
69
+ end
70
+ end
71
+
72
+ def reload_static_caches
73
+ [Legion::Data::Model::Extension, Legion::Data::Model::Runner, Legion::Data::Model::Function].each do |m|
74
+ m.load_cache if m.respond_to?(:load_cache)
75
+ end
76
+ end
57
77
  end
58
78
  end
59
79
  end
@@ -7,14 +7,17 @@ module Legion
7
7
  module Function
8
8
  include Legion::Extensions::Helpers::Lex if defined?(Legion::Extensions::Helpers::Lex)
9
9
 
10
+ RESERVED_ARG_NAMES = %w[opts options].freeze
11
+
10
12
  def create(runner_id:, name:, active: true, **opts)
11
- existing = Legion::Data::Model::Function.where(name: name.to_s, runner_id: runner_id).first
12
- return update(function_id: existing.values[:id], name: name, active: active, **opts) if existing
13
+ existing = find_cached_function(name, runner_id)
14
+ return update(function_id: existing.values[:id], name: name, active: active, **opts) if existing # rubocop:disable Legion/Extension/RunnerReturnHash
13
15
 
14
16
  insert = { runner_id: runner_id, name: name.to_s, active: active }
15
- insert[:args] = Legion::JSON.dump(opts[:formatted_args]) if opts.key?(:formatted_args)
17
+ insert[:args] = json_dump(opts[:formatted_args]) if opts.key?(:formatted_args)
16
18
 
17
19
  id = Legion::Data::Model::Function.insert(insert)
20
+ reload_static_caches
18
21
  { success: true, function_id: id }
19
22
  end
20
23
 
@@ -26,13 +29,14 @@ module Legion
26
29
  changes[:active] = opts[:active] if opts.key?(:active) && function.values[:active] != opts[:active]
27
30
 
28
31
  if opts.key?(:formatted_args)
29
- args = Legion::JSON.dump(opts[:formatted_args])
32
+ args = json_dump(opts[:formatted_args])
30
33
  changes[:args] = args unless args == function.values[:args]
31
34
  end
32
35
 
33
36
  return { success: true, changed: false, function_id: function_id } if changes.empty?
34
37
 
35
38
  function.update(changes)
39
+ reload_static_caches
36
40
  { success: true, changed: true, updates: changes, function_id: function_id }
37
41
  end
38
42
 
@@ -48,16 +52,34 @@ module Legion
48
52
  return { success: false, reason: 'not found' } if record.nil?
49
53
 
50
54
  record.delete
55
+ reload_static_caches
51
56
  { success: true, function_id: function_id }
52
57
  end
53
58
 
54
59
  def build_args(raw_args:, **_opts)
55
60
  args = {}
56
61
  raw_args.each do |arg|
57
- args[arg[1]] = arg[0] unless %w[opts options].include?(arg[1].to_s)
62
+ args[arg[1]] = arg[0] unless RESERVED_ARG_NAMES.include?(arg[1].to_s)
58
63
  end
59
64
  { success: true, formatted_args: args }
60
65
  end
66
+
67
+ private
68
+
69
+ def find_cached_function(name, runner_id)
70
+ model = Legion::Data::Model::Function
71
+ if model.respond_to?(:cache) && model.respond_to?(:all)
72
+ model.all.find { |f| f.values[:name] == name.to_s && f.values[:runner_id] == runner_id }
73
+ else
74
+ model.where(name: name.to_s, runner_id: runner_id).first
75
+ end
76
+ end
77
+
78
+ def reload_static_caches
79
+ [Legion::Data::Model::Extension, Legion::Data::Model::Runner, Legion::Data::Model::Function].each do |m|
80
+ m.load_cache if m.respond_to?(:load_cache)
81
+ end
82
+ end
61
83
  end
62
84
  end
63
85
  end
@@ -8,6 +8,9 @@ module Legion
8
8
  include Legion::Extensions::Helpers::Lex if defined?(Legion::Extensions::Helpers::Lex)
9
9
 
10
10
  def save(opts:, **_options)
11
+ log.unknown "save(opts: #{opts.class}, #{opts.length}, #{opts&.keys}"
12
+ log.unknown "full: #{opts}" if opts.empty?
13
+
11
14
  return { success: false, reason: 'no opts provided' } if opts.nil? || opts.empty?
12
15
 
13
16
  extension_id = nil
@@ -4,12 +4,12 @@ module Legion
4
4
  module Extensions
5
5
  module Lex
6
6
  module Runners
7
- module Runner
7
+ module Runner # rubocop:disable Legion/Extension/RunnerPluralModule
8
8
  include Legion::Extensions::Helpers::Lex if defined?(Legion::Extensions::Helpers::Lex)
9
9
 
10
10
  def create(extension_id:, name:, active: true, **opts)
11
- existing = Legion::Data::Model::Runner.where(name: name.to_s, extension_id: extension_id).first
12
- return update(runner_id: existing.values[:id], name: name, active: active, **opts) if existing
11
+ existing = find_cached_runner(name, extension_id)
12
+ return update(runner_id: existing.values[:id], name: name, active: active, **opts) if existing # rubocop:disable Legion/Extension/RunnerReturnHash
13
13
 
14
14
  insert = {
15
15
  extension_id: extension_id,
@@ -20,6 +20,7 @@ module Legion
20
20
  insert[:queue] = opts.fetch(:queue, name.to_s)
21
21
  insert[:uri] = opts.fetch(:uri, name.to_s)
22
22
  id = Legion::Data::Model::Runner.insert(insert)
23
+ reload_static_caches
23
24
  { success: true, runner_id: id }
24
25
  end
25
26
 
@@ -38,6 +39,7 @@ module Legion
38
39
  return { success: true, changed: false, runner_id: runner_id } if changes.empty?
39
40
 
40
41
  runner.update(changes)
42
+ reload_static_caches
41
43
  { success: true, changed: true, updates: changes, runner_id: runner_id }
42
44
  end
43
45
 
@@ -53,8 +55,26 @@ module Legion
53
55
  return { success: false, reason: 'not found' } if record.nil?
54
56
 
55
57
  record.delete
58
+ reload_static_caches
56
59
  { success: true, runner_id: runner_id }
57
60
  end
61
+
62
+ private
63
+
64
+ def find_cached_runner(name, extension_id)
65
+ model = Legion::Data::Model::Runner
66
+ if model.respond_to?(:cache) && model.respond_to?(:all)
67
+ model.all.find { |r| r.values[:name] == name.to_s && r.values[:extension_id] == extension_id }
68
+ else
69
+ model.where(name: name.to_s, extension_id: extension_id).first
70
+ end
71
+ end
72
+
73
+ def reload_static_caches
74
+ [Legion::Data::Model::Extension, Legion::Data::Model::Runner, Legion::Data::Model::Function].each do |m|
75
+ m.load_cache if m.respond_to?(:load_cache)
76
+ end
77
+ end
58
78
  end
59
79
  end
60
80
  end
@@ -3,7 +3,7 @@
3
3
  module Legion
4
4
  module Extensions
5
5
  module Lex
6
- VERSION = '0.3.4'
6
+ VERSION = '0.3.6'
7
7
  end
8
8
  end
9
9
  end
@@ -6,14 +6,14 @@ require_relative 'lex/runners/runner'
6
6
  require_relative 'lex/runners/function'
7
7
  require_relative 'lex/runners/register'
8
8
  require_relative 'lex/runners/sync'
9
- require_relative 'lex/actors/agent_watcher' if defined?(Legion::Extensions::Actors::Every)
9
+ require_relative 'lex/actors/agent_watcher'
10
10
 
11
11
  module Legion
12
12
  module Extensions
13
13
  module Lex
14
- extend Legion::Extensions::Core if Legion::Extensions.const_defined?(:Core)
14
+ extend Legion::Extensions::Core if Legion::Extensions.const_defined?(:Core, false)
15
15
 
16
- def self.data_required?
16
+ def self.data_required? # rubocop:disable Legion/Extension/DataRequiredWithoutMigrations
17
17
  true
18
18
  end
19
19
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: lex-lex
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.4
4
+ version: 0.3.6
5
5
  platform: ruby
6
6
  authors:
7
7
  - Esity
@@ -108,35 +108,35 @@ dependencies:
108
108
  - !ruby/object:Gem::Version
109
109
  version: 1.3.9
110
110
  - !ruby/object:Gem::Dependency
111
- name: rake
111
+ name: rspec
112
112
  requirement: !ruby/object:Gem::Requirement
113
113
  requirements:
114
- - - ">="
114
+ - - "~>"
115
115
  - !ruby/object:Gem::Version
116
- version: '0'
116
+ version: '3.13'
117
117
  type: :development
118
118
  prerelease: false
119
119
  version_requirements: !ruby/object:Gem::Requirement
120
120
  requirements:
121
- - - ">="
121
+ - - "~>"
122
122
  - !ruby/object:Gem::Version
123
- version: '0'
123
+ version: '3.13'
124
124
  - !ruby/object:Gem::Dependency
125
- name: rspec
125
+ name: rspec_junit_formatter
126
126
  requirement: !ruby/object:Gem::Requirement
127
127
  requirements:
128
- - - "~>"
128
+ - - ">="
129
129
  - !ruby/object:Gem::Version
130
- version: '3.13'
130
+ version: '0'
131
131
  type: :development
132
132
  prerelease: false
133
133
  version_requirements: !ruby/object:Gem::Requirement
134
134
  requirements:
135
- - - "~>"
135
+ - - ">="
136
136
  - !ruby/object:Gem::Version
137
- version: '3.13'
137
+ version: '0'
138
138
  - !ruby/object:Gem::Dependency
139
- name: rspec_junit_formatter
139
+ name: rubocop
140
140
  requirement: !ruby/object:Gem::Requirement
141
141
  requirements:
142
142
  - - ">="
@@ -150,19 +150,19 @@ dependencies:
150
150
  - !ruby/object:Gem::Version
151
151
  version: '0'
152
152
  - !ruby/object:Gem::Dependency
153
- name: rubocop
153
+ name: rubocop-legion
154
154
  requirement: !ruby/object:Gem::Requirement
155
155
  requirements:
156
- - - "~>"
156
+ - - ">="
157
157
  - !ruby/object:Gem::Version
158
- version: '1.75'
158
+ version: '0'
159
159
  type: :development
160
160
  prerelease: false
161
161
  version_requirements: !ruby/object:Gem::Requirement
162
162
  requirements:
163
- - - "~>"
163
+ - - ">="
164
164
  - !ruby/object:Gem::Version
165
- version: '1.75'
165
+ version: '0'
166
166
  - !ruby/object:Gem::Dependency
167
167
  name: rubocop-rspec
168
168
  requirement: !ruby/object:Gem::Requirement