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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 906d2b96665278b78cb003349e7d5733546ededdfd2eade4f61e270f5c778a7f
4
- data.tar.gz: 60bbb47534fc56690960b82717dbfbb5dc76edd79465517f481f881686edde6c
3
+ metadata.gz: a8f0f6e6d047004004fc22bbbc5e59600a19a49c0456cd469e8abfbf2182d12a
4
+ data.tar.gz: 9511f9d436244571f12bc15b587c028c2692c0fff54ed81ea5caaf1a59948676
5
5
  SHA512:
6
- metadata.gz: 8477f380f05f478cd823f8acf6e435a691f303682c07d849016445770f890a55c3f5fa2f755dd9b3050d92e56dc1cd8e75d55f2c5c49039a4c87c70018337a1c
7
- data.tar.gz: e5b6063b50c13fd4e454356a6df9afe724ceb0653868e32180ffc9e49e7e1c35bcf500fd05981c10b2a4d9a96b523141d63687186950416ed2d7b5a6b860fade
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
- ### Operators
49
-
50
- **Binary** (require `fact` + `value`):
51
- - `equal` - exact equality
52
- - `not_equal` - inequality
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
- **Unary** (require `fact` only):
55
- - `nil` - value is nil
56
- - `not_nil` - value is not nil
57
- - `is_true` - value is truthy
58
- - `is_false` - value is falsy
59
- - `is_string` - value is a String
60
- - `is_array` - value is an Array
61
- - `is_integer` - value is an Integer
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 sets task status based on outcome:
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` is still called and raises `MissingArgument`)
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`
@@ -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
- Legion::Logging.error 'LEX::Conditioner::Runners::Condition had an exception'
39
- Legion::Logging.warn e.message
40
- Legion::Logging.warn e.backtrace
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
 
@@ -3,7 +3,7 @@
3
3
  module Legion
4
4
  module Extensions
5
5
  module Conditioner
6
- VERSION = '0.3.0'
6
+ VERSION = '0.3.1'
7
7
  end
8
8
  end
9
9
  end
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.0
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: