lex-lex 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/.github/workflows/ci.yml +16 -0
- data/.rubocop.yml +56 -15
- data/CHANGELOG.md +28 -0
- data/CLAUDE.md +78 -0
- data/Gemfile +2 -0
- data/Gemfile.lock +65 -38
- data/README.md +25 -25
- data/lex-lex.gemspec +14 -12
- data/lib/legion/extensions/lex/actors/sync.rb +45 -0
- data/lib/legion/extensions/lex/runners/extension.rb +56 -53
- data/lib/legion/extensions/lex/runners/function.rb +52 -43
- data/lib/legion/extensions/lex/runners/register.rb +47 -58
- data/lib/legion/extensions/lex/runners/runner.rb +53 -37
- data/lib/legion/extensions/lex/runners/sync.rb +50 -0
- data/lib/legion/extensions/lex/version.rb +1 -1
- data/lib/legion/extensions/lex.rb +12 -5
- metadata +42 -29
- data/Dockerfile +0 -9
- data/Rakefile +0 -8
- data/bitbucket-pipelines.yml +0 -19
- data/docker_deploy.rb +0 -13
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 0b474e02feee750156314596b621bd8fe8425d08a0175bdb143e5a867f924f8b
|
|
4
|
+
data.tar.gz: e87547d06e779d04651916c1c9fc5c3fc2cd704906aa842b9928a2e758e058c1
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 0dedff5f561b638b61eb814699cb8ae10f07e6bd73be9acca5392226bcb1a813209426d0be17dc65c4a5d814f6de8e19e45b6a40f31cb2fa98a6934cc2881639
|
|
7
|
+
data.tar.gz: 21703e95634726a6f429f58dde4a6d35f79f814a606be40f62308f33fe06ea56f87bab43506d0ff39ff139d4b1d3a04ebe756fee96f268dc0dcf162e9c345543
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
name: CI
|
|
2
|
+
on:
|
|
3
|
+
push:
|
|
4
|
+
branches: [main]
|
|
5
|
+
pull_request:
|
|
6
|
+
|
|
7
|
+
jobs:
|
|
8
|
+
ci:
|
|
9
|
+
uses: LegionIO/.github/.github/workflows/ci.yml@main
|
|
10
|
+
|
|
11
|
+
release:
|
|
12
|
+
needs: ci
|
|
13
|
+
if: github.event_name == 'push' && github.ref == 'refs/heads/main'
|
|
14
|
+
uses: LegionIO/.github/.github/workflows/release.yml@main
|
|
15
|
+
secrets:
|
|
16
|
+
rubygems-api-key: ${{ secrets.RUBYGEMS_API_KEY }}
|
data/.rubocop.yml
CHANGED
|
@@ -1,25 +1,66 @@
|
|
|
1
|
+
AllCops:
|
|
2
|
+
TargetRubyVersion: 3.4
|
|
3
|
+
NewCops: enable
|
|
4
|
+
SuggestExtensions: false
|
|
5
|
+
|
|
1
6
|
Layout/LineLength:
|
|
2
|
-
Max:
|
|
3
|
-
|
|
4
|
-
Max: 55
|
|
5
|
-
Metrics/ClassLength:
|
|
6
|
-
Max: 1500
|
|
7
|
-
Metrics/BlockLength:
|
|
8
|
-
Max: 75
|
|
9
|
-
Metrics/AbcSize:
|
|
10
|
-
Max: 50
|
|
7
|
+
Max: 160
|
|
8
|
+
|
|
11
9
|
Layout/SpaceAroundEqualsInParameterDefault:
|
|
12
10
|
EnforcedStyle: space
|
|
13
|
-
|
|
14
|
-
Enabled: true
|
|
11
|
+
|
|
15
12
|
Layout/HashAlignment:
|
|
16
13
|
EnforcedHashRocketStyle: table
|
|
17
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
|
+
|
|
18
34
|
Style/Documentation:
|
|
19
35
|
Enabled: false
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
36
|
+
|
|
37
|
+
Style/SymbolArray:
|
|
38
|
+
Enabled: true
|
|
39
|
+
|
|
24
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:
|
|
25
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/**/*'
|
|
63
|
+
|
|
64
|
+
Style/OneClassPerFile:
|
|
65
|
+
Exclude:
|
|
66
|
+
- 'spec/**/*'
|
data/CHANGELOG.md
ADDED
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
# Changelog
|
|
2
|
+
|
|
3
|
+
## [0.2.0] - 2026-03-14
|
|
4
|
+
|
|
5
|
+
### Added
|
|
6
|
+
- Sync runner: reconciles in-memory extensions with database on startup
|
|
7
|
+
- Sync Once actor: fires 5s after startup, guarded by `Legion::Data.connected?`
|
|
8
|
+
- Nil guards on all CRUD operations (return `{ success: false }` instead of raising)
|
|
9
|
+
- Comprehensive spec suite (55 specs)
|
|
10
|
+
|
|
11
|
+
### Changed
|
|
12
|
+
- Modernized to Ruby >= 3.4
|
|
13
|
+
- Register.save uses direct module calls instead of `Legion::Runner.run` chain
|
|
14
|
+
- Register.save is now an instance method (was `self.save`)
|
|
15
|
+
- Updated gemspec: GitHub URLs, rubygems_mfa_required, modern dev dependencies
|
|
16
|
+
- Updated rubocop config to match current LegionIO conventions
|
|
17
|
+
- All runners guard `include Legion::Extensions::Helpers::Lex` with `defined?` check
|
|
18
|
+
|
|
19
|
+
### Removed
|
|
20
|
+
- Bitbucket pipeline config
|
|
21
|
+
- Docker deployment script
|
|
22
|
+
- Old Dockerfile
|
|
23
|
+
|
|
24
|
+
## [0.1.3] - Legacy
|
|
25
|
+
|
|
26
|
+
- Original Bitbucket-era release
|
|
27
|
+
- Ruby 2.5 minimum
|
|
28
|
+
- Extension/Runner/Function CRUD via `Legion::Runner.run` chain
|
data/CLAUDE.md
ADDED
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
# lex-lex: Extension Registry for LegionIO
|
|
2
|
+
|
|
3
|
+
**Repository Level 3 Documentation**
|
|
4
|
+
- **Parent**: `/Users/miverso2/rubymine/legion/extensions-core/CLAUDE.md`
|
|
5
|
+
- **Grandparent**: `/Users/miverso2/rubymine/legion/CLAUDE.md`
|
|
6
|
+
|
|
7
|
+
## Purpose
|
|
8
|
+
|
|
9
|
+
Core Legion Extension that persists extension, runner, and function metadata to the database. When LEX gems load, `LegionIO` publishes a `LexRegister` message to RabbitMQ. This extension consumes those messages and writes the catalog to `legion-data` models. Also provides a sync runner that reconciles in-memory extension state with the database on startup.
|
|
10
|
+
|
|
11
|
+
Without lex-lex, the extensions/runners/functions DB tables remain empty, and the REST API, MCP tools, and CLI commands that query extension metadata return stale results.
|
|
12
|
+
|
|
13
|
+
**GitHub**: https://github.com/LegionIO/lex-lex
|
|
14
|
+
**License**: MIT
|
|
15
|
+
**Version**: 0.2.0
|
|
16
|
+
|
|
17
|
+
## Architecture
|
|
18
|
+
|
|
19
|
+
```
|
|
20
|
+
Legion::Extensions::Lex
|
|
21
|
+
├── Runners/
|
|
22
|
+
│ ├── Extension # CRUD on Legion::Data::Model::Extension
|
|
23
|
+
│ ├── Runner # CRUD on Legion::Data::Model::Runner
|
|
24
|
+
│ ├── Function # CRUD on Legion::Data::Model::Function + arg schema building
|
|
25
|
+
│ ├── Register # Orchestration: persist full extension descriptor from LexRegister message
|
|
26
|
+
│ └── Sync # Reconcile in-memory @extensions with DB (guarded by Data.connected?)
|
|
27
|
+
└── Actors/
|
|
28
|
+
└── Sync # Once actor: fires 5s after startup, calls Sync.sync
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
## Data Flow
|
|
32
|
+
|
|
33
|
+
```
|
|
34
|
+
Extension loads (LegionIO/lib/legion/extensions.rb)
|
|
35
|
+
-> Publishes LexRegister message (routing key: extension_manager.register.save)
|
|
36
|
+
-> RabbitMQ queue "lex.register" (defined in lex-tasker)
|
|
37
|
+
-> lex-lex Subscription actor consumes message
|
|
38
|
+
-> Register.save persists extension + runners + functions to DB
|
|
39
|
+
|
|
40
|
+
Startup (after all extensions load):
|
|
41
|
+
-> Sync Once actor fires (5s delay)
|
|
42
|
+
-> Reads Legion::Extensions.@extensions and @loaded_extensions
|
|
43
|
+
-> Creates/updates DB records to match in-memory state
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
## Key Design Decisions
|
|
47
|
+
|
|
48
|
+
- **Direct DB calls**: Register.save calls Extension/Runner/Function modules directly instead of going through `Legion::Runner.run`. Registration is infrastructure plumbing, not business logic — task tracking overhead is unnecessary.
|
|
49
|
+
- **Idempotent**: All create methods check for existing records and update instead of duplicating.
|
|
50
|
+
- **Guard on sync**: Sync runner checks `Legion::Settings[:data][:connected]` before any DB operations.
|
|
51
|
+
- **data_required?**: Set to `true` — extension will not load if `legion-data` is unavailable.
|
|
52
|
+
|
|
53
|
+
## File Map
|
|
54
|
+
|
|
55
|
+
| Path | Purpose |
|
|
56
|
+
|------|---------|
|
|
57
|
+
| `lib/legion/extensions/lex.rb` | Entry point, requires all runners |
|
|
58
|
+
| `lib/legion/extensions/lex/version.rb` | VERSION constant (0.2.0) |
|
|
59
|
+
| `lib/legion/extensions/lex/runners/extension.rb` | Extension CRUD |
|
|
60
|
+
| `lib/legion/extensions/lex/runners/runner.rb` | Runner CRUD |
|
|
61
|
+
| `lib/legion/extensions/lex/runners/function.rb` | Function CRUD + build_args |
|
|
62
|
+
| `lib/legion/extensions/lex/runners/register.rb` | Orchestration: full extension registration |
|
|
63
|
+
| `lib/legion/extensions/lex/runners/sync.rb` | In-memory to DB reconciliation |
|
|
64
|
+
| `lib/legion/extensions/lex/actors/sync.rb` | Once actor for startup sync |
|
|
65
|
+
|
|
66
|
+
## Testing
|
|
67
|
+
|
|
68
|
+
```bash
|
|
69
|
+
bundle install
|
|
70
|
+
bundle exec rspec # 55 specs
|
|
71
|
+
bundle exec rubocop # 0 offenses
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
Specs run standalone without the full Legion framework. The spec_helper provides in-memory stubs for `Legion::Data::Model::*`, `Legion::Settings`, `Legion::Extensions::Helpers::Lex`, and `Legion::JSON`.
|
|
75
|
+
|
|
76
|
+
---
|
|
77
|
+
|
|
78
|
+
**Maintained By**: Matthew Iverson (@Esity)
|
data/Gemfile
CHANGED
data/Gemfile.lock
CHANGED
|
@@ -1,64 +1,91 @@
|
|
|
1
1
|
PATH
|
|
2
2
|
remote: .
|
|
3
3
|
specs:
|
|
4
|
-
lex-lex (0.
|
|
4
|
+
lex-lex (0.2.0)
|
|
5
5
|
|
|
6
6
|
GEM
|
|
7
7
|
remote: https://rubygems.org/
|
|
8
8
|
specs:
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
9
|
+
addressable (2.8.9)
|
|
10
|
+
public_suffix (>= 2.0.2, < 8.0)
|
|
11
|
+
ast (2.4.3)
|
|
12
|
+
bigdecimal (4.0.1)
|
|
13
|
+
diff-lcs (1.6.2)
|
|
14
|
+
docile (1.4.1)
|
|
15
|
+
json (2.19.1)
|
|
16
|
+
json-schema (6.2.0)
|
|
17
|
+
addressable (~> 2.8)
|
|
18
|
+
bigdecimal (>= 3.1, < 5)
|
|
19
|
+
language_server-protocol (3.17.0.5)
|
|
20
|
+
lint_roller (1.1.0)
|
|
21
|
+
mcp (0.8.0)
|
|
22
|
+
json-schema (>= 4.1)
|
|
23
|
+
parallel (1.27.0)
|
|
24
|
+
parser (3.3.10.2)
|
|
14
25
|
ast (~> 2.4.1)
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
rspec-
|
|
25
|
-
|
|
26
|
+
racc
|
|
27
|
+
prism (1.9.0)
|
|
28
|
+
public_suffix (7.0.5)
|
|
29
|
+
racc (1.8.1)
|
|
30
|
+
rainbow (3.1.1)
|
|
31
|
+
rake (13.3.1)
|
|
32
|
+
regexp_parser (2.11.3)
|
|
33
|
+
rspec (3.13.2)
|
|
34
|
+
rspec-core (~> 3.13.0)
|
|
35
|
+
rspec-expectations (~> 3.13.0)
|
|
36
|
+
rspec-mocks (~> 3.13.0)
|
|
37
|
+
rspec-core (3.13.6)
|
|
38
|
+
rspec-support (~> 3.13.0)
|
|
39
|
+
rspec-expectations (3.13.5)
|
|
26
40
|
diff-lcs (>= 1.2.0, < 2.0)
|
|
27
|
-
rspec-support (~> 3.
|
|
28
|
-
rspec-mocks (3.
|
|
41
|
+
rspec-support (~> 3.13.0)
|
|
42
|
+
rspec-mocks (3.13.8)
|
|
29
43
|
diff-lcs (>= 1.2.0, < 2.0)
|
|
30
|
-
rspec-support (~> 3.
|
|
31
|
-
rspec-support (3.
|
|
32
|
-
|
|
44
|
+
rspec-support (~> 3.13.0)
|
|
45
|
+
rspec-support (3.13.7)
|
|
46
|
+
rspec_junit_formatter (0.6.0)
|
|
47
|
+
rspec-core (>= 2, < 4, != 2.12.0)
|
|
48
|
+
rubocop (1.85.1)
|
|
49
|
+
json (~> 2.3)
|
|
50
|
+
language_server-protocol (~> 3.17.0.2)
|
|
51
|
+
lint_roller (~> 1.1.0)
|
|
52
|
+
mcp (~> 0.6)
|
|
33
53
|
parallel (~> 1.10)
|
|
34
|
-
parser (>= 3.
|
|
54
|
+
parser (>= 3.3.0.2)
|
|
35
55
|
rainbow (>= 2.2.2, < 4.0)
|
|
36
|
-
regexp_parser (>=
|
|
37
|
-
|
|
38
|
-
rubocop-ast (>= 1.2.0, < 2.0)
|
|
56
|
+
regexp_parser (>= 2.9.3, < 3.0)
|
|
57
|
+
rubocop-ast (>= 1.49.0, < 2.0)
|
|
39
58
|
ruby-progressbar (~> 1.7)
|
|
40
|
-
unicode-display_width (>=
|
|
41
|
-
rubocop-ast (1.
|
|
42
|
-
parser (>=
|
|
43
|
-
|
|
44
|
-
|
|
59
|
+
unicode-display_width (>= 2.4.0, < 4.0)
|
|
60
|
+
rubocop-ast (1.49.1)
|
|
61
|
+
parser (>= 3.3.7.2)
|
|
62
|
+
prism (~> 1.7)
|
|
63
|
+
rubocop-rspec (3.9.0)
|
|
64
|
+
lint_roller (~> 1.1)
|
|
65
|
+
rubocop (~> 1.81)
|
|
66
|
+
ruby-progressbar (1.13.0)
|
|
67
|
+
simplecov (0.22.0)
|
|
45
68
|
docile (~> 1.1)
|
|
46
69
|
simplecov-html (~> 0.11)
|
|
47
70
|
simplecov_json_formatter (~> 0.1)
|
|
48
|
-
simplecov-html (0.
|
|
49
|
-
simplecov_json_formatter (0.1.
|
|
50
|
-
unicode-display_width (2.0
|
|
71
|
+
simplecov-html (0.13.2)
|
|
72
|
+
simplecov_json_formatter (0.1.4)
|
|
73
|
+
unicode-display_width (3.2.0)
|
|
74
|
+
unicode-emoji (~> 4.1)
|
|
75
|
+
unicode-emoji (4.2.0)
|
|
51
76
|
|
|
52
77
|
PLATFORMS
|
|
78
|
+
arm64-darwin-25
|
|
53
79
|
ruby
|
|
54
80
|
|
|
55
81
|
DEPENDENCIES
|
|
56
|
-
bundler (>= 2)
|
|
57
82
|
lex-lex!
|
|
58
83
|
rake
|
|
59
|
-
rspec
|
|
60
|
-
|
|
84
|
+
rspec (~> 3.13)
|
|
85
|
+
rspec_junit_formatter
|
|
86
|
+
rubocop (~> 1.75)
|
|
87
|
+
rubocop-rspec
|
|
61
88
|
simplecov
|
|
62
89
|
|
|
63
90
|
BUNDLED WITH
|
|
64
|
-
2.
|
|
91
|
+
2.6.9
|
data/README.md
CHANGED
|
@@ -1,40 +1,40 @@
|
|
|
1
|
-
#
|
|
1
|
+
# lex-lex
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
Extension registry for [LegionIO](https://github.com/LegionIO). Persists extension, runner, and function metadata to the database when LEX gems load.
|
|
4
4
|
|
|
5
|
-
|
|
5
|
+
## What It Does
|
|
6
6
|
|
|
7
|
-
|
|
7
|
+
When LegionIO loads extensions, it publishes `LexRegister` messages to RabbitMQ. This extension:
|
|
8
8
|
|
|
9
|
-
|
|
9
|
+
1. **Consumes** those messages via a subscription actor
|
|
10
|
+
2. **Persists** extension/runner/function records to `legion-data` models
|
|
11
|
+
3. **Syncs** in-memory extension state with the database on startup
|
|
10
12
|
|
|
11
|
-
|
|
12
|
-
gem 'legion-extensions-lex'
|
|
13
|
-
```
|
|
14
|
-
|
|
15
|
-
And then execute:
|
|
13
|
+
Without lex-lex, the REST API (`/api/extensions`), MCP tools (`legion.list_extensions`), and CLI (`legion lex list`) return empty results.
|
|
16
14
|
|
|
17
|
-
|
|
15
|
+
## Runners
|
|
18
16
|
|
|
19
|
-
|
|
17
|
+
| Runner | Methods | Purpose |
|
|
18
|
+
|--------|---------|---------|
|
|
19
|
+
| Extension | create, update, get, delete | CRUD for extensions |
|
|
20
|
+
| Runner | create, update, get, delete | CRUD for runners |
|
|
21
|
+
| Function | create, update, get, delete, build_args | CRUD for functions + arg schema |
|
|
22
|
+
| Register | save | Persist full extension descriptor |
|
|
23
|
+
| Sync | sync | Reconcile in-memory state with DB |
|
|
20
24
|
|
|
21
|
-
|
|
25
|
+
## Requirements
|
|
22
26
|
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
TODO: Write usage instructions here
|
|
27
|
+
- Ruby >= 3.4
|
|
28
|
+
- `legion-data` must be connected (`data_required? true`)
|
|
26
29
|
|
|
27
30
|
## Development
|
|
28
31
|
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
Bug reports and pull requests are welcome on GitHub at https://github.com/[USERNAME]/legion-extensions-lex.
|
|
36
|
-
|
|
32
|
+
```bash
|
|
33
|
+
bundle install
|
|
34
|
+
bundle exec rspec
|
|
35
|
+
bundle exec rubocop
|
|
36
|
+
```
|
|
37
37
|
|
|
38
38
|
## License
|
|
39
39
|
|
|
40
|
-
|
|
40
|
+
MIT
|
data/lex-lex.gemspec
CHANGED
|
@@ -8,26 +8,28 @@ Gem::Specification.new do |spec|
|
|
|
8
8
|
spec.authors = ['Esity']
|
|
9
9
|
spec.email = ['matthewdiverson@gmail.com']
|
|
10
10
|
|
|
11
|
-
spec.summary = '
|
|
12
|
-
spec.description = '
|
|
13
|
-
spec.homepage = 'https://
|
|
11
|
+
spec.summary = 'Legion Extension Registry'
|
|
12
|
+
spec.description = 'Persists extension, runner, and function metadata to the database when LEX gems load'
|
|
13
|
+
spec.homepage = 'https://github.com/LegionIO/lex-lex'
|
|
14
14
|
spec.license = 'MIT'
|
|
15
|
-
spec.required_ruby_version =
|
|
15
|
+
spec.required_ruby_version = '>= 3.4'
|
|
16
16
|
|
|
17
|
-
spec.metadata['homepage_uri']
|
|
18
|
-
spec.metadata['source_code_uri']
|
|
19
|
-
spec.metadata['
|
|
20
|
-
spec.metadata['
|
|
21
|
-
spec.metadata['bug_tracker_uri']
|
|
17
|
+
spec.metadata['homepage_uri'] = spec.homepage
|
|
18
|
+
spec.metadata['source_code_uri'] = 'https://github.com/LegionIO/lex-lex'
|
|
19
|
+
spec.metadata['changelog_uri'] = 'https://github.com/LegionIO/lex-lex'
|
|
20
|
+
spec.metadata['documentation_uri'] = 'https://github.com/LegionIO/lex-lex'
|
|
21
|
+
spec.metadata['bug_tracker_uri'] = 'https://github.com/LegionIO/lex-lex/issues'
|
|
22
|
+
spec.metadata['rubygems_mfa_required'] = 'true'
|
|
22
23
|
|
|
23
24
|
spec.files = Dir.chdir(File.expand_path(__dir__)) do
|
|
24
25
|
`git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
|
|
25
26
|
end
|
|
26
27
|
spec.require_paths = ['lib']
|
|
27
28
|
|
|
28
|
-
spec.add_development_dependency 'bundler', '>= 2'
|
|
29
29
|
spec.add_development_dependency 'rake'
|
|
30
|
-
spec.add_development_dependency 'rspec'
|
|
31
|
-
spec.add_development_dependency '
|
|
30
|
+
spec.add_development_dependency 'rspec', '~> 3.13'
|
|
31
|
+
spec.add_development_dependency 'rspec_junit_formatter'
|
|
32
|
+
spec.add_development_dependency 'rubocop', '~> 1.75'
|
|
33
|
+
spec.add_development_dependency 'rubocop-rspec'
|
|
32
34
|
spec.add_development_dependency 'simplecov'
|
|
33
35
|
end
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require 'legion/extensions/actors/once'
|
|
4
|
+
|
|
5
|
+
module Legion
|
|
6
|
+
module Extensions
|
|
7
|
+
module Lex
|
|
8
|
+
module Actor
|
|
9
|
+
class Sync < Legion::Extensions::Actors::Once
|
|
10
|
+
def runner_class
|
|
11
|
+
Legion::Extensions::Lex::Runners::Sync
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
def runner_function
|
|
15
|
+
'sync'
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
def use_runner?
|
|
19
|
+
false
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
def check_subtask?
|
|
23
|
+
false
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
def generate_task?
|
|
27
|
+
false
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
def enabled?
|
|
31
|
+
return false unless defined?(Legion::Settings)
|
|
32
|
+
|
|
33
|
+
Legion::Settings[:data][:connected] == true
|
|
34
|
+
rescue StandardError
|
|
35
|
+
false
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
def delay
|
|
39
|
+
5.0
|
|
40
|
+
end
|
|
41
|
+
end
|
|
42
|
+
end
|
|
43
|
+
end
|
|
44
|
+
end
|
|
45
|
+
end
|
|
@@ -1,57 +1,60 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Legion
|
|
4
|
+
module Extensions
|
|
5
|
+
module Lex
|
|
6
|
+
module Runners
|
|
7
|
+
module Extension
|
|
8
|
+
include Legion::Extensions::Helpers::Lex if defined?(Legion::Extensions::Helpers::Lex)
|
|
9
|
+
|
|
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
|
|
13
|
+
|
|
14
|
+
insert = { name: name, namespace: namespace, active: active }
|
|
15
|
+
insert[:exchange] = opts.fetch(:exchange, name)
|
|
16
|
+
insert[:uri] = opts.fetch(:uri, name)
|
|
17
|
+
id = Legion::Data::Model::Extension.insert(insert)
|
|
18
|
+
{ success: true, extension_id: id }
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
def update(extension_id:, **opts)
|
|
22
|
+
extension = Legion::Data::Model::Extension[extension_id]
|
|
23
|
+
return { success: false, reason: 'extension not found' } if extension.nil?
|
|
24
|
+
|
|
25
|
+
update = {}
|
|
26
|
+
%i[name namespace active exchange uri].each do |column|
|
|
27
|
+
next unless opts.key?(column)
|
|
28
|
+
next if extension.values[column] == opts[column]
|
|
29
|
+
|
|
30
|
+
update[column] = opts[column]
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
return { success: true, changed: false, extension_id: extension_id } if update.empty?
|
|
34
|
+
|
|
35
|
+
extension.update(update)
|
|
36
|
+
{ success: true, changed: true, updates: update, extension_id: extension_id }
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
def get(extension_id: nil, name: nil, namespace: nil, **_opts)
|
|
40
|
+
dataset = Legion::Data::Model::Extension
|
|
41
|
+
dataset = dataset.where(id: extension_id) if extension_id
|
|
42
|
+
dataset = dataset.where(name: name) if name
|
|
43
|
+
dataset = dataset.where(namespace: namespace) if namespace
|
|
44
|
+
record = dataset.first
|
|
45
|
+
return { success: false, reason: 'not found' } if record.nil?
|
|
46
|
+
|
|
47
|
+
{ success: true, values: record.values }
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
def delete(extension_id:, **_opts)
|
|
51
|
+
record = Legion::Data::Model::Extension[extension_id]
|
|
52
|
+
return { success: false, reason: 'not found' } if record.nil?
|
|
53
|
+
|
|
54
|
+
record.delete
|
|
55
|
+
{ success: true, extension_id: extension_id }
|
|
56
|
+
end
|
|
15
57
|
end
|
|
16
|
-
|
|
17
|
-
insert = { name: name, namespace: namespace, active: active }
|
|
18
|
-
insert[:exchange] = opts.key?(:exchange) ? opts[:exchange] : name
|
|
19
|
-
insert[:uri] = opts.key?(:uri) ? opts[:uri] : name
|
|
20
|
-
{ success: true, extension_id: model.insert(insert) }
|
|
21
|
-
end
|
|
22
|
-
|
|
23
|
-
def update(extension_id:, **opts)
|
|
24
|
-
extension = Legion::Data::Model::Extension[extension_id]
|
|
25
|
-
update = {}
|
|
26
|
-
%i[name namespace active exchange uri].each do |column|
|
|
27
|
-
next unless opts.key? column
|
|
28
|
-
next if extension.values[column] == opts[column]
|
|
29
|
-
|
|
30
|
-
update[column] = opts[column]
|
|
31
|
-
end
|
|
32
|
-
|
|
33
|
-
{ success: true, changed: false, extension_id: extension_id } if update.count.zero?
|
|
34
|
-
extension.update(update)
|
|
35
|
-
{ success: true, changed: true, updates: update, extension_id: extension_id }
|
|
36
|
-
end
|
|
37
|
-
|
|
38
|
-
def get(**opts)
|
|
39
|
-
extension = Legion::Data::Model::Extension
|
|
40
|
-
extension.where(id: opts[:extension_id]) if opts.key? :extension_id
|
|
41
|
-
extension.where(name: opts[:name]) if opts.key? :name
|
|
42
|
-
extension.where(namespace: opts[:namespace]) if opts.key? :namespace
|
|
43
|
-
{ success: true, values: extension.first.values }
|
|
44
|
-
end
|
|
45
|
-
|
|
46
|
-
def delete(extension_id:, **_opts)
|
|
47
|
-
Legion::Data::Model::Extension[extension_id].delete
|
|
48
|
-
{ success: true, extension_id: extension_id }
|
|
49
|
-
end
|
|
50
|
-
|
|
51
|
-
private
|
|
52
|
-
|
|
53
|
-
def model
|
|
54
|
-
Legion::Data::Model::Extension
|
|
55
58
|
end
|
|
56
59
|
end
|
|
57
60
|
end
|
|
@@ -1,55 +1,64 @@
|
|
|
1
|
-
|
|
2
|
-
module Runners
|
|
3
|
-
module Function
|
|
4
|
-
include Legion::Extensions::Helpers::Lex
|
|
5
|
-
|
|
6
|
-
def create(runner_id:, name:, active: 1, **opts)
|
|
7
|
-
exist = Legion::Data::Model::Function.where(name: name.to_s).where(runner_id: runner_id).first
|
|
8
|
-
unless exist.nil?
|
|
9
|
-
log.debug "function: #{exist.values[:id]} already exists, updating it"
|
|
10
|
-
update_hash = { function_id: exist.values[:id], name: name, active: active, **opts }
|
|
11
|
-
return Legion::Runner.run(runner_class: 'Legion::Extensions::Lex::Runners::Function',
|
|
12
|
-
function: 'update',
|
|
13
|
-
args: update_hash,
|
|
14
|
-
parent_id: opts[:task_id],
|
|
15
|
-
master_id: opts[:master_id])
|
|
16
|
-
end
|
|
17
|
-
insert = { runner_id: runner_id, name: name.to_s, active: active }
|
|
18
|
-
insert[:args] = Legion::JSON.dump(opts[:formatted_args]) if opts.key? :formatted_args
|
|
1
|
+
# frozen_string_literal: true
|
|
19
2
|
|
|
20
|
-
|
|
21
|
-
|
|
3
|
+
module Legion
|
|
4
|
+
module Extensions
|
|
5
|
+
module Lex
|
|
6
|
+
module Runners
|
|
7
|
+
module Function
|
|
8
|
+
include Legion::Extensions::Helpers::Lex if defined?(Legion::Extensions::Helpers::Lex)
|
|
22
9
|
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
update[:active] = true unless function.values[:active]
|
|
10
|
+
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
|
|
27
13
|
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
update[:args] = args unless args == function.values[:args]
|
|
31
|
-
end
|
|
14
|
+
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)
|
|
32
16
|
|
|
33
|
-
|
|
17
|
+
id = Legion::Data::Model::Function.insert(insert)
|
|
18
|
+
{ success: true, function_id: id }
|
|
19
|
+
end
|
|
34
20
|
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
21
|
+
def update(function_id:, **opts)
|
|
22
|
+
function = Legion::Data::Model::Function[function_id]
|
|
23
|
+
return { success: false, reason: 'function not found' } if function.nil?
|
|
38
24
|
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
end
|
|
25
|
+
update = {}
|
|
26
|
+
update[:active] = opts[:active] if opts.key?(:active) && function.values[:active] != opts[:active]
|
|
42
27
|
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
28
|
+
if opts.key?(:formatted_args)
|
|
29
|
+
args = Legion::JSON.dump(opts[:formatted_args])
|
|
30
|
+
update[:args] = args unless args == function.values[:args]
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
return { success: true, changed: false, function_id: function_id } if update.empty?
|
|
34
|
+
|
|
35
|
+
function.update(update)
|
|
36
|
+
{ success: true, changed: true, updates: update, function_id: function_id }
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
def get(function_id:, **_opts)
|
|
40
|
+
record = Legion::Data::Model::Function[function_id]
|
|
41
|
+
return { success: false, reason: 'not found' } if record.nil?
|
|
42
|
+
|
|
43
|
+
{ success: true, values: record.values }
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
def delete(function_id:, **_opts)
|
|
47
|
+
record = Legion::Data::Model::Function[function_id]
|
|
48
|
+
return { success: false, reason: 'not found' } if record.nil?
|
|
49
|
+
|
|
50
|
+
record.delete
|
|
51
|
+
{ success: true, function_id: function_id }
|
|
52
|
+
end
|
|
46
53
|
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
54
|
+
def build_args(raw_args:, **_opts)
|
|
55
|
+
args = {}
|
|
56
|
+
raw_args.each do |arg|
|
|
57
|
+
args[arg[1]] = arg[0] unless %w[opts options].include?(arg[1].to_s)
|
|
58
|
+
end
|
|
59
|
+
{ success: true, formatted_args: args }
|
|
60
|
+
end
|
|
51
61
|
end
|
|
52
|
-
{ success: true, formatted_args: args }
|
|
53
62
|
end
|
|
54
63
|
end
|
|
55
64
|
end
|
|
@@ -1,68 +1,57 @@
|
|
|
1
|
-
|
|
2
|
-
module Runners
|
|
3
|
-
module Register
|
|
4
|
-
include Legion::Extensions::Helpers::Lex
|
|
1
|
+
# frozen_string_literal: true
|
|
5
2
|
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
if
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
3
|
+
module Legion
|
|
4
|
+
module Extensions
|
|
5
|
+
module Lex
|
|
6
|
+
module Runners
|
|
7
|
+
module Register
|
|
8
|
+
include Legion::Extensions::Helpers::Lex if defined?(Legion::Extensions::Helpers::Lex)
|
|
9
|
+
|
|
10
|
+
def save(opts:, **_options)
|
|
11
|
+
return { success: false, reason: 'no opts provided' } if opts.nil? || opts.empty?
|
|
12
|
+
|
|
13
|
+
extension_id = nil
|
|
14
|
+
runners_created = 0
|
|
15
|
+
functions_created = 0
|
|
16
|
+
|
|
17
|
+
opts.each do |runner_name, runner_opts|
|
|
18
|
+
next unless runner_opts.is_a?(Hash)
|
|
19
|
+
|
|
20
|
+
if extension_id.nil?
|
|
21
|
+
ext_result = Extension.create(
|
|
22
|
+
name: runner_opts[:extension_name],
|
|
23
|
+
namespace: runner_opts[:extension_class].to_s
|
|
24
|
+
)
|
|
25
|
+
extension_id = ext_result[:extension_id]
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
runner_result = Runner.create(
|
|
29
|
+
extension_id: extension_id,
|
|
30
|
+
name: runner_name.to_s,
|
|
31
|
+
namespace: runner_opts[:runner_class].to_s
|
|
32
|
+
)
|
|
33
|
+
runner_id = runner_result[:runner_id]
|
|
34
|
+
runners_created += 1
|
|
26
35
|
|
|
27
|
-
|
|
28
|
-
name: runner_name,
|
|
29
|
-
namespace: opt[:runner_class],
|
|
30
|
-
parent_id: @parent_id,
|
|
31
|
-
master_id: opts[:task_id] }
|
|
32
|
-
runner = Legion::Runner.run(runner_class: 'Legion::Extensions::Lex::Runners::Runner',
|
|
33
|
-
function: 'create',
|
|
34
|
-
args: runner_args,
|
|
35
|
-
parent_id: @parent_id,
|
|
36
|
-
master_id: master_id)
|
|
36
|
+
next unless runner_opts[:class_methods].is_a?(Hash)
|
|
37
37
|
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
else
|
|
41
|
-
runner[:result][:runner_id]
|
|
42
|
-
end
|
|
38
|
+
runner_opts[:class_methods].each do |func_name, func_opts|
|
|
39
|
+
formatted = (Function.build_args(raw_args: func_opts[:args])[:formatted_args] if func_opts.is_a?(Hash) && func_opts[:args])
|
|
43
40
|
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
master_id: master_id)
|
|
41
|
+
Function.create(
|
|
42
|
+
runner_id: runner_id,
|
|
43
|
+
name: func_name.to_s,
|
|
44
|
+
formatted_args: formatted
|
|
45
|
+
)
|
|
46
|
+
functions_created += 1
|
|
47
|
+
end
|
|
48
|
+
end
|
|
53
49
|
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
master_id: master_id, parent_id: runner[:task_id] }
|
|
58
|
-
Legion::Runner.run(runner_class: 'Legion::Extensions::Lex::Runners::Function',
|
|
59
|
-
function: 'create',
|
|
60
|
-
args: function_args,
|
|
61
|
-
parent_id: args[:task_id],
|
|
62
|
-
master_id: master_id)
|
|
50
|
+
{ success: true, extension_id: extension_id, runners: runners_created, functions: functions_created }
|
|
51
|
+
rescue StandardError => e
|
|
52
|
+
{ success: false, error: e.message }
|
|
63
53
|
end
|
|
64
54
|
end
|
|
65
|
-
{ success: true }
|
|
66
55
|
end
|
|
67
56
|
end
|
|
68
57
|
end
|
|
@@ -1,45 +1,61 @@
|
|
|
1
|
-
|
|
2
|
-
module Runners
|
|
3
|
-
module Runner
|
|
4
|
-
include Legion::Extensions::Helpers::Lex
|
|
5
|
-
|
|
6
|
-
def create(extension_id:, name:, active: 1, **opts)
|
|
7
|
-
exist = Legion::Data::Model::Runner.where(name: name.to_s).where(extension_id: extension_id).first
|
|
8
|
-
unless exist.nil?
|
|
9
|
-
update_hash = { runner_id: exist.values[:id], name: name, active: active, **opts }
|
|
10
|
-
return Legion::Runner.run(runner_class: 'Legion::Extensions::Lex::Runners::Runner',
|
|
11
|
-
function: 'update',
|
|
12
|
-
args: update_hash,
|
|
13
|
-
parent_id: opts[:task_id],
|
|
14
|
-
master_id: opts[:master_id])
|
|
15
|
-
end
|
|
16
|
-
insert = { extension_id: extension_id, name: name.to_s, active: active, namespace: opts[:namespace] }
|
|
17
|
-
insert[:queue] = opts.key?(:queue) ? opts[:queue] : name.to_s
|
|
18
|
-
insert[:uri] = opts.key?(:uri) ? opts[:uri] : name.to_s
|
|
19
|
-
{ success: true, runner_id: Legion::Data::Model::Runner.insert(insert) }
|
|
20
|
-
end
|
|
1
|
+
# frozen_string_literal: true
|
|
21
2
|
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
3
|
+
module Legion
|
|
4
|
+
module Extensions
|
|
5
|
+
module Lex
|
|
6
|
+
module Runners
|
|
7
|
+
module Runner
|
|
8
|
+
include Legion::Extensions::Helpers::Lex if defined?(Legion::Extensions::Helpers::Lex)
|
|
28
9
|
|
|
29
|
-
|
|
30
|
-
|
|
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
|
|
31
13
|
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
14
|
+
insert = {
|
|
15
|
+
extension_id: extension_id,
|
|
16
|
+
name: name.to_s,
|
|
17
|
+
active: active,
|
|
18
|
+
namespace: opts[:namespace]
|
|
19
|
+
}
|
|
20
|
+
insert[:queue] = opts.fetch(:queue, name.to_s)
|
|
21
|
+
insert[:uri] = opts.fetch(:uri, name.to_s)
|
|
22
|
+
id = Legion::Data::Model::Runner.insert(insert)
|
|
23
|
+
{ success: true, runner_id: id }
|
|
24
|
+
end
|
|
36
25
|
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
26
|
+
def update(runner_id:, **opts)
|
|
27
|
+
runner = Legion::Data::Model::Runner[runner_id]
|
|
28
|
+
return { success: false, reason: 'runner not found' } if runner.nil?
|
|
29
|
+
|
|
30
|
+
update = {}
|
|
31
|
+
%i[name namespace active queue uri].each do |column|
|
|
32
|
+
next unless opts.key?(column)
|
|
33
|
+
next if runner.values[column] == opts[column]
|
|
34
|
+
|
|
35
|
+
update[column] = opts[column]
|
|
36
|
+
end
|
|
40
37
|
|
|
41
|
-
|
|
42
|
-
|
|
38
|
+
return { success: true, changed: false, runner_id: runner_id } if update.empty?
|
|
39
|
+
|
|
40
|
+
runner.update(update)
|
|
41
|
+
{ success: true, changed: true, updates: update, runner_id: runner_id }
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
def get(runner_id:, **_opts)
|
|
45
|
+
record = Legion::Data::Model::Runner[runner_id]
|
|
46
|
+
return { success: false, reason: 'not found' } if record.nil?
|
|
47
|
+
|
|
48
|
+
{ success: true, values: record.values }
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
def delete(runner_id:, **_opts)
|
|
52
|
+
record = Legion::Data::Model::Runner[runner_id]
|
|
53
|
+
return { success: false, reason: 'not found' } if record.nil?
|
|
54
|
+
|
|
55
|
+
record.delete
|
|
56
|
+
{ success: true, runner_id: runner_id }
|
|
57
|
+
end
|
|
58
|
+
end
|
|
43
59
|
end
|
|
44
60
|
end
|
|
45
61
|
end
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Legion
|
|
4
|
+
module Extensions
|
|
5
|
+
module Lex
|
|
6
|
+
module Runners
|
|
7
|
+
module Sync
|
|
8
|
+
include Legion::Extensions::Helpers::Lex if defined?(Legion::Extensions::Helpers::Lex)
|
|
9
|
+
|
|
10
|
+
def sync(**_opts)
|
|
11
|
+
return { success: false, reason: 'legion-data not connected' } unless Legion::Settings[:data][:connected]
|
|
12
|
+
|
|
13
|
+
extensions = Legion::Extensions.instance_variable_get(:@extensions) || {}
|
|
14
|
+
loaded = Legion::Extensions.instance_variable_get(:@loaded_extensions) || []
|
|
15
|
+
|
|
16
|
+
synced = 0
|
|
17
|
+
created = 0
|
|
18
|
+
updated = 0
|
|
19
|
+
|
|
20
|
+
loaded.each do |ext_name|
|
|
21
|
+
values = extensions[ext_name]
|
|
22
|
+
next if values.nil?
|
|
23
|
+
|
|
24
|
+
existing = Legion::Data::Model::Extension.where(name: ext_name).first
|
|
25
|
+
if existing.nil?
|
|
26
|
+
Legion::Data::Model::Extension.insert(
|
|
27
|
+
name: ext_name,
|
|
28
|
+
namespace: values[:extension_class].to_s,
|
|
29
|
+
active: true,
|
|
30
|
+
exchange: ext_name,
|
|
31
|
+
uri: ext_name
|
|
32
|
+
)
|
|
33
|
+
created += 1
|
|
34
|
+
else
|
|
35
|
+
ns = values[:extension_class].to_s
|
|
36
|
+
existing.update(namespace: ns, active: true) if existing.values[:namespace] != ns
|
|
37
|
+
updated += 1
|
|
38
|
+
end
|
|
39
|
+
synced += 1
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
{ success: true, synced: synced, created: created, updated: updated }
|
|
43
|
+
rescue StandardError => e
|
|
44
|
+
{ success: false, error: e.message }
|
|
45
|
+
end
|
|
46
|
+
end
|
|
47
|
+
end
|
|
48
|
+
end
|
|
49
|
+
end
|
|
50
|
+
end
|
|
@@ -1,13 +1,20 @@
|
|
|
1
|
-
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require_relative 'lex/version'
|
|
4
|
+
require_relative 'lex/runners/extension'
|
|
5
|
+
require_relative 'lex/runners/runner'
|
|
6
|
+
require_relative 'lex/runners/function'
|
|
7
|
+
require_relative 'lex/runners/register'
|
|
8
|
+
require_relative 'lex/runners/sync'
|
|
2
9
|
|
|
3
10
|
module Legion
|
|
4
11
|
module Extensions
|
|
5
12
|
module Lex
|
|
6
|
-
extend Legion::Extensions::Core if Legion::Extensions.const_defined?
|
|
7
|
-
end
|
|
13
|
+
extend Legion::Extensions::Core if Legion::Extensions.const_defined?(:Core)
|
|
8
14
|
|
|
9
|
-
|
|
10
|
-
|
|
15
|
+
def data_required?
|
|
16
|
+
true
|
|
17
|
+
end
|
|
11
18
|
end
|
|
12
19
|
end
|
|
13
20
|
end
|
metadata
CHANGED
|
@@ -1,45 +1,44 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: lex-lex
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 0.
|
|
4
|
+
version: 0.2.0
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Esity
|
|
8
|
-
autorequire:
|
|
9
8
|
bindir: bin
|
|
10
9
|
cert_chain: []
|
|
11
|
-
date:
|
|
10
|
+
date: 1980-01-02 00:00:00.000000000 Z
|
|
12
11
|
dependencies:
|
|
13
12
|
- !ruby/object:Gem::Dependency
|
|
14
|
-
name:
|
|
13
|
+
name: rake
|
|
15
14
|
requirement: !ruby/object:Gem::Requirement
|
|
16
15
|
requirements:
|
|
17
16
|
- - ">="
|
|
18
17
|
- !ruby/object:Gem::Version
|
|
19
|
-
version: '
|
|
18
|
+
version: '0'
|
|
20
19
|
type: :development
|
|
21
20
|
prerelease: false
|
|
22
21
|
version_requirements: !ruby/object:Gem::Requirement
|
|
23
22
|
requirements:
|
|
24
23
|
- - ">="
|
|
25
24
|
- !ruby/object:Gem::Version
|
|
26
|
-
version: '
|
|
25
|
+
version: '0'
|
|
27
26
|
- !ruby/object:Gem::Dependency
|
|
28
|
-
name:
|
|
27
|
+
name: rspec
|
|
29
28
|
requirement: !ruby/object:Gem::Requirement
|
|
30
29
|
requirements:
|
|
31
|
-
- - "
|
|
30
|
+
- - "~>"
|
|
32
31
|
- !ruby/object:Gem::Version
|
|
33
|
-
version: '
|
|
32
|
+
version: '3.13'
|
|
34
33
|
type: :development
|
|
35
34
|
prerelease: false
|
|
36
35
|
version_requirements: !ruby/object:Gem::Requirement
|
|
37
36
|
requirements:
|
|
38
|
-
- - "
|
|
37
|
+
- - "~>"
|
|
39
38
|
- !ruby/object:Gem::Version
|
|
40
|
-
version: '
|
|
39
|
+
version: '3.13'
|
|
41
40
|
- !ruby/object:Gem::Dependency
|
|
42
|
-
name:
|
|
41
|
+
name: rspec_junit_formatter
|
|
43
42
|
requirement: !ruby/object:Gem::Requirement
|
|
44
43
|
requirements:
|
|
45
44
|
- - ">="
|
|
@@ -54,6 +53,20 @@ dependencies:
|
|
|
54
53
|
version: '0'
|
|
55
54
|
- !ruby/object:Gem::Dependency
|
|
56
55
|
name: rubocop
|
|
56
|
+
requirement: !ruby/object:Gem::Requirement
|
|
57
|
+
requirements:
|
|
58
|
+
- - "~>"
|
|
59
|
+
- !ruby/object:Gem::Version
|
|
60
|
+
version: '1.75'
|
|
61
|
+
type: :development
|
|
62
|
+
prerelease: false
|
|
63
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
64
|
+
requirements:
|
|
65
|
+
- - "~>"
|
|
66
|
+
- !ruby/object:Gem::Version
|
|
67
|
+
version: '1.75'
|
|
68
|
+
- !ruby/object:Gem::Dependency
|
|
69
|
+
name: rubocop-rspec
|
|
57
70
|
requirement: !ruby/object:Gem::Requirement
|
|
58
71
|
requirements:
|
|
59
72
|
- - ">="
|
|
@@ -80,42 +93,43 @@ dependencies:
|
|
|
80
93
|
- - ">="
|
|
81
94
|
- !ruby/object:Gem::Version
|
|
82
95
|
version: '0'
|
|
83
|
-
description:
|
|
84
|
-
|
|
96
|
+
description: Persists extension, runner, and function metadata to the database when
|
|
97
|
+
LEX gems load
|
|
85
98
|
email:
|
|
86
99
|
- matthewdiverson@gmail.com
|
|
87
100
|
executables: []
|
|
88
101
|
extensions: []
|
|
89
102
|
extra_rdoc_files: []
|
|
90
103
|
files:
|
|
104
|
+
- ".github/workflows/ci.yml"
|
|
91
105
|
- ".gitignore"
|
|
92
106
|
- ".rspec"
|
|
93
107
|
- ".rubocop.yml"
|
|
94
|
-
-
|
|
108
|
+
- CHANGELOG.md
|
|
109
|
+
- CLAUDE.md
|
|
95
110
|
- Gemfile
|
|
96
111
|
- Gemfile.lock
|
|
97
112
|
- LICENSE.txt
|
|
98
113
|
- README.md
|
|
99
|
-
- Rakefile
|
|
100
|
-
- bitbucket-pipelines.yml
|
|
101
|
-
- docker_deploy.rb
|
|
102
114
|
- lex-lex.gemspec
|
|
103
115
|
- lib/legion/extensions/lex.rb
|
|
116
|
+
- lib/legion/extensions/lex/actors/sync.rb
|
|
104
117
|
- lib/legion/extensions/lex/runners/extension.rb
|
|
105
118
|
- lib/legion/extensions/lex/runners/function.rb
|
|
106
119
|
- lib/legion/extensions/lex/runners/register.rb
|
|
107
120
|
- lib/legion/extensions/lex/runners/runner.rb
|
|
121
|
+
- lib/legion/extensions/lex/runners/sync.rb
|
|
108
122
|
- lib/legion/extensions/lex/version.rb
|
|
109
|
-
homepage: https://
|
|
123
|
+
homepage: https://github.com/LegionIO/lex-lex
|
|
110
124
|
licenses:
|
|
111
125
|
- MIT
|
|
112
126
|
metadata:
|
|
113
|
-
homepage_uri: https://
|
|
114
|
-
source_code_uri: https://
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
bug_tracker_uri: https://
|
|
118
|
-
|
|
127
|
+
homepage_uri: https://github.com/LegionIO/lex-lex
|
|
128
|
+
source_code_uri: https://github.com/LegionIO/lex-lex
|
|
129
|
+
changelog_uri: https://github.com/LegionIO/lex-lex
|
|
130
|
+
documentation_uri: https://github.com/LegionIO/lex-lex
|
|
131
|
+
bug_tracker_uri: https://github.com/LegionIO/lex-lex/issues
|
|
132
|
+
rubygems_mfa_required: 'true'
|
|
119
133
|
rdoc_options: []
|
|
120
134
|
require_paths:
|
|
121
135
|
- lib
|
|
@@ -123,15 +137,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
|
123
137
|
requirements:
|
|
124
138
|
- - ">="
|
|
125
139
|
- !ruby/object:Gem::Version
|
|
126
|
-
version:
|
|
140
|
+
version: '3.4'
|
|
127
141
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
|
128
142
|
requirements:
|
|
129
143
|
- - ">="
|
|
130
144
|
- !ruby/object:Gem::Version
|
|
131
145
|
version: '0'
|
|
132
146
|
requirements: []
|
|
133
|
-
rubygems_version: 3.
|
|
134
|
-
signing_key:
|
|
147
|
+
rubygems_version: 3.6.9
|
|
135
148
|
specification_version: 4
|
|
136
|
-
summary:
|
|
149
|
+
summary: Legion Extension Registry
|
|
137
150
|
test_files: []
|
data/Dockerfile
DELETED
|
@@ -1,9 +0,0 @@
|
|
|
1
|
-
FROM legionio/legion:latest
|
|
2
|
-
LABEL maintainer="Matthew Iverson <matthewdiverson@gmail.com>"
|
|
3
|
-
|
|
4
|
-
#RUN mkdir /etc/legionio
|
|
5
|
-
RUN apk update && apk add build-base tzdata postgresql-dev mysql-client mariadb-dev tzdata gcc git
|
|
6
|
-
|
|
7
|
-
COPY . ./
|
|
8
|
-
RUN gem install lex-lex legion-data --no-document --no-prerelease
|
|
9
|
-
CMD ruby --jit $(which legionio)
|
data/Rakefile
DELETED
data/bitbucket-pipelines.yml
DELETED
|
@@ -1,19 +0,0 @@
|
|
|
1
|
-
image: ruby:2.7
|
|
2
|
-
|
|
3
|
-
pipelines:
|
|
4
|
-
tags:
|
|
5
|
-
"v*":
|
|
6
|
-
- step:
|
|
7
|
-
name: Push to RubyGems
|
|
8
|
-
deployment: RubyGems
|
|
9
|
-
script:
|
|
10
|
-
- gem install gem-release
|
|
11
|
-
- (umask 077 ; echo $gem_creds | base64 --decode > ~/.gem/credentials)
|
|
12
|
-
- gem release
|
|
13
|
-
artifacts:
|
|
14
|
-
- pkg/**
|
|
15
|
-
- step:
|
|
16
|
-
name: Push to Docker
|
|
17
|
-
deployment: Docker
|
|
18
|
-
script:
|
|
19
|
-
- './docker_deploy.rb'
|
data/docker_deploy.rb
DELETED
|
@@ -1,13 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env ruby
|
|
2
|
-
|
|
3
|
-
name = 'lex'
|
|
4
|
-
require "./lib/legion/extensions/#{name}/version"
|
|
5
|
-
version = Legion::Extensions::Lex::VERSION
|
|
6
|
-
|
|
7
|
-
puts "Building docker image for Legion v#{version}"
|
|
8
|
-
system("docker build --tag legionio/lex-#{name}:v#{version} .")
|
|
9
|
-
puts 'Pushing to hub.docker.com'
|
|
10
|
-
system("docker push legionio/lex-#{name}:v#{version}")
|
|
11
|
-
system("docker tag legionio/lex-#{name}:v#{version} legionio/lex-#{name}:latest")
|
|
12
|
-
system("docker push legionio/lex-#{name}:latest")
|
|
13
|
-
puts 'completed'
|