lex-transformer 0.3.0 → 0.3.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/CHANGELOG.md +9 -0
- data/CLAUDE.md +28 -9
- data/README.md +35 -1
- data/lex-transformer.gemspec +8 -1
- data/lib/legion/extensions/transformer/version.rb +1 -1
- 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: 35166d2a367010e3ba45201b37487ba9467bb23e5f721d11ec441e2933a3f5f0
|
|
4
|
+
data.tar.gz: 1f7ec62283b945208b5f59a2f3a55503a9f54974237bd96f6820195d93ab33e4
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 799874d1728143a2cbff5fdb56af95ae960fa9532684c6619ce6a0f85073794b16acae11ac51cb5403a0207e6b75743424de5c05f16be4dc1a8e0d7fd82d7311
|
|
7
|
+
data.tar.gz: 138c24347f12024dd32e46b068d2e1dd54313211d278424a016c0657da510abab31abc80b62f23e63fdd6aaa6ad78d256103bc333073299837a8e13e5e4622e4
|
data/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,14 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## [0.3.1] - 2026-03-22
|
|
4
|
+
|
|
5
|
+
### Changed
|
|
6
|
+
- Add sub-gem runtime dependencies: legion-cache, legion-crypt, legion-data, legion-json, legion-logging, legion-settings, legion-transport
|
|
7
|
+
- Replace inline Legion::Logging and Legion::JSON stubs in spec_helper with real sub-gem helpers
|
|
8
|
+
- Build Helpers::Lex stub from real sub-gem helper modules in spec_helper
|
|
9
|
+
- Add Actors::Subscription and Helpers::Task stubs to spec_helper for actor load-time resolution
|
|
10
|
+
- Remove redundant inline Helpers::Lex/Task stubs from runner spec files
|
|
11
|
+
|
|
3
12
|
## [0.3.0] - 2026-03-19
|
|
4
13
|
|
|
5
14
|
### Added
|
data/CLAUDE.md
CHANGED
|
@@ -6,11 +6,11 @@
|
|
|
6
6
|
|
|
7
7
|
## Purpose
|
|
8
8
|
|
|
9
|
-
Legion Extension that transforms task payloads between services in a relationship chain. Uses pluggable template engines (ERB, Static, Liquid, JSONPath, LLM) to map data from one task's output into the format expected by the next task's input. Supports single-hash output (1:1 dispatch), array output (fan-out/multiply), schema validation, and sequential transform chains. Requires `legion-data` (`data_required? true`).
|
|
9
|
+
Legion Extension that transforms task payloads between services in a relationship chain. Uses pluggable template engines (ERB, Static, Liquid, JSONPath, LLM) to map data from one task's output into the format expected by the next task's input. Supports named transform definitions (Settings-based), `engine_options:` passthrough, single-hash output (1:1 dispatch), array output (fan-out/multiply), schema validation, and sequential transform chains. Requires `legion-data` (`data_required? true`).
|
|
10
10
|
|
|
11
11
|
**GitHub**: https://github.com/LegionIO/lex-transformer
|
|
12
12
|
**License**: MIT
|
|
13
|
-
**Version**: 0.
|
|
13
|
+
**Version**: 0.3.0
|
|
14
14
|
|
|
15
15
|
## Architecture
|
|
16
16
|
|
|
@@ -30,18 +30,19 @@ Legion::Extensions::Transformer
|
|
|
30
30
|
│ └── SchemaValidator # Validates transform output against required_keys/types schema
|
|
31
31
|
├── Runners/
|
|
32
32
|
│ └── Transform # Executes template-based payload transformation
|
|
33
|
-
│ ├── transform # Entry point: render + dispatch or validate
|
|
34
|
-
│ ├── transform_chain # Sequential pipeline: N steps, output feeds next
|
|
35
|
-
│ ├── render_transformation # Engine dispatch (ERB/Static/Liquid/JSONPath/LLM)
|
|
33
|
+
│ ├── transform # Entry point: render + dispatch or validate; accepts engine_options:
|
|
34
|
+
│ ├── transform_chain # Sequential pipeline: N steps, output feeds next; per-step engine_options
|
|
35
|
+
│ ├── render_transformation # Engine dispatch (ERB/Static/Liquid/JSONPath/LLM) with engine_options
|
|
36
36
|
│ ├── build_template_variables # Inject crypt/settings/cache/task into scope
|
|
37
37
|
│ ├── dispatch_transformed # Route Hash (single) or Array (fan-out) results
|
|
38
38
|
│ ├── dispatch_multiplied # Fan-out: create a new task per array element
|
|
39
39
|
│ └── send_task # Publish transformed payload to next runner
|
|
40
|
+
├── Definitions # Named transform definitions loaded from Settings (lex-transformer.definitions.*)
|
|
40
41
|
├── Transport/
|
|
41
42
|
│ ├── Exchanges/Task # Publishes to the task exchange
|
|
42
43
|
│ ├── Queues/Transform # Subscribes to transformation queue
|
|
43
44
|
│ └── Messages/Message # Transform request message format
|
|
44
|
-
└── Client # Standalone client: transform + transform_chain
|
|
45
|
+
└── Client # Standalone client: transform + transform_chain + transform_by_name
|
|
45
46
|
```
|
|
46
47
|
|
|
47
48
|
## Key Files
|
|
@@ -51,7 +52,8 @@ Legion::Extensions::Transformer
|
|
|
51
52
|
| `lib/legion/extensions/transformer.rb` | Entry point (`data_required? true`) |
|
|
52
53
|
| `lib/legion/extensions/transformer/runners/transform.rb` | Core transformation logic |
|
|
53
54
|
| `lib/legion/extensions/transformer/actors/transform.rb` | AMQP subscription actor |
|
|
54
|
-
| `lib/legion/extensions/transformer/client.rb` | Standalone client (transform, transform_chain) |
|
|
55
|
+
| `lib/legion/extensions/transformer/client.rb` | Standalone client (transform, transform_chain, transform_by_name) |
|
|
56
|
+
| `lib/legion/extensions/transformer/definitions.rb` | Named definition loader from Settings (fetch, names, merge_options) |
|
|
55
57
|
| `lib/legion/extensions/transformer/engines/registry.rb` | Engine name -> class lookup + auto-detection |
|
|
56
58
|
| `lib/legion/extensions/transformer/helpers/schema_validator.rb` | Output schema validation |
|
|
57
59
|
| `lib/legion/extensions/transformer/transport.rb` | Transport setup |
|
|
@@ -80,6 +82,23 @@ The LLM engine requires `legion-llm` to be started; it is provider-agnostic (Oll
|
|
|
80
82
|
| `cache` | Template string contains `'cache'` |
|
|
81
83
|
| `task` | Template string contains `'task'` and payload has `task_id` |
|
|
82
84
|
|
|
85
|
+
## Named Transform Definitions
|
|
86
|
+
|
|
87
|
+
`Definitions` loads named transform configurations from `Legion::Settings[:lex_transformer][:definitions]`. Each definition is a hash with `:transformation`, optional `:engine`, `:schema`, `:engine_options`, and `:conditions` keys.
|
|
88
|
+
|
|
89
|
+
**`Definitions.fetch(name)`** — returns the named definition hash (symbolized) or `nil`.
|
|
90
|
+
**`Definitions.names`** — returns array of defined names.
|
|
91
|
+
**`Definitions.merge_options(definition, **overrides)`** — merges caller engine_options over definition defaults.
|
|
92
|
+
|
|
93
|
+
Client usage:
|
|
94
|
+
|
|
95
|
+
```ruby
|
|
96
|
+
# Define in settings: lex-transformer.definitions.my_template: { transformation: "...", engine: "erb" }
|
|
97
|
+
result = client.transform(name: 'my_template', payload: { foo: 'bar' })
|
|
98
|
+
```
|
|
99
|
+
|
|
100
|
+
If a definition includes `conditions:` (a lex-conditioner condition hash), the conditioner client is called first — the transform is skipped if conditions fail.
|
|
101
|
+
|
|
83
102
|
## Schema Validation
|
|
84
103
|
|
|
85
104
|
```ruby
|
|
@@ -124,11 +143,11 @@ result[:result] # => { x: "hello" }
|
|
|
124
143
|
|
|
125
144
|
```bash
|
|
126
145
|
bundle install
|
|
127
|
-
bundle exec rspec #
|
|
146
|
+
bundle exec rspec # 121 examples, 0 failures
|
|
128
147
|
bundle exec rubocop # 0 offenses
|
|
129
148
|
```
|
|
130
149
|
|
|
131
|
-
Spec files: `
|
|
150
|
+
Spec files include: `tranformer_spec.rb` (note: typo in filename), `transform_runner_spec.rb`, `definitions_spec.rb`, `client_spec.rb`, per-engine specs, `transform_chain_spec.rb`, `transform_schema_spec.rb`, and `llm_integration_spec.rb`.
|
|
132
151
|
|
|
133
152
|
---
|
|
134
153
|
|
data/README.md
CHANGED
|
@@ -38,6 +38,14 @@ result = client.transform(
|
|
|
38
38
|
engine: :liquid
|
|
39
39
|
)
|
|
40
40
|
|
|
41
|
+
# With engine options (passed through to the engine)
|
|
42
|
+
result = client.transform(
|
|
43
|
+
transformation: 'Summarize this in one sentence',
|
|
44
|
+
payload: { text: 'Long article...' },
|
|
45
|
+
engine: :llm,
|
|
46
|
+
engine_options: { model: 'claude-opus-4-6', temperature: 0.3 }
|
|
47
|
+
)
|
|
48
|
+
|
|
41
49
|
# With schema validation
|
|
42
50
|
result = client.transform(
|
|
43
51
|
transformation: '{"name":"test"}',
|
|
@@ -47,6 +55,9 @@ result = client.transform(
|
|
|
47
55
|
result[:success] # => false
|
|
48
56
|
result[:status] # => "transformer.validation_failed"
|
|
49
57
|
result[:errors] # => ["missing required key: email"]
|
|
58
|
+
|
|
59
|
+
# By named definition (loaded from Legion::Settings)
|
|
60
|
+
result = client.transform(name: 'my_template', payload: { foo: 'bar' })
|
|
50
61
|
```
|
|
51
62
|
|
|
52
63
|
### Transform Chains
|
|
@@ -106,11 +117,34 @@ schema = {
|
|
|
106
117
|
|
|
107
118
|
When validation fails, the transform returns `{ success: false, status: 'transformer.validation_failed', errors: [...] }`.
|
|
108
119
|
|
|
120
|
+
## Named Definitions
|
|
121
|
+
|
|
122
|
+
Transform definitions can be registered in settings under `lex-transformer.definitions.<name>` and referenced by name:
|
|
123
|
+
|
|
124
|
+
```json
|
|
125
|
+
{
|
|
126
|
+
"lex-transformer": {
|
|
127
|
+
"definitions": {
|
|
128
|
+
"slack_notify": {
|
|
129
|
+
"transformation": "{\"text\":\"<%= title %> by <%= author %>\"}",
|
|
130
|
+
"engine": "erb"
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
```
|
|
136
|
+
|
|
137
|
+
```ruby
|
|
138
|
+
result = client.transform(name: 'slack_notify', payload: { title: 'PR merged', author: 'alice' })
|
|
139
|
+
```
|
|
140
|
+
|
|
141
|
+
If a definition includes `conditions:`, the conditioner client is evaluated first and the transform is skipped on failure.
|
|
142
|
+
|
|
109
143
|
## Runners
|
|
110
144
|
|
|
111
145
|
### Transform
|
|
112
146
|
|
|
113
|
-
#### `transform(transformation:, engine: nil, schema: nil, **payload)`
|
|
147
|
+
#### `transform(transformation:, engine: nil, schema: nil, engine_options: {}, name: nil, **payload)`
|
|
114
148
|
|
|
115
149
|
Renders the transformation template against the payload, optionally validates the result, then dispatches:
|
|
116
150
|
|
data/lex-transformer.gemspec
CHANGED
|
@@ -26,5 +26,12 @@ Gem::Specification.new do |spec|
|
|
|
26
26
|
end
|
|
27
27
|
spec.require_paths = ['lib']
|
|
28
28
|
|
|
29
|
-
spec.add_dependency '
|
|
29
|
+
spec.add_dependency 'legion-cache', '>= 1.3.11'
|
|
30
|
+
spec.add_dependency 'legion-crypt', '>= 1.4.9'
|
|
31
|
+
spec.add_dependency 'legion-data', '>= 1.4.17'
|
|
32
|
+
spec.add_dependency 'legion-json', '>= 1.2.1'
|
|
33
|
+
spec.add_dependency 'legion-logging', '>= 1.3.2'
|
|
34
|
+
spec.add_dependency 'legion-settings', '>= 1.3.14'
|
|
35
|
+
spec.add_dependency 'legion-transport', '>= 1.3.9'
|
|
36
|
+
spec.add_dependency 'tilt', '>= 2.3'
|
|
30
37
|
end
|
metadata
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: lex-transformer
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 0.3.
|
|
4
|
+
version: 0.3.1
|
|
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: tilt
|
|
14
112
|
requirement: !ruby/object:Gem::Requirement
|