lex-conditioner 0.2.5 → 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.
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require_relative 'comparator'
2
4
 
3
5
  module Legion
@@ -33,32 +35,19 @@ module Legion
33
35
  raise Legion::Exception::WrongType::Hash, @conditions.class unless @conditions.is_a? Hash
34
36
  end
35
37
 
36
- def validate_test(conditions = @conditions) # rubocop:disable Metrics/AbcSize
38
+ BINARY_OPS = %w[equal not_equal greater_than less_than greater_or_equal less_or_equal between contains starts_with ends_with matches in_set not_in_set
39
+ size_equal].freeze
40
+ UNARY_OPS = %w[nil not_nil is_false is_true is_string is_array is_integer empty not_empty].freeze
41
+ UNARY_METHOD_MAP = {
42
+ 'is_false' => :false?, 'is_true' => :true?,
43
+ 'is_string' => :string?, 'is_array' => :array?, 'is_integer' => :integer?,
44
+ 'empty' => :empty?, 'not_empty' => :not_empty?
45
+ }.freeze
46
+
47
+ def validate_test(conditions = @conditions)
37
48
  conditions.each do |condition|
38
49
  condition[1].each do |rule|
39
- result = validate_test('conditions' => { 'all' => rule[:all] }) if rule.include? :all
40
- result = validate_test('conditions' => { 'any' => rule[:any] }) if rule.include? :any
41
- case rule[:operator]
42
- when 'equal'
43
- result = Legion::Extensions::Conditioner::Comparator.equal?(rule[:fact], rule[:value], @values)
44
- when 'not_equal'
45
- result = Legion::Extensions::Conditioner::Comparator.not_equal?(rule[:fact], rule[:value], @values)
46
- when 'nil'
47
- result = Legion::Extensions::Conditioner::Comparator.nil?(rule[:fact], @values)
48
- when 'not_nil'
49
- result = Legion::Extensions::Conditioner::Comparator.not_nil?(rule[:fact], @values)
50
- when 'is_false'
51
- result = Legion::Extensions::Conditioner::Comparator.is_false?(rule[:fact], @values)
52
- when 'is_true'
53
- result = Legion::Extensions::Conditioner::Comparator.is_true?(rule[:fact], @values)
54
- when 'is_string'
55
- result = Legion::Extensions::Conditioner::Comparator.is_string?(rule[:fact], @values)
56
- when 'is_array'
57
- result = Legion::Extensions::Conditioner::Comparator.is_array?(rule[:fact], @values)
58
- when 'is_integer'
59
- result = Legion::Extensions::Conditioner::Comparator.is_integer?(rule[:fact], @values)
60
- end
61
-
50
+ result = evaluate_rule(rule)
62
51
  return true if condition[0] == :any && result == true
63
52
  return false if condition[0] == :all && result == false
64
53
  end
@@ -67,10 +56,56 @@ module Legion
67
56
  end
68
57
  end
69
58
 
59
+ def evaluate_rule(rule)
60
+ return validate_test(all: rule[:all]) if rule.include?(:all)
61
+ return validate_test(any: rule[:any]) if rule.include?(:any)
62
+
63
+ comp = Legion::Extensions::Conditioner::Comparator
64
+ op = rule[:operator]
65
+
66
+ if BINARY_OPS.include?(op)
67
+ comp.send(:"#{op}?", rule[:fact], rule[:value], @values)
68
+ elsif UNARY_OPS.include?(op)
69
+ method_name = UNARY_METHOD_MAP[op] || :"#{op}?"
70
+ comp.send(method_name, rule[:fact], @values)
71
+ end
72
+ end
73
+
70
74
  def valid?
71
75
  @valid = validate_test if @valid.nil?
72
76
  @valid
73
77
  end
78
+
79
+ def explain_test(conditions = @conditions)
80
+ group = conditions.keys.first
81
+ rules = conditions[group].map do |rule|
82
+ explain_rule(rule)
83
+ end
84
+
85
+ valid = group == :all ? rules.all? { |r| r[:result] } : rules.any? { |r| r[:result] }
86
+ { valid: valid, group: group, rules: rules }
87
+ end
88
+
89
+ def explain_rule(rule)
90
+ if rule.include?(:all)
91
+ result = explain_test(all: rule[:all])
92
+ return { group: :all, rules: result[:rules], result: result[:valid] }
93
+ end
94
+ if rule.include?(:any)
95
+ result = explain_test(any: rule[:any])
96
+ return { group: :any, rules: result[:rules], result: result[:valid] }
97
+ end
98
+
99
+ result = evaluate_rule(rule)
100
+ explanation = { fact: rule[:fact], operator: rule[:operator], result: result }
101
+ explanation[:value] = rule[:value] if rule.key?(:value)
102
+ explanation[:actual] = @values[rule[:fact]]
103
+ explanation
104
+ end
105
+
106
+ def explain
107
+ @explain ||= explain_test
108
+ end
74
109
  end
75
110
  end
76
111
  end
@@ -1,61 +1,67 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'legion/extensions/conditioner/helpers/condition'
2
4
 
3
- module Legion::Extensions::Conditioner
4
- module Runners
5
+ module Legion
6
+ module Extensions
5
7
  module Conditioner
6
- def check(conditions:, **payload) # rubocop:disable Metrics/AbcSize
7
- conditioner = Legion::Extensions::Conditioner::Condition.new(conditions: conditions,
8
- values: payload,
9
- type: payload[:type])
10
-
11
- status = if conditioner.valid? && payload.key?(:transformation)
12
- 'transformation.queued'
13
- elsif conditioner.valid? && payload.key?(:runner_routing_key)
14
- 'task.queued'
15
- elsif conditioner.valid?
16
- 'task.exception'
17
- else
18
- 'conditioner.failed'
19
- end
20
-
21
- send_task(**payload) unless status == 'conditioner.failed'
22
- task_update(payload[:task_id], status, **payload) unless payload[:task_id].nil?
23
-
24
- if payload[:debug] && payload.key?(:task_id)
25
- generate_task_log(task_id: payload[:task_id],
26
- function: 'check',
27
- valid: conditioner.valid?,
28
- conditions: payload[:conditions],
29
- values: payload)
30
- end
8
+ module Runners
9
+ module Conditioner
10
+ def check(conditions:, **payload)
11
+ conditioner = Legion::Extensions::Conditioner::Condition.new(conditions: conditions,
12
+ values: payload,
13
+ type: payload[:type])
31
14
 
32
- { success: true, valid: conditioner.valid? }
33
- rescue StandardError => e
34
- Legion::Logging.error 'LEX::Conditioner::Runners::Condition had an exception'
35
- Legion::Logging.warn e.message
36
- Legion::Logging.warn e.backtrace
37
- task_update(payload[:task_id], 'conditioner.exception', **payload) unless payload[:task_id].nil?
38
- end
15
+ status = if conditioner.valid? && payload.key?(:transformation)
16
+ 'transformation.queued'
17
+ elsif conditioner.valid? && payload.key?(:runner_routing_key)
18
+ 'task.queued'
19
+ elsif conditioner.valid?
20
+ 'task.exception'
21
+ else
22
+ 'conditioner.failed'
23
+ end
39
24
 
40
- def send_task(**opts)
41
- subtask_hash = {}
42
- %i[runner_routing_key relationship_id chain_id trigger_runner_id trigger_function_id funciton_id function runner_id runner_class transformation debug task_id results].each do |column| # rubocop:disable Layout/LineLength
43
- subtask_hash[column] = opts[column] if opts.key? column
44
- end
25
+ send_task(**payload) unless status == 'conditioner.failed'
26
+ task_update(payload[:task_id], status, **payload) unless payload[:task_id].nil?
45
27
 
46
- subtask_hash[:routing_key] = if subtask_hash.key? :transformation
47
- 'task.subtask.transform'
48
- elsif subtask_hash.key? :runner_routing_key
49
- subtask_hash[:runner_routing_key]
50
- end
28
+ if payload[:debug] && payload.key?(:task_id)
29
+ generate_task_log(task_id: payload[:task_id],
30
+ function: 'check',
31
+ valid: conditioner.valid?,
32
+ conditions: payload[:conditions],
33
+ values: payload)
34
+ end
51
35
 
52
- raise Legion::Exception::MissingArgument 'Missing :routing_key' unless subtask_hash.key? :routing_key
36
+ { success: true, valid: conditioner.valid? }
37
+ rescue StandardError => e
38
+ log.error 'LEX::Conditioner::Runners::Condition had an exception'
39
+ log.warn e.message
40
+ log.warn e.backtrace
41
+ task_update(payload[:task_id], 'conditioner.exception', **payload) unless payload[:task_id].nil?
42
+ end
53
43
 
54
- Legion::Transport::Messages::SubTask.new(**subtask_hash).publish
55
- end
44
+ def send_task(**opts)
45
+ subtask_hash = {}
46
+ %i[runner_routing_key relationship_id chain_id trigger_runner_id trigger_function_id function_id function runner_id runner_class transformation debug task_id results].each do |column| # rubocop:disable Layout/LineLength
47
+ subtask_hash[column] = opts[column] if opts.key? column
48
+ end
56
49
 
57
- include Legion::Extensions::Helpers::Lex
58
- include Legion::Extensions::Helpers::Task
50
+ subtask_hash[:routing_key] = if subtask_hash.key? :transformation
51
+ 'task.subtask.transform'
52
+ elsif subtask_hash.key? :runner_routing_key
53
+ subtask_hash[:runner_routing_key]
54
+ end
55
+
56
+ raise Legion::Exception::MissingArgument 'Missing :routing_key' unless subtask_hash.key? :routing_key
57
+
58
+ Legion::Transport::Messages::SubTask.new(**subtask_hash).publish
59
+ end
60
+
61
+ include Legion::Extensions::Helpers::Lex
62
+ include Legion::Extensions::Helpers::Task
63
+ end
64
+ end
59
65
  end
60
66
  end
61
67
  end
@@ -1,7 +1,13 @@
1
- module Legion::Extensions::Conditioner
2
- module Transport
3
- module Exchanges
4
- class Conditioner < Legion::Transport::Exchanges::Task
1
+ # frozen_string_literal: true
2
+
3
+ module Legion
4
+ module Extensions
5
+ module Conditioner
6
+ module Transport
7
+ module Exchanges
8
+ class Conditioner < Legion::Transport::Exchanges::Task
9
+ end
10
+ end
5
11
  end
6
12
  end
7
13
  end
@@ -1,13 +1,19 @@
1
- module Legion::Extensions::Conditioner
2
- module Transport
3
- module Messages
4
- class Conditioner < Legion::Transport::Message
5
- def routing_key
6
- 'task.conditioner.succeeded'
7
- end
1
+ # frozen_string_literal: true
2
+
3
+ module Legion
4
+ module Extensions
5
+ module Conditioner
6
+ module Transport
7
+ module Messages
8
+ class Conditioner < Legion::Transport::Message
9
+ def routing_key
10
+ 'task.conditioner.succeeded'
11
+ end
8
12
 
9
- def exchange
10
- Legion::Transport::Exchanges::Task
13
+ def exchange
14
+ Legion::Transport::Exchanges::Task
15
+ end
16
+ end
11
17
  end
12
18
  end
13
19
  end
@@ -1,9 +1,15 @@
1
- module Legion::Extensions::Conditioner
2
- module Transport
3
- module Queues
4
- class Conditioner < Legion::Transport::Queue
5
- def queue_name
6
- 'task.conditioner'
1
+ # frozen_string_literal: true
2
+
3
+ module Legion
4
+ module Extensions
5
+ module Conditioner
6
+ module Transport
7
+ module Queues
8
+ class Conditioner < Legion::Transport::Queue
9
+ def queue_name
10
+ 'task.conditioner'
11
+ end
12
+ end
7
13
  end
8
14
  end
9
15
  end
@@ -1,13 +1,20 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'legion/extensions/transport'
2
4
 
3
- module Legion::Extensions::Conditioner
4
- module Transport
5
- extend Legion::Extensions::Transport
6
- def self.additional_e_to_q
7
- [
8
- { from: 'task', to: 'conditioner', routing_key: 'task.subtask' },
9
- { from: 'task', to: 'conditioner', routing_key: 'task.subtask.conditioner' }
10
- ]
5
+ module Legion
6
+ module Extensions
7
+ module Conditioner
8
+ module Transport
9
+ extend Legion::Extensions::Transport
10
+
11
+ def self.additional_e_to_q
12
+ [
13
+ { from: 'task', to: 'conditioner', routing_key: 'task.subtask' },
14
+ { from: 'task', to: 'conditioner', routing_key: 'task.subtask.conditioner' }
15
+ ]
16
+ end
17
+ end
11
18
  end
12
19
  end
13
20
  end
@@ -1,7 +1,9 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Legion
2
4
  module Extensions
3
5
  module Conditioner
4
- VERSION = '0.2.5'.freeze
6
+ VERSION = '0.3.1'
5
7
  end
6
8
  end
7
9
  end
@@ -1,4 +1,7 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'legion/extensions/conditioner/version'
4
+ require_relative 'conditioner/client'
2
5
 
3
6
  module Legion
4
7
  module Extensions
metadata CHANGED
@@ -1,120 +1,136 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: lex-conditioner
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.5
4
+ version: 0.3.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Esity
8
- autorequire:
9
8
  bindir: bin
10
9
  cert_chain: []
11
- date: 2021-03-03 00:00:00.000000000 Z
10
+ date: 1980-01-02 00:00:00.000000000 Z
12
11
  dependencies:
13
12
  - !ruby/object:Gem::Dependency
14
- name: legionio
13
+ name: legion-cache
15
14
  requirement: !ruby/object:Gem::Requirement
16
15
  requirements:
17
16
  - - ">="
18
17
  - !ruby/object:Gem::Version
19
- version: '0'
20
- type: :development
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
21
34
  prerelease: false
22
35
  version_requirements: !ruby/object:Gem::Requirement
23
36
  requirements:
24
37
  - - ">="
25
38
  - !ruby/object:Gem::Version
26
- version: '0'
39
+ version: 1.4.9
27
40
  - !ruby/object:Gem::Dependency
28
- name: rake
41
+ name: legion-data
29
42
  requirement: !ruby/object:Gem::Requirement
30
43
  requirements:
31
44
  - - ">="
32
45
  - !ruby/object:Gem::Version
33
- version: '0'
34
- type: :development
46
+ version: 1.4.17
47
+ type: :runtime
35
48
  prerelease: false
36
49
  version_requirements: !ruby/object:Gem::Requirement
37
50
  requirements:
38
51
  - - ">="
39
52
  - !ruby/object:Gem::Version
40
- version: '0'
53
+ version: 1.4.17
41
54
  - !ruby/object:Gem::Dependency
42
- name: rspec
55
+ name: legion-json
43
56
  requirement: !ruby/object:Gem::Requirement
44
57
  requirements:
45
58
  - - ">="
46
59
  - !ruby/object:Gem::Version
47
- version: '0'
48
- type: :development
60
+ version: 1.2.1
61
+ type: :runtime
49
62
  prerelease: false
50
63
  version_requirements: !ruby/object:Gem::Requirement
51
64
  requirements:
52
65
  - - ">="
53
66
  - !ruby/object:Gem::Version
54
- version: '0'
67
+ version: 1.2.1
55
68
  - !ruby/object:Gem::Dependency
56
- name: rubocop
69
+ name: legion-logging
57
70
  requirement: !ruby/object:Gem::Requirement
58
71
  requirements:
59
72
  - - ">="
60
73
  - !ruby/object:Gem::Version
61
- version: '0'
62
- type: :development
74
+ version: 1.3.2
75
+ type: :runtime
63
76
  prerelease: false
64
77
  version_requirements: !ruby/object:Gem::Requirement
65
78
  requirements:
66
79
  - - ">="
67
80
  - !ruby/object:Gem::Version
68
- version: '0'
81
+ version: 1.3.2
69
82
  - !ruby/object:Gem::Dependency
70
- name: simplecov
83
+ name: legion-settings
71
84
  requirement: !ruby/object:Gem::Requirement
72
85
  requirements:
73
86
  - - ">="
74
87
  - !ruby/object:Gem::Version
75
- version: '0'
76
- type: :development
88
+ version: 1.3.14
89
+ type: :runtime
77
90
  prerelease: false
78
91
  version_requirements: !ruby/object:Gem::Requirement
79
92
  requirements:
80
93
  - - ">="
81
94
  - !ruby/object:Gem::Version
82
- version: '0'
95
+ version: 1.3.14
83
96
  - !ruby/object:Gem::Dependency
84
- name: legion-exceptions
97
+ name: legion-transport
85
98
  requirement: !ruby/object:Gem::Requirement
86
99
  requirements:
87
100
  - - ">="
88
101
  - !ruby/object:Gem::Version
89
- version: '0'
102
+ version: 1.3.9
90
103
  type: :runtime
91
104
  prerelease: false
92
105
  version_requirements: !ruby/object:Gem::Requirement
93
106
  requirements:
94
107
  - - ">="
95
108
  - !ruby/object:Gem::Version
96
- version: '0'
97
- description: Runs relationship conditional statements against tasks in a relationship
109
+ version: 1.3.9
110
+ description: Evaluates JSON-based rules against task payloads with 18+ operators,
111
+ structured explanations, and standalone client support
98
112
  email:
99
113
  - matthewdiverson@gmail.com
100
114
  executables: []
101
115
  extensions: []
102
116
  extra_rdoc_files: []
103
117
  files:
118
+ - ".github/workflows/ci.yml"
104
119
  - ".gitignore"
105
120
  - ".rspec"
106
121
  - ".rubocop.yml"
122
+ - CHANGELOG.md
123
+ - CLAUDE.md
107
124
  - Dockerfile
108
125
  - Gemfile
109
- - Gemfile.lock
110
126
  - LICENSE.txt
111
127
  - README.md
112
128
  - Rakefile
113
- - bitbucket-pipelines.yml
114
129
  - docker_deploy.rb
115
130
  - lex-conditioner.gemspec
116
131
  - lib/legion/extensions/conditioner.rb
117
132
  - lib/legion/extensions/conditioner/actors/conditioner.rb
133
+ - lib/legion/extensions/conditioner/client.rb
118
134
  - lib/legion/extensions/conditioner/helpers/comparator.rb
119
135
  - lib/legion/extensions/conditioner/helpers/condition.rb
120
136
  - lib/legion/extensions/conditioner/runners/conditioner.rb
@@ -123,16 +139,16 @@ files:
123
139
  - lib/legion/extensions/conditioner/transport/messages/conditioner.rb
124
140
  - lib/legion/extensions/conditioner/transport/queues/conditioner.rb
125
141
  - lib/legion/extensions/conditioner/version.rb
126
- homepage: https://bitbucket.org/legion-io/lex-conditioner
142
+ homepage: https://github.com/LegionIO/lex-conditioner
127
143
  licenses:
128
144
  - MIT
129
145
  metadata:
130
- homepage_uri: https://bitbucket.org/legion-io/lex-conditioner
131
- source_code_uri: https://bitbucket.org/legion-io/lex-conditioner
132
- documentation_uri: https://legionio.atlassian.net/wiki/spaces/LEX/pages/614957181
133
- changelog_uri: https://legionio.atlassian.net/wiki/spaces/LEX/pages/612270436
134
- bug_tracker_uri: https://bitbucket.org/legion-io/lex-conditioner/issues
135
- post_install_message:
146
+ homepage_uri: https://github.com/LegionIO/lex-conditioner
147
+ source_code_uri: https://github.com/LegionIO/lex-conditioner
148
+ documentation_uri: https://github.com/LegionIO/lex-conditioner
149
+ changelog_uri: https://github.com/LegionIO/lex-conditioner/blob/main/CHANGELOG.md
150
+ bug_tracker_uri: https://github.com/LegionIO/lex-conditioner/issues
151
+ rubygems_mfa_required: 'true'
136
152
  rdoc_options: []
137
153
  require_paths:
138
154
  - lib
@@ -140,15 +156,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
140
156
  requirements:
141
157
  - - ">="
142
158
  - !ruby/object:Gem::Version
143
- version: 2.5.0
159
+ version: '3.4'
144
160
  required_rubygems_version: !ruby/object:Gem::Requirement
145
161
  requirements:
146
162
  - - ">="
147
163
  - !ruby/object:Gem::Version
148
164
  version: '0'
149
165
  requirements: []
150
- rubygems_version: 3.1.4
151
- signing_key:
166
+ rubygems_version: 3.6.9
152
167
  specification_version: 4
153
- summary: LEX-Conditioner is used to apply conditional statements to tasks
168
+ summary: Conditional rule engine for LegionIO task chains
154
169
  test_files: []
data/Gemfile.lock DELETED
@@ -1,119 +0,0 @@
1
- PATH
2
- remote: .
3
- specs:
4
- lex-conditioner (0.2.5)
5
- legion-exceptions
6
-
7
- GEM
8
- remote: https://rubygems.org/
9
- specs:
10
- amq-protocol (2.3.2)
11
- ast (2.4.2)
12
- aws-eventstream (1.1.0)
13
- aws-sigv4 (1.2.2)
14
- aws-eventstream (~> 1, >= 1.0.2)
15
- bunny (2.17.0)
16
- amq-protocol (~> 2.3, >= 2.3.1)
17
- concurrent-ruby (1.1.8)
18
- concurrent-ruby-ext (1.1.8)
19
- concurrent-ruby (= 1.1.8)
20
- connection_pool (2.2.3)
21
- daemons (1.3.1)
22
- dalli (2.7.11)
23
- diff-lcs (1.4.4)
24
- docile (1.3.5)
25
- json_pure (2.5.1)
26
- legion-cache (1.1.1)
27
- connection_pool (>= 2.2.3)
28
- dalli (>= 2.7)
29
- redis (>= 4.2)
30
- legion-crypt (0.3.0)
31
- vault (>= 0.15.0)
32
- legion-exceptions (1.1.5)
33
- legion-json (1.1.4)
34
- json_pure
35
- legion-exceptions (>= 1.1.5)
36
- multi_json
37
- legion-logging (1.1.4)
38
- rainbow (~> 3)
39
- legion-settings (1.1.3)
40
- legion-json
41
- legion-logging
42
- legion-transport (1.1.9)
43
- bunny (>= 2.17.0)
44
- concurrent-ruby (>= 1.1.7)
45
- legion-json
46
- legionio (0.4.3)
47
- concurrent-ruby (>= 1.1.7)
48
- concurrent-ruby-ext (>= 1.1.7)
49
- daemons (>= 1.3.1)
50
- legion-cache
51
- legion-crypt (>= 0.2.0)
52
- legion-exceptions
53
- legion-json
54
- legion-logging
55
- legion-settings
56
- legion-transport (>= 1.1.9)
57
- lex-node
58
- oj (>= 3.10)
59
- thor (>= 1)
60
- lex-node (0.1.7)
61
- multi_json (1.15.0)
62
- oj (3.11.2)
63
- parallel (1.20.1)
64
- parser (3.0.0.0)
65
- ast (~> 2.4.1)
66
- rainbow (3.0.0)
67
- rake (13.0.3)
68
- redis (4.2.5)
69
- regexp_parser (2.1.1)
70
- rexml (3.2.4)
71
- rspec (3.10.0)
72
- rspec-core (~> 3.10.0)
73
- rspec-expectations (~> 3.10.0)
74
- rspec-mocks (~> 3.10.0)
75
- rspec-core (3.10.1)
76
- rspec-support (~> 3.10.0)
77
- rspec-expectations (3.10.1)
78
- diff-lcs (>= 1.2.0, < 2.0)
79
- rspec-support (~> 3.10.0)
80
- rspec-mocks (3.10.2)
81
- diff-lcs (>= 1.2.0, < 2.0)
82
- rspec-support (~> 3.10.0)
83
- rspec-support (3.10.2)
84
- rubocop (1.11.0)
85
- parallel (~> 1.10)
86
- parser (>= 3.0.0.0)
87
- rainbow (>= 2.2.2, < 4.0)
88
- regexp_parser (>= 1.8, < 3.0)
89
- rexml
90
- rubocop-ast (>= 1.2.0, < 2.0)
91
- ruby-progressbar (~> 1.7)
92
- unicode-display_width (>= 1.4.0, < 3.0)
93
- rubocop-ast (1.4.1)
94
- parser (>= 2.7.1.5)
95
- ruby-progressbar (1.11.0)
96
- simplecov (0.21.2)
97
- docile (~> 1.1)
98
- simplecov-html (~> 0.11)
99
- simplecov_json_formatter (~> 0.1)
100
- simplecov-html (0.12.3)
101
- simplecov_json_formatter (0.1.2)
102
- thor (1.1.0)
103
- unicode-display_width (2.0.0)
104
- vault (0.15.0)
105
- aws-sigv4
106
-
107
- PLATFORMS
108
- ruby
109
-
110
- DEPENDENCIES
111
- legionio
112
- lex-conditioner!
113
- rake
114
- rspec
115
- rubocop
116
- simplecov
117
-
118
- BUNDLED WITH
119
- 2.2.6