iso-deserializer 0.8.0
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 +7 -0
- data/.gitignore +12 -0
- data/.travis.yml +32 -0
- data/Gemfile +10 -0
- data/Gemfile.lock +55 -0
- data/MIT-LICENSE +20 -0
- data/README.md +641 -0
- data/Rakefile +11 -0
- data/deserializer.gemspec +25 -0
- data/gemfiles/4.0.gemfile +8 -0
- data/gemfiles/5.0.gemfile +8 -0
- data/gemfiles/6.0.gemfile +8 -0
- data/lib/deserializer/attributable.rb +54 -0
- data/lib/deserializer/attribute/association.rb +12 -0
- data/lib/deserializer/attribute/attribute.rb +20 -0
- data/lib/deserializer/attribute/base.rb +49 -0
- data/lib/deserializer/attribute/has_many_association.rb +14 -0
- data/lib/deserializer/attribute/has_one_association.rb +35 -0
- data/lib/deserializer/attribute/nested_association.rb +10 -0
- data/lib/deserializer/attribute/value_attribute.rb +24 -0
- data/lib/deserializer/attribute.rb +11 -0
- data/lib/deserializer/base.rb +56 -0
- data/lib/deserializer/deserializer_error.rb +12 -0
- data/lib/deserializer/version.rb +3 -0
- data/lib/deserializer.rb +12 -0
- data/test/lib/deserializers.rb +148 -0
- data/test/minitest_helper.rb +14 -0
- data/test/unit/deserializer_error_test.rb +12 -0
- data/test/unit/deserializer_test.rb +200 -0
- metadata +118 -0
@@ -0,0 +1,200 @@
|
|
1
|
+
require 'minitest_helper'
|
2
|
+
|
3
|
+
class DeserializerTest < Minitest::Test
|
4
|
+
|
5
|
+
def setup
|
6
|
+
@params = { user: 6,
|
7
|
+
user_id: 6,
|
8
|
+
text: "text",
|
9
|
+
i_sholdnt_be_here: :should_i_now}
|
10
|
+
|
11
|
+
end
|
12
|
+
|
13
|
+
def test_no_nil_params
|
14
|
+
assert_raises Deserializer::DeserializerError do
|
15
|
+
BasicDeserializer.from_params nil
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
def test_from_params
|
20
|
+
assert_equal ({user_id: 6, text: "text"}) , BasicDeserializer.from_params( @params )
|
21
|
+
end
|
22
|
+
|
23
|
+
def test_does_not_eat_false_or_nil_values
|
24
|
+
params = { user_id: nil,
|
25
|
+
text: false,
|
26
|
+
i_sholdnt_be_here: :should_i_now }
|
27
|
+
|
28
|
+
assert_equal ({user_id: nil, text: false}) , BasicDeserializer.from_params( params )
|
29
|
+
end
|
30
|
+
|
31
|
+
def test_permitted_params
|
32
|
+
assert_equal [:user_id, :text] , BasicDeserializer.permitted_params
|
33
|
+
end
|
34
|
+
|
35
|
+
def test_permitted_params_with_attr_key
|
36
|
+
assert_equal [:user, :text] , AttributeDeserializer.permitted_params
|
37
|
+
end
|
38
|
+
|
39
|
+
def test_attribute
|
40
|
+
assert_equal "text", AttributeDeserializer.from_params( @params )[:text]
|
41
|
+
end
|
42
|
+
|
43
|
+
def test_attribute_with_key
|
44
|
+
assert_equal 6, AttributeDeserializer.from_params( @params )[:user_id]
|
45
|
+
end
|
46
|
+
|
47
|
+
def test_ignore_empty_option
|
48
|
+
d = EmptiableAttributeDeserializer
|
49
|
+
|
50
|
+
assert_equal ({ emptiable: true }), d.from_params( emptiable: true )
|
51
|
+
assert_equal ({ nonemptiable: true }), d.from_params( nonemptiable: true )
|
52
|
+
|
53
|
+
[false, nil, "", [], {}].each do |empty_value|
|
54
|
+
assert_equal ({}), d.from_params( emptiable: empty_value )
|
55
|
+
assert_equal ({ nonemptiable: empty_value }), d.from_params( nonemptiable: empty_value )
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
def test_ignore_empty_with_key
|
60
|
+
d = EmptiableAttributeDeserializer
|
61
|
+
|
62
|
+
assert_equal ({ emptiable_with_key: true }), d.from_params( empty: true )
|
63
|
+
assert_equal ({ nonemptiable_with_key: true }), d.from_params( non_empty: true )
|
64
|
+
|
65
|
+
[false, nil, "", [], {}].each do |value|
|
66
|
+
assert_equal ({}), d.from_params( key: value )
|
67
|
+
assert_equal ({ nonemptiable_with_key: value }), d.from_params( non_empty: value )
|
68
|
+
end
|
69
|
+
end
|
70
|
+
|
71
|
+
def test_undefined_params_dont_come_through
|
72
|
+
assert_equal nil, AttributeDeserializer.from_params( @params )[:i_shouldnt_be_here]
|
73
|
+
end
|
74
|
+
|
75
|
+
def test_supports_conversions
|
76
|
+
expected = { real_range: (1..4), bad_range: (1..1)}
|
77
|
+
params = { real_range: [1, 12, 4], bad_range: 1}
|
78
|
+
|
79
|
+
assert_equal expected, ConversionDeserializer.from_params( params )
|
80
|
+
end
|
81
|
+
|
82
|
+
def test_supports_conversions_with_key
|
83
|
+
expected = { real_range: (1..4), bad_range: (1..1)}
|
84
|
+
params = { real: [1, 4], bad: 1}
|
85
|
+
|
86
|
+
assert_equal expected, KeyedConversionDeserializer.from_params( params )
|
87
|
+
end
|
88
|
+
|
89
|
+
def test_supports_conversions_with_ignore_empty
|
90
|
+
expected = { real_range: (1..4)}
|
91
|
+
params = { real: [1, 4], bad: nil}
|
92
|
+
|
93
|
+
assert_equal expected, NillableConversionDeserializer.from_params( params )
|
94
|
+
end
|
95
|
+
|
96
|
+
def test_has_one
|
97
|
+
expected = { internal: :thing, params: { user_id: 6, text: "text" }}
|
98
|
+
params = { external: :thing, params: @params }
|
99
|
+
assert_equal expected, VanillaHasOneDeserializer.from_params( params )
|
100
|
+
end
|
101
|
+
|
102
|
+
def test_has_one_supports_key
|
103
|
+
expected = { internal: :thing, user_info: { user_id: 6, text: "text" }}
|
104
|
+
params = { external: :thing, thing: @params }
|
105
|
+
assert_equal expected, KeyedHasOneDeserializer.from_params( params )
|
106
|
+
end
|
107
|
+
|
108
|
+
def test_has_one_requires_deserializer
|
109
|
+
assert_raises Deserializer::DeserializerError do
|
110
|
+
BasicDeserializer.has_one :splosion
|
111
|
+
end
|
112
|
+
end
|
113
|
+
|
114
|
+
def test_has_one_with_key_target
|
115
|
+
expected = { internal: :thing, user_info: { user_id: 6, text: "text" }}
|
116
|
+
params = { external: :thing, thing: @params }
|
117
|
+
assert_equal expected, HasOneWithTargetDeserializer.from_params( params )
|
118
|
+
end
|
119
|
+
|
120
|
+
def test_can_combine_two_has_ones_into_a_third_key
|
121
|
+
expected = { internal: :thing, user_info: { user_id: 6, text: "text", attr1: :blah, attr2: :blech }}
|
122
|
+
params = { external: :thing, thing: @params, other_thing: {attr1: :blah, attr2: :blech} }
|
123
|
+
assert_equal expected, TricksyDeserializer.from_params( params )
|
124
|
+
end
|
125
|
+
|
126
|
+
|
127
|
+
def test_can_merge_a_has_one_into_another
|
128
|
+
expected = { internal: :thing, thing: { user_id: 6, text: "text", attr1: :blah, attr2: :blech }}
|
129
|
+
params = { external: :thing, thing: @params, other_thing: {attr1: :blah, attr2: :blech} }
|
130
|
+
assert_equal expected, ExtraTricksyDeserializer.from_params( params )
|
131
|
+
end
|
132
|
+
|
133
|
+
|
134
|
+
def test_merge_has_one_into_object
|
135
|
+
expected = { internal: :thing, user_id: 6, text: "text", attr1: :blah, attr2: :blech }
|
136
|
+
params = { external: :thing, thing: @params, other_thing: {attr1: :blah, attr2: :blech} }
|
137
|
+
assert_equal expected, HasOneWithObjectTargetDeserializer.from_params( params )
|
138
|
+
end
|
139
|
+
|
140
|
+
def test_belongs_to_unpermitted
|
141
|
+
assert_raises Deserializer::DeserializerError do
|
142
|
+
BasicDeserializer.belongs_to :explody
|
143
|
+
end
|
144
|
+
end
|
145
|
+
|
146
|
+
def test_tests_requires_deserializer
|
147
|
+
assert_raises Deserializer::DeserializerError do
|
148
|
+
BasicDeserializer.nests :splosion
|
149
|
+
end
|
150
|
+
end
|
151
|
+
|
152
|
+
def test_supports_nested
|
153
|
+
params = { id: 1, attr_1: "blah", attr_2: "something" }
|
154
|
+
expected = { id: 1, attr_1: "blah", nested_object: { name: "blah", attr_2: "something" } }
|
155
|
+
|
156
|
+
assert_equal expected, NestableDeserializer.from_params( params )
|
157
|
+
end
|
158
|
+
|
159
|
+
def test_has_many_requires_deserializer
|
160
|
+
assert_raises Deserializer::DeserializerError do
|
161
|
+
BasicDeserializer.has_many :splosions
|
162
|
+
end
|
163
|
+
end
|
164
|
+
|
165
|
+
def test_supports_has_many
|
166
|
+
params = { id: 1, attributes: [{user: 6, text: "lol"}, {user: 6, text: "something"}] }
|
167
|
+
expected = { id: 1, attributes: [{user_id: 6, text: "lol"}, {user_id: 6, text: "something"}] }
|
168
|
+
|
169
|
+
assert_equal expected, HasManyDeserializer.from_params( params )
|
170
|
+
end
|
171
|
+
|
172
|
+
def test_has_many_handles_no_input
|
173
|
+
assert_equal ({}), HasManyDeserializer.from_params( {} )
|
174
|
+
end
|
175
|
+
|
176
|
+
def test_has_many_supports_key
|
177
|
+
params = { id: 1, attributes: [{user: 6, text: "lol"}, {user: 6, text: "something"}] }
|
178
|
+
expected = { id: 1, special_attributes: [{user_id: 6, text: "lol"}, {user_id: 6, text: "something"}] }
|
179
|
+
|
180
|
+
assert_equal expected, KeyedHasManyDeserializer.from_params( params )
|
181
|
+
end
|
182
|
+
|
183
|
+
def test_has_one_handles_no_input
|
184
|
+
assert_equal ({}), VanillaHasOneDeserializer.from_params( {} )
|
185
|
+
end
|
186
|
+
|
187
|
+
def test_nested_handles_no_input
|
188
|
+
assert_equal ({nested_object: {}}), NestableDeserializer.from_params( {} )
|
189
|
+
end
|
190
|
+
|
191
|
+
def test_can_inherit_from_other_deserializer
|
192
|
+
base_permitted_params = HasOneWithTargetDeserializer.permitted_params
|
193
|
+
|
194
|
+
assert_equal [:external, :thing], base_permitted_params, "inheritance broke the base class"
|
195
|
+
|
196
|
+
inherited_permitted_params = base_permitted_params + [:this, :that, :created_by]
|
197
|
+
|
198
|
+
assert_equal inherited_permitted_params, InheritedDeserializer.permitted_params
|
199
|
+
end
|
200
|
+
end
|
metadata
ADDED
@@ -0,0 +1,118 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: iso-deserializer
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.8.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Isometric
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2024-08-13 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: activesupport
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - ">="
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: 5.0.0
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - ">="
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: 5.0.0
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: rake
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - ">="
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '0'
|
34
|
+
type: :development
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - ">="
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '0'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: m
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - "~>"
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: 1.3.1
|
48
|
+
type: :development
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - "~>"
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: 1.3.1
|
55
|
+
description: conversion from complexy write params to a json blob that an AR model
|
56
|
+
can consume
|
57
|
+
email:
|
58
|
+
- andy@iso.io
|
59
|
+
executables: []
|
60
|
+
extensions: []
|
61
|
+
extra_rdoc_files: []
|
62
|
+
files:
|
63
|
+
- ".gitignore"
|
64
|
+
- ".travis.yml"
|
65
|
+
- Gemfile
|
66
|
+
- Gemfile.lock
|
67
|
+
- MIT-LICENSE
|
68
|
+
- README.md
|
69
|
+
- Rakefile
|
70
|
+
- deserializer.gemspec
|
71
|
+
- gemfiles/4.0.gemfile
|
72
|
+
- gemfiles/5.0.gemfile
|
73
|
+
- gemfiles/6.0.gemfile
|
74
|
+
- lib/deserializer.rb
|
75
|
+
- lib/deserializer/attributable.rb
|
76
|
+
- lib/deserializer/attribute.rb
|
77
|
+
- lib/deserializer/attribute/association.rb
|
78
|
+
- lib/deserializer/attribute/attribute.rb
|
79
|
+
- lib/deserializer/attribute/base.rb
|
80
|
+
- lib/deserializer/attribute/has_many_association.rb
|
81
|
+
- lib/deserializer/attribute/has_one_association.rb
|
82
|
+
- lib/deserializer/attribute/nested_association.rb
|
83
|
+
- lib/deserializer/attribute/value_attribute.rb
|
84
|
+
- lib/deserializer/base.rb
|
85
|
+
- lib/deserializer/deserializer_error.rb
|
86
|
+
- lib/deserializer/version.rb
|
87
|
+
- test/lib/deserializers.rb
|
88
|
+
- test/minitest_helper.rb
|
89
|
+
- test/unit/deserializer_error_test.rb
|
90
|
+
- test/unit/deserializer_test.rb
|
91
|
+
homepage: https://github.com/gaorlov/deserializer
|
92
|
+
licenses:
|
93
|
+
- MIT
|
94
|
+
metadata: {}
|
95
|
+
post_install_message:
|
96
|
+
rdoc_options: []
|
97
|
+
require_paths:
|
98
|
+
- lib
|
99
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
100
|
+
requirements:
|
101
|
+
- - ">="
|
102
|
+
- !ruby/object:Gem::Version
|
103
|
+
version: '0'
|
104
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
105
|
+
requirements:
|
106
|
+
- - ">="
|
107
|
+
- !ruby/object:Gem::Version
|
108
|
+
version: '0'
|
109
|
+
requirements: []
|
110
|
+
rubygems_version: 3.3.26
|
111
|
+
signing_key:
|
112
|
+
specification_version: 4
|
113
|
+
summary: deserialization
|
114
|
+
test_files:
|
115
|
+
- test/lib/deserializers.rb
|
116
|
+
- test/minitest_helper.rb
|
117
|
+
- test/unit/deserializer_error_test.rb
|
118
|
+
- test/unit/deserializer_test.rb
|