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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 111582b1dfcbe44b2cf91d3b316bd6394eb09e4d750a7b19be8844e91257e2c5
4
- data.tar.gz: 6efebcb5ea769c9426e17e6be93aa1cc0ca1bf5093e02d9f5ea0fe5254809760
3
+ metadata.gz: 35166d2a367010e3ba45201b37487ba9467bb23e5f721d11ec441e2933a3f5f0
4
+ data.tar.gz: 1f7ec62283b945208b5f59a2f3a55503a9f54974237bd96f6820195d93ab33e4
5
5
  SHA512:
6
- metadata.gz: 8af3daa3467d9e37e571319c876a17ff772e3558c0510fcca75a633e970ed32b0497c1e31f63faa047e0eb2f6e8488d8a55820d0d5e46394450957228f4ec3af
7
- data.tar.gz: a8dc1caf0ce16261c8eecf6d6ed37b2af4ff1cf4736465047a67cfd96eeb431a1454d4a31f2c34861219fea481b8d79b42d13b860a3935d240f81b89669c870d
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.2.1
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 (uses Engines::Registry directly)
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 # 86 examples, 0 failures
146
+ bundle exec rspec # 121 examples, 0 failures
128
147
  bundle exec rubocop # 0 offenses
129
148
  ```
130
149
 
131
- Spec files: `spec/legion/extensions/tranformer_spec.rb` (note: typo in filename is intentional in repo), `spec/legion/extensions/transform_runner_spec.rb`
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
 
@@ -26,5 +26,12 @@ Gem::Specification.new do |spec|
26
26
  end
27
27
  spec.require_paths = ['lib']
28
28
 
29
- spec.add_dependency 'tilt', '>= 2.3'
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
@@ -3,7 +3,7 @@
3
3
  module Legion
4
4
  module Extensions
5
5
  module Transformer
6
- VERSION = '0.3.0'
6
+ VERSION = '0.3.1'
7
7
  end
8
8
  end
9
9
  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.0
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