jat 0.0.8 → 0.0.9
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/plugins/json_api/lib/map.rb +4 -5
- data/lib/jat/plugins/json_api/plugins/json_api_validate_params/lib/validate_include_param.rb +1 -3
- data/lib/jat/plugins/simple_api/lib/fields_param_parser.rb +20 -36
- data/lib/jat/plugins/simple_api/lib/map.rb +4 -5
- data/lib/jat/plugins/simple_api/plugins/simple_api_validate_params/simple_api_validate_params.rb +1 -1
- data/lib/jat/plugins/types/types.rb +4 -3
- data/lib/jat/plugins.rb +4 -3
- data/test/lib/jat/plugins/json_api/lib/include_param_parser_test.rb +0 -2
- data/test/lib/jat/plugins/json_api/lib/response_test.rb +0 -1
- data/test/lib/jat/plugins/json_api_preloads/lib/preloads_test.rb +0 -3
- data/test/lib/jat/plugins/simple_api/lib/fields_param_parser_test.rb +4 -0
- data/test/lib/jat/plugins/simple_api/lib/response_test.rb +7 -9
- data/test/lib/jat/plugins/simple_api_preloads/lib/preloads_test.rb +1 -6
- data/test/lib/jat/plugins/types/types_test.rb +0 -1
- data/test/test_helper.rb +2 -2
- metadata +27 -41
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 0b59dbef3044d5b23c7b8178e23f931458b3acb5ced78b3750c5f1d7bb8ea01e
|
4
|
+
data.tar.gz: 7ebf0b1ec19a10872b8e659bd3ab9cd45a5859ace34f87c65070a83af713a2fd
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: e7e4b943c4b6452937d2c025f47bc1e3e4484151748139682ad03724fa3bc5138f02c23400426ceb3fb6c948112dd91015c1beddfd4da2ee3a1cd3187e0a5d5c
|
7
|
+
data.tar.gz: de404f4d77ca9b68a50834b4e435f303f1ace3f66bb976ffa154e4159b01888fa27301795192c967a7cc3b2577c35a10012135521f7e91e9037833d7098f7816
|
@@ -103,11 +103,10 @@ class Jat
|
|
103
103
|
end
|
104
104
|
|
105
105
|
def attribute_exposed?(attribute)
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
end
|
106
|
+
return true if exposed == :all
|
107
|
+
return false if exposed == :none
|
108
|
+
|
109
|
+
attribute.exposed?
|
111
110
|
end
|
112
111
|
end
|
113
112
|
|
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
|
@@ -18,7 +18,7 @@ class Jat
|
|
18
18
|
def parse(fields)
|
19
19
|
return FROZEN_EMPTY_HASH unless fields
|
20
20
|
|
21
|
-
new(fields)
|
21
|
+
new.parse(fields)
|
22
22
|
end
|
23
23
|
end
|
24
24
|
|
@@ -27,65 +27,49 @@ class Jat
|
|
27
27
|
OPEN_BRACKET = "("
|
28
28
|
CLOSE_BRACKET = ")"
|
29
29
|
|
30
|
-
def initialize(fields)
|
31
|
-
@fields = fields
|
32
|
-
end
|
33
|
-
|
34
30
|
# user => { user: {} }
|
35
31
|
# user(id) => { user: { id: {} } }
|
36
32
|
# user(id,name) => { user: { id: {}, name: {} } }
|
37
33
|
# user,comments => { user: {}, comments: {} }
|
38
34
|
# user(comments(text)) => { user: { comments: { text: {} } } }
|
39
|
-
def parse
|
40
|
-
|
35
|
+
def parse(fields)
|
36
|
+
res = {}
|
37
|
+
attribute = +""
|
38
|
+
path_stack = nil
|
41
39
|
|
42
40
|
fields.each_char do |char|
|
43
41
|
case char
|
44
42
|
when COMMA
|
45
|
-
|
46
|
-
|
47
|
-
add_attribute(current_attr)
|
48
|
-
current_attr = nil
|
43
|
+
add_attribute(res, path_stack, attribute, FROZEN_EMPTY_HASH)
|
49
44
|
when CLOSE_BRACKET
|
50
|
-
|
51
|
-
|
52
|
-
current_attr = nil
|
53
|
-
end
|
54
|
-
|
55
|
-
route.pop
|
45
|
+
add_attribute(res, path_stack, attribute, FROZEN_EMPTY_HASH)
|
46
|
+
path_stack&.pop
|
56
47
|
when OPEN_BRACKET
|
57
|
-
|
58
|
-
|
59
|
-
attribute_name = add_attribute(current_attr, {})
|
60
|
-
route << attribute_name
|
61
|
-
current_attr = nil
|
48
|
+
name = add_attribute(res, path_stack, attribute, {})
|
49
|
+
(path_stack ||= []).push(name) if name
|
62
50
|
else
|
63
|
-
|
51
|
+
attribute.insert(-1, char)
|
64
52
|
end
|
65
53
|
end
|
66
54
|
|
67
|
-
add_attribute(
|
55
|
+
add_attribute(res, path_stack, attribute, FROZEN_EMPTY_HASH)
|
68
56
|
|
69
57
|
res
|
70
58
|
end
|
71
59
|
|
72
60
|
private
|
73
61
|
|
74
|
-
|
62
|
+
def add_attribute(res, path_stack, attribute, nested_attributes = FROZEN_EMPTY_HASH)
|
63
|
+
attribute.strip!
|
64
|
+
return if attribute.empty?
|
75
65
|
|
76
|
-
|
77
|
-
|
78
|
-
attribute_name = current_attr.strip.to_sym
|
79
|
-
current_resource[attribute_name] = nested_attrs
|
80
|
-
attribute_name
|
81
|
-
end
|
66
|
+
name = attribute.to_sym
|
67
|
+
attribute.clear
|
82
68
|
|
83
|
-
|
84
|
-
|
85
|
-
end
|
69
|
+
current_attrs = !path_stack || path_stack.empty? ? res : res.dig(*path_stack)
|
70
|
+
current_attrs[name] = nested_attributes
|
86
71
|
|
87
|
-
|
88
|
-
@route ||= []
|
72
|
+
name
|
89
73
|
end
|
90
74
|
end
|
91
75
|
|
@@ -74,11 +74,10 @@ class Jat
|
|
74
74
|
private
|
75
75
|
|
76
76
|
def expose?(attribute, fields)
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
end
|
77
|
+
return true if exposed == :all
|
78
|
+
return manually_exposed?(attribute, fields) if exposed == :none
|
79
|
+
|
80
|
+
attribute.exposed? || manually_exposed?(attribute, fields)
|
82
81
|
end
|
83
82
|
|
84
83
|
def manually_exposed?(attribute, fields)
|
@@ -40,9 +40,10 @@ class Jat
|
|
40
40
|
value = original_block.call(object, context)
|
41
41
|
|
42
42
|
# Type conversion
|
43
|
-
|
44
|
-
|
45
|
-
else
|
43
|
+
if type.is_a?(Symbol)
|
44
|
+
self.class.jat_class.config.fetch(:types).fetch(type).call(value)
|
45
|
+
else
|
46
|
+
type.call(value)
|
46
47
|
end
|
47
48
|
end
|
48
49
|
end
|
data/lib/jat/plugins.rb
CHANGED
@@ -25,11 +25,12 @@ class Jat
|
|
25
25
|
begin
|
26
26
|
require_plugin(name)
|
27
27
|
rescue PluginLoadError
|
28
|
-
|
28
|
+
name_str = name.to_s
|
29
|
+
if name_str.start_with?("json_api")
|
29
30
|
require_plugin(name, "/json_api/plugins")
|
30
|
-
elsif
|
31
|
+
elsif name_str.start_with?("simple_api")
|
31
32
|
require_plugin(name, "/simple_api/plugins")
|
32
|
-
elsif
|
33
|
+
elsif name_str.start_with?("base")
|
33
34
|
require_plugin(name, "/base")
|
34
35
|
else
|
35
36
|
raise
|
@@ -3,8 +3,6 @@
|
|
3
3
|
require "test_helper"
|
4
4
|
|
5
5
|
describe "Jat::Plugins::JsonApi::Params::Include" do
|
6
|
-
before { Jat::Plugins.find_plugin(:json_api) }
|
7
|
-
|
8
6
|
let(:base_class) { Class.new(Jat) { plugin :json_api } }
|
9
7
|
let(:a_serializer) { Class.new(base_class) }
|
10
8
|
let(:b_serializer) { Class.new(base_class) }
|
@@ -15,9 +15,6 @@ describe "Jat::Plugins::JsonApiPreloads::Preloads" do
|
|
15
15
|
let(:email_serializer) { Class.new(base) { type(:email) } }
|
16
16
|
|
17
17
|
let(:jat_user) { user_serializer.allocate }
|
18
|
-
let(:jat_profile) { profile_serializer.allocate }
|
19
|
-
let(:jat_email) { email_serializer.allocate }
|
20
|
-
|
21
18
|
let(:described_class) { Jat::Plugins::JsonApiPreloads::Preloads }
|
22
19
|
|
23
20
|
def define_map(map)
|
@@ -50,6 +50,10 @@ describe "Jat::Plugins::SimpleApi::FieldsParamParser" do
|
|
50
50
|
assert_equal({users: {id: {}}}, parse("(users(id))"))
|
51
51
|
end
|
52
52
|
|
53
|
+
it "parses fields started with extra close PAREN" do
|
54
|
+
assert_equal({users: {}}, parse(")users)"))
|
55
|
+
end
|
56
|
+
|
53
57
|
it "parses single resource with multiple fields" do
|
54
58
|
assert_equal({users: {id: {}, name: {}}}, parse("users(id,name)"))
|
55
59
|
end
|
@@ -132,13 +132,11 @@ describe "Jat::Plugins::SimpleApi::Response" do
|
|
132
132
|
end
|
133
133
|
|
134
134
|
it "does not return has-one relationship when not exposed" do
|
135
|
-
|
136
|
-
attribute(:id) { |obj| obj }
|
137
|
-
end
|
135
|
+
nested_serializer = Class.new(base_class)
|
138
136
|
|
139
137
|
str_serializer = Class.new(base_class) do
|
140
138
|
attribute(:id) { |obj| obj[0] }
|
141
|
-
attribute :length, serializer:
|
139
|
+
attribute :length, serializer: nested_serializer, exposed: false
|
142
140
|
end
|
143
141
|
|
144
142
|
assert_equal({id: "S"}, str_serializer.to_h("STRING"))
|
@@ -243,12 +241,12 @@ describe "Jat::Plugins::SimpleApi::Response" do
|
|
243
241
|
# All fields are not exposed in this serializers,
|
244
242
|
# We will show only attributes provided in `fields` param
|
245
243
|
chr_serializer = Class.new(base_class) do
|
246
|
-
attribute(:id, exposed: false)
|
244
|
+
attribute(:id, exposed: false)
|
247
245
|
attribute :next, exposed: false
|
248
246
|
end
|
249
247
|
|
250
248
|
str_serializer = Class.new(base_class) do
|
251
|
-
attribute(:id, exposed: false)
|
249
|
+
attribute(:id, exposed: false)
|
252
250
|
attribute :chars, serializer: chr_serializer, many: true, exposed: false
|
253
251
|
end
|
254
252
|
|
@@ -308,14 +306,14 @@ describe "Jat::Plugins::SimpleApi::Response" do
|
|
308
306
|
it "does not overwrite manually added meta" do
|
309
307
|
str_serializer = Class.new(base_class) do
|
310
308
|
root(:root)
|
311
|
-
meta(:
|
309
|
+
meta(:length)
|
312
310
|
|
313
311
|
attribute(:id) { |obj| obj }
|
314
312
|
end
|
315
313
|
|
316
314
|
assert_equal(
|
317
|
-
{root: {id: "1"}, meta: {
|
318
|
-
str_serializer.to_h("1", meta: {
|
315
|
+
{root: {id: "1"}, meta: {length: "33"}},
|
316
|
+
str_serializer.to_h("1", meta: {length: "33"})
|
319
317
|
)
|
320
318
|
end
|
321
319
|
|
@@ -10,15 +10,10 @@ describe "Jat::Plugins::SimpleApiPreloads::Preloads" do
|
|
10
10
|
end
|
11
11
|
end
|
12
12
|
|
13
|
+
let(:described_class) { Jat::Plugins::SimpleApiPreloads::Preloads }
|
13
14
|
let(:user_serializer) { Class.new(base) }
|
14
15
|
let(:profile_serializer) { Class.new(base) }
|
15
|
-
let(:email_serializer) { Class.new(base) }
|
16
|
-
|
17
16
|
let(:jat_user) { user_serializer.new }
|
18
|
-
let(:jat_profile) { profile_serializer.new }
|
19
|
-
let(:jat_email) { email_serializer.new }
|
20
|
-
|
21
|
-
let(:described_class) { Jat::Plugins::SimpleApiPreloads::Preloads }
|
22
17
|
|
23
18
|
def define_map(map)
|
24
19
|
user_serializer::Map.expects(:call).returns(map)
|
data/test/test_helper.rb
CHANGED
@@ -4,7 +4,8 @@
|
|
4
4
|
# ARGV is not populated when running `ruby -Itest {file}`
|
5
5
|
# ARGV is not populated when running test by `m` gem - `m {file}`
|
6
6
|
# ARGV is not populated when running tests by `m` gem with line number - `m {file}:{line_number}`
|
7
|
-
|
7
|
+
# jruby and truffleruby have bad simplecov support
|
8
|
+
if RUBY_ENGINE == "ruby" && ARGV.any?
|
8
9
|
require "simplecov"
|
9
10
|
SimpleCov.start
|
10
11
|
end
|
@@ -12,6 +13,5 @@ end
|
|
12
13
|
require "bundler/setup"
|
13
14
|
require "minitest/autorun"
|
14
15
|
require "mocha/minitest"
|
15
|
-
require "pry-byebug"
|
16
16
|
|
17
17
|
require_relative "../lib/jat"
|
metadata
CHANGED
@@ -1,113 +1,99 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: jat
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.9
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Andrey Glushkov
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2022-01-
|
11
|
+
date: 2022-01-16 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: minitest
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
16
16
|
requirements:
|
17
|
-
- - "
|
17
|
+
- - ">="
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version: '
|
19
|
+
version: '0'
|
20
20
|
type: :development
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
|
-
- - "
|
24
|
+
- - ">="
|
25
25
|
- !ruby/object:Gem::Version
|
26
|
-
version: '
|
26
|
+
version: '0'
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: mocha
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
30
30
|
requirements:
|
31
|
-
- - "
|
31
|
+
- - ">="
|
32
32
|
- !ruby/object:Gem::Version
|
33
|
-
version: '
|
33
|
+
version: '0'
|
34
34
|
type: :development
|
35
35
|
prerelease: false
|
36
36
|
version_requirements: !ruby/object:Gem::Requirement
|
37
37
|
requirements:
|
38
|
-
- - "
|
38
|
+
- - ">="
|
39
39
|
- !ruby/object:Gem::Version
|
40
|
-
version: '
|
40
|
+
version: '0'
|
41
41
|
- !ruby/object:Gem::Dependency
|
42
42
|
name: rake
|
43
43
|
requirement: !ruby/object:Gem::Requirement
|
44
44
|
requirements:
|
45
|
-
- - "
|
45
|
+
- - ">="
|
46
46
|
- !ruby/object:Gem::Version
|
47
|
-
version: '
|
47
|
+
version: '0'
|
48
48
|
type: :development
|
49
49
|
prerelease: false
|
50
50
|
version_requirements: !ruby/object:Gem::Requirement
|
51
51
|
requirements:
|
52
|
-
- - "
|
52
|
+
- - ">="
|
53
53
|
- !ruby/object:Gem::Version
|
54
|
-
version: '
|
54
|
+
version: '0'
|
55
55
|
- !ruby/object:Gem::Dependency
|
56
56
|
name: simplecov
|
57
57
|
requirement: !ruby/object:Gem::Requirement
|
58
58
|
requirements:
|
59
|
-
- - "
|
59
|
+
- - ">="
|
60
60
|
- !ruby/object:Gem::Version
|
61
|
-
version: '0
|
61
|
+
version: '0'
|
62
62
|
type: :development
|
63
63
|
prerelease: false
|
64
64
|
version_requirements: !ruby/object:Gem::Requirement
|
65
65
|
requirements:
|
66
|
-
- - "
|
66
|
+
- - ">="
|
67
67
|
- !ruby/object:Gem::Version
|
68
|
-
version: '0
|
68
|
+
version: '0'
|
69
69
|
- !ruby/object:Gem::Dependency
|
70
70
|
name: standard
|
71
71
|
requirement: !ruby/object:Gem::Requirement
|
72
72
|
requirements:
|
73
|
-
- - "
|
73
|
+
- - ">="
|
74
74
|
- !ruby/object:Gem::Version
|
75
|
-
version: '
|
75
|
+
version: '0'
|
76
76
|
type: :development
|
77
77
|
prerelease: false
|
78
78
|
version_requirements: !ruby/object:Gem::Requirement
|
79
79
|
requirements:
|
80
|
-
- - "
|
80
|
+
- - ">="
|
81
81
|
- !ruby/object:Gem::Version
|
82
|
-
version: '
|
82
|
+
version: '0'
|
83
83
|
- !ruby/object:Gem::Dependency
|
84
84
|
name: activerecord
|
85
85
|
requirement: !ruby/object:Gem::Requirement
|
86
86
|
requirements:
|
87
|
-
- - "
|
87
|
+
- - ">="
|
88
88
|
- !ruby/object:Gem::Version
|
89
|
-
version: '
|
89
|
+
version: '0'
|
90
90
|
type: :development
|
91
91
|
prerelease: false
|
92
92
|
version_requirements: !ruby/object:Gem::Requirement
|
93
93
|
requirements:
|
94
|
-
- - "
|
94
|
+
- - ">="
|
95
95
|
- !ruby/object:Gem::Version
|
96
|
-
version: '
|
97
|
-
- !ruby/object:Gem::Dependency
|
98
|
-
name: sqlite3
|
99
|
-
requirement: !ruby/object:Gem::Requirement
|
100
|
-
requirements:
|
101
|
-
- - "~>"
|
102
|
-
- !ruby/object:Gem::Version
|
103
|
-
version: '1.4'
|
104
|
-
type: :development
|
105
|
-
prerelease: false
|
106
|
-
version_requirements: !ruby/object:Gem::Requirement
|
107
|
-
requirements:
|
108
|
-
- - "~>"
|
109
|
-
- !ruby/object:Gem::Version
|
110
|
-
version: '1.4'
|
96
|
+
version: '0'
|
111
97
|
description: |
|
112
98
|
JAT serializer allows you to generate a JSON response based on the fields requested by the client.
|
113
99
|
Besides, it helps to preload relations to avoid N+1 when used with activerecord.
|
@@ -239,7 +225,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
239
225
|
- !ruby/object:Gem::Version
|
240
226
|
version: '0'
|
241
227
|
requirements: []
|
242
|
-
rubygems_version: 3.
|
228
|
+
rubygems_version: 3.3.3
|
243
229
|
signing_key:
|
244
230
|
specification_version: 4
|
245
231
|
summary: JSON API TOOLKIT
|