jat 0.0.6 → 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 +4 -4
- data/lib/jat/attribute.rb +5 -18
- data/lib/jat/config.rb +5 -20
- data/lib/jat/plugins/{common/_activerecord_preloads/_activerecord_preloads.rb → base/base_activerecord_preloads/base_activerecord_preloads.rb} +3 -3
- data/lib/jat/plugins/{common/_activerecord_preloads → base/base_activerecord_preloads}/lib/preloader.rb +3 -1
- data/lib/jat/plugins/{common/_lower_camel_case/_lower_camel_case.rb → base/base_lower_camel_case/base_lower_camel_case.rb} +3 -3
- data/lib/jat/plugins/{common/_preloads/_preloads.rb → base/base_preloads/base_preloads.rb} +3 -3
- data/lib/jat/plugins/{common/_preloads → base/base_preloads}/lib/format_user_preloads.rb +1 -1
- data/lib/jat/plugins/{common/_preloads → base/base_preloads}/lib/preloads_with_path.rb +1 -1
- data/lib/jat/plugins/json_api/lib/fields_param_parser.rb +1 -10
- data/lib/jat/plugins/json_api/lib/include_param_parser.rb +1 -10
- data/lib/jat/plugins/json_api/lib/map.rb +5 -15
- data/lib/jat/plugins/json_api/lib/response.rb +2 -15
- data/lib/jat/plugins/json_api/lib/response_piece.rb +10 -19
- data/lib/jat/plugins/json_api/plugins/json_api_activerecord/json_api_activerecord.rb +1 -1
- data/lib/jat/plugins/json_api/plugins/json_api_lower_camel_case/json_api_lower_camel_case.rb +1 -1
- data/lib/jat/plugins/json_api/plugins/json_api_preloads/json_api_preloads.rb +1 -1
- data/lib/jat/plugins/json_api/plugins/json_api_validate_params/lib/validate_include_param.rb +1 -3
- data/lib/jat/plugins/presenter/presenter.rb +79 -0
- data/lib/jat/plugins/simple_api/lib/fields_param_parser.rb +21 -46
- data/lib/jat/plugins/simple_api/lib/map.rb +5 -15
- data/lib/jat/plugins/simple_api/lib/response.rb +2 -15
- data/lib/jat/plugins/simple_api/lib/response_piece.rb +2 -15
- data/lib/jat/plugins/simple_api/plugins/simple_api_activerecord/simple_api_activerecord.rb +1 -1
- data/lib/jat/plugins/simple_api/plugins/simple_api_lower_camel_case/simple_api_lower_camel_case.rb +1 -1
- data/lib/jat/plugins/simple_api/plugins/simple_api_preloads/simple_api_preloads.rb +1 -1
- data/lib/jat/plugins/simple_api/plugins/simple_api_validate_params/simple_api_validate_params.rb +1 -1
- data/lib/jat/plugins/simple_api/simple_api.rb +1 -1
- data/lib/jat/plugins/types/types.rb +55 -0
- data/lib/jat/plugins.rb +38 -25
- data/lib/jat/utils/jat_class.rb +21 -0
- data/lib/jat.rb +9 -6
- data/test/lib/jat/attribute_test.rb +8 -0
- data/test/lib/jat/plugins/activerecord/activerecord_test.rb +27 -0
- data/test/lib/jat/plugins/{_activerecord_preloads/_activerecord_preloads_test.rb → base_activerecord_preloads/base_activerecord_preloads_test.rb} +3 -3
- data/test/lib/jat/plugins/{_activerecord_preloads → base_activerecord_preloads}/lib/preloader_test.rb +2 -2
- data/test/lib/jat/plugins/{_camel_lower/_camel_lower_test.rb → base_lower_camel_case/base_lower_camel_case_test.rb} +2 -2
- data/test/lib/jat/plugins/{_preloads/_preloads_test.rb → base_preloads/base_preloads_test.rb} +2 -2
- data/test/lib/jat/plugins/{_preloads → base_preloads}/lib/format_user_preloads_test.rb +3 -3
- data/test/lib/jat/plugins/{_preloads → base_preloads}/lib/preloads_with_path_test.rb +2 -2
- data/test/lib/jat/plugins/json_api/json_api_test.rb +1 -1
- data/test/lib/jat/plugins/json_api/lib/fields_param_parser_test.rb +20 -12
- data/test/lib/jat/plugins/json_api/lib/include_param_parser_test.rb +25 -11
- data/test/lib/jat/plugins/json_api/lib/map_test.rb +132 -124
- data/test/lib/jat/plugins/json_api/lib/response_piece_test.rb +13 -0
- data/test/lib/jat/plugins/json_api/lib/response_test.rb +6 -1
- data/test/lib/jat/plugins/json_api_activerecord/json_api_activerecord_test.rb +1 -1
- data/test/lib/jat/plugins/{json_api_camel_lower/json_api_camel_lower_test.rb → json_api_lower_camel_case/json_api_lower_camel_case_test.rb} +6 -0
- data/test/lib/jat/plugins/json_api_preloads/json_api_preloads_test.rb +16 -2
- data/test/lib/jat/plugins/json_api_preloads/lib/preloads_test.rb +0 -3
- data/test/lib/jat/plugins/json_api_validate_params/json_api_validate_params_test.rb +30 -6
- data/test/lib/jat/plugins/lower_camel_case/lower_camel_case_test.rb +27 -0
- data/test/lib/jat/plugins/maps_cache/maps_cache_test.rb +27 -0
- data/test/lib/jat/plugins/preloads/preloads_test.rb +27 -0
- data/test/lib/jat/plugins/presenter/presenter_test.rb +215 -0
- data/test/lib/jat/plugins/simple_api/lib/fields_param_parser_test.rb +57 -43
- data/test/lib/jat/plugins/simple_api/lib/map_test.rb +90 -82
- data/test/lib/jat/plugins/simple_api/lib/response_piece_test.rb +13 -0
- data/test/lib/jat/plugins/simple_api/lib/response_test.rb +17 -11
- data/test/lib/jat/plugins/simple_api/simple_api_test.rb +36 -1
- data/test/lib/jat/plugins/simple_api_activerecord/simple_api_activerecord_test.rb +1 -1
- data/test/lib/jat/plugins/{simple_api_camel_lower/simple_api_camel_lower_test.rb → simple_api_lower_camel_case/simple_api_lower_camel_case_test.rb} +7 -1
- data/test/lib/jat/plugins/simple_api_preloads/lib/preloads_test.rb +1 -6
- data/test/lib/jat/plugins/simple_api_preloads/simple_api_preloads_test.rb +16 -2
- data/test/lib/jat/plugins/simple_api_validate_params/simple_api_validate_params_test.rb +12 -0
- data/test/lib/jat/plugins/types/types_test.rb +83 -0
- data/test/lib/jat/plugins/validate_params/validate_params_test.rb +27 -0
- data/test/lib/jat/plugins_test.rb +89 -0
- data/test/test_helper.rb +14 -4
- metadata +72 -67
- data/test/lib/plugin_test.rb +0 -49
- data/test/test_plugin.rb +0 -56
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: d7b5ab9fe35df564d6282bd57f3008293bbc38e72c7dbf0ade8ef27734aafb10
|
|
4
|
+
data.tar.gz: c2bd6717c5555e862bdaafab2bdd16f510d7535be1922e0327253fee7d8cb248
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 2979f947fc8b2052632549e92990ef0f9039c582915cd405d97954f2a7aa6d7c6bf88627aea7e708f8417107a89e2ea089dfd3f0005425147cca297eb138e3f0
|
|
7
|
+
data.tar.gz: f90de936bc75392e315c4e8c5e8bf3e191aacaca84dd7b0a3dd924d93976e753bccf31425cc9b8588c406dbde0a0690cf0f13788d1e7ffb5871dfdcb553152a0
|
data/lib/jat/attribute.rb
CHANGED
|
@@ -9,6 +9,8 @@ class Jat
|
|
|
9
9
|
attr_reader :params, :opts
|
|
10
10
|
|
|
11
11
|
def initialize(name:, opts: {}, block: nil)
|
|
12
|
+
check_block_valid(block)
|
|
13
|
+
|
|
12
14
|
@opts = EnumDeepDup.call(opts)
|
|
13
15
|
@params = EnumDeepFreeze.call(name: name, opts: @opts, block: block)
|
|
14
16
|
end
|
|
@@ -61,7 +63,7 @@ class Jat
|
|
|
61
63
|
def block
|
|
62
64
|
return @block if instance_variable_defined?(:@block)
|
|
63
65
|
|
|
64
|
-
current_block = params.fetch(:block)
|
|
66
|
+
current_block = params.fetch(:block)
|
|
65
67
|
current_block ||= keyword_block
|
|
66
68
|
|
|
67
69
|
@block = current_block
|
|
@@ -79,29 +81,14 @@ class Jat
|
|
|
79
81
|
end
|
|
80
82
|
|
|
81
83
|
def check_block_valid(block)
|
|
82
|
-
|
|
84
|
+
return unless block
|
|
83
85
|
|
|
84
86
|
params = block.parameters
|
|
85
87
|
raise Error, "Block can have 0-2 parameters" if params.count > 2
|
|
86
|
-
|
|
87
|
-
valid_params_types = params.all? { |param| param[0] == :opt }
|
|
88
|
-
raise Error, "Block parameters must be optional and no keyword parameters" unless valid_params_types
|
|
89
|
-
end
|
|
90
|
-
end
|
|
91
|
-
|
|
92
|
-
module ClassMethods
|
|
93
|
-
# Returns the Jat class that this Attribute class is namespaced under.
|
|
94
|
-
attr_accessor :jat_class
|
|
95
|
-
|
|
96
|
-
# Since Attribute is anonymously subclassed when Jat is subclassed,
|
|
97
|
-
# and then assigned to a constant of the Jat subclass, make inspect
|
|
98
|
-
# reflect the likely name for the class.
|
|
99
|
-
def inspect
|
|
100
|
-
"#{jat_class.inspect}::Attribute"
|
|
101
88
|
end
|
|
102
89
|
end
|
|
103
90
|
|
|
104
|
-
extend
|
|
91
|
+
extend Jat::JatClass
|
|
105
92
|
include InstanceMethods
|
|
106
93
|
end
|
|
107
94
|
end
|
data/lib/jat/config.rb
CHANGED
|
@@ -1,38 +1,23 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
2
|
|
|
3
|
+
require "forwardable"
|
|
3
4
|
require_relative "utils/enum_deep_dup"
|
|
4
5
|
|
|
5
6
|
class Jat
|
|
6
7
|
class Config
|
|
7
8
|
module InstanceMethods
|
|
9
|
+
extend Forwardable
|
|
10
|
+
|
|
8
11
|
attr_reader :opts
|
|
9
12
|
|
|
10
13
|
def initialize(opts = {})
|
|
11
14
|
@opts = EnumDeepDup.call(opts)
|
|
12
15
|
end
|
|
13
16
|
|
|
14
|
-
|
|
15
|
-
opts[key] = value
|
|
16
|
-
end
|
|
17
|
-
|
|
18
|
-
def [](key)
|
|
19
|
-
opts[key]
|
|
20
|
-
end
|
|
21
|
-
end
|
|
22
|
-
|
|
23
|
-
module ClassMethods
|
|
24
|
-
# Returns the Jat class that this config class is namespaced under.
|
|
25
|
-
attr_accessor :jat_class
|
|
26
|
-
|
|
27
|
-
# Since Config is anonymously subclassed when Jat is subclassed,
|
|
28
|
-
# and then assigned to a constant of the Jat subclass, make inspect
|
|
29
|
-
# reflect the likely name for the class.
|
|
30
|
-
def inspect
|
|
31
|
-
"#{jat_class.inspect}::Config"
|
|
32
|
-
end
|
|
17
|
+
def_delegators :@opts, :[], :[]=, :fetch
|
|
33
18
|
end
|
|
34
19
|
|
|
35
20
|
include InstanceMethods
|
|
36
|
-
extend
|
|
21
|
+
extend Jat::JatClass
|
|
37
22
|
end
|
|
38
23
|
end
|
|
@@ -4,9 +4,9 @@ require_relative "./lib/preloader"
|
|
|
4
4
|
|
|
5
5
|
class Jat
|
|
6
6
|
module Plugins
|
|
7
|
-
module
|
|
7
|
+
module BaseActiverecordPreloads
|
|
8
8
|
def self.plugin_name
|
|
9
|
-
:
|
|
9
|
+
:base_activerecord_preloads
|
|
10
10
|
end
|
|
11
11
|
|
|
12
12
|
def self.load(jat_class, **_opts)
|
|
@@ -33,6 +33,6 @@ class Jat
|
|
|
33
33
|
end
|
|
34
34
|
end
|
|
35
35
|
|
|
36
|
-
register_plugin(
|
|
36
|
+
register_plugin(BaseActiverecordPreloads.plugin_name, BaseActiverecordPreloads)
|
|
37
37
|
end
|
|
38
38
|
end
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
class Jat
|
|
4
4
|
module Plugins
|
|
5
|
-
module
|
|
5
|
+
module BaseActiverecordPreloads
|
|
6
6
|
class Preloader
|
|
7
7
|
module ClassMethods
|
|
8
8
|
def preload(object, preloads)
|
|
@@ -21,6 +21,7 @@ class Jat
|
|
|
21
21
|
end
|
|
22
22
|
|
|
23
23
|
class Loader
|
|
24
|
+
# :nocov: We can check only one version of activerecord
|
|
24
25
|
def self.call(records, associations)
|
|
25
26
|
if ActiveRecord::VERSION::MAJOR >= 7
|
|
26
27
|
ActiveRecord::Associations::Preloader.new(records: records, associations: associations).call
|
|
@@ -28,6 +29,7 @@ class Jat
|
|
|
28
29
|
ActiveRecord::Associations::Preloader.new.preload(records, associations)
|
|
29
30
|
end
|
|
30
31
|
end
|
|
32
|
+
# :nocov:
|
|
31
33
|
end
|
|
32
34
|
|
|
33
35
|
class ActiverecordObject
|
|
@@ -2,9 +2,9 @@
|
|
|
2
2
|
|
|
3
3
|
class Jat
|
|
4
4
|
module Plugins
|
|
5
|
-
module
|
|
5
|
+
module BaseLowerCamelCase
|
|
6
6
|
def self.plugin_name
|
|
7
|
-
:
|
|
7
|
+
:base_lower_camel_case
|
|
8
8
|
end
|
|
9
9
|
|
|
10
10
|
def self.load(jat_class, **_opts)
|
|
@@ -18,7 +18,7 @@ class Jat
|
|
|
18
18
|
end
|
|
19
19
|
end
|
|
20
20
|
|
|
21
|
-
register_plugin(
|
|
21
|
+
register_plugin(BaseLowerCamelCase.plugin_name, BaseLowerCamelCase)
|
|
22
22
|
end
|
|
23
23
|
|
|
24
24
|
class LowerCamelCaseTransformation
|
|
@@ -6,9 +6,9 @@ require_relative "./lib/preloads_with_path"
|
|
|
6
6
|
# This plugin adds attribute methods #preloads, #preloads_path
|
|
7
7
|
class Jat
|
|
8
8
|
module Plugins
|
|
9
|
-
module
|
|
9
|
+
module BasePreloads
|
|
10
10
|
def self.plugin_name
|
|
11
|
-
:
|
|
11
|
+
:base_preloads
|
|
12
12
|
end
|
|
13
13
|
|
|
14
14
|
def self.load(jat_class, **_opts)
|
|
@@ -58,6 +58,6 @@ class Jat
|
|
|
58
58
|
end
|
|
59
59
|
end
|
|
60
60
|
|
|
61
|
-
register_plugin(
|
|
61
|
+
register_plugin(BasePreloads.plugin_name, BasePreloads)
|
|
62
62
|
end
|
|
63
63
|
end
|
|
@@ -7,16 +7,6 @@ class Jat
|
|
|
7
7
|
module ClassMethods
|
|
8
8
|
COMMA = ","
|
|
9
9
|
|
|
10
|
-
# Returns the Jat class that this FieldsParamParser class is namespaced under.
|
|
11
|
-
attr_accessor :jat_class
|
|
12
|
-
|
|
13
|
-
# Since FieldsParamParser is anonymously subclassed when Jat is subclassed,
|
|
14
|
-
# and then assigned to a constant of the Jat subclass, make inspect
|
|
15
|
-
# reflect the likely name for the class.
|
|
16
|
-
def inspect
|
|
17
|
-
"#{jat_class.inspect}::FieldsParamParser"
|
|
18
|
-
end
|
|
19
|
-
|
|
20
10
|
def parse(fields)
|
|
21
11
|
return FROZEN_EMPTY_HASH unless fields
|
|
22
12
|
|
|
@@ -33,6 +23,7 @@ class Jat
|
|
|
33
23
|
end
|
|
34
24
|
end
|
|
35
25
|
|
|
26
|
+
extend Jat::JatClass
|
|
36
27
|
extend ClassMethods
|
|
37
28
|
end
|
|
38
29
|
end
|
|
@@ -8,16 +8,6 @@ class Jat
|
|
|
8
8
|
COMMA = ","
|
|
9
9
|
DOT = "."
|
|
10
10
|
|
|
11
|
-
# Returns the Jat class that this IncludeParamParser class is namespaced under.
|
|
12
|
-
attr_accessor :jat_class
|
|
13
|
-
|
|
14
|
-
# Since IncludeParamParser is anonymously subclassed when Jat is subclassed,
|
|
15
|
-
# and then assigned to a constant of the Jat subclass, make inspect
|
|
16
|
-
# reflect the likely name for the class.
|
|
17
|
-
def inspect
|
|
18
|
-
"#{jat_class.inspect}::IncludeParamParser"
|
|
19
|
-
end
|
|
20
|
-
|
|
21
11
|
def parse(includes_string_param)
|
|
22
12
|
return {} unless includes_string_param
|
|
23
13
|
|
|
@@ -77,6 +67,7 @@ class Jat
|
|
|
77
67
|
end
|
|
78
68
|
end
|
|
79
69
|
|
|
70
|
+
extend Jat::JatClass
|
|
80
71
|
extend ClassMethods
|
|
81
72
|
end
|
|
82
73
|
end
|
|
@@ -5,16 +5,6 @@ class Jat
|
|
|
5
5
|
module JsonApi
|
|
6
6
|
class Map
|
|
7
7
|
module ClassMethods
|
|
8
|
-
# Returns the Jat class that this Map class is namespaced under.
|
|
9
|
-
attr_accessor :jat_class
|
|
10
|
-
|
|
11
|
-
# Since Map is anonymously subclassed when Jat is subclassed,
|
|
12
|
-
# and then assigned to a constant of the Jat subclass, make inspect
|
|
13
|
-
# reflect the likely name for the class.
|
|
14
|
-
def inspect
|
|
15
|
-
"#{jat_class.inspect}::Map"
|
|
16
|
-
end
|
|
17
|
-
|
|
18
8
|
# Returns structure like
|
|
19
9
|
# {
|
|
20
10
|
# type1 => {
|
|
@@ -103,14 +93,14 @@ class Jat
|
|
|
103
93
|
end
|
|
104
94
|
|
|
105
95
|
def attribute_exposed?(attribute)
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
end
|
|
96
|
+
return true if exposed == :all
|
|
97
|
+
return false if exposed == :none
|
|
98
|
+
|
|
99
|
+
attribute.exposed?
|
|
111
100
|
end
|
|
112
101
|
end
|
|
113
102
|
|
|
103
|
+
extend Jat::JatClass
|
|
114
104
|
extend ClassMethods
|
|
115
105
|
include InstanceMethods
|
|
116
106
|
end
|
|
@@ -6,16 +6,6 @@ class Jat
|
|
|
6
6
|
module JsonApi
|
|
7
7
|
class Response
|
|
8
8
|
module ClassMethods
|
|
9
|
-
# Returns the Jat class that this Response class is namespaced under.
|
|
10
|
-
attr_accessor :jat_class
|
|
11
|
-
|
|
12
|
-
# Since Response is anonymously subclassed when Jat is subclassed,
|
|
13
|
-
# and then assigned to a constant of the Jat subclass, make inspect
|
|
14
|
-
# reflect the likely name for the class.
|
|
15
|
-
def inspect
|
|
16
|
-
"#{jat_class.inspect}::Response"
|
|
17
|
-
end
|
|
18
|
-
|
|
19
9
|
def call(object, context)
|
|
20
10
|
new(object, context).to_h
|
|
21
11
|
end
|
|
@@ -87,7 +77,7 @@ class Jat
|
|
|
87
77
|
attributes.each do |name, attribute|
|
|
88
78
|
next if data.key?(name)
|
|
89
79
|
|
|
90
|
-
value =
|
|
80
|
+
value = attribute.value(object, context)
|
|
91
81
|
|
|
92
82
|
unless value.nil?
|
|
93
83
|
data = data.dup if data.equal?(FROZEN_EMPTY_HASH)
|
|
@@ -98,10 +88,6 @@ class Jat
|
|
|
98
88
|
data
|
|
99
89
|
end
|
|
100
90
|
|
|
101
|
-
def attribute_value(attribute)
|
|
102
|
-
attribute.block.call(object, context)
|
|
103
|
-
end
|
|
104
|
-
|
|
105
91
|
def context_jsonapi
|
|
106
92
|
context_attr_transform(:jsonapi)
|
|
107
93
|
end
|
|
@@ -119,6 +105,7 @@ class Jat
|
|
|
119
105
|
end
|
|
120
106
|
end
|
|
121
107
|
|
|
108
|
+
extend Jat::JatClass
|
|
122
109
|
extend ClassMethods
|
|
123
110
|
include InstanceMethods
|
|
124
111
|
end
|
|
@@ -5,16 +5,6 @@ class Jat
|
|
|
5
5
|
module JsonApi
|
|
6
6
|
class ResponsePiece
|
|
7
7
|
module ClassMethods
|
|
8
|
-
# Returns the Jat class that this ResponsePiece class is namespaced under.
|
|
9
|
-
attr_accessor :jat_class
|
|
10
|
-
|
|
11
|
-
# Since ResponsePiece is anonymously subclassed when Jat is subclassed,
|
|
12
|
-
# and then assigned to a constant of the Jat subclass, make inspect
|
|
13
|
-
# reflect the likely name for the class.
|
|
14
|
-
def inspect
|
|
15
|
-
"#{jat_class.inspect}::ResponsePiece"
|
|
16
|
-
end
|
|
17
|
-
|
|
18
8
|
def call(object, context, map, includes)
|
|
19
9
|
new(object, context, map, includes).to_h
|
|
20
10
|
end
|
|
@@ -60,7 +50,7 @@ class Jat
|
|
|
60
50
|
|
|
61
51
|
attributes_names.each_with_object({}) do |name, attrs|
|
|
62
52
|
attribute = jat_class.attributes[name]
|
|
63
|
-
attrs[name] = attribute.
|
|
53
|
+
attrs[name] = attribute.value(object, context)
|
|
64
54
|
end
|
|
65
55
|
end
|
|
66
56
|
|
|
@@ -70,7 +60,7 @@ class Jat
|
|
|
70
60
|
|
|
71
61
|
relationships_names.each_with_object({}) do |name, rels|
|
|
72
62
|
rel_attribute = jat_class.attributes[name]
|
|
73
|
-
rel_object = rel_attribute.
|
|
63
|
+
rel_object = rel_attribute.value(object, context)
|
|
74
64
|
|
|
75
65
|
rel_serializer = rel_attribute.serializer.call
|
|
76
66
|
rel_links = get_relationship_links(rel_serializer, rel_object)
|
|
@@ -123,37 +113,37 @@ class Jat
|
|
|
123
113
|
def get_links
|
|
124
114
|
jat_class
|
|
125
115
|
.object_links
|
|
126
|
-
.transform_values { |attr| attr.
|
|
116
|
+
.transform_values { |attr| attr.value(object, context) }
|
|
127
117
|
.tap(&:compact!)
|
|
128
118
|
end
|
|
129
119
|
|
|
130
120
|
def get_meta
|
|
131
121
|
jat_class
|
|
132
122
|
.added_object_meta
|
|
133
|
-
.transform_values { |attr| attr.
|
|
123
|
+
.transform_values { |attr| attr.value(object, context) }
|
|
134
124
|
.tap(&:compact!)
|
|
135
125
|
end
|
|
136
126
|
|
|
137
127
|
def get_relationship_links(rel_serializer, rel_object)
|
|
138
128
|
links = rel_serializer.relationship_links
|
|
139
|
-
return FROZEN_EMPTY_HASH
|
|
129
|
+
return FROZEN_EMPTY_HASH if links.empty?
|
|
140
130
|
|
|
141
131
|
context[:parent_object] = object
|
|
142
132
|
|
|
143
133
|
links
|
|
144
|
-
.transform_values { |attr| attr.
|
|
134
|
+
.transform_values { |attr| attr.value(rel_object, context) }
|
|
145
135
|
.tap(&:compact!)
|
|
146
136
|
.tap { context.delete(:parent_object) }
|
|
147
137
|
end
|
|
148
138
|
|
|
149
139
|
def get_relationship_meta(rel_serializer, rel_object)
|
|
150
140
|
meta = rel_serializer.added_relationship_meta
|
|
151
|
-
return FROZEN_EMPTY_HASH
|
|
141
|
+
return FROZEN_EMPTY_HASH if meta.empty?
|
|
152
142
|
|
|
153
143
|
context[:parent_object] = object
|
|
154
144
|
|
|
155
145
|
meta
|
|
156
|
-
.transform_values { |attr| attr.
|
|
146
|
+
.transform_values { |attr| attr.value(rel_object, context) }
|
|
157
147
|
.tap(&:compact!)
|
|
158
148
|
.tap { context.delete(:parent_object) }
|
|
159
149
|
end
|
|
@@ -163,10 +153,11 @@ class Jat
|
|
|
163
153
|
end
|
|
164
154
|
|
|
165
155
|
def id
|
|
166
|
-
@id ||= jat_class.get_id.
|
|
156
|
+
@id ||= jat_class.get_id.value(object, context)
|
|
167
157
|
end
|
|
168
158
|
end
|
|
169
159
|
|
|
160
|
+
extend Jat::JatClass
|
|
170
161
|
extend ClassMethods
|
|
171
162
|
include InstanceMethods
|
|
172
163
|
end
|
data/lib/jat/plugins/json_api/plugins/json_api_lower_camel_case/json_api_lower_camel_case.rb
CHANGED
|
@@ -10,7 +10,7 @@ class Jat
|
|
|
10
10
|
def self.before_load(jat_class, **_opts)
|
|
11
11
|
raise Error, "Please load :json_api plugin first" unless jat_class.plugin_used?(:json_api)
|
|
12
12
|
|
|
13
|
-
jat_class.plugin :
|
|
13
|
+
jat_class.plugin :base_lower_camel_case
|
|
14
14
|
end
|
|
15
15
|
|
|
16
16
|
def self.load(jat_class, **_opts)
|
|
@@ -12,7 +12,7 @@ class Jat
|
|
|
12
12
|
def self.before_load(jat_class, **opts)
|
|
13
13
|
raise Error, "Please load :json_api plugin first" unless jat_class.plugin_used?(:json_api)
|
|
14
14
|
|
|
15
|
-
jat_class.plugin :
|
|
15
|
+
jat_class.plugin :base_preloads, **opts
|
|
16
16
|
end
|
|
17
17
|
|
|
18
18
|
def self.load(jat_class, **_opts)
|
data/lib/jat/plugins/json_api/plugins/json_api_validate_params/lib/validate_include_param.rb
CHANGED
|
@@ -22,9 +22,7 @@ class Jat
|
|
|
22
22
|
allowed_relationships = jat_class.attributes.each_value.select(&:relation?).map!(&:name)
|
|
23
23
|
allowed_relationships = "'#{allowed_relationships.join("', '")}'"
|
|
24
24
|
|
|
25
|
-
raise JsonApiParamsError,
|
|
26
|
-
"Type '#{type}' has no included '#{name}' relationship. " \
|
|
27
|
-
"Existing relationships are: #{allowed_relationships}"
|
|
25
|
+
raise JsonApiParamsError, "Type '#{type}' has no included '#{name}' relationship. Existing relationships are: #{allowed_relationships}"
|
|
28
26
|
end
|
|
29
27
|
end
|
|
30
28
|
end
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require "delegate"
|
|
4
|
+
require "forwardable"
|
|
5
|
+
|
|
6
|
+
class Jat
|
|
7
|
+
module Plugins
|
|
8
|
+
module Presenter
|
|
9
|
+
def self.plugin_name
|
|
10
|
+
:presenter
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
def self.before_load(jat_class, **opts)
|
|
14
|
+
if jat_class.plugin_used?(:json_api)
|
|
15
|
+
jat_class.plugin :json_api_preloads, **opts
|
|
16
|
+
elsif jat_class.plugin_used?(:simple_api)
|
|
17
|
+
jat_class.plugin :simple_api_preloads, **opts
|
|
18
|
+
else
|
|
19
|
+
raise Error, "Please load :json_api or :simple_api plugin first"
|
|
20
|
+
end
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
def self.load(jat_class, **_opts)
|
|
24
|
+
jat_class.extend(ClassMethods)
|
|
25
|
+
jat_class::ResponsePiece.include(ResponsePieceInstanceMethods)
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
def self.after_load(jat_class, **_opts)
|
|
29
|
+
presenter_class = Class.new(Presenter)
|
|
30
|
+
presenter_class.jat_class = jat_class
|
|
31
|
+
jat_class.const_set(:Presenter, presenter_class)
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
class Presenter < SimpleDelegator
|
|
35
|
+
module InstanceMethods
|
|
36
|
+
# Delegates all missing methods to current object.
|
|
37
|
+
# We create real methods after first missing method.
|
|
38
|
+
# rubocop:disable Style/MissingRespondToMissing (base SimpleDelegator class has this method)
|
|
39
|
+
def method_missing(name, *args, &block)
|
|
40
|
+
super(name, *args, &block).tap do
|
|
41
|
+
self.class.def_delegator :__getobj__, name
|
|
42
|
+
end
|
|
43
|
+
end
|
|
44
|
+
# rubocop:enable Style/MissingRespondToMissing
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
extend Forwardable
|
|
48
|
+
extend Jat::JatClass
|
|
49
|
+
include InstanceMethods
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
module ClassMethods
|
|
53
|
+
def inherited(subclass)
|
|
54
|
+
presenter_class = Class.new(self::Presenter)
|
|
55
|
+
presenter_class.jat_class = subclass
|
|
56
|
+
subclass.const_set(:Presenter, presenter_class)
|
|
57
|
+
|
|
58
|
+
super
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
def attribute(name, **opts, &block)
|
|
62
|
+
# Define attr_accessor in presenter automatically
|
|
63
|
+
super.tap do |attribute|
|
|
64
|
+
self::Presenter.def_delegator(:__getobj__, attribute.key) unless attribute.params[:block]
|
|
65
|
+
end
|
|
66
|
+
end
|
|
67
|
+
end
|
|
68
|
+
|
|
69
|
+
module ResponsePieceInstanceMethods
|
|
70
|
+
def initialize(*)
|
|
71
|
+
super
|
|
72
|
+
@object = jat_class::Presenter.new(object)
|
|
73
|
+
end
|
|
74
|
+
end
|
|
75
|
+
end
|
|
76
|
+
|
|
77
|
+
register_plugin(Presenter.plugin_name, Presenter)
|
|
78
|
+
end
|
|
79
|
+
end
|
|
@@ -5,20 +5,10 @@ class Jat
|
|
|
5
5
|
module SimpleApi
|
|
6
6
|
class FieldsParamParser
|
|
7
7
|
module ClassMethods
|
|
8
|
-
# Returns the Jat class that this FieldsParamParser class is namespaced under.
|
|
9
|
-
attr_accessor :jat_class
|
|
10
|
-
|
|
11
|
-
# Since FieldsParamParser is anonymously subclassed when Jat is subclassed,
|
|
12
|
-
# and then assigned to a constant of the Jat subclass, make inspect
|
|
13
|
-
# reflect the likely name for the class.
|
|
14
|
-
def inspect
|
|
15
|
-
"#{jat_class.inspect}::FieldsParamParser"
|
|
16
|
-
end
|
|
17
|
-
|
|
18
8
|
def parse(fields)
|
|
19
9
|
return FROZEN_EMPTY_HASH unless fields
|
|
20
10
|
|
|
21
|
-
new(fields)
|
|
11
|
+
new.parse(fields)
|
|
22
12
|
end
|
|
23
13
|
end
|
|
24
14
|
|
|
@@ -27,68 +17,53 @@ class Jat
|
|
|
27
17
|
OPEN_BRACKET = "("
|
|
28
18
|
CLOSE_BRACKET = ")"
|
|
29
19
|
|
|
30
|
-
def initialize(fields)
|
|
31
|
-
@fields = fields
|
|
32
|
-
end
|
|
33
|
-
|
|
34
20
|
# user => { user: {} }
|
|
35
21
|
# user(id) => { user: { id: {} } }
|
|
36
22
|
# user(id,name) => { user: { id: {}, name: {} } }
|
|
37
23
|
# user,comments => { user: {}, comments: {} }
|
|
38
24
|
# user(comments(text)) => { user: { comments: { text: {} } } }
|
|
39
|
-
def parse
|
|
40
|
-
|
|
25
|
+
def parse(fields)
|
|
26
|
+
res = {}
|
|
27
|
+
attribute = +""
|
|
28
|
+
path_stack = nil
|
|
41
29
|
|
|
42
30
|
fields.each_char do |char|
|
|
43
31
|
case char
|
|
44
32
|
when COMMA
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
add_attribute(current_attr)
|
|
48
|
-
current_attr = nil
|
|
33
|
+
add_attribute(res, path_stack, attribute, FROZEN_EMPTY_HASH)
|
|
49
34
|
when CLOSE_BRACKET
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
current_attr = nil
|
|
53
|
-
end
|
|
54
|
-
|
|
55
|
-
route.pop
|
|
35
|
+
add_attribute(res, path_stack, attribute, FROZEN_EMPTY_HASH)
|
|
36
|
+
path_stack&.pop
|
|
56
37
|
when OPEN_BRACKET
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
attribute_name = add_attribute(current_attr, {})
|
|
60
|
-
route << attribute_name
|
|
61
|
-
current_attr = nil
|
|
38
|
+
name = add_attribute(res, path_stack, attribute, {})
|
|
39
|
+
(path_stack ||= []).push(name) if name
|
|
62
40
|
else
|
|
63
|
-
|
|
41
|
+
attribute.insert(-1, char)
|
|
64
42
|
end
|
|
65
43
|
end
|
|
66
44
|
|
|
67
|
-
add_attribute(
|
|
45
|
+
add_attribute(res, path_stack, attribute, FROZEN_EMPTY_HASH)
|
|
68
46
|
|
|
69
47
|
res
|
|
70
48
|
end
|
|
71
49
|
|
|
72
50
|
private
|
|
73
51
|
|
|
74
|
-
|
|
52
|
+
def add_attribute(res, path_stack, attribute, nested_attributes = FROZEN_EMPTY_HASH)
|
|
53
|
+
attribute.strip!
|
|
54
|
+
return if attribute.empty?
|
|
75
55
|
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
attribute_name = current_attr.strip.to_sym
|
|
79
|
-
current_resource[attribute_name] = nested_attrs
|
|
80
|
-
attribute_name
|
|
81
|
-
end
|
|
56
|
+
name = attribute.to_sym
|
|
57
|
+
attribute.clear
|
|
82
58
|
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
end
|
|
59
|
+
current_attrs = !path_stack || path_stack.empty? ? res : res.dig(*path_stack)
|
|
60
|
+
current_attrs[name] = nested_attributes
|
|
86
61
|
|
|
87
|
-
|
|
88
|
-
@route ||= []
|
|
62
|
+
name
|
|
89
63
|
end
|
|
90
64
|
end
|
|
91
65
|
|
|
66
|
+
extend Jat::JatClass
|
|
92
67
|
extend ClassMethods
|
|
93
68
|
include InstanceMethods
|
|
94
69
|
end
|