rest_framework 0.0.9 → 0.0.10
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
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: a3ed68df38881608ec5cc6c66c286624a600398a745ab730e6cef89513f0138f
|
4
|
+
data.tar.gz: 7f2654b29027aa24357b14082e0e0236d9024521fe47e3ae90be7fdeda535b5f
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 460fd09cc0b375e5509a83ff64bf5ffb87f864cb53e5cb51aa1027bce3a39bbd12a8f692a3c621ad93ac200f98bb095b369610b2953eedb9a47a181568fea948
|
7
|
+
data.tar.gz: 03c6ec7c3d910dac783e2ddb927ea53212e066246dcf1b2673d95e703754a9295a5e792d9daeb3c40fd5d334491e489e076b4740f766ab7880eaf3d731344bda
|
@@ -1 +1 @@
|
|
1
|
-
0.0.
|
1
|
+
0.0.10
|
@@ -75,7 +75,7 @@ module RESTFramework
|
|
75
75
|
end
|
76
76
|
|
77
77
|
# Helper alias for `respond_to`/`render`, and replace nil responses with blank ones. `payload`
|
78
|
-
#
|
78
|
+
# should be already serialized to Ruby primitives.
|
79
79
|
def api_response(payload, html_kwargs: nil, json_kwargs: nil, xml_kwargs: nil, **kwargs)
|
80
80
|
html_kwargs ||= {}
|
81
81
|
json_kwargs ||= {}
|
@@ -31,43 +31,37 @@ module RESTFramework
|
|
31
31
|
return self.class.serializer_class || NativeModelSerializer
|
32
32
|
end
|
33
33
|
|
34
|
-
# Get a list of fields for
|
35
|
-
def get_fields
|
34
|
+
# Get a list of fields for the current action.
|
35
|
+
def get_fields
|
36
36
|
action_fields = self.class.action_fields || {}
|
37
|
-
|
38
|
-
# action will, by default, be the current action name
|
39
|
-
action = action_name.to_sym unless action
|
37
|
+
action = self.action_name.to_sym
|
40
38
|
|
41
39
|
# index action should use :list fields if :index is not provided
|
42
40
|
action = :list if action == :index && !action_fields.key?(:index)
|
43
41
|
|
44
|
-
return action_fields[action] || self.class.fields || []
|
42
|
+
return (action_fields[action] if action) || self.class.fields || []
|
45
43
|
end
|
46
44
|
|
47
|
-
# Get a native serializer config for
|
48
|
-
def get_native_serializer_config
|
49
|
-
|
50
|
-
|
51
|
-
# action will, by default, be the current action name
|
52
|
-
action = action_name.to_sym unless action
|
45
|
+
# Get a native serializer config for the current action.
|
46
|
+
def get_native_serializer_config
|
47
|
+
action_serializer_config = self.class.native_serializer_action_config || {}
|
48
|
+
action = self.action_name.to_sym
|
53
49
|
|
54
50
|
# index action should use :list serializer config if :index is not provided
|
55
|
-
action = :list if action == :index && !
|
51
|
+
action = :list if action == :index && !action_serializer_config.key?(:index)
|
56
52
|
|
57
|
-
return
|
53
|
+
return (action_serializer_config[action] if action) || self.class.native_serializer_config
|
58
54
|
end
|
59
55
|
|
60
|
-
# Get a list of parameters allowed for
|
61
|
-
def get_allowed_parameters
|
56
|
+
# Get a list of parameters allowed for the current action.
|
57
|
+
def get_allowed_parameters
|
62
58
|
allowed_action_parameters = self.class.allowed_action_parameters || {}
|
63
|
-
|
64
|
-
# action will, by default, be the current action name
|
65
|
-
action = action_name.to_sym unless action
|
59
|
+
action = self.action_name.to_sym
|
66
60
|
|
67
61
|
# index action should use :list allowed parameters if :index is not provided
|
68
62
|
action = :list if action == :index && !allowed_action_parameters.key?(:index)
|
69
63
|
|
70
|
-
return allowed_action_parameters[action] || self.class.allowed_parameters
|
64
|
+
return (allowed_action_parameters[action] if action) || self.class.allowed_parameters
|
71
65
|
end
|
72
66
|
|
73
67
|
# Filter the request body for keys in current action's allowed_parameters/fields config.
|
@@ -7,28 +7,58 @@ module RESTFramework
|
|
7
7
|
@data = data
|
8
8
|
@controller = controller
|
9
9
|
end
|
10
|
-
|
11
|
-
def is_valid
|
12
|
-
return true
|
13
|
-
end
|
14
10
|
end
|
15
11
|
|
16
12
|
# This serializer uses `.as_json` to serialize objects. Despite the name, `.as_json` is a Rails
|
17
13
|
# method which converts objects to Ruby primitives (with the top-level being either an array or a
|
18
14
|
# hash).
|
19
15
|
class NativeModelSerializer < BaseSerializer
|
20
|
-
|
16
|
+
class_attribute :config
|
17
|
+
class_attribute :singular_config
|
18
|
+
class_attribute :plural_config
|
19
|
+
class_attribute :action_config
|
20
|
+
|
21
|
+
def initialize(model: nil, many: nil, **kwargs)
|
21
22
|
super(**kwargs)
|
22
|
-
@
|
23
|
+
@many = many
|
24
|
+
@model = model || (@controller ? @controller.send(:get_model) : nil)
|
25
|
+
end
|
26
|
+
|
27
|
+
# Get controller action, if possible.
|
28
|
+
def get_action
|
29
|
+
return @controller&.action_name&.to_sym
|
30
|
+
end
|
31
|
+
|
32
|
+
# Get a locally defined configuration, if one is defined.
|
33
|
+
def get_local_serializer_config
|
34
|
+
action = self.get_action
|
35
|
+
|
36
|
+
if action && self.action_config
|
37
|
+
# index action should use :list serializer config if :index is not provided
|
38
|
+
action = :list if action == :index && !self.action_config.key?(:index)
|
39
|
+
|
40
|
+
return self.action_config[action] if self.action_config[action]
|
41
|
+
end
|
42
|
+
|
43
|
+
# no action_config, so try singular/plural config
|
44
|
+
return self.plural_config if @many && self.plural_config
|
45
|
+
return self.singular_config if !@many && self.singular_config
|
46
|
+
|
47
|
+
# lastly, try the default config
|
48
|
+
return self.config
|
23
49
|
end
|
24
50
|
|
25
51
|
# Get a configuration passable to `as_json` for the model.
|
26
|
-
def
|
52
|
+
def get_serializer_config
|
53
|
+
# return a locally defined serializer config if one is defined
|
54
|
+
local_config = self.get_local_serializer_config
|
55
|
+
return local_config if local_config
|
56
|
+
|
27
57
|
# return a serializer config if one is defined
|
28
58
|
serializer_config = @controller.send(:get_native_serializer_config)
|
29
59
|
return serializer_config if serializer_config
|
30
60
|
|
31
|
-
# build serializer config from fields
|
61
|
+
# otherwise, build a serializer config from fields
|
32
62
|
fields = @controller.send(:get_fields)
|
33
63
|
unless fields.blank?
|
34
64
|
columns, methods = fields.partition { |f| f.to_s.in?(@model.column_names) }
|
@@ -38,10 +68,52 @@ module RESTFramework
|
|
38
68
|
return {}
|
39
69
|
end
|
40
70
|
|
71
|
+
# Recursive method for traversing a config and evaluating nested serializers.
|
72
|
+
def _resolve_serializer_config(node: nil)
|
73
|
+
# First base case: found a serializer, so evaluate it and return it.
|
74
|
+
if node.is_a?(Class) && (node < BaseSerializer)
|
75
|
+
return node.new(controller: @controller).get_resolved_serializer_config
|
76
|
+
end
|
77
|
+
|
78
|
+
# Second base case: found a serializer instance, so evaluate it and return it.
|
79
|
+
if node.is_a?(BaseSerializer)
|
80
|
+
return node.get_resolved_serializer_config
|
81
|
+
end
|
82
|
+
|
83
|
+
# Third base case: node is not iterable, so return it.
|
84
|
+
unless node.respond_to?(:each)
|
85
|
+
return node
|
86
|
+
end
|
87
|
+
|
88
|
+
# Recursive case: node is iterable, so iterate and recursively resolve serializers.
|
89
|
+
if node.is_a? Hash
|
90
|
+
node.each do |k,v|
|
91
|
+
node[k] = self._resolve_serializer_config(node: v)
|
92
|
+
end
|
93
|
+
else
|
94
|
+
node.map! do |v|
|
95
|
+
self._resolve_serializer_config(node: v)
|
96
|
+
end
|
97
|
+
end
|
98
|
+
|
99
|
+
return node
|
100
|
+
end
|
101
|
+
|
102
|
+
# Get a serializer config and resolve any nested serializers into configs.
|
103
|
+
def get_resolved_serializer_config
|
104
|
+
config = self.get_serializer_config
|
105
|
+
|
106
|
+
# traverse the config, resolving nested serializers
|
107
|
+
return _resolve_serializer_config(node: config)
|
108
|
+
end
|
109
|
+
|
41
110
|
# Convert the object(s) to Ruby primitives.
|
42
111
|
def serialize
|
43
112
|
if @object
|
44
|
-
|
113
|
+
@many = @object.respond_to?(:each) if @many.nil?
|
114
|
+
return @object.as_json(
|
115
|
+
self.get_resolved_serializer_config
|
116
|
+
)
|
45
117
|
end
|
46
118
|
return nil
|
47
119
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rest_framework
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.10
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Gregory N. Schmit
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2020-10-
|
11
|
+
date: 2020-10-09 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rails
|