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