json_logic 0.4.6 → 0.4.7

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: 02d27d74f30407c0f44426ca5c69a5c32b781fa4
4
- data.tar.gz: fefdbb2e9d6f74f7bf06c789bbc812a2d64213bd
2
+ SHA256:
3
+ metadata.gz: c8af2db5872f3fe1ff4ebf64aa0ca0b617f3238b6536c750a85f80e000e84881
4
+ data.tar.gz: b80fa16f7e15ee2025cdba337af89bafe6c777882763a8dfecc4427997ebc90c
5
5
  SHA512:
6
- metadata.gz: 88a67e9def1c338e4c720f3e485c8441ec71704debff13fb149c144540f114b80679a6077854b184b3429faa03075ca0eb890949184be11ae45e83a0aba03565
7
- data.tar.gz: 99f44c676014e61dc7cbf5fda8d40bda9a946489938c44f55bdaa20a308a25f555c1ce951da355d18ff4096c5a0ca07558879c62ce37392b02591fe9289b6aee
6
+ metadata.gz: dc13699694479c8c33c582278bbf9e81d78292fa2665d477590c2bcf95f959711f635120174e040375009a0c55ac3ca3dd7ec627fc9ac17292ea93c037f7aea9
7
+ data.tar.gz: af2eec900330d7f48392ee7498dfce496a7a297ae4bf8dd75c64e78136d9f7b9ecee097d52e43d573bdad3e07be8b081d9fb6a961522b7a78e68b37631033988
@@ -20,9 +20,9 @@ Gem::Specification.new do |spec|
20
20
 
21
21
  spec.required_ruby_version = '>= 2.2'
22
22
 
23
- spec.add_development_dependency 'bundler', '~> 2.0.1'
24
- spec.add_development_dependency 'rake', '~> 10.0'
25
- spec.add_development_dependency 'minitest', '~> 5.0'
23
+ spec.add_development_dependency 'bundler', '>= 2.0.1'
24
+ spec.add_development_dependency 'rake', '>= 10.0'
25
+ spec.add_development_dependency 'minitest', '>= 5.0'
26
26
  spec.add_development_dependency 'byebug'
27
27
  spec.add_development_dependency 'pry'
28
28
  spec.add_runtime_dependency 'backport_dig' if Gem::Version.new(RUBY_VERSION) < Gem::Version.new('2.3')
@@ -5,33 +5,57 @@ require 'json_logic/operation'
5
5
  module JSONLogic
6
6
  def self.apply(logic, data)
7
7
  if logic.is_a?(Array)
8
- return logic.map { |val| apply(val, data) }
9
- end
10
-
11
- return logic unless logic.is_a?(Hash) # pass-thru
8
+ logic.map do |val|
9
+ apply(val, data)
10
+ end
11
+ elsif !logic.is_a?(Hash)
12
+ # Pass-thru
13
+ logic
14
+ else
15
+ if data.is_a?(Hash)
16
+ data = data.stringify_keys
17
+ end
18
+ data ||= {}
12
19
 
13
- data = data.stringify_keys if data.is_a?(Hash) # Stringify keys to keep out problems with symbol/string mismatch
14
- operator, values = logic.first # unwrap single-key hash
15
- values = [values] unless values.is_a?(Array) # syntactic sugar
16
- Operation.perform(operator, values, data || {})
20
+ operator, values = operator_and_values_from_logic(logic)
21
+ Operation.perform(operator, values, data)
22
+ end
17
23
  end
18
24
 
25
+ # Return a list of the non-literal data used. Eg, if the logic contains a {'var' => 'bananas'} operation, the result of
26
+ # uses_data on this logic will be a collection containing 'bananas'
19
27
  def self.uses_data(logic)
20
28
  collection = []
21
29
 
22
- operator, values = logic.first
23
- values = [values] unless values.is_a?(Array)
24
- if operator == 'var'
25
- collection << values[0]
26
- else
27
- values.each { |val|
28
- collection.concat(uses_data(val))
29
- }
30
+ if logic.kind_of?(Hash) || logic.kind_of?(Array) # If we are still dealing with logic, keep going. Else it's a value.
31
+ operator, values = operator_and_values_from_logic(logic)
32
+
33
+ if operator == 'var' # TODO: It may be that non-var operators use data so we may want a flag or collection that indicates data use.
34
+ if values[0] != JSONLogic::ITERABLE_KEY
35
+ collection << values[0]
36
+ end
37
+ else
38
+ values.each do |val|
39
+ collection.concat(uses_data(val))
40
+ end
41
+ end
30
42
  end
31
43
 
32
44
  return collection.uniq
33
45
  end
34
46
 
47
+ def self.operator_and_values_from_logic(logic)
48
+ # Unwrap single-key hash
49
+ operator, values = logic.first
50
+
51
+ # Ensure values is an array
52
+ if !values.is_a?(Array)
53
+ values = [values]
54
+ end
55
+
56
+ [operator, values]
57
+ end
58
+
35
59
  def self.filter(logic, data)
36
60
  data.select { |d| apply(logic, d) }
37
61
  end
@@ -1,9 +1,22 @@
1
1
  module JSONLogic
2
+ ITERABLE_KEY = "".freeze
3
+
2
4
  class Operation
3
5
  LAMBDAS = {
4
6
  'var' => ->(v, d) do
5
- return d unless d.is_a?(Hash) or d.is_a?(Array)
6
- return v == [""] ? (d.is_a?(Array) ? d : d[""]) : d.deep_fetch(*v)
7
+ if !(d.is_a?(Hash) || d.is_a?(Array))
8
+ d
9
+ else
10
+ if v == [JSONLogic::ITERABLE_KEY]
11
+ if d.is_a?(Array)
12
+ d
13
+ else
14
+ d[JSONLogic::ITERABLE_KEY]
15
+ end
16
+ else
17
+ d.deep_fetch(*v)
18
+ end
19
+ end
7
20
  end,
8
21
  'missing' => ->(v, d) { v.select { |val| d.deep_fetch(val).nil? } },
9
22
  'missing_some' => ->(v, d) {
@@ -11,6 +24,8 @@ module JSONLogic
11
24
  present.size >= v[0] ? [] : LAMBDAS['missing'].call(v[1], d)
12
25
  },
13
26
  'some' => -> (v,d) do
27
+ return false unless v[0].is_a?(Array)
28
+
14
29
  v[0].any? do |val|
15
30
  interpolated_block(v[1], val).truthy?
16
31
  end
@@ -1,3 +1,3 @@
1
1
  module JSONLogic
2
- VERSION = '0.4.6'
2
+ VERSION = '0.4.7'
3
3
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: json_logic
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.4.6
4
+ version: 0.4.7
5
5
  platform: ruby
6
6
  authors:
7
7
  - Kenneth Geerts
@@ -9,48 +9,48 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2020-04-18 00:00:00.000000000 Z
12
+ date: 2020-10-06 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: bundler
16
16
  requirement: !ruby/object:Gem::Requirement
17
17
  requirements:
18
- - - "~>"
18
+ - - ">="
19
19
  - !ruby/object:Gem::Version
20
20
  version: 2.0.1
21
21
  type: :development
22
22
  prerelease: false
23
23
  version_requirements: !ruby/object:Gem::Requirement
24
24
  requirements:
25
- - - "~>"
25
+ - - ">="
26
26
  - !ruby/object:Gem::Version
27
27
  version: 2.0.1
28
28
  - !ruby/object:Gem::Dependency
29
29
  name: rake
30
30
  requirement: !ruby/object:Gem::Requirement
31
31
  requirements:
32
- - - "~>"
32
+ - - ">="
33
33
  - !ruby/object:Gem::Version
34
34
  version: '10.0'
35
35
  type: :development
36
36
  prerelease: false
37
37
  version_requirements: !ruby/object:Gem::Requirement
38
38
  requirements:
39
- - - "~>"
39
+ - - ">="
40
40
  - !ruby/object:Gem::Version
41
41
  version: '10.0'
42
42
  - !ruby/object:Gem::Dependency
43
43
  name: minitest
44
44
  requirement: !ruby/object:Gem::Requirement
45
45
  requirements:
46
- - - "~>"
46
+ - - ">="
47
47
  - !ruby/object:Gem::Version
48
48
  version: '5.0'
49
49
  type: :development
50
50
  prerelease: false
51
51
  version_requirements: !ruby/object:Gem::Requirement
52
52
  requirements:
53
- - - "~>"
53
+ - - ">="
54
54
  - !ruby/object:Gem::Version
55
55
  version: '5.0'
56
56
  - !ruby/object:Gem::Dependency
@@ -125,8 +125,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
125
125
  - !ruby/object:Gem::Version
126
126
  version: '0'
127
127
  requirements: []
128
- rubyforge_project:
129
- rubygems_version: 2.6.14
128
+ rubygems_version: 3.0.1
130
129
  signing_key:
131
130
  specification_version: 4
132
131
  summary: Build complex rules, serialize them as JSON, and execute them in ruby