strum 0.1.1 → 0.1.2
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/Gemfile.lock +2 -2
- data/lib/strum/json_schema.rb +4 -96
- data/lib/strum/json_schema/cast.rb +68 -0
- data/lib/strum/json_schema/validate.rb +32 -0
- data/lib/strum/version.rb +1 -1
- metadata +3 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 461d85a4cb7a32b26a404517717ee5b677ff41488f37be951023a2b25a517086
|
4
|
+
data.tar.gz: 699a002f15c6f4aab8d2fabe5d99846f622a269cf655577cda138cde0e49f418
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 169582be09f5b176d0cc27fb77d18fb77c315a68d7b9c71ce7d02448b7848a2f3449040ffe613bc3199272d8b65b559d1f19a2987201be5514974fe2888b214b
|
7
|
+
data.tar.gz: b9f33038c7f6cd2cdc1ea297d3860b67c19115f0212bad1947c81f6eb3f0e06bf5c64e21f731fd0a9a6723b17c8e3090e1b86c544dd82045bb98a0433041e8bb
|
data/Gemfile.lock
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
strum (0.1.
|
4
|
+
strum (0.1.2)
|
5
5
|
dry-inflector (~> 0.2.0)
|
6
6
|
dry-struct (~> 1.2)
|
7
7
|
json-schema (~> 2.8.1)
|
@@ -53,7 +53,7 @@ GEM
|
|
53
53
|
parallel (1.19.1)
|
54
54
|
parser (2.7.0.5)
|
55
55
|
ast (~> 2.4.0)
|
56
|
-
public_suffix (4.0.
|
56
|
+
public_suffix (4.0.4)
|
57
57
|
rainbow (3.0.0)
|
58
58
|
rake (10.5.0)
|
59
59
|
reline (0.1.3)
|
data/lib/strum/json_schema.rb
CHANGED
@@ -1,102 +1,10 @@
|
|
1
|
-
|
2
|
-
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "strum/json_schema/validate"
|
4
|
+
require "strum/json_schema/cast"
|
3
5
|
|
4
6
|
module Strum
|
5
7
|
module JsonSchema
|
6
|
-
class Validate
|
7
|
-
include Strum::Service
|
8
|
-
|
9
|
-
def call
|
10
|
-
array_errors = JSON::Validator.fully_validate(args[:schema], input, errors_as_objects: true)
|
11
|
-
array_errors.each { |error| add_error(*self.parse_json_schema_error(error)) }
|
12
|
-
output(input)
|
13
|
-
end
|
14
|
-
|
15
|
-
def audit
|
16
|
-
add_error(:schema, :not_found) if !args[:schema].is_a?(Hash)
|
17
|
-
end
|
18
|
-
|
19
|
-
protected
|
20
|
-
|
21
|
-
def parse_json_schema_error(error)
|
22
|
-
id = error[:fragment].sub(/#/, "input")
|
23
|
-
keys = id.split("/")
|
24
|
-
last_key_idx = keys.rindex { |key| key !~ /[0-9]+/ }
|
25
|
-
last_key = keys.map { |key| key =~ /[0-9]+/ ? "[#{key}]" : ".#{key}" }.join[1..-1]
|
26
|
-
value = error[:message][0, error[:message].index(/ in schema/)].sub(error[:fragment], last_key)
|
27
|
-
[last_key.to_sym, value]
|
28
|
-
end
|
29
|
-
end
|
30
|
-
|
31
|
-
class Cast
|
32
|
-
include Strum::Service
|
33
|
-
|
34
|
-
def call
|
35
|
-
output(casted(input, args[:schema]))
|
36
|
-
end
|
37
|
-
|
38
|
-
def audit
|
39
|
-
add_error(:schema, :not_found) if !args[:schema].is_a?(Hash)
|
40
|
-
end
|
41
|
-
|
42
|
-
protected
|
43
|
-
|
44
|
-
def casted(input_data, schema)
|
45
|
-
@input_data = input_data
|
46
|
-
|
47
|
-
def rec_casted(schema, path = [])
|
48
|
-
item = self.custom_dig(@input_data, path)
|
49
|
-
|
50
|
-
if item.is_a?(NoValue)
|
51
|
-
return item
|
52
|
-
end
|
53
|
-
|
54
|
-
case schema[:type]
|
55
|
-
when Array
|
56
|
-
schema[:type].reduce(nil) do |type, x|
|
57
|
-
new_schema = schema.clone
|
58
|
-
new_schema[:type] = x
|
59
|
-
type ||= rec_casted(new_schema, path)
|
60
|
-
end
|
61
|
-
when "object"
|
62
|
-
if item.is_a?(Hash) && schema[:properties].is_a?(Hash)
|
63
|
-
schema[:properties].map { |key, val| [key, rec_casted(val, path + [key])] }.filter { |pair| !pair[1].is_a?(NoValue) }.to_h
|
64
|
-
end
|
65
|
-
when "array"
|
66
|
-
if item.is_a?(Array) && schema[:items].is_a?(Hash)
|
67
|
-
(0..(item.length - 1)).reduce([]) { |res, idx| res << rec_casted(schema[:items], path + [idx]) }
|
68
|
-
end
|
69
|
-
when "string"
|
70
|
-
item.to_s
|
71
|
-
when "integer"
|
72
|
-
if item.is_a?(Numeric)
|
73
|
-
item
|
74
|
-
elsif item.is_a?(String) || item.is_a?(Symbol)
|
75
|
-
item.to_s.to_i
|
76
|
-
end
|
77
|
-
when "boolean"
|
78
|
-
item.to_s.downcase == "true"
|
79
|
-
when "jsonb"
|
80
|
-
if (Module.constants.include?(:Sequel)) && (Sequel.methods.include?(:pg_jsonb_wrap))
|
81
|
-
Sequel.pg_jsonb_wrap(item)
|
82
|
-
else
|
83
|
-
add_error(:schema, "jsonb type is not supported")
|
84
|
-
end
|
85
|
-
when nil, ""
|
86
|
-
item
|
87
|
-
else
|
88
|
-
add_error(:schema, :invalid_type)
|
89
|
-
end
|
90
|
-
end
|
91
|
-
|
92
|
-
rec_casted(schema)
|
93
|
-
end
|
94
|
-
|
95
|
-
def custom_dig(obj, path)
|
96
|
-
path.reduce(obj) { |item, x| item.fetch(x) { |it| return NoValue.new } }
|
97
|
-
end
|
98
|
-
end
|
99
|
-
|
100
8
|
class NoValue; end
|
101
9
|
end
|
102
10
|
end
|
@@ -0,0 +1,68 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "strum/service"
|
4
|
+
|
5
|
+
module Strum
|
6
|
+
module JsonSchema
|
7
|
+
class Cast
|
8
|
+
include Strum::Service
|
9
|
+
|
10
|
+
def call
|
11
|
+
output(casted(input, args[:schema]))
|
12
|
+
end
|
13
|
+
|
14
|
+
def audit
|
15
|
+
add_error(:schema, :not_found) if !args[:schema].is_a?(Hash)
|
16
|
+
end
|
17
|
+
|
18
|
+
protected
|
19
|
+
|
20
|
+
def casted(input_data, schema, path = [])
|
21
|
+
item = custom_dig(input_data, path)
|
22
|
+
|
23
|
+
return item if item.is_a?(NoValue)
|
24
|
+
|
25
|
+
case schema[:type]
|
26
|
+
when Array
|
27
|
+
schema[:type].reduce(nil) do |type, x|
|
28
|
+
new_schema = schema.clone
|
29
|
+
new_schema[:type] = x
|
30
|
+
type || casted(input_data, new_schema, path)
|
31
|
+
end
|
32
|
+
when "object"
|
33
|
+
if item.is_a?(Hash) && schema[:properties].is_a?(Hash)
|
34
|
+
item.map { |key, val| (prop = schema[:properties][key]) ? [key, casted(input_data, prop, path + [key])] : [key, val]}.filter { |pair| !pair[1].is_a?(NoValue) }.to_h
|
35
|
+
end
|
36
|
+
when "array"
|
37
|
+
if item.is_a?(Array) && schema[:items].is_a?(Hash)
|
38
|
+
(0..(item.length - 1)).reduce([]) { |res, idx| res << casted(input_data, schema[:items], path + [idx]) }
|
39
|
+
end
|
40
|
+
when "string"
|
41
|
+
item.to_s
|
42
|
+
when "integer"
|
43
|
+
if item.is_a?(Numeric)
|
44
|
+
item
|
45
|
+
elsif item.is_a?(String) || item.is_a?(Symbol)
|
46
|
+
item.to_s.to_i
|
47
|
+
end
|
48
|
+
when "boolean"
|
49
|
+
item.to_s.downcase == "true"
|
50
|
+
when "jsonb"
|
51
|
+
if Module.constants.include?(:Sequel) && Sequel.methods.include?(:pg_jsonb_wrap)
|
52
|
+
Sequel.pg_jsonb_wrap(item)
|
53
|
+
else
|
54
|
+
add_error(:schema, "jsonb type is not supported")
|
55
|
+
end
|
56
|
+
when nil, ""
|
57
|
+
item
|
58
|
+
else
|
59
|
+
add_error(:schema, :invalid_type)
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
63
|
+
def custom_dig(obj, path)
|
64
|
+
path.reduce(obj) { |item, x| item.fetch(x) { |_it| return NoValue.new } }
|
65
|
+
end
|
66
|
+
end
|
67
|
+
end
|
68
|
+
end
|
@@ -0,0 +1,32 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "strum/service"
|
4
|
+
require "json-schema"
|
5
|
+
|
6
|
+
module Strum
|
7
|
+
module JsonSchema
|
8
|
+
class Validate
|
9
|
+
include Strum::Service
|
10
|
+
|
11
|
+
def call
|
12
|
+
array_errors = JSON::Validator.fully_validate(args[:schema], input, errors_as_objects: true)
|
13
|
+
array_errors.each { |error| add_error(*parse_json_schema_error(error)) }
|
14
|
+
output(input)
|
15
|
+
end
|
16
|
+
|
17
|
+
def audit
|
18
|
+
add_error(:schema, :not_found) if !args[:schema].is_a?(Hash)
|
19
|
+
end
|
20
|
+
|
21
|
+
protected
|
22
|
+
|
23
|
+
def parse_json_schema_error(error)
|
24
|
+
id = error[:fragment].sub(/#/, "input")
|
25
|
+
keys = id.split("/")
|
26
|
+
last_key = keys.map { |key| key =~ /[0-9]+/ ? "[#{key}]" : ".#{key}" }.join[1..-1]
|
27
|
+
value = error[:message][0, error[:message].index(/ in schema/)].sub(error[:fragment], last_key)
|
28
|
+
[last_key.to_sym, value]
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
data/lib/strum/version.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: strum
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Serhiy Nazarov
|
@@ -203,6 +203,8 @@ files:
|
|
203
203
|
- lib/strum/json.rb
|
204
204
|
- lib/strum/json_deserializer.rb
|
205
205
|
- lib/strum/json_schema.rb
|
206
|
+
- lib/strum/json_schema/cast.rb
|
207
|
+
- lib/strum/json_schema/validate.rb
|
206
208
|
- lib/strum/json_serializer.rb
|
207
209
|
- lib/strum/object_to_hash.rb
|
208
210
|
- lib/strum/pipe.rb
|