lex-conditioner 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 +8 -0
- data/CLAUDE.md +65 -19
- data/lex-conditioner.gemspec +8 -0
- data/lib/legion/extensions/conditioner/runners/conditioner.rb +3 -3
- data/lib/legion/extensions/conditioner/version.rb +1 -1
- metadata +100 -2
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: a8f0f6e6d047004004fc22bbbc5e59600a19a49c0456cd469e8abfbf2182d12a
|
|
4
|
+
data.tar.gz: 9511f9d436244571f12bc15b587c028c2692c0fff54ed81ea5caaf1a59948676
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 5a86d76e674865fa293c3dff60e8a7a7f22f6dbf632d1a336c9f2fdbc88b47a68f727408a1e358d43571b904ac53612c226c6819caaa6d1354d8b9909a61ff4b
|
|
7
|
+
data.tar.gz: bbb2646ca44322974146f11bef9c9012d5363838645f29f8d12d77b7b685d725b91891d97644baeccbdcbbb30f445107dfc46098cad35d2dadb90e052901c1bb
|
data/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,13 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## [0.3.1] - 2026-03-22
|
|
4
|
+
|
|
5
|
+
### Changed
|
|
6
|
+
- Migrated to sub-gem helpers (Tier 1): added runtime dependencies on legion-cache >= 1.3.11, legion-crypt >= 1.4.9, legion-data >= 1.4.17, legion-json >= 1.2.1, legion-logging >= 1.3.2, legion-settings >= 1.3.14, legion-transport >= 1.3.9
|
|
7
|
+
- Replaced direct `Legion::Logging` calls in runner with `log` helper method via `Helpers::Lex` (includes `Legion::Logging::Helper`)
|
|
8
|
+
- Updated spec_helper to use real sub-gem helpers with `Helpers::Lex` module and actor stubs; removed inline Legion::Logging and Legion::JSON stubs
|
|
9
|
+
- Updated runner spec to remove framework stubs covered by spec_helper; added scoped `Helpers::Task`, `Transport::Messages::SubTask`, and `Exception::MissingArgument` stubs
|
|
10
|
+
|
|
3
11
|
## [0.3.0] - 2026-03-17
|
|
4
12
|
|
|
5
13
|
### Added
|
data/CLAUDE.md
CHANGED
|
@@ -43,31 +43,77 @@ Legion::Extensions::Conditioner
|
|
|
43
43
|
|
|
44
44
|
## Condition Rule Format
|
|
45
45
|
|
|
46
|
-
Rules use `all`/`any` grouping with `fact`/`operator`/`value` entries. Facts use dot notation to address nested payload keys.
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
46
|
+
Rules use `all`/`any` grouping with `fact`/`operator`/`value` entries. Facts use dot notation to address nested payload keys. Groups can be nested arbitrarily.
|
|
47
|
+
|
|
48
|
+
```json
|
|
49
|
+
{
|
|
50
|
+
"all": [
|
|
51
|
+
{ "fact": "response.code", "operator": "greater_or_equal", "value": 200 },
|
|
52
|
+
{ "any": [
|
|
53
|
+
{ "fact": "action", "operator": "equal", "value": "opened" },
|
|
54
|
+
{ "fact": "action", "operator": "equal", "value": "reopened" }
|
|
55
|
+
]}
|
|
56
|
+
]
|
|
57
|
+
}
|
|
58
|
+
```
|
|
53
59
|
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
60
|
+
## Operators
|
|
61
|
+
|
|
62
|
+
### Binary (require `fact` + `value`)
|
|
63
|
+
|
|
64
|
+
| Operator | Description |
|
|
65
|
+
|----------|-------------|
|
|
66
|
+
| `equal` | Exact equality |
|
|
67
|
+
| `not_equal` | Inequality |
|
|
68
|
+
| `greater_than` | Numeric greater than |
|
|
69
|
+
| `less_than` | Numeric less than |
|
|
70
|
+
| `greater_or_equal` | Numeric greater than or equal |
|
|
71
|
+
| `less_or_equal` | Numeric less than or equal |
|
|
72
|
+
| `between` | Value within range (`value` is `[min, max]`) |
|
|
73
|
+
| `contains` | String contains substring |
|
|
74
|
+
| `starts_with` | String starts with prefix |
|
|
75
|
+
| `ends_with` | String ends with suffix |
|
|
76
|
+
| `matches` | String matches regex pattern |
|
|
77
|
+
| `in_set` | Value is in the given array |
|
|
78
|
+
| `not_in_set` | Value is not in the given array |
|
|
79
|
+
| `size_equal` | Collection or string size equals value |
|
|
80
|
+
|
|
81
|
+
### Unary (require `fact` only)
|
|
82
|
+
|
|
83
|
+
| Operator | Description |
|
|
84
|
+
|----------|-------------|
|
|
85
|
+
| `nil` | Value is nil |
|
|
86
|
+
| `not_nil` | Value is not nil |
|
|
87
|
+
| `is_true` | Value is truthy |
|
|
88
|
+
| `is_false` | Value is falsy |
|
|
89
|
+
| `is_string` | Value is a String |
|
|
90
|
+
| `is_array` | Value is an Array |
|
|
91
|
+
| `is_integer` | Value is an Integer |
|
|
92
|
+
| `empty` | Value is nil or empty |
|
|
93
|
+
| `not_empty` | Value is present and not empty |
|
|
62
94
|
|
|
63
95
|
## Condition Evaluation Logic
|
|
64
96
|
|
|
65
|
-
After evaluation, the runner
|
|
97
|
+
After evaluation, the runner routes based on outcome:
|
|
66
98
|
- Condition passes + transformation present: `transformation.queued` (routes to `task.subtask.transform`)
|
|
67
99
|
- Condition passes + routing key present: `task.queued` (routes to `runner_routing_key`)
|
|
68
|
-
- Condition passes but no routing info: `task.exception` (`send_task`
|
|
100
|
+
- Condition passes but no routing info: `task.exception` (`send_task` raises `MissingArgument`)
|
|
69
101
|
- Condition fails: `conditioner.failed` (`send_task` is skipped)
|
|
70
102
|
|
|
103
|
+
Each evaluation also returns an explanation chain with per-rule results including actual values, for use by lex-synapse and standalone callers.
|
|
104
|
+
|
|
105
|
+
## Standalone Client
|
|
106
|
+
|
|
107
|
+
`Legion::Extensions::Conditioner::Client` includes the `Conditioner` runner. Instantiate without the full framework:
|
|
108
|
+
|
|
109
|
+
```ruby
|
|
110
|
+
require 'legion/extensions/conditioner/client'
|
|
111
|
+
client = Legion::Extensions::Conditioner::Client.new
|
|
112
|
+
result = client.evaluate(conditions: { all: [...] }, values: { ... })
|
|
113
|
+
result[:valid] # => true/false
|
|
114
|
+
result[:explanation] # => per-rule results with actual values
|
|
115
|
+
```
|
|
116
|
+
|
|
71
117
|
## Dependencies
|
|
72
118
|
|
|
73
119
|
| Gem | Purpose |
|
|
@@ -78,8 +124,8 @@ After evaluation, the runner sets task status based on outcome:
|
|
|
78
124
|
|
|
79
125
|
```bash
|
|
80
126
|
bundle install
|
|
81
|
-
bundle exec rspec
|
|
82
|
-
bundle exec rubocop
|
|
127
|
+
bundle exec rspec # 140 examples, 0 failures
|
|
128
|
+
bundle exec rubocop # 0 offenses
|
|
83
129
|
```
|
|
84
130
|
|
|
85
131
|
Spec files: `spec/legion/extensions/conditioner_spec.rb`, `spec/legion/extensions/comparator_spec.rb`, `spec/legion/extensions/condition_spec.rb`, `spec/legion/extensions/conditioner/runners/conditioner_spec.rb`
|
data/lex-conditioner.gemspec
CHANGED
|
@@ -25,4 +25,12 @@ Gem::Specification.new do |spec|
|
|
|
25
25
|
`git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
|
|
26
26
|
end
|
|
27
27
|
spec.require_paths = ['lib']
|
|
28
|
+
|
|
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'
|
|
28
36
|
end
|
|
@@ -35,9 +35,9 @@ module Legion
|
|
|
35
35
|
|
|
36
36
|
{ success: true, valid: conditioner.valid? }
|
|
37
37
|
rescue StandardError => e
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
38
|
+
log.error 'LEX::Conditioner::Runners::Condition had an exception'
|
|
39
|
+
log.warn e.message
|
|
40
|
+
log.warn e.backtrace
|
|
41
41
|
task_update(payload[:task_id], 'conditioner.exception', **payload) unless payload[:task_id].nil?
|
|
42
42
|
end
|
|
43
43
|
|
metadata
CHANGED
|
@@ -1,14 +1,112 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: lex-conditioner
|
|
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
|
|
8
8
|
bindir: bin
|
|
9
9
|
cert_chain: []
|
|
10
10
|
date: 1980-01-02 00:00:00.000000000 Z
|
|
11
|
-
dependencies:
|
|
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
|
description: Evaluates JSON-based rules against task payloads with 18+ operators,
|
|
13
111
|
structured explanations, and standalone client support
|
|
14
112
|
email:
|