json_logic 0.4.6 → 0.4.7

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
- 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